Reference
Comparison methodology reference
Rules for /compare entries: two-sided verified, one-sided verified, pending; the type-level declaresWinner: false invariant; comparison-table rules and source-trail requirements.
Last updated: 2026-05-21
No winner declared
Every ComparisonEntity record carries the literal field declaresWinner: false as a type-level invariant. The build refuses to compile a comparison with true; an integrity guard greps the data layer and the page copy for "winner" / "best model" outside the explicit disclaimer; the rendered page carries an aside that states "No winner declared" in plain text. The discipline is structural, not editorial.
A comparison's job is to set verified attributes side-by-side. Readers compare against their own workload; the platform does not assert that one model is overall "better" than another along any axis we are not willing to source directly.
Two-sided / one-sided / pending
/compare groups every ComparisonEntity into one of three buckets:
| Bucket | Definition | Rule / note |
|---|---|---|
| two-sided-verifiedBoth models verified | Both compared models carry verificationStatus: 'verified'. | Indexable. Surfaced first on /compare. JSON-LD includes the full pricing/context/modality fields. |
| one-sided-verifiedOne model verified | Exactly one of the compared models is verified end-to-end; the other is partial or unverified. | Indexable. Surfaced second. The asymmetry is documented on the page; unverified fields render as the canonical label. |
| pendingNeither side verified | Both sides are partial or unverified. Kept structural until verification lands. | Noindex. Filtered URL set is also noindex per the global hub rules. |
Comparison table rules
The comparison table renders each attribute through a VerifiedField — never a raw value. If a model lacks a verified value for an attribute, the cell renders the canonical unverified-data label rather than "N/A" or a guess. Pricing cells render per-row, with each unit shown separately (no "total cost" column). Capability flags (extended thinking, vision input, tool use) render only when verified.
Limitations are recorded as a per-comparison limitations array and rendered as a Caveats section. The comparison's "use cases" field is a neutral list of workload classes each side is commonly chosen for; it is not a recommendation.
Source trail
Every comparison renders the union of both sides' citations at the bottom of the page (using mergeCitations(modelA.citations, modelB.citations)). The list deduplicates by URL so a citation that backs both sides appears once. Readers can audit every metric on the page directly against the underlying primary source.
Indexing rules
A comparison page is indexable only when at least one side is verified — enforced by shouldIndexComparison() in lib/should-index.ts. Pending comparisons remain reachable (so the catalogue stays honest about gaps) but emit noindex, follow metadata. Filtered URLs (e.g. /compare?provider=anthropic) are also noindex; the unfiltered base URL is the canonical.
See /compare for the live hub and the filter form.
Continue