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(Comparisontype and thecomparisonsarray). The data structure this page describes. - Internal —
data/legacy-redirects.jsonandnext.config.ts. The real redirect registry referenced above.
Last reviewed
- Page last reviewed: 2026-09-02