Skip to content

Promote dev to main: Serialized onboarding, bench scoring fixes, 001 node reference - #2269

Open
Flotapponnier wants to merge 99 commits into
mainfrom
dev
Open

Promote dev to main: Serialized onboarding, bench scoring fixes, 001 node reference#2269
Flotapponnier wants to merge 99 commits into
mainfrom
dev

Conversation

@Flotapponnier

Copy link
Copy Markdown
Collaborator

Staging state on dev since 2026-09-05, reviewed at https://staging-openchainbench.vercel.app.

What this promotes

Serialized (serialized.xyz) as a provider

Bench integrity fixes, all as separate series so history is preserved

Audit doc docs/methodology/serialized-onboarding-audit.md v1.3 (#2264, #2265): every number, every correction, two methodology defects in our own benches, a verified 5.2x BONK mispricing traced to a pool-ranking unit bug on their side.

What merging to main does beyond the site

The three Railway head-lag services (Aggregator east usa, Agg eu west, agg sgp) build from main, root harnesses/aggregator-head-lag. After this merge, trigger a fresh git build on each (serviceInstanceDeployV2); SERIALIZED_API_KEY is already set on all three. Agg eu west has three failed snapshot-upload deploys since 2026-09-05 14:32 (lstat …/harnesses: no such file or directory), a railway up from a directory without the harness path; a git build replaces it.

Known state at promotion time

  • 004: Serialized is producing (p50 53.3% on the spec query) but the leaderboard still shows the pre-outage snapshot because Mobula/Codex/Jupiter quantiles are NaN while the dead hours (webshare proxy quota, 429) remain in the 24h window; quorum fails 1/4 and the worker keeps the previous render. Self-heals once those hours roll out.
  • 008: Serialized 3rd at 76.75% (n=1,188). 005: last at 19. 090: 4th of 5 at 19 (Sim by Dune is dead: api.sim.dune.com no longer resolves).

🤖 Generated with Claude Code

https://claude.ai/code/session_01CpArutAtXuBb1BVNUDXoYA

…2188)

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.
* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection
…2190)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease
* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease
* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: widen coin name column in top markets to fit xyz:NVDA
* feat(rpc): add Shentu bench #254 and MANTRA Chain bench #255

* fix: remove accidental dev-portal submodule
* merge: dev → main (Gains carry fix + vault fee split) (#2191)

* fix(harnesses): cap LZ/CCIP/Axelar cardinality to bench-tracked chains only (#2187)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit (#2188)

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection (#2189)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains action names v5→v6, handle position size increases (#2190)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* feat(rpc): Union bench #253 (#2195)

* fix(harnesses): cap LZ/CCIP/Axelar cardinality to bench-tracked chains only (#2187)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit (#2188)

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection (#2189)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains action names v5→v6, handle position size increases (#2190)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: Gains carry projection (v6 action names + still-open positions)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: widen coin name column for long tickers (xyz:NVDA)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: widen coin name column in top markets to fit xyz:NVDA

* feat(rpc): add Union bench #253 (Nodes.Guru, Stake And Relax, High Stakes) (#2194)

* fix(union-rpc): remove em dashes from YAML

* feat(union): add provider SVG logos and brand colors

* feat: Shentu #254 + MANTRA Chain #255 benches

* fix(harnesses): cap LZ/CCIP/Axelar cardinality to bench-tracked chains only (#2187)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit (#2188)

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection (#2189)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains action names v5→v6, handle position size increases (#2190)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: Gains carry projection (v6 action names + still-open positions)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: widen coin name column for long tickers (xyz:NVDA)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: widen coin name column in top markets to fit xyz:NVDA

* feat(rpc): add Union bench #253 (Nodes.Guru, Stake And Relax, High Stakes) (#2194)

* fix(union-rpc): remove em dashes from YAML (#2196)

* feat(rpc): Shentu #254 + MANTRA Chain #255 (#2199)

* feat(rpc): add Shentu bench #254 and MANTRA Chain bench #255

* fix: remove accidental dev-portal submodule

* fix: bench-blob revalidate 300s to fix perp ISR conflict
…2207)

* fix(fee-compare): rename Volume→Position size + clearer vault fee label

* fix(fee-compare): show total position value + inline vault fee explanation
…#2208)

* fix(fee-compare): rename Volume→Position size + clearer vault fee label

* fix(fee-compare): show total position value + inline vault fee explanation
* merge: dev → main (Gains carry fix + vault fee split) (#2191)

* fix(harnesses): cap LZ/CCIP/Axelar cardinality to bench-tracked chains only (#2187)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit (#2188)

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection (#2189)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains action names v5→v6, handle position size increases (#2190)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* feat(rpc): Union bench #253 (#2195)

* fix(harnesses): cap LZ/CCIP/Axelar cardinality to bench-tracked chains only (#2187)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit (#2188)

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection (#2189)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains action names v5→v6, handle position size increases (#2190)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: Gains carry projection (v6 action names + still-open positions)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: widen coin name column for long tickers (xyz:NVDA)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: widen coin name column in top markets to fit xyz:NVDA

* feat(rpc): add Union bench #253 (Nodes.Guru, Stake And Relax, High Stakes) (#2194)

* fix(union-rpc): remove em dashes from YAML

* feat(union): add provider SVG logos and brand colors

* feat: Shentu #254 + MANTRA Chain #255 benches

* fix(harnesses): cap LZ/CCIP/Axelar cardinality to bench-tracked chains only (#2187)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit (#2188)

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection (#2189)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains action names v5→v6, handle position size increases (#2190)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: Gains carry projection (v6 action names + still-open positions)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: widen coin name column for long tickers (xyz:NVDA)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: widen coin name column in top markets to fit xyz:NVDA

* feat(rpc): add Union bench #253 (Nodes.Guru, Stake And Relax, High Stakes) (#2194)

* fix(union-rpc): remove em dashes from YAML (#2196)

* feat(rpc): Shentu #254 + MANTRA Chain #255 (#2199)

* feat(rpc): add Shentu bench #254 and MANTRA Chain bench #255

* fix: remove accidental dev-portal submodule

* feat: Band Protocol #256 + cheqd #257 benches

* fix(harnesses): cap LZ/CCIP/Axelar cardinality to bench-tracked chains only (#2187)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit (#2188)

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection (#2189)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains action names v5→v6, handle position size increases (#2190)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: Gains carry projection (v6 action names + still-open positions)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: widen coin name column for long tickers (xyz:NVDA)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: widen coin name column in top markets to fit xyz:NVDA

* feat(rpc): add Union bench #253 (Nodes.Guru, Stake And Relax, High Stakes) (#2194)

* fix(union-rpc): remove em dashes from YAML (#2196)

* feat(rpc): Shentu #254 + MANTRA Chain #255 (#2199)

* feat(rpc): add Shentu bench #254 and MANTRA Chain bench #255

* fix: remove accidental dev-portal submodule

* feat: Band Protocol #256 + cheqd #257 benches

* fix: bench-blob revalidate 300s to fix perp ISR conflict (#2206)

* merge: dev → main (Gains carry fix + vault fee split) (#2191)

* fix(harnesses): cap LZ/CCIP/Axelar cardinality to bench-tracked chains only (#2187)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit (#2188)

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection (#2189)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains action names v5→v6, handle position size increases (#2190)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* feat(rpc): Union bench #253 (#2195)

* fix(harnesses): cap LZ/CCIP/Axelar cardinality to bench-tracked chains only (#2187)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit (#2188)

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection (#2189)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains action names v5→v6, handle position size increases (#2190)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: Gains carry projection (v6 action names + still-open positions)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: widen coin name column for long tickers (xyz:NVDA)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: widen coin name column in top markets to fit xyz:NVDA

* feat(rpc): add Union bench #253 (Nodes.Guru, Stake And Relax, High Stakes) (#2194)

* fix(union-rpc): remove em dashes from YAML

* feat(union): add provider SVG logos and brand colors

* feat: Shentu #254 + MANTRA Chain #255 benches

* fix(harnesses): cap LZ/CCIP/Axelar cardinality to bench-tracked chains only (#2187)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit (#2188)

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection (#2189)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains action names v5→v6, handle position size increases (#2190)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: Gains carry projection (v6 action names + still-open positions)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: widen coin name column for long tickers (xyz:NVDA)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: widen coin name column in top markets to fit xyz:NVDA

* feat(rpc): add Union bench #253 (Nodes.Guru, Stake And Relax, High Stakes) (#2194)

* fix(union-rpc): remove em dashes from YAML (#2196)

* feat(rpc): Shentu #254 + MANTRA Chain #255 (#2199)

* feat(rpc): add Shentu bench #254 and MANTRA Chain bench #255

* fix: remove accidental dev-portal submodule

* fix: bench-blob revalidate 300s to fix perp ISR conflict

* fix(fee-compare): total position value + inline vault fee explanation

* fix(fee-compare): remove vault fee — carry fees settled per-action, not OI surcharge (#2209)

* feat(rpc): ICON bench #258 — new icon probe kind, 3 keyless providers
* fix: include long-running Gains positions in HL funding projection

* fix: use earliest POSSIZEINCREASE as anchor for positions opened before fetch window
* fix: include long-running Gains positions in HL funding projection

* fix: use earliest POSSIZEINCREASE as anchor for positions opened before fetch window

* fix: fetch 1yr Gains history for position reconstruction to find true open timestamps
* fix: include long-running Gains positions in HL funding projection

* fix: use earliest POSSIZEINCREASE as anchor for positions opened before fetch window

* fix: fetch 1yr Gains history for position reconstruction to find true open timestamps

* feat: grey out Gains-exclusive pairs in comparison, exclude from HL fee calc

* fix: hide equivFee for Gains-exclusive pairs (coin not on HL)
* fix: signed HL funding projection, filter exclusive coins, increase coin limit to 20

* fix: sort Gains trades oldest-first for correct size tracking; fix equivFee uses HL rate not Gains rate
* merge: dev → main (Gains carry fix + vault fee split) (#2191)

* fix(harnesses): cap LZ/CCIP/Axelar cardinality to bench-tracked chains only (#2187)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit (#2188)

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection (#2189)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains action names v5→v6, handle position size increases (#2190)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* feat(rpc): Union bench #253 (#2195)

* fix(harnesses): cap LZ/CCIP/Axelar cardinality to bench-tracked chains only (#2187)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit (#2188)

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection (#2189)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains action names v5→v6, handle position size increases (#2190)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: Gains carry projection (v6 action names + still-open positions)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: widen coin name column for long tickers (xyz:NVDA)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: widen coin name column in top markets to fit xyz:NVDA

* feat(rpc): add Union bench #253 (Nodes.Guru, Stake And Relax, High Stakes) (#2194)

* fix(union-rpc): remove em dashes from YAML

* feat(union): add provider SVG logos and brand colors

* fix(citation): allow negative p50 for deviation benches
…ns, comparable notional (#2217)

F1: paginate fetchHlFundingHistory (up to 5 pages × 500) to cover 180d+ windows
F4: multi-slice reconstructGainsPositions — one PositionSlice per size-change period
    so pre-increase periods use smaller notional (more accurate HL equiv funding)
F5: track comparableNotionalUsdc (HL-listed coins only) and use it in walletStats
    so the HL taker-equiv fee isn't inflated by PONS/Gains-exclusive notional
report: Best Robinhood Chain RPC (median-scoped)
Flotapponnier and others added 30 commits September 4, 2026 01:09
…lish

feat(speedtest): responsive + design polish
feat(speedtest): SEO/GEO findability pass
feat(speedtest): red stop button at section bottom
feat(speedtest): dedicated social card
fix(speedtest): satori-compatible OG card
feat: crowdsourced RPC latency world map
feat(map): search + compare + smart viewport
feat(map): clickable areas + history panel
feat(map): near me + pin with nearest results
fix(speedtest): fail-open prefill check
fix(bench-205): apples-to-apples Solana scoping
Wires serialized.xyz into metadata-coverage (004) and wallet-labels (008),
the two benches where their endpoints map 1:1 to the existing scoring rule.

Both providers throttle client-side at ~16 rps: Serialized enforces a hard
40 req/s burst cap and an unthrottled worker pool turns coverage into a
rate-limit artifact (measured 77% -> 37%).

Adds the registry entry, logo and a full onboarding audit documenting the
apples-to-apples numbers and two scoring flaws the tests exposed in our
own benches (logo presence vs resolution on 004, name-service strings
counted as entity labels on 008).


Claude-Session: https://claude.ai/code/session_01CpArutAtXuBb1BVNUDXoYA

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
The harnesses emit provider="serialized" but the leaderboards are
driven by the explicit providers block in each spec, so the series
never rendered. Adds the block for both benches, same query shape as
the incumbents.

Validated with SpecSchema.safeParse across all 218 specs; every
formula stays under the 240-char cap that silently drops a spec.


Claude-Session: https://claude.ai/code/session_01CpArutAtXuBb1BVNUDXoYA

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
Serialized publishes its chain list at the free GET /v1/meta/chains.
The same list answers both benches: they run their own indexers and
do not separate asset-registry coverage from DEX-pool coverage, so
the count is identical on 005 and 090 by construction.

Only chains the endpoint marks status=live are counted, so a future
beta or deprecated status cannot inflate the number.


Claude-Session: https://claude.ai/code/session_01CpArutAtXuBb1BVNUDXoYA

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
…ups (#2264)

v1.0 claimed bench 001 references archive nodes and was therefore
unaffected by provider clock disagreement. That repeated the spec
instead of reading the harness: there is no archive-node reference in
aggregator-head-lag at all, and the leaderboard gauge is computed from
each provider's own timestamp. The spec says the opposite in three
places.

Also records the now-conclusive bench 067 result (verified 5 of 19
chains), probe-confirmed negative capabilities, and a verified 5.2x
BONK mispricing traced to pool discovery missing the main market.


Claude-Session: https://claude.ai/code/session_01CpArutAtXuBb1BVNUDXoYA

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
…en-security feasibility (#2265)

The v1.1 text said the deep Orca pool was absent from their pool list.
It is present, ranked second. The real defect is that the ranking
compares liquidityNative across different quote assets without
converting to USD, so a $4,347 USDC-quoted pool outranks a $75,679
SOL-quoted one because 4,346 > 728. Seven of eight pools agree on the
price; rank 1 is the lone outlier and the token is priced from it.

Adds section 17: token-security bench feasibility, including the
provider cohort, a latency table where Mobula is last by 17x, three
measured design traps, a retrospective backtest and its limits, and
which fields actually carry signal.


Claude-Session: https://claude.ai/code/session_01CpArutAtXuBb1BVNUDXoYA

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
Both benches score a proxy for the thing they claim to measure.

Bench 004 scores the logo field as "non-empty string", which any
provider wins by construction by rewriting logos onto its own CDN at a
deterministic path. The current beneficiary is Mobula, at 100% logo on
every chain against 22.9/37.8/78.9 for a provider returning upstream
URLs. Adds logo_resolved: HEAD the URL, fall back to a ranged GET on
403/405, cache 6h so we do not hammer third-party CDNs.

Bench 008 scores a hit as "any non-generic name", which cannot tell a
curated entity from a personal name-service record. Measured: 25% of
Serialized's hits and 25.4% of Mobula's named something other than the
curated entity. The anchor list already carries a Hint for every
address and the scoring path ignored it. Adds
wallet_labels_accurate_total scored against that Hint.

Both land as SEPARATE series, not as redefinitions, so the published
leaderboards and their history stay intact while the stricter numbers
build up alongside.


Claude-Session: https://claude.ai/code/session_01CpArutAtXuBb1BVNUDXoYA

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
… clock (#2267)

The spec promises "Reference: archive nodes per chain, validated against
block hashes" in three places. The harness never did that: both provider
paths compute receiveTime minus the timestamp the provider itself sent.
grep for archive/getBlockByNumber/blockTimestamp over the harness returns
nothing.

Measured consequence: on the same transaction hash, Serialized and Mobula
disagree about when it happened by 707 ms on Solana and 1,000 ms on Base,
so the leaderboard partly ranks where each vendor puts its clock.

Adds one WebSocket subscription per monitored pool straight to a node,
timestamping every swap on receipt, matched to provider emissions by
transaction hash. Published as head_lag_ref_seconds beside the legacy
series so the old one keeps its history while the two are compared.

Validated before shipping at a 100% hash match rate on Base and Solana.
That validation also surfaced the binding constraint: against public
endpoints the reference node is SLOWER than the providers, so the series
carries the node's own latency as an offset and must be read as a
relative comparison until REF_WS_URL_<CHAIN> points at a paid node. All
of this is documented at the call site.


Claude-Session: https://claude.ai/code/session_01CpArutAtXuBb1BVNUDXoYA

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
Their trades stream is keyed by token with an optional pools filter,
while the bench is keyed by pool. Subscribing by the pool's native side
(SOL, WETH, WBNB) acknowledges and delivers nothing; subscribing by the
side their own /v1/pool reports as `token` (USDC, BUSD, USDG) with
pools=<bench pool> delivers exactly that market. Verified on all four
bench pools before shipping (events with txHash: solana 4, base 10,
bnb 2, robinhood 79).

One connection per process, four pools multiplexed: their key allows 5
concurrent connections and this harness runs in three regions.

Records both series: head_lag_seconds from their own `at`, same
treatment as the incumbents, and head_lag_ref_seconds against the node
reference clock matched by txHash.


Claude-Session: https://claude.ai/code/session_01CpArutAtXuBb1BVNUDXoYA

Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
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