⚠ In development — prototype · Project management and author: Adrien Normier (with grateful acknowledgment to Jonathan Justman and V. Nakache for help in the project's earliest steps) · Ontological development grounded in the works of the Cosmic Footprint Society (2024 ISSI Forum on Cosmic Footprint) · Dataset © Adrien Normier · Licence: SSR-GPL v2.0
The Factory is the registry's single licensed maker of values nobody measured. When a real object is missing a parameter — a diameter, a mass, an orbit plane — or when a region of the scene has no catalogued content at all, the Factory supplies an explicit, modelled estimate. It never measures and never invents ad-hoc: every output is deterministic from a seed and a paper pack (a named, swappable bundle of published distributions), and every value is tagged so it reads as an estimate wherever it appears — synthetic and fitted content renders dimmed or translucent, and each factory-supplied parameter is listed per object with the method that produced it.
The Factory is a watertight block (architecture §4): it imports only the shared record contract, it never fetches data, never reads disk, never emits measured records. Registry truth (from the ingest block) always comes first; the Factory only fills what truth left empty. It is the in-repo embryo of an external Factory service — stateless, reproducible, replaceable behind one door.
The Factory's published model spans three domains, mirroring the functional specification:
| Domain | Generates | Origin |
|---|---|---|
| Astrophysics | stars, planets, moons, galaxies, surfaces, atmospheres | NATURAL |
| Exobiology | abiogenesis, biospheres, biosignatures (reserved — not yet generating) | NATURAL |
| Footprint | infrastructure, emissions, debris, maneuver exhaust, deposition footprints | ARTIFICIAL |
Each domain offers the same three operations:
This is the current, honest inventory of what the prototype Factory
implements. Everything below is reached through the Factory's single
public door (src/factory/index.ts); nothing else in the
codebase calls its internals.
Reached via fillSync / fillStreaming,
budgeted by a scale preset (TINY → HUGE) and the paper pack's category
mix. All output is SYNTHETIC, seeded and
reproducible, rendered dimmed — a setting, never a census.
| Function | Generates | Origin |
|---|---|---|
emitGalaxiesnatural/galaxies.ts | synthetic galaxies populating the Local Group beyond the catalogued members, each with a seeded disc orientation | NATURAL |
emitStarsnatural/stars.ts | synthetic stars filling the Milky Way beyond the Gaia catalogue's reach — circulating about the GALACTIC CENTRE (8.1 kpc along +x̂gal, clockwise seen from the north galactic pole) on the cited flat 229 km/s curve (Eilers et al. 2019, DOI); the pre-2026-07-21 version circled the frame origin (= Sol) — a display fix on SYNTHETIC data, seed/pack unchanged | NATURAL |
emitGalacticStarsnatural/milkyway.ts | “generate galaxy from image” — ≈30,000 field stars sampled from the NASA/JPL-Caltech (R. Hurt) Milky Way structure map: luminance drives the spiral-arm density (CDF sharpened ^1.5, circular cutout), the map's colour tints each star, with a bulge-thickened exponential disc and a flat 229 km/s rotation curve (Eilers et al. 2019, DOI). An artist-informed density proxy, not a stellar census (real stars are the Gaia layer) | NATURAL |
emitPlanetsnatural/planets.ts | synthetic planets on log-uniform orbits around synthetic stars | NATURAL |
emitMoonsnatural/moons.ts | procedural moons on the generated planets | NATURAL |
emitOrbiters · emitLandersartificial/artifacts.ts | synthetic artefacts (orbiters, landers) on the synthetic bodies — the Footprint domain's backdrop | ARTIFICIAL |
Reached via fitNode — the LIGHT-mode half of the
VIZ→Factory pull. It supplies only what the registry left empty, so a
real but under-described object can still be drawn and inspected.
| Function | Completes | Origin |
|---|---|---|
fitNodefit.ts | radius ↔ mass power laws and a class-procedural generic surface for imagery-less known planets (most exoplanets), each listed as “provided by factory” with its method | matches the host |
classifyPlanetnatural/planetclass.ts | the planet's coarse class from MEASURED parameters only — telluric / lava-hot telluric / Neptunian / cold–hot gas giant — driving which generic procedural texture the fit assigns, with the class + its published basis NAMED in the inspector's “provided by factory” line. Thresholds are taken from the literature, never invented: rocky bound 1.6 R⊕ (Rogers 2015 — the same bound the telluric census uses), giant bound 6 R⊕ (Kepler size classes, Borucki et al. 2011), mass regimes 2 / 130 M⊕ (Chen & Kipping 2017 — the same regime boundaries as the mass–radius law above), hot-giant T_eq ≥ 900 K (alkali-haze appearance class, Sudarsky et al. 2000 / 2003), lava-hot telluric T_eq ≥ 1500 K (silicate-melt regime, Chao et al. 2021), with the zero-albedo T_eq = T_eff·√(R★/2a) computed only when the host's sourced temperature + radius and the orbit exist. Missing radius AND mass ⇒ no class (the plain generic default — absence never invents a class); no computable irradiation ⇒ no hot/cold claim. Deterministic, seedless; the class render is a GENERIC texture, never imagery (this is the honest equivalent of NASA's Eyes-on-Exoplanets class-based artist renders — no per-planet exoplanet texture database exists to ingest) | NATURAL |
fitTrajectoryartificial/trajectory.ts | the multistage maneuver catalog: for each phase boundary it classifies a same-parent burn (Δv), a patched-conic handover, a landing or a launch — the inspector's per-segment voyage breakdown | ARTIFICIAL |
fitDepositionfit.ts | the ballistic plume footprint of a lander on an airless body (≈ v²/g), oriented by the curated approach bearing where one exists. An unphased surface point with no catalogued mass (curated impact scars, artifacts) inherits the landing-class envelope at the unknown-mass default — an OWNER-CHOSEN knowledge-marker visual (2026-07-02: "return the phantom envelopes, it was nice"), MODELLED and labelled, not a fitted plume. Footprint outlines/fills are drawn conformally ON the sphere (geodesic ellipse sampling, sphereellipse.ts) — never a flat tangent-plane ellipse | ARTIFICIAL |
asteroidShapenatural/asteroidshape.ts | the seeded irregular 3D form (“potato”) of a minor body with a measured radius but no observed shape model — a direction-displaced icosphere with baked lambert shading, emitted as plain position+colour arrays (tier-pure, no THREE). The SIZE is real (the node's radius); the SHAPE is modelled — the record card reads “3D shape: procedural [factory · seeded, modelled]”, distinct from an observed radar/GLB mesh | NATURAL |
habitableZonenatural/habitablezone.ts | the habitable annulus of a star — its luminosity derived from the SOURCED radius + effective temperature (Stefan–Boltzmann). There is no single “the” habitable zone, so the method is SELECTABLE among five published models: Kopparapu 2014 (the T_eff-dependent S_eff polynomial, more accurate across spectral type, the default), flux-scaled (the simple sqrt(L) scaling of the solar boundary distances, Kopparapu 2013), Kasting 1993 (constant effective-flux boundaries — runaway/maximum-greenhouse conservative, recent-Venus/early-Mars empirical optimistic — scaled by sqrt(L); DOI), Selsis 2007 (its OWN scaling law: each boundary distance is a quadratic in T_eff × sqrt(L), eqs. 2-3; DOI) and Kaltenegger & Sasselov 2011 (the equilibrium-temperature band 175 K < T_eq < 270 K from their §4, converted to distances via T_eq = T_eff·√(R★/2a)·(1−A)^¼ at the stated Earth-like Bond albedo A = 0.29 — one published band, so its conservative and optimistic limits coincide; DOI). Conservative (moist … maximum greenhouse) and optimistic (recent Venus … early Mars) limits; absent radius or temperature ⇒ no estimate (never invented). Drawn as ring overlays (incl. all-methods overlay) + read out in the inspector; modelled, declared. The Kasting boundaries, Selsis coefficients + the T_eq bounds are taken verbatim from the papers (A5) | NATURAL |
hillRadiusnatural/hillsphere.ts | the Hill sphere of a body — the radius within which its own gravity dominates over its primary's and it can hold satellites, r_H ≈ a(1−e)(m/3M)^⅓ at periapsis. Computed only from the SOURCED orbit (a, e) and the body + primary masses; any missing ⇒ no estimate (never invents a mass). Drawn as a faint translucent shell around a framed body | NATURAL |
deriveGalacticOrbit · circularVelocityMs · escapeVelocityMs · galacticAccel · galacticPotentialnatural/galacticorbit.ts | the galactic orbit of a single star — a test-particle trajectory integrated (fixed-step RK4, ≤512 samples, deterministic) in the Irrgang et al. 2013 Model I Milky Way potential (revised Allen & Santillán 1991: Plummer bulge + Miyamoto–Nagai disc + truncated spherical dark halo; DOI), from the star's MEASURED position + full 3-D space velocity and the galactic-centre offset taken from registry data. NOT a Kepler ellipse about the centre: the Galaxy's mass is extended, so the measured rotation curve stays near-flat across 5–25 kpc (Eilers et al. 2019, DOI; the classic flat-curve result: Rubin & Ford 1970, DOI) where a point-mass orbit would fall as r−½. The paper's own derived anchors — vc(8.40 kpc) = 242.0 km/s and vesc,⊙ = 616.4 km/s — are reproduced in the test file; energy conservation is pinned <10−6. MODELLED, display-only, single-element on-demand (§4.5, never a population sweep) — feeds the star-trajectory line (so=gal); a star without a measured full 3-D velocity ⇒ no orbit (never invented); an unbound state is flagged UNBOUND, never hidden. Caveats stated in the note: static axisymmetric model (no bar/spiral). The registry's stellar velocity convention (2026-07-21) is the Sun's FULL galactocentric motion — vc = 229 km/s (Eilers et al. 2019, DOI) + the measured solar peculiar motion (U,V,W)⊙ = (11.10, 12.24, 7.25) km/s (Schönrich et al. 2010, DOI) — whose total solar tangential speed (241.2 km/s) agrees to 0.8 km/s with this potential's own vc(8.40 kpc) = 242.0 km/s: one convention, no drift-vs-potential mismatch | NATURAL |
deriveOverdensityRadius · zFromComovingDistanceMnatural/overdensityradius.ts | the overdensity radius RΔ of a galaxy cluster from its published overdensity mass MΔ — the identity that DEFINES the SZ/X-ray mass convention, inverted: MΔ = (4/3)π·Δ·ρcrit(z)·RΔ³ with ρcrit(z) = 3H(z)²/8πG, flat ΛCDM (Planck 2018 results VI, DOI). Δ = 500 by default, matching the Planck PSZ2 catalogue's MSZ ≡ M500 convention (DOI) — an OVERDENSITY radius, deliberately never labelled "virial". Verified against published MCXC (z, M500, R500) rows (Piffaretti et al. 2011, DOI: A2029 · A0085 · A2163 reproduce to <0.2% under that paper's own cosmology). zFromComovingDistanceM recovers a ΛCDM-placed node's catalogued redshift by inverting the comoving-distance placement (Hogg 1999, arXiv). MODELLED, single-element on-demand (§4.5) — feeds the zoom relevance floor at a cluster marker; missing mass/redshift ⇒ no estimate (never invented) | NATURAL |
yarkovskyDrift · yarkovskyColoryarkovsky.ts | the MODELLED Yarkovsky semimajor-axis drift da/dt (m/yr, signed: + prograde/outward, − retrograde/inward) of a small body — the slow secular push from anisotropic thermal re-emission. A transparent ORDER-OF-MAGNITUDE scaled diurnal relation, da/dt ∝ cos(γ)/(D·ρ·√a), with the constant anchored to (101955) Bennu's measured −284 m/yr; no thermal integration. Reported at 2 sig-figs with a disclosed model equation, a per-input variance budget (obliquity 45% · thermal inertia 30% · density 15% · diameter 10%) and a ~factor-2 1σ (k=1) — “modelled, not a measurement”. yarkovskyColor is the pure diverging blue/red tint for a future overlay | NATURAL |
| Function | Derives | Origin |
|---|---|---|
deriveExhaustPuffsartificial/exhaust.ts | maneuver exhaust puffs located at navigation-arc Δv discontinuities, with Tsiolkovsky propellant masses — upper-bound proxies, limits declared in the method article | ARTIFICIAL |
deriveBioburdenartificial/bioburden.ts | the maximal viable-spore burden a landed/impacting mission could deliver while satisfying the planetary-protection standard in force at its launch (the compliance regime is computed registry-side and passed in; the factory models the spore count from the regime + the craft's exposed area) — MODELLED upper bound, method & the per-body governance metric in the method article | ARTIFICIAL |
Closed-form, two-body preliminary-design maths for the trajectory-play and student mission-planning front-ends. Everything here is MODELLED / PROJECTED (patched-conic / Lambert fidelity) — real preliminary-design accuracy, never an integrated truth, never baked into the registry; it feeds projected mission overlays only.
| Function | Computes | Origin |
|---|---|---|
solveLambertdynamics/lambert.ts | Lambert's two-point boundary-value problem — given r1, r2, a time-of-flight and µ, the transfer conic's departure/arrival velocities (universal-variable / Stumpff formulation, prograde or retrograde). Refuses degenerate or collinear geometry rather than invent a plane | ARTIFICIAL |
hohmannTransferdynamics/transfer.ts | the Hohmann transfer between two coplanar circular orbits — the two burn Δv's, the total budget, the transfer-ellipse semi-major axis and the time of flight (LEO→GEO ≈ 3.9 km/s) | ARTIFICIAL |
escapeC3FromVinf · injectionDvForVinfdynamics/transfer.ts | the escape characteristic energy C3 = v∞² and the injection Δv from a circular parking orbit onto a hyperbola of a given v∞ | ARTIFICIAL |
tsiolkovskyPropellant · tsiolkovskyMassRatiodynamics/transfer.ts | the rocket equation — propellant mass mp = mdry·(eΔv/ve−1) and the wet/dry mass ratio for a Δv budget (the reusable form of the propellant law the exhaust layer computes inline) | ARTIFICIAL |
porkchopGriddynamics/porkchop.ts | the launch-window survey — over a grid of departure × arrival dates it solves Lambert between two bodies (their ephemerides supplied as callbacks — tier-pure) and records the departure C3 (or total Δv) per cell, with the finite minimum; the porkchop plot the mission-planning UI contours | ARTIFICIAL |
elementsToStatedynamics/applydv.ts | evaluate a conic at a Julian Date → the full state vector (position + velocity) in the parent frame, for both branches (elliptic e<1, hyperbolic e>1) — the inverse of the registry's state→elements recovery | ARTIFICIAL |
applyDeltaV · progradeDeltaVdynamics/applydv.ts | grab an object, drag a velocity gizmo: add an instantaneous Δv to a state and recover the NEW conic it flies (a prograde burn raises apoapsis, retrograde lowers it; a large enough burn reaches escape, e≥1) — the analytical trajectory-play core | ARTIFICIAL |
integrate · totalEnergydynamics/nbody.ts | a small DETERMINISTIC symplectic (kick-drift-kick velocity-Verlet leapfrog) n-body integrator over a bounded set of gravitating sources (Sun + planets) plus massless test particles — fixed timestep so the result is permalink-reproducible; for close encounters / the chaotic regime. totalEnergy is the conserved-energy invariant it preserves | ARTIFICIAL |
Every run is a pure function of (seed, paperPack, request).
The shipped pack is proto-uniform@0 — honest log-uniform
toy distributions for stress-testing, not literature models; real packs
(a Kroupa initial mass function, measured size–frequency laws) replace
it without touching any caller. Scale presets TINY · SMALL ·
MEDIUM · LARGE · HUGE set the node budget; the same seed and pack
reproduce the same scene bit-for-bit, and every bake is recorded in the
append-only archive.
Epistemic transparency is a hard rule. Factory output is always visibly an estimate: synthetic populations render dimmed and translucent against the measured catalogue, and each fitted parameter is named in the object's inspector under “provided by factory”, with the model that produced it. The Factory never overwrites a registry value and never passes an estimate off as an observation.