Data quality
This tab documents the quality programme behind the catalog: what every record is tested for, how those tests are defined, and what a passing result establishes. Results are published in three groups: each catalog in the database, the checks that read records and the sources they cite, and the systems built on the data. The calculations the checks rest on are set out on the Methods tab. This page explains how the pieces fit.
Programme scope
The current size of the programme, read live at page load. These counts describe how much is measured, not how good the data is. Each group's index carries its totals: checks holding, failing and skipped, records flagged, and review tasks open.
| Measure | Current |
|---|---|
| catalogs measured | |
| checks run | |
| checks failing |
Objectives
A specification database is only suitable to build on when its completeness can be established rather than assumed. The programme is designed around four commitments.
- Publish the report we act on internally. The same figures drive our own remediation queue, and the summary is served without an API key so the claim can be independently verified.
- Report records rather than scores. A score indicates how far the data can be trusted. A list of identifiers tells an engineer or an automated process exactly what to correct. Every failure names the records responsible.
- Preserve the distinction between unknown and false. A value nobody has established remains null rather than receiving a default, because a default converts an open question into a settled answer and the record is never revisited.
- Report completeness and consistency separately. A combined index would allow a contradiction in the data to be offset by strong coverage elsewhere.
How we keep the data right
What is done to the catalogue, on a schedule and by hand, and where you can check each one yourself. None of it edits a record on its own: every automated step files a proposal or a plan, and a person decides.
| Practice | What it does | Where to check it |
|---|---|---|
| Record rules | Every file is validated against its schema daily, no company may appear under two ids, and no firearm may carry fields that cannot all be true at once (a rimfire cartridge in a locked short-recoil action, a rail on a gun made before rails existed). | Record checks |
| Checks against models | A record's figures are held to models of the physics: what a magazine of rounds weighs, how dense a gun of its size and materials can be, the energy a bullet at a velocity carries, how far anything flies with no air. Each model's constants are quoted from a published source, and a figure outside its band is a finding for a person, never a correction. | Plausibility checks |
| Corroboration | A figure stated by one source is compared with an independent one. Agreement within the published tolerance is evidence; a disagreement is listed for a person to settle from a quoted source. | Corroboration checks |
| Link checks | Every manufacturer website and every cited source is asked weekly whether it still answers and is still the page cited. Dead pages, parked or hijacked domains (casino and betting pages on lapsed maker domains) and moved sites are findings; a site that refuses an automated reader is counted as unverified, never as passing. | Link checks |
| Archived copies | A source that no longer answers is replaced by its last Wayback Machine capture that answered 200, so the citation still shows what its author read. The capture keeps the original page's kind. A source the archive never captured is removed only where the record cites something else. | provenance.sourceKinds[].archivedFrom |
| Manufacturers against Wikidata | Every manufacturer is compared with Wikidata for its website, founding year, country and whether it still trades. A match is trusted only when Wikidata records the company making something and its country agrees; only empty fields are filled, and every disagreement goes to a person. | Manufacturer checks |
| Source hierarchy | Every cited page is classed by what it is: the maker, a standards body, a government, a reference work, press, a retailer or a forum. Each maker's own website is known from its record. Sites the catalogue leans on that have no class yet are listed to be classified. | Source checks provenance.sourceKinds |
| Cited from the maker | A record citing a page on its own manufacturer's website (a page, not the front door, and never another maker's) carries the mark. Cited is not verified: the page may still disagree with a figure. | Source checks provenance.makerSource |
| Verification against the maker's page | Redback, the data agent, reads a record's maker page and reports what it states for each figure, with the sentence it came from. A figure whose sentence is not on the page is dropped, the model is never shown our value, and agreement uses the published tolerances. Every task, what it proposed and the pages it read are published on the record. | Redback provenance.checks |
| A person decides | Nothing an agent or check proposes reaches a record until a person accepts it. An accepted verification lists the confirmed figures in verifiedFields; a figure the maker states differently is a correction for a person, never an automatic change. | provenance.verifiedFields |
| Fitment scenarios | The compatibility engine is asked realistic questions with known answers on a schedule, and every fit it returns is held to rules about the whole catalogue. | Fitment |
| Published, failures included | Every run is published as it happened, and each is compared with the run before it, so a report says what was fixed, what is new and what is still open rather than a number that moved for reasons nobody wrote down. | Records and sources index |
What is measured
Every catalog page applies the first two measures, in the same order. The record and source checks and the systems add four more, each asking a different question of the same data.
| Measure | Question | Example finding |
|---|---|---|
| What is missing | Whether a value is present at all. Null and empty string are both treated as absent, so a column of blanks is never reported as complete. | 594 manufacturers hold no website. This is an outstanding gap rather than an error in the data. |
| What contradicts itself | Whether a statement the catalog makes contradicts another statement it makes. | A company recorded as closing before it was founded, or a firearm attributed to a manufacturer the catalog does not hold. |
| Plausibility | Whether a record's figures could all be true at once, judged against a model of the physics: a loaded weight against its empty weight and a magazine of rounds, a weight against the gun's size and materials, a cartridge's energy against its bullet and velocity. | A rifle's empty weight recorded as its loaded weight, so a full magazine appears to weigh nothing. |
| Corroboration | Whether an independent source states the same figure. One source is a claim; two agreeing within tolerance is evidence. | A barrel length that no second source repeats, or that a reference work states 15 percent differently. |
| Provenance | Where each figure comes from and whether that source still says it: the kind of source cited, whether the maker's own page states it, and whether the page is still there. | A figure whose only citation is a retailer listing, or a maker domain that now serves a casino. |
| Systems | Whether what is built on the data answers correctly: the compatibility engine asked questions with known answers, and the API and MCP server held to their published contract. | A rail optic reported to fit a gun with no rail, or an endpoint answering in a shape its reference does not describe. |
The two are reported separately by design. A catalog can be 98 percent complete and still record a company as closing eleven years before it opened, and a single combined figure would move for only one of those conditions.
Results pages
Results are published in three groups, as the sidebar lists them, so an assessment of one dataset does not require reading the others. Each group opens with an index: one table of everything in it, with what holds, what fails and what was skipped.
Database
Each catalog's own report: how full its fields are and whether its records contradict each other, read live from the database.
Records and sources
The suites that read every record and the sources it cites: rules, invented data, physical plausibility, cartridge arithmetic, materials, agreement between sources, source quality and dead links.
Systems
What is built on the data, tested on a schedule, and the agent that works the review queue the other pages fill.
The methods behind the checks
A check that calculates is only as good as its model, and an answer the API works out is only as good as its formula. Each has a page on the Methods tab with its equations, the published figures a model was fitted to, the sources of every constant, and the checks or endpoints that use it. The evidence pages set out how sources are ranked and every reference the methods cite.
Every check that rests on a method links to it from its own row, and every finding it raises carries the figures it read, so a reader can redo the arithmetic. A check marked as rules with no calculation holds a record to a stated rule and needs no model.
Interpreting a result
Each check returns one of three verdicts. None of them says anything about whether the values themselves are accurate.
| Result | What it means |
|---|---|
| Pass | confirms that no record in the catalog fails the check. It does not establish that the values are correct. |
| Fail | indicates that at least one record does, and the affected identifiers are listed alongside it. Failures are published rather than suppressed, and most warrant review before correction, since the check itself is sometimes the stricter of the two. |
| Skipped | means the run could not ask the question: a plan it held no key for, a record the catalogue does not have yet, or a source that refused an automated reader. A skip is neither a pass nor a failure, and each page names what was skipped and why. |
Coverage bars encode width only and carry no colour. Colour would grade a field as good or poor, and a description nobody has written yet is not a defect.
Sources
Every figure is read from the database when the page loads. The summary is public and needs no API key, so the claims on these pages can be verified directly. The two endpoints that return full identifier lists are the operational worklist and require an Enterprise plan. Each row links to its entry in the API reference.
| Endpoint | Plan | Returns |
|---|---|---|
GET/v1/data/gaps | Public | The complete report: coverage for every tracked field, the verdict for every check, and up to five identifiers behind each failure. |
GET/v1/data/gaps/history | Public | One row per day from the daily snapshot: how many checks ran and failed, how many records were behind those failures, and weighted field coverage. This is how the figures above are judged over time. |
GET/v1/data/gaps/records | Enterprise | The records missing a given field, returned as identifiers with pagination. This is the endpoint an automated pipeline consumes. |
GET/v1/data/gaps/checks/{checkId} | Enterprise | Every identifier failing a given check, returned in full rather than as a sample. |
GET/v1/data/coverage | Enterprise | Per-field completeness for each table as a single percentage. The same question the coverage tables above answer, in the shape a dashboard wants. |
GET/v1/data/confidence | Enterprise | The records whose confidence score falls below a threshold you set, so a sourcing run can start with the weakest. |
The trend endpoint returns this. No key, no signup, no sales call.
{ "success": true, "data": { "days": 90, "runs": [ { "ranOn": "2026-09-15", "ranAt": "2026-09-15 03:00:00", "scope": "all", "checksTotal": 8, "checksFailing": 1, "recordsFailing": 3, "coveragePct": 62.4 } ] }}Nothing on this tab is a build time snapshot, so a record corrected today is reflected the next time the page is opened.
Why this is public
Firearms specification data is fragmented, inconsistently recorded and frequently contradictory across sources. Any catalog built from it has gaps. Publishing ours is a deliberate position, and it rests on four things.
- The source material is the hard part. Specifications differ by year, factory, batch and market; manufacturers retire pages; importers and retailers restate figures they did not measure. A catalog that claimed to be complete would be describing a body of data that does not exist in that form.
- A vendor who will not say what is missing is not a vendor without gaps. Every dataset in this field has them, so the difference between suppliers is whether you find out before you build or afterwards.
- Every figure on these pages is served by a public endpoint. You can fetch the same report we act on, disagree with it, and hold us to it, without an account and without asking.
- The snapshot is daily and the history is published with it, so the claim is not that the data is perfect today. It is that the direction is visible and on the record.
What this does not tell you
- A filled field is not necessarily a correct one. Coverage records whether a value is present, never whether it is accurate. A firearm with the wrong founding year is counted as fully covered.
- These checks find records that disagree with each other. A record that is confidently, consistently wrong passes every one of them.
- Whether a cited website still resolves is not part of a catalog's report. The link checks ask every published link weekly, and their results are on their own page.
- These figures are our own measurement of our own data and do not constitute a third party audit. The endpoints behind them are public so that the results can be verified rather than accepted.