LLM World — Methodology

What counts as evidence here, what the record statuses mean, and the rules every figure on this site had to pass.

How facts get into this dataset, what makes one trustworthy, and what happens when we get one wrong.

Companion to TAXONOMY.md (what things are called), MASTER-EVOLUTION-PLAN.md (what we intend to support) and EXECUTION-ORDER.md (in what order).

Written at Stage 0. The rules here are enforced by scripts/validate-data.mjs from Stage 1 onward; where a rule is not yet enforced it says so.

The governing principle:

This project will never be the fastest to publish. It should be the easiest to check.

1. Never estimate

An undisclosed value is null and renders as "Not disclosed". It is never inferred, interpolated, or carried across from a similar model.

Most proprietary labs do not publish parameter counts. null is the correct and complete answer there — not a gap to be filled. A dataset that guesses once cannot be trusted anywhere.

The single exception is provenance.status: "estimated", which exists for dates that are known to be approximate and are labelled as such in the UI. It is not a licence to estimate specifications.

Enforced today.


2. What counts as one record

One record per separately named, separately shipped model.

(see TAXONOMY §7).

This matches the existing convention: Claude 3 Opus, Claude 3.5 Sonnet and Claude Sonnet 4.5 are three records sharing the Claude family, because the lab named and shipped them separately.

Worked example — the Grok-1 duplicate

The dataset currently holds two records, Grok-1 and Grok-1 (open weights). Same model, same name; the second exists to mark the later weights release.

Under this rule that is one record with two events:

"events": [
  { "type": "announcement",          "date": "2023-11-04", "sources": ["src-…"] },
  { "type": "weights_availability",  "date": "2024-03-17", "sources": ["src-…"] }
]

Two records for one model overstate the model count, split its sources, and make the same lab look twice as productive as it was. Merging them is part of the Stage 1 migration.

The two records also disagree on access.open_weights — false on the first, true on the second — which exposes a rule the schema needs:

access describes current state. events[] records when it changed.

The merged record is open_weights: true, and the weights_availability event is what dates that change. The same applies to any access fact that can flip: a model that later gains an API, or has its weights withdrawn.

A consequence worth stating: "was this model open at the time?" is a question about events, not about access. Analytics that plot open-weight share over time must read the event, not the current flag, or they will retroactively report Grok-1 as open in November 2023.

Event types

announcement · paper · public_availability · api_availability · weights_availability · major_update · retirement

Each event carries its own sources[]. An event without a source is not recorded.


3. The canonical date

A model has many dates. The timeline needs one.

Canonical date = the announcement event. Where no announcement is evidenced, fall back to the earliest evidenced event of any type.

Rationale: announcement is the date almost universally reported, and it is what every existing record already encodes — PaLM sits at 2022-04-04, its research blog post. Choosing availability instead would silently re-order the entire timeline against every existing source, which is a change no reader could see or verify.

Where announcement and availability differ materially, the model page shows both. The timeline position is the canonical date and says which one it is.

Derived at build time from events[]. Never stored separately — see §4.


4. A fact is stored once

Every fact has exactly one home in the schema. Anything else is derived at build time.

This is not tidiness; it is a trust rule. Two copies of a fact will eventually disagree, and a dataset that contradicts itself cannot be checked by a reader.

Current examples being resolved in Stage 1:

FactStored twice asResolution
Open weightsaccess.open_weights and the open-weights tagKeep access; drop the tag
Multimodalitythe multimodal tag and modalitiesDerive from modalities
Long context—Derive from context_window

The open_weights duplication is currently guarded by a hand-written cross-check in validate-data.mjs. Removing the duplicate removes the need for the guard.

Charter §18 proposes a dates object alongside events[]. Rejected under this rule — events[] is strictly more expressive, and dates is derivable.


5. Sources and authority

Every record cites at least one source. Every source is an object with a stable id so that individual facts can reference it (Stage 5).

{
  "id": "src-001",
  "url": "https://www.anthropic.com/news/…",
  "archived_url": "https://web.archive.org/web/20260809…/https://…",
  "retrieved": "2026-08-09",
  "publisher": "Anthropic",
  "type": "official_announcement",
  "authority": "primary"
}

Authority

AuthorityMeaning
primaryPublished by the organisation that made the model
secondaryIndependent reporting, analysis or third-party benchmarking
discoveryUsed only to find that something exists. Never cited as evidence for a value.

Type → authority

typeDefault authority
official_announcementprimary
official_documentationprimary
official_model_cardprimary
official_repositoryprimary
technical_paperprimary when authored by the releasing lab, otherwise secondary
independent_benchmark, independent_analysissecondary
newssecondary

A paper about a model, written by people who did not make it, is secondary. The mapping is a default, not an override: authority is stated per source.

Discovery sources

Third-party trackers (aireleasetracker.com, llm-timeline.com, llmgateway.io) and Hugging Face org listings are discovery only. Use them to learn that something exists, then verify against the lab's own announcement and cite that.

Two are additionally constrained legally: llmgateway's catalogue is AGPL and aireleasetracker is an EU database. Neither is mirrored.


6. Mutable sources require an archived citation

A page that shows current state does not prove a past fact. Citing openai.com/pricing for a 2023 price is a citation that has already rotted — the page no longer contains the claim.

Any fact taken from a mutable page must carry archived_url and retrieved. A dated snapshot is permanently checkable; a live URL is not.

Required for:

Recommended everywhere else — announcements are edited more often than people expect.

Where no snapshot exists, create one before citing. Where one cannot be created, the fact is not recorded.

Enforced for pricing since Stage 7: a pricing[] entry whose source has no archived_url fails the build. Since the price-history work it must also cite a source whose authority is primary — §5 has always said a secondary source cannot back a value, but nothing checked it, and four prices reached production citing Wikipedia articles that state no figure at all.

One URL, many snapshots, is not a duplicate citation

Two source ids for one URL normally read as two independent corroborations when they are one, and the validator rejects that. A price history is the exception: Cohere's pricing page captured in April 2024 says $0.50 per million and the same page in September says $0.15. Those are different documents that happen to share a URL, and each observation must cite the snapshot that states it.

So the test is the snapshot, not the URL. Two sources for one page with no archived_url, or with the same one, remain an error.

A snapshot dates itself, not the fact

Pricing entries carry observed_on, never effective_from. A capture proves what a page said on the day it was captured. It does not say when that price started, and assuming otherwise invents a fact.

The first version of the pricing extractor got this wrong. It labelled every price with the model's announcement date, so a February 2026 capture of OpenAI's documentation showed GPT-4o at $2.5/$10 "from May 13, 2024" — a launch price that was never charged, since GPT-4o launched at $5/$15 and was cut later. Seven of sixteen records had the snapshot more than sixty days after the date being claimed; one was 1,076 days.

The same caution applies to any field read from a page that changes. Ask what date the evidence actually carries, and publish that one.


7. Record the claim, not the number

Benchmark scores are dated assertions by named parties, not properties of a model.

{
  "name": "GPQA Diamond",
  "score": 88.7,
  "evaluation_type": "vendor_reported",
  "reported_on": "2026-08-01",
  "sources": ["src-004"]
}

Consequences of this framing:

The disagreement between them is itself data.

required, because who ran the evaluation is more informative than the score.

number claiming to rank models hides exactly the methodology this project exists to expose.

The same framing applies to any vendor claim about capability.


8. Conflicting evidence is published, not resolved

Where credible sources disagree, both values are recorded with their sources, and the record is shown as conflicting.

"evidence": {
  "context_window": [
    { "value": 128000, "sources": ["src-002"] },
    { "value": 200000, "sources": ["src-007"] }
  ]
}

Silently picking a winner is the most damaging thing this dataset could do, because it is invisible to the reader. Showing the disagreement is more useful than resolving it and more honest than hiding it.

provenance.status: "conflicting" is already a valid status but currently has nowhere to put the conflict. Stage 5 gives it one.


9. Provenance status and confidence

A record is verified when every value it asserts is found in a primary source. A null asserts nothing, so an undisclosed parameter count does not block verification — the opposite rule would mean no proprietary model could ever be verified, which contradicts §1.

Where verification was done by checking that a value appears verbatim in an archived snapshot, the reason says so and names the form matched (context window (1M)). That is evidence, not proof: a reader can see the basis and disagree with it. Do not write a reason that hides the method.

Known gap: null currently cannot distinguish "the lab does not publish this" from "nobody has researched it yet". Those are very different facts and the Data Quality page will misreport coverage until they are separable. Fixing it needs a small additive field; it is not blocking, and it is not yet done.

StatusRequirement
verifiedEvery asserted value traced to a primary source
partially_verifiedDate or key facts corroborated only by secondary sources
conflictingCredible sources disagree; both recorded per §8
estimatedDate known to be approximate; labelled as such in the UI
unverifiedRecorded from a discovery source, not yet checked. Not publishable — a holding state during research only

confidence (0–100) is currently hand-set, which makes it the least principled field in the schema. Under this methodology it is defined by evidence, not by feel:

BandMeaning
90–100Primary source for date and all recorded specifications
70–89Primary source for the date; some specifications secondary or absent
50–69Date corroborated only by secondary sources
< 50Not publishable

Where the band is fully determined by the evidence, confidence should be derived at build time rather than stored. Stage 5 makes that possible; until then it is hand-set within these bands.


10. Corrections are public

Every fact in this dataset already carries a complete audit trail, because the dataset is a JSON file in git. Almost nobody exposes this, and it is one of the cheapest trust features available here.

Policy:

changed it**. Not "update data".

stays visible.

have always been right.

Requires no schema change — it needs commit discipline now and a build-time read of git history at Stage 3.


11. Coverage is stated, not implied

The dataset covers 85 models from 16 labs. It is not complete and does not imply completeness.

The Data Quality page (Stage 3) states plainly:

weekly in CI; the result is currently private and should be published

never disclosed

Naming the gaps is more credible than a number that implies there are none. A reader who can see what is missing can calibrate everything else.


12. AI-assisted research

AI may be used to discover candidates, locate sources, and draft records.

AI may not be the source of a fact. Every value traces to a cited document a reader can open. A model's recollection of a specification is not evidence, and is exactly the kind of plausible-but-unverifiable claim this dataset exists to displace.

Every record reaches the dataset through a human-reviewed change with sources attached. No automated pipeline publishes directly (charter §45).

See how every record scores against this →
Browse the records themselves →