Skip to content

Trust & methodology

Comparison Methodology — How Comparison Pages Are Built

How BestAIAgent.in builds comparison pages: the evidence-ready gate, what a comparison page does and doesn't assert, and how duplicate-direction URLs are handled.

Comparison pages are easy to misuse — a "vs" page invites a verdict even when the underlying evidence doesn't support one. This page documents the actual gate a comparison must clear to be indexed, and what it never claims.

The evidence-ready gate

A comparison is defined in code as two entity references, a title, a status (evidence-ready or refreshing), and a list of editorial notes. It becomes publicly indexable only when both referenced entities independently resolve as verified, public entities — meaning each has verification: "verified" and at least one evidence record whose status is verified, authority is primary, and contentHash matches the sha256:[0-9a-f]{64} format. This check is a function, not a manual judgment call, and it's re-run against the current data every time the site builds.

If either side isn't yet verified, the comparison stays at status refreshing: the page is still reachable at its URL, but it's excluded from the sitemap and llms.txt, and its detail page is marked noindex.

What a comparison page asserts, and what it doesn't

  • It asserts that both entities' identities are independently verified against a primary source — nothing more.
  • It does not assert a winner. The notes field is free-form editorial text describing what's genuinely known and unknown about each side; it is never a numeric score or a ranked verdict.
  • It does not inherit pricing, benchmark, or capability claims from the identity check. Those remain unknown unless separately evidenced on the entity's own page.

Duplicate-direction URLs

When both an "A vs. B" and a "B vs. A" URL exist for the same pair, the non-canonical direction is a permanent redirect to the canonical one. These redirects are declared in the same registry used for every other legacy URL on this site — data/legacy-redirects.json, consumed by next.config.ts's redirects() — not a separate comparison-specific system.

A bug this exact check has caught

This isn't hypothetical: a comparison titled "Cursor vs GitHub Copilot" once had its a/b fields quietly pointing at two unrelated entities from an earlier URL migration. Nothing in the type system catches a title that doesn't match its own data — that has to be checked by eye when a comparison is added or reviewed. See CONTRIBUTING.md for the same example.

Related methodology pages

Source receipts

  • Internal — lib/catalog.ts (isPublicIndexableComparison, publicIndexableComparisons). The actual gate function this page describes.
  • Internal — lib/comparisons.ts (Comparison type and the comparisons array). The data structure this page describes.
  • Internal — data/legacy-redirects.json and next.config.ts. The real redirect registry referenced above.

Last reviewed

  • Page last reviewed: 2026-09-02