diff --git a/src/app/benchmarks/[slug]/page.tsx b/src/app/benchmarks/[slug]/page.tsx index de1a044d..3f8c1bd7 100644 --- a/src/app/benchmarks/[slug]/page.tsx +++ b/src/app/benchmarks/[slug]/page.tsx @@ -1,6 +1,5 @@ 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"; @@ -276,14 +275,6 @@ 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. diff --git a/src/lib/spec.ts b/src/lib/spec.ts index 4aeba369..9deaf4b4 100644 --- a/src/lib/spec.ts +++ b/src/lib/spec.ts @@ -10,7 +10,7 @@ */ import { cache } from "react"; -import { unstable_cache, unstable_noStore } from "next/cache"; +import { unstable_cache } from "next/cache"; import type { Benchmark } from "@/types/benchmark"; import type { Spec } from "@/lib/spec-schema"; // Imported from the isolated alias module (NOT @/lib/chains) to avoid @@ -577,16 +577,6 @@ export const loadAllBenchmarksSafe = cache( return await loadAllBenchmarksCached(); } catch (err) { if (err instanceof AllBenchmarksDraftError) { - // Opt this render out of every cache layer (ISR + CDN edge). When - // the aggregate quorum is lost (SRH stuck, Redis blackout, worker - // starved) the placeholder response is a degraded surrogate, NOT - // ground truth. Without noStore the placeholder HTML would sit at - // Vercel Edge for `revalidate` seconds and — under stale-while- - // revalidate — for hours after backend recovery, since SWR only - // refreshes on cache miss. Marking the response no-store forces - // every subsequent hit to re-render, which immediately picks up - // real data as soon as SRH is back — no cache-key bump, no deploy. - unstable_noStore(); const specs = await loadSpecs(); return specs .map((s) => draftPlaceholderForSpec(s))