Explanation
Variants and sourced sizes
Why every rocket comes in versions, how a figure names its source, and what a blank or a disagreement means.
Rockets change. Starship Block 1 is not Block 3, and a Falcon 9 from 2012 is not a Block 5. So the package never has one "Falcon 9"; it has the variants a source documents, each with its own sizes.

A figure names its source, or is blank
Every size, count and date in the data is a Figure: a value, the id of the source it came from, and a date where the source has one. A figure with no source is blank (value is null) and is never estimated to fill a gap.
import { SOURCES, variantOf } from "@johnmorrisdotca/uchusen-rockets";
const v3 = variantOf("starship", "v3");
const height = v3?.facts.height;
console.log(height?.value, height?.source, height?.source ? SOURCES[height.source].url : "");124.4 wikipedia-starship https://en.wikipedia.org/wiki/SpaceX_StarshipSOURCES is the table every id points into: title, publisher, address, the date on the page, and whether it was read directly, found by search or cited by another page.
Where sources disagree
Sources do not always agree. The figure keeps the value the package chose and lists the others in others, each with who said it and why it was not chosen.
import { variantOf } from "@johnmorrisdotca/uchusen-rockets";
const booster = variantOf("starship", "v3")?.facts.parts.booster;
for (const other of booster?.others ?? []) console.log(other.value, other.source, other.note);72 spacex-starship SpaceX's page as quoted by a search engine: 72 m (236 ft), rounded.
81 wikipedia-starship 81 m is Block 4's cell in Wikipedia's table, where colspans shift the columns. A site that printed it for Block 3 misread it: 81 m plus 52.1 m does not make 124.4 m.Words that must stay beside a number
Some figures are announced and not built, or stated in a form that is not the whole story. Such a figure has a brief: a few words that must stay beside the value wherever it is shown. figureWords writes a figure the way a table should.
import { figureWords, variantOf } from "@johnmorrisdotca/uchusen-rockets";
const v4 = variantOf("starship", "v4");
console.log(v4?.status, figureWords(v4?.facts.height, " m"));announced 142 m, announced, an estimateBlock 4 is announced, not built, so its height reads as an estimate. A reader cannot take it for a measured size.
Statuses
A variant's status is flown, announced, artist-model, test-vehicle or support. A rocket labelled as a real version uses only parts true for it. Anything that mixes parts is a custom build and says so.
Finding what exists
ROCKETS is a record by id. Each entry lists its variants in order and names its default.
import { ROCKETS } from "@johnmorrisdotca/uchusen-rockets";
for (const rocket of Object.values(ROCKETS).slice(0, 5)) console.log(rocket.id, rocket.variants.map((variant) => variant.id).join(" "));starship v1-flight1 v1 v2 v3 v4 2019
falcon-9 v1.0 v1.0-dragon v1.1 ft block-5 block-5-dragon-2
falcon-heavy falcon-heavy
dragon dragon-1 dragon-2 cargo-dragon-2 crew-dragon-inside
grasshopper grasshopperPLANNED_ROCKETS lists rockets with sourced facts and no shape yet.
Why it is built this way
A drawing that looks right and is wrong by ten metres is worse than no drawing. Because a mesh and a drawing come from the same sourced numbers, they cannot disagree with each other or with the table beside them. See Architecture.