Every non-root body (parentId set — the root/star case is the one
documented exception, see CelestialBody.parentId) with neither orbit
nor fixedPosition set. CelestialBody requires both keys (not optional)
specifically so this can't happen from an accidental omission in
TypeScript — but orbit: null, fixedPosition: null is still a value a
caller can write deliberately, and plain JSON can omit both keys
outright. Either way it's unplottable: render.ts's own
resolveWorldPosition silently places such a body at the system's
origin, [0,0,0], with no error. This flags that case explicitly rather
than leaving it as a quiet default. (It used to test orbit === null,
which missed the omitted-key case — the plain-JSON input it exists for.)
Every non-root body (parentId set — the root/star case is the one documented exception, see CelestialBody.parentId) with neither
orbitnorfixedPositionset. CelestialBody requires both keys (not optional) specifically so this can't happen from an accidental omission in TypeScript — butorbit: null, fixedPosition: nullis still a value a caller can write deliberately, and plain JSON can omit both keys outright. Either way it's unplottable: render.ts's own resolveWorldPosition silently places such a body at the system's origin, [0,0,0], with no error. This flags that case explicitly rather than leaving it as a quiet default. (It used to testorbit === null, which missed the omitted-key case — the plain-JSON input it exists for.)