Skip to content

seo: stop counting benches that 410 on product pages, and 404 the thin compare tail - #2618

Merged
Flotapponnier merged 1 commit into
devfrom
fix/seo-retired-benches-and-thin-compare
Sep 22, 2026
Merged

Flotapponnier merged 1 commit into
devfrom
fix/seo-retired-benches-and-thin-compare

Conversation

@Flotapponnier

Copy link
Copy Markdown
Collaborator

Majors 1 and 2 of the 2026-09-22 site audit.

Product pages counted, linked and quoted benches that return 410

The only link gate was built from isExpiredRpcPage, which covers chain RPC pages and nothing else; the file never knew about REMOVED_BENCH_SLUGS or isDevOnlyBench.

Live on /products/mobula: two outgoing links to /benchmarks/indexing-freshness and /benchmarks/portfolio-chain-coverage, both 410, their ranks printed inside the first 300 words, and both counted in "8 live benchmarks". An answer engine quoting that page quoted a rank on a cohort the site had retired.

One helper now filters appearances for generateMetadata and the body alike, so the metadata lead, the visible count and the list agree and none of them names a page that 410s. The degraded-read tripwire keeps reading the raw list — it is about the store being healthy, not about what is displayed.

The compare tail lived forever as 200 + noindex

That is the one combination a crawler never drops. Search Console recorded impressions on 383 compare URLs against 151 in the sitemap, so 232 pages were live, crawled and deindexed, and the property carries 3,356 noindex exclusions, about four times the indexable site.

An ad hoc pair with fewer than two live shared benches now 404s, in generateMetadata and the body both, right next to the notFound() the file already does for a pair sharing zero benches. A 404 leaves the index in weeks; a 200 with noindex is recrawled indefinitely.

Curated COMPARE_PAIRS stay indexable on a single live shared bench, unchanged. Compare is the best-converting section (6,332 impressions, 92 clicks) and the curation is what earns that.

pnpm typecheck clean, pnpm lint 0 errors, pnpm test 301 pass, pnpm validate 231 specs.

🤖 Generated with Claude Code

https://claude.ai/code/session_01L4rjxemTvgRwrCG6D2iK5D

… and the thin compare tail 404s instead of living forever as noindex

Majors 1 and 2 of the 2026-09-22 site audit.

Product pages had one link gate, built from isExpiredRpcPage, which covers
chain RPC pages and nothing else; the file never knew about
REMOVED_BENCH_SLUGS or isDevOnlyBench. Live on /products/mobula: two
outgoing links to /benchmarks/indexing-freshness and
/benchmarks/portfolio-chain-coverage, both 410, their ranks printed inside
the first 300 words, and both counted in "8 live benchmarks". An answer
engine quoting that page quoted a rank on a cohort the site had retired.

One helper now filters appearances for generateMetadata and the body
alike, so the metadata lead, the visible count and the list agree and none
of them names a page that 410s. The degraded-read tripwire keeps reading
the raw list: it is about the store being healthy, not about display.

The compare tail answered 200 with noindex, the one combination a crawler
never drops. Search Console recorded impressions on 383 compare URLs
against 151 in the sitemap, so 232 pages were live, crawled and
deindexed, and the property carries 3,356 noindex exclusions, about four
times the indexable site. An ad hoc pair with fewer than two live shared
benches now 404s, in generateMetadata and the body both, next to the
notFound() the file already does for a pair sharing zero benches. Curated
COMPARE_PAIRS stay indexable on a single live bench, unchanged: compare is
the best-converting section (6,332 impressions, 92 clicks) and the
curation is what earns that.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01L4rjxemTvgRwrCG6D2iK5D
@Flotapponnier
Flotapponnier merged commit 661986b into dev Sep 22, 2026
2 checks passed
@Flotapponnier
Flotapponnier deleted the fix/seo-retired-benches-and-thin-compare branch September 22, 2026 21:36
Flotapponnier added a commit that referenced this pull request Sep 22, 2026
…from 404ing the best converting page, retire the second dead answer (#2625)

Third audit. Two of these are mine.

#2620 moved the registry one-liner in front of the measured lead in the
product description. Registry descriptions run to a median of 166
characters against a 155 cap, so capSnippet dropped the lead entirely and
every one of the 220 product snippets lost its numbers: /products/invo
went from "Invo ranks #7 of 104 on trading builder fees collected at
$12.8K, #8 of 11 on Crypto trading app iOS App Store ratings at 4.23x
(p50, 24h)." to a vendor blurb with nothing measured in it. The vendor's
own SERP result already says what the product is; the ranks are the only
thing ours carries that theirs does not. A one-liner under 80 characters
still leads; a longer one follows the ranks, trimmed to its first clause.

#2618 turned the compare thin gate from noindex into notFound. That is
right for a pair that structurally has nothing to compare and wrong for
one whose data dipped for a render window: /compare/fomo-vs-invo sits at
exactly two live shared benches and earns 36 of the site's 289 clicks, so
one flapping bench would have 404ed the best converting URL on the
property. The 404 now keys on the number of SHARED benches, which is
stable, and a live-count dip goes back to noindex, which recovers. The
sitemap's 3/4 buffer in adhoc-pairs.ts stays exactly as written: it exists
for this flap and its comment says so. The audit proposed lowering it to
match the render floor; that would have removed the buffer precisely when
crossing it became expensive.

And the same retired-bench class as yesterday, second instance:
/answers/polymarket-vs-kalshi-fees references pm-fee-comparison too, 404s
too, and was advertised by the same hub. The filter added yesterday works;
the slug was missing from the set. Its YAML also hand-types "flat 2%",
"roughly $0.07" and a "$0.20 / $0.80" crossover, so it must not be revived
as written.


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

Co-authored-by: Claude Opus 5 (1M context) <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