diff --git a/src/app/benchmarks/[slug]/page.tsx b/src/app/benchmarks/[slug]/page.tsx index c82a7755..06d31a75 100644 --- a/src/app/benchmarks/[slug]/page.tsx +++ b/src/app/benchmarks/[slug]/page.tsx @@ -1,5 +1,6 @@ import { Suspense } from "react"; import type { Metadata } from "next"; +import { unstable_noStore as noStore } from "next/cache"; import { notFound } from "next/navigation"; import Link from "next/link"; import { ArrowLeft, ArrowUpRight, ChevronDown } from "lucide-react"; @@ -210,6 +211,14 @@ export default async function BenchmarkPage({ const isDraft = benchmark.status === "draft"; const isAwaiting = isDraft && benchmark.editorialStatus === "live"; + // An editorially-live bench rendering as draft means the store read + // came back empty this cycle (srh timeout, snapshot swap), not that + // the bench has no data: keep that render OUT of the ISR cache so the + // next visitor triggers a fresh read instead of everyone seeing + // "no live data yet" for a revalidate window (seen on perp-fees + // 2026-07-10). Genuinely-new benches render dynamically until their + // first samples land, which is the correct behavior anyway. + if (isAwaiting) noStore(); // Insufficient: editorially live, runtime might say "live" too, but the // shared predicate decided no provider has a usable p50. Drives the // pill above the H1 and the headline degradation downstream.