The Factory

⚠ 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

What the Factory is

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.

Three domains

The Factory's published model spans three domains, mirroring the functional specification:

DomainGeneratesOrigin
Astrophysicsstars, planets, moons, galaxies, surfaces, atmospheresNATURAL
Exobiologyabiogenesis, biospheres, biosignatures (reserved — not yet generating)NATURAL
Footprintinfrastructure, emissions, debris, maneuver exhaust, deposition footprintsARTIFICIAL

Three operations

Each domain offers the same three operations:

All three are the same function shape — (seed, paperPack, request) → output, stateless, deterministic, estimate-only. What differs is only where the subject comes from: fit is handed a known object, fill is handed a known region or host, and full is handed nothing at all.

Functions developed so far

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.

fill — synthetic backdrop population

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.

FunctionGeneratesOrigin
emitGalaxies
natural/galaxies.ts
synthetic galaxies populating the Local Group beyond the catalogued members, each with a seeded disc orientationNATURAL
emitStars
natural/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. Since 2026-09-15 the star itself is drawn and derived from the same cited packs GENESIS uses: the MASS from the Kroupa 2001 canonical IMF (DOI) through sampleImfMass, and the RADIUS, TEMPERATURE and LUMINOSITY from mainSequenceStructure — Eker et al. 2018 (DOI), with the draw TRUNCATED to that paper's own calibrated 0.179–31 M☉ sample rather than extrapolated past it. Before that date this fill invented all three numbers — a log-uniform mass over [0.08, 20] M☉ standing in for «a rough Kroupa-ish IMF», plus two uncited power laws R = M0.8 R☉ and T = 5778·M0.5 — which is the one thing the Factory may never do (it may invent an INSTANCE, never a LAW or a DISTRIBUTION), and it showed: 52 synthetic stars in the shipped bake sat below the ~2,300 K hydrogen-burning floor, the coldest at 1,659 K, because 5778·√0.08 = 1,635 K. The coldest the cited chain can now produce is 3,291 K. The rng stream is unchanged — one draw where there was one draw — so every star's id, position and drift stay byte-identical across the fixNATURAL
emitGalacticStars
natural/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
emitPlanets
natural/planets.ts
synthetic planets on log-uniform orbits around synthetic starsNATURAL
emitMoons
natural/moons.ts
procedural moons on the generated planetsNATURAL
emitOrbiters · emitLanders
artificial/artifacts.ts
synthetic artefacts (orbiters, landers) on the synthetic bodies — the Footprint domain's backdropARTIFICIAL

full — GENESIS: a whole system from a seed and a stack of papers

The third operation, and the one that needs a fence. GENESIS generates a complete stellar system with no measured input at all: a seed and a set of cited paper packs go in, a star and its planets come out. The rule it is built around is this registry's own epistemic line — the Factory may invent an INSTANCE, never a LAW and never a DISTRIBUTION. So a generated system here is a draw from published distributions: the seed picks which sample, the papers decide what is sampled. A world whose rules we chose would be a postulate rather than a draw: it has no expression in this mode, and no way to enter the registry.

Everything the literature does not constrain is refused and counted, never filled in. A generated system deliberately has no moons (no published exomoon occurrence rate exists), no age, no metallicity, no stellar companion, no debris disc, no position of its own, and no catalogue-shaped name. Each refusal is recorded with the exact pack or dataset that would close it. Two measured consequences of that discipline, on 2,000 generated systems: 38.2 % of the mass draws are refused outright — they fall below the 0.179 M☉ floor of the mass–luminosity relation, and a fit is not extrapolated past its own sample — and a further 95 stars are built but get no planets, being hotter than any published occurrence grid.

FunctionGeneratesOrigin
generateSystem · generateSystems
genesis/genesis.ts
one complete synthetic stellar system (or a batch, with its refusal census): the star's mass drawn from a published initial mass function, its luminosity/radius/temperature derived from that mass, its planets drawn from the published Kepler occurrence grids, its habitable annulus derived by a published method. Deterministic in (seed, system id, pack ids) — the dice is a seed re-run, never a stored variantNATURAL
sampleImfMass · imfCdf · imfQuantile
genesis/imf.ts
a stellar mass drawn from a cited initial mass function, through one generic numerical inverse-CDF that serves any pack: Kroupa 2001 canonical two-part power law (DOI) and Chabrier 2003 disc IMF for individual stars (DOI). Normalisation cancels and piecewise branches are joined by computed continuity, so no pack quotes a constant it could mis-copy. Anchor: the Kroupa fraction below 0.5 M☉ is 76.1 %, against the published ≈70–75 % M-dwarf fraction of the solar neighbourhoodNATURAL
mainSequenceStructure
genesis/mainsequence.ts
the star itself from its mass — luminosity, radius and effective temperature via the Eker et al. 2018 interrelated main-sequence relations (DOI), measured on 509 components of detached eclipsing binaries, with the third quantity closed by the Stefan–Boltzmann law exactly as that paper prescribes. Refuses outside its calibrated 0.179–31 M☉ sample. Anchor: one solar mass returns Teff = 5771.9 K against the IAU nominal 5772 K (0.001 %), L = 0.984 L☉, R = 0.992 R☉NATURAL
genesisRecords · emitGenesisSystems
genesis/records.ts
the generated system as registry records — a synthetic star and its drawn planets, each carrying its recipe (seed + every pack id) in its own note. Placement is always the caller's: a system has no position of its own, so this never invents a coordinate; ids and names stay visibly synthetic rather than imitating a catalogue designation; and no colour is painted, because nobody derived oneNATURAL

fit — completing a known object

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.

FunctionCompletesOrigin
fitNode
fit.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 methodmatches the host
classifyPlanet
natural/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). AND IT REFUSES ABOVE ~2 RJup (2026-09-15), keeping the catalogued value and withholding only our interpretation of it: an H/He object held up by electron degeneracy has a radius that is nearly FLAT at 1.0–1.2 RJup from ~0.3 MJup through the brown-dwarf regime (Burrows et al. 2001), and the largest radii ever MEASURED for transiting planets sit near 2 RJup — so above that there is no published class to give. The shipped bake carries three such rows (HD 100546 b at 6.89 RJup, GQ Lup b at 2.99, Kepler-297 d at 2.90); each is a real archive value with an honest reason to be strange — a model-inferred radius for a directly-imaged young object, or a transit depth a blend can fake — and none is a number to correct. Calling them gas giants was the error: the Borucki Jupiter-size class tops out at 15 R⊕ = 1.37 RJup, so the class was being extrapolated five times past its own range. The refusal is returned as a RESULT, not as the nothing-measured null, so the reader sees the radius, the refusal and its basis togetherNATURAL
fitTrajectory
artificial/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 breakdownARTIFICIAL
fitDeposition
fit.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 ellipseARTIFICIAL
asteroidShape
natural/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 meshNATURAL
habitableZone
natural/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
hillRadius
natural/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 bodyNATURAL
geomagneticField · magneticDeclinationDeg
lib/geomag.ts · data/wmm2025.ts
the Earth's main magnetic field at a place and date from the World Magnetic Model 2025 (NOAA/NCEI + British Geological Survey, DOI; coefficients verbatim, public domain): the Schmidt semi-normalised spherical-harmonic series to degree 12 at the 6371.2 km reference radius with the model's linear secular variation from epoch 2025.0, WGS84 geodetic → geocentric conversion, the field rotated back to the geodetic frame — X, Y, Z, H, F, inclination and declination. Validated against NCEI's twelve published test values to the 0.1 nT and 0.01° the reference software prints. Added 2026-10-27 for ONE consumer: the Stargazing rig reads a phone's compass heading, which is MAGNETIC (iOS hands out CLHeading.magneticHeading, read in WebKit's source), while the sky is drawn on TRUE north — the declination (≈ +2.5° at Paris in 2026, −12° at New York, >20° in places) is now added to every compass-anchored azimuth, for the place the observer stands and the real date, and the badge prints the value applied. A5: the model's own stated accuracy is ~0.5° in declination; past 2030.0 the series is extrapolated and valid says so; local anomalies and the device's own magnetisation are in no modelNATURAL
moonPosition · nutationLongitudeArcsec
natural/lunarephemeris.ts
where the Moon is, from a published series (owner 2026-09-30, the Maldives calibration: «quelle est la précision angulaire sur la position de la lune, à l'instant T, il y a 10 ans, il y a 100 ans, il y a 1000 ans, il y a 3000 ans ?»): geocentric ecliptic longitude, latitude and distance of date from Meeus 1998 ch. 47 — the 60 + 60-term truncation of ELP-2000/82 (Chapront-Touzé & Chapront 1983, A&A 124, 50) with the mean-argument polynomials to T⁴, the E factor and the A1/A2/A3 terms, every coefficient copied from the book; nutation in longitude from the ch. 22 short form (0.5″). Published accuracy ≈ 10″ in longitude, 4″ in latitude near J2000; domain claimed ±3000 years. Falsified on Meeus's own example 47.a (λ 133.162655°, β −3.229126°, Δ 368 409.7 km — a wrong coefficient reddens a named sum; one did, +166 for −166) and measured against JPL Horizons DE441 at 2026, 2016, 1926, 1026 and −974: 3.6″, 0.4″, 0.4″, 4.7″ and 2.0′ in longitude. Drawn by the simulation in its eclipse mode (ecl=1, v2.417): the Moon then stands 0.6″–3.2″ from JPL at the 2017, 2023, 2024 and 2027 eclipse maxima, against ~1° on its mean elementsNATURAL
sunPosition
natural/solarlongitude.ts
the Sun's geocentric longitude (true and apparent) and radius vector from Meeus ch. 25, the lower-accuracy theory (0.01°), pinned to example 25.a (☉ 199.90988°, R 0.99766 AU). It names the SEASONAL station of the nakaiy calendar — 27 periods of 13–14 days that follow the SunNATURAL
deltaTSeconds · deltaTForElp2000 · jdTTfromUT
natural/deltat.ts
the Earth's clock error ΔT = TT − UT, the thirteen piecewise polynomials of Espenak & Meeus 2006 (NASA eclipse site) over −1999…+3000, on the historical values of Morrison & Stephenson 2004; pinned to the page's Tables 1 and 2 at every tabulated year, continuous at every seam. A civil date is Universal Time and the series runs on Terrestrial Time; at −974 the gap is 6.9 h and the Moon moves 3.9° in it. Carries the published uncertainty beside the value (±260 s at year 0, ±55 s at 1000, ~±1000 s before −500) and says that the 2005–2050 branch reads 75.5 s for 2026 against the measured ~69 sNATURAL
generalPrecessionLongitudeDeg · precessEquatorial · precessEcliptic · meanObliquityDeg
natural/precession.ts
the turning of the equinox against the stars: the IAU 2006 general precession in longitude (Capitaine, Wallace & Chapront 2003, A&A 412, 567 — 50.29″/yr at J2000, one degree in 71.6 years, one lunar station of 13°20′ in ~955 years), the IAU 1976 rotation of equatorial and ecliptic coordinates between any two epochs (Lieske et al. 1977, Meeus ch. 21 — pinned to examples 21.b and 21.c), and Laskar's 1986 obliquity polynomial (ten terms, ±10,000 years). It answers the owner's question directly: the constellations do not move against the Moon — a SEASON does, by 41.6° in 3000 years, three stationsNATURAL
topocentricEquatorial · gmstDeg
natural/lunartopocentric.ts
the Moon as seen from a place, not from the Earth's centre: Greenwich mean sidereal time (Meeus 12.4, examples 12.a/12.b), the observer on the IAU 1976 ellipsoid (ch. 11), and the diurnal parallax applied as a vector subtraction — up to 1.02° at perigee on the horizon, the largest factor after precession, and one that can move the Moon across a constellation boundary from Malé where the geocentric ephemeris would notNATURAL
screenKeplerFidelity
natural/perturbers.ts
a statement about the MODEL, not about the object: is the FIXED two-body ellipse the registry draws for this orbit a defensible long-term prediction, or does the orbit cross a third body's gravitational reach so that the drawn path and the real path are different curves? The classical crossing-orbit screen — radial-band overlap measured in Hill radii, q ≤ aM+k·RH and Q ≥ aM−k·RH (built on hillRadius above), with k = 3 exposed as a parameter rather than buried, because the screening scale is a judgement and should be visible as one. The case that forced it: the Falcon 9 upper stage 2025-010D, whose stored ellipse tops out 15,500 km SHORT of the lunar orbital radius — so a naive “do the radii meet?” test says no — and which is nevertheless going to strike the Moon on 2026 Aug 5; the Hill band flags it 2.73 RH deep. Measured over the shipped bake: 4,558 of 52,847 screened orbits are flagged (8.6%) — 88.9% of the core layer (the near-Earth-asteroid and comet population, which is defined by crossing, so this is the screen agreeing with the catalogue), 2.7% of exoplanets (tightly-packed multiplanet systems), 0.9% of GCAT, of which 184 are Earth-frame objects crossing the Moon's reach. Deliberately crude in one direction and honest about it: overlap makes an encounter POSSIBLE, not certain — inclination and phase can keep a crossing orbit clear for a long time. A5 limits stated in the note it carries: it cannot see NON-gravitational forces (solar radiation pressure on a light, large body — decisive for this very object), and a perturber whose mass the registry does not carry is SKIPPED and counted, never assigned a plausible oneNATURAL
reachBandOf · bandsCanMeet
natural/perturbers.ts
the SAME geometry read symmetrically: the band of radii a body sweeps about its primary, widened by its own reach — its Hill radius where a mass is known, else its physical radius, else ZERO (never a guessed size, A5) — and whether two such bands overlap. Answers “could these two ever meet?” for a pair sharing a primary, including the case where NEITHER has a usable mass (two satellites). Why the radial band and not a minimum-orbital-intersection-distance test: nodes and apsides PRECESS at rates that differ with semi-major axis and inclination, so over many revolutions the angular configuration sweeps through everything, while the range of radii each body visits does not change — the band test is the LONG-TERM criterion, and a MOID test answers a different question (this pass, not ever). This is the classical apogee/perigee pre-filter of conjunction screening, used the way it is honest: as a NECESSARY condition. Overlap does not make an encounter likely and nothing here says it does; what it EXCLUDES is certain. Feeds the per-object potential-impactor groups (engine/impactors.ts) — measured on the shipped bake: Earth 2,788 natural candidates · the Moon 205 artificial · the ISS 5,345 · Phobos 0NATURAL
impactGate
natural/perturbers.ts
where a clear criterion stops, and why it stops there (owner 2026-07-28: “quel est le choix de gate ? est-ce que c’est le fait qu’il passe dans la sphère de Hill ?”). The answer: the Hill sphere is the right gate for one question and the WRONG gate for the other. Crossing it gates “the two-body model has stopped being predictive” — a statement about OUR MODEL. An IMPACT needs the target’s PHYSICAL radius, the disc that must actually be struck, enlarged by gravitational focusing (Safronov, R·√(1+vesc²/vrel²) ≈ 1.1–1.3 at typical encounter speeds — stated, not computed, because a relative velocity we do not measure is not one to invent). For the Earth those radii are ~1.5 million km against 6,371 km: the region where the model already fails is ~200× wider than the target, ~40,000× its area. So the verdict has TWO values and deliberately no “likely”: excluded (bands disjoint — no collision possible while these elements hold; PROVABLE, the strong half) and open, with the basis recorded — crossing (the orbits reach the same radii) or gravitational-grip (the object enters the Hill reach, so the answer is not merely unknown but provably ABSENT from this data). A grip verdict reports gripToTargetRatio, the measured number that justifies leaving it open (the Moon: ~100×); a target with no measured radius reports NO ratio rather than an estimate (A5). Closing it needs an n-body integration with a covariance — NASA/JPL Sentry — and until such a source is ingested no probability is producedNATURAL
deriveGalacticOrbit · circularVelocityMs · escapeVelocityMs · galacticAccel · galacticPotential
natural/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 mismatchNATURAL
deriveEpicyclic · evalEpicyclic · epicyclicFrequencies
natural/epicyclic.ts
the epicyclic closed-form orbit of a single near-circular disc star about its guiding centre (the standard small-amplitude approximation, Binney & Tremaine 2008, Galactic Dynamics 2nd ed. §3.2.3) in the SAME Irrgang et al. 2013 Model I potential (DOI) the RK4 integrator uses: R(t)=Rg+X·cos(κt+α), z(t)=Z·cos(νt+β), azimuth by Lz conservation. A per-star CLOSED FORM whose coefficients derive ONCE off the frame path (guiding radius from Lz; radial frequency κ²=R·dΩc²/dR+4Ωc², vertical ν²=∂²Φ/∂z²) and evaluate in ~113 ns — a flat rotation curve gives κ=√2·Ωc, a Kepler curve κ=Ωc (test-pinned; κ/Ωc=1.39 at 8.1 kpc). Faithful ONLY for near-circular orbits: a small-amplitude gate (X/Rg ≤ 0.20, Z/Rg ≤ 0.10) flags halo/high-velocity stars OUTSIDE it (still returns coefficients, never hidden). A calibrate mode fits κeff/Ωeff/νeff from ONE integrated radial period, killing the textbook secular phase drift (max error over ±100 Myr at X/Rg ≤ 0.1: 20%→3.9% of Rg). Cross-pinned against deriveGalacticOrbit for near-circular orbits; reproduces the input position + velocity exactly at Δt = 0 (a seamless piecewise switch). MODELLED — GROUNDWORK for a possible whole-population galactic-orbit DEFAULT (the §4.5 batch-scope decision; ARCHIVE.md “Galactic-orbit default design 2026-07-21”); NOT yet wired into any hot path. A5: missing 3-D velocity / a radial plunge (|vφ| < 1 km/s) ⇒ null, never inventedNATURAL
deriveSystemFill · mutualHillDelta
natural/systemfill.ts
the statistically-expected unseen planets of a single host star — the Astrophysics fill (spec §3): for one host, a deterministic seeded draw of the synthetic planetary complement from PUBLISHED Kepler occurrence grids, one Bernoulli trial per (size class × period bin) cell. Paper packs (swappable cited coefficient tables, the HZ discipline — never an invented split): kepler-fgkm@1 = Fressin et al. 2013 FGK Table 2 (DOI) + Dressing & Charbonneau 2015 M-dwarf Table 4 (DOI); petigura13@1 = Petigura, Howard & Marcy 2013 Sun-like GK (DOI). A system's KNOWN planets CONSTRAIN the draw (their occupied class×bin cells are never re-drawn) and a candidate is rejected when it sits closer than Δ = 10 mutual Hill radii to any known or accepted planet (mutualHillDelta; Pu & Wu 2015 circular-coplanar survival minimum, DOI). Orbit shape from published Kepler-multi distributions: e ~ Rayleigh(0.04) (Xie et al. 2016, DOI), mutual inclination ~ Rayleigh(1.4°) (Fabrycky et al. 2014, DOI), Ω/ω/M₀ uniform (stated convention); mass from radius via the Chen & Kipping 2017 class law (DOI). SYNTHETIC by definition — an AVERAGE-occurrence draw (framing: Zhu & Dong 2021 review, DOI), never a claim about THIS system; the recipe {seed, packId} rides in every note (the dice re-runs the seed — no variant baking). Single-element on-demand (§4.5) — feeds the full-system fill overlay (sf=1); a host without a measured mass+temperature, or outside the pack's sample bounds, gets nothing (the reason stated, A5)NATURAL
deriveStarParams · drawStarParams · starMassBranches · discResolvedRangeM
natural/starparam.ts · starparamrelation.ts · starparamreveal.ts
the radius a real star never had published, and the range at which a ship could check it. Measured on the shipped bake: of 91,485 catalogued stars only 4,805 carry a radius (5.25 %) and 28,876 a temperature — Gaia publishes none at all (0 of 36,835 and 0 of 19,122), because a radius is a DERIVATION nobody has published for those rows, whereas characterising a transit host forces one. So the gap is the shape of the literature, not a defect of the bake. The chain runs on the pack GENESIS already uses FORWARDS, Eker et al. 2018 (DOI), read BACKWARDS — one relation in the repository, two directions, no possibility of the inverse drifting: measured Teff → mass by inverting the forward map → L from the mass–luminosity relation → R closed by Stefan–Boltzmann on the MEASURED temperature. At zero residual that returns Eker's own radius to 0 or 2.2×10−16 relative (test-pinned), so the draw is a band around the published derivation and not a second model; R ∝ √L at fixed T, so the radius scatter is exactly half the published luminosity σ (0.038–0.083 dex = 9.1–20.9 %) — arithmetic, not a choice. TWO READINGS, both load-bearing: deriveStarParams has NO rng and is the relation's central value (what a mission plans against, and the better estimator); drawStarParams is seeded on (star id ⊕ world seed) — never the clock, never call order — and is the INSTANCE this world holds. The gap between them is the bet. The piecewise fit STEPS, so the inversion is neither continuous nor single-valued and both consequences are published rather than smoothed: the image runs 3,290.7–41,421.1 K (measured off the table, never typed), and at 4,500 K there are two preimages spanning 9.2 % in radius which starMassBranches returns BOTH of — 8.02 % of served stars land on more than one (three at most, at the genuine non-monotone plateau near 3,565 K; widest spread a factor 1.2695), and hiding the multiplicity would present an arbitrary pick as a derivation. A CROSSING IS NOT ALWAYS A PREIMAGE, and this file's own test caught it: where the pieces step, a sign change can be the relation jumping ACROSS the requested temperature, so the bisection lands on the discontinuity and returns a mass whose real temperature is 4,459.7 K for a 4,500 K request — a third of all branches on multi-branch temperatures (33 of 99) were such artefacts. They are verified away; no headline number moved, because the central value always took the lowest branch, which was genuine — what it fixed is the DRAW, which picked uniformly. Served and refused sum exactly over the 56,680 catalogued real radius-less stars (the 30,399 SYNTHETIC factory stars excluded — generated BY this relation, so counting them would be circular): served 16,274 · no-measured-input 32,336 · teff-below-relation 8,019 (M dwarfs cooler than anything in a 509-binary sample — extrapolating to reach them is what A5 forbids) · mass-outside-relation 51. THE ODDS, HELD OUT against 4,321 catalogued radii this code never sees: median −4.5 %, |Δ| p50 0.037 dex, 68.8 % within ±20 %, 92.5 % within a factor of two. The tail is NOT noise: 326 miss by more than 2× and 314 have a measured radius more than twice the largest main-sequence branch at their temperature — the failures are evolved stars, almost one for one, because temperature alone cannot separate a dwarf from a subgiant. So this is precisely a bet that the star is on the main sequence, and it is labelled as one. The declared spread is NOT widened to match the measured 0.085 dex: stretching a draw until it fits our own residual would be inventing a distribution, the one thing §4.6 forbids the Factory — the published σ is drawn from, the measured residual is published beside it. What it costs a mission: βL ∝ L ∝ R², so the capture verdict moves as the SQUARE of the error — drawn against measured, the port/scenery verdict for a 1 km², 100 kg sail flips on 187 of 4,317 stars (4.33 %). discResolvedRangeM derives the reveal range from diffraction rather than typing a threshold — d = 2·R·D/(k·λ), k an ARGUMENT because the Airy and flight-literature conventions differ by 22 % — and its scale is the finding: a metre-class aperture at 550 nm resolves the Sun's disc from 0.219 ly, and Proxima's only after 99.2 % of the crossing. It REFUSES to treat the sail as the optic (a 1 km² membrane would "resolve" the Sun from 219 ly and hand back an answer nobody measured). SYNTHETIC where drawn, MODELLED where derived; single-element on-demand (§4.5), ~32 µs, never a frame pathNATURAL
deriveStarVariability · drawStarVariability · logGCgsOf · amplitudeAtQuantile · luminosityAtW · variabilitySurvival · dimensionlessPeriod · speedFractionFromLuminosityFraction · captureCeilingFractionFromLuminosityFraction · arrivalSpread
natural/starvar.ts · starvarpack.ts · starvarsail.ts
the brightness variability a catalogue never measured, and what it costs a light sail. The registry knows nothing about it, measured rather than assumed: every tagged key on all 91,485 star nodes was enumerated (color 91,485 · notes 61,086 · temperature 28,876 · mass 5,089 · radius 4,805) and that is the complete list — no variability class, no amplitude, no rotation period, no surface gravity. So this fills the gap the way deriveStarParams fills the missing-radius gap: by DRAWING from a published distribution, deterministically, labelled so it can never pass for a measurement — and it never says a star is quiet, only that nothing is known. Pack mcquillan14-solanki13-reinhold20-basri13@1: the amplitude ladder is the McQuillan, Mazeh & Aigrain 2014 Kepler rotation sample (DOI) read at quantiles — 950 / 5,600 / 22,700 ppm peak-to-peak at q = 0.05 / 0.50 / 0.95 — with Solanki, Krivova & Haigh 2013 (DOI), Reinhold et al. 2020 (DOI), Basri, Walkowicz & Reiners 2013 (DOI) and Baliunas et al. 1995 (DOI) for the selection cuts and the 2.5–25 yr activity-cycle range. THE PAPER’S OWN SELECTION CRITERION IS APPLIED, NOT APPROXIMATED: every published ladder is cut by surface gravity, the registry publishes no log g — and log g is g = GM/R² by definition, so logGCgsOf derives it EXACTLY from registry mass and radius and applies Reinhold’s log g > 4.2, the most permissive of the three, so the refusal is the narrowest the literature supports. A star with no mass or radius is served anyway and flagged mainSequenceEstablished: false — the same bet starparam makes, named in the same words. Served and refused sum EXACTLY over the 61,086 real stars (the 30,399 SYNTHETIC factory stars excluded — generated by a relation, not observed): served 14,013 (22.94 %), of which 10,645 carry the main-sequence bet · no-effective-temperature 32,609 · teff-below-published-sample 8,917 · teff-above-published-sample 4,842 · surface-gravity-below-sample 705. The hot refusal is the interesting one, and it is McQuillan’s reason rather than a convenience: the 6,500 K cut exists in that paper because it "greatly reduces the potential for contamination of the sample by pulsating stars from the instability strip" — above it the ladder would answer for a population it was built to exclude, and those classes swing by a FACTOR of 2–3 rather than a fraction of a per cent. What it costs a sail is closed form and exact: v∞ ∝ √L, so a fractional luminosity amplitude A gives A/2 in speed — and whether the sail feels it at all is one dimensionless number, the ratio of the variation period to the acceleration timescale r₀/v∞ (dimensionlessPeriod): variabilitySurvival integrates the sail through the modulation (RK4) and returns the surviving fraction ∈ [0,1] — 1 means the sail saw a frozen offset, 0 means it averaged the cycle away. Because acceleration is over in ~50 days against cycles of years, a stellar sail samples an INSTANTANEOUS luminosity and the cycle does NOT average out — which is what makes a launch date matter. deriveStarVariability has NO rng and returns the ladder’s median (what a mission plans against); drawStarVariability is seeded on the star id and the world seed — never the clock, never call order — and is the instance THIS world holds. A period is REFUSED by name (no-published-period-distribution): the ladder publishes amplitudes and a 0.2–70 day timescale RANGE, not a per-star period, so the range travels and a single period is never invented. SYNTHETIC where drawn, MODELLED where derived; single-element on-demand (§4.5), never a population sweep, never a frame pathNATURAL
deriveLocalGroupOrbits
natural/lgnbody.ts
the Local Group few-body motion — the mutual gravitational trajectories of the three massive members (Milky Way · M31 · M33) integrated together (fixed-step RK4, ≤511 samples, deterministic, symmetric softened point masses) from the CANONICAL initial conditions of van der Marel, Besla, Cox, Sohn & Anderson 2012 III (DOI): the MEASURED M31 velocity vector from HST proper motions (Sohn et al. 2012, DOI) and the M33 velocity from VLBA water masers (Brunthaler et al. 2005, DOI). Reproduces the classic timing-argument approach of Andromeda (Kahn & Woltjer 1959, DOI): the friction-free MW–M31 first pericenter lands at ~4.3 Gyr, the +1σ end of the paper's 3.87 +0.42/−0.32 Gyr (the omitted dynamical friction hastens the paper's value); energy conservation pinned <10−8. WHY few-body and not a smooth potential: at Local Group scale the point masses DO dominate and DO move under each other (M31 is a comparable mass to the MW, not a test particle) — unlike a single star. MODELLED, display-only, single on-demand integration (§4.5, never a population sweep) — feeds the Local-Group-dynamics model (lgd, default on) so Andromeda moves in deep time; NO dynamical friction (first approach representative, merger not modelled), the LMC/SMC and dwarfs excluded, close-passage physics approximate (all stated in the note)NATURAL
deriveOverdensityRadius · zFromComovingDistanceM
natural/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
beamRangeForFluxM · beaconDamageReachM · beaconSignalReachM · twoWayReachM · isotropicRangeForFluxM · beamGainOverIsotropic · beamSailAccelMps2 · beamedElectricThrustN · damageFluxWPerM2 · radiometerFloorWPerM2Hz · systemEquivalentFluxDensity · DETECTION_FLOOR_PACKS
natural/beaconreach.ts · damageflux.ts · detectionfloor.ts · beaconpack.ts
one beacon power, four reaches — the owner's rule (2026-08-13) rendered as physics: a beacon's total radiated power decides how far it can DESTROY, how far it can be HEARD, how hard it can push a sail, and how much electrical power it can deliver to a heavy ship under a reaction drive. There is ONE range law, z(E) = √(2P/πE)/θ, inverted from the peak irradiance beamphysics already publishes — so every named reach is that law with a DIFFERENT THRESHOLD and no second beam model exists that could disagree with the first. Two structural results fall out of the inversion rather than being designed: the range does not depend on the target's size, and the ratio of any two reaches is independent of the beacon entirely — θ, P, λ and D all cancel, z₁/z₂ = √(E₂/E₁) — so it is a property of the two thresholds alone (asserted across six beacons spanning 106–1018 W and both diffraction conventions). NEITHER THRESHOLD EXISTED IN THIS CORPUS, and both are DERIVED rather than typed. Damage: the steady-state radiative balance αE = εσT⁴, with the failure temperature and α, ε as ARGUMENTS and no material table — a handbook melting point is a property of somebody's ship, not of physics; conduction, latent heat and dwell are all absent and all point the same way, so the threshold is a lower bound and any weapon range built on it an upper bound on the weapon, stated rather than hoped for. Detection: SEFD = 2kBTsys/Aeff beaten down by the radiometer equation, every receiver parameter an argument — anchored outside itself twice: FAST returns 1.30 Jy against the ≈1.25 Jy that telescope publishes for itself, and a DSN 70 m antenna returns 1.0045×10−27 W·m−2·Hz−1 against the registry's own catalogued 10−27 — 0.45 %, from an entirely different lineage, with a falsification test proving that is not an identity (a 10 m dish misses by 10³). Per the owner's ruling the floor is a SELECTABLE PACK (the habitable-zone discipline): radiometer@1 1.0045×10−24 · ssr-catalogue@1 1.0000×10−24 · parkin-downlink@1 7.09×10−20 W/m² (Parkin 2020, DOI) — spread 7.09×104, published and never averaged, because the discriminating check is that the two radio floors agree to under 1 %: the spread is the QUESTION differing (a bit stream against a tone), not noise. Parkin states the same signal twice — −133 dBm and 288 photons/s at 1.25 µm — and both are transcribed, because one number can be mistyped in silence while two that must agree cannot (they agree to 8.7 %). Also cited: Messerschmitt, Lubin & Morrison 2020 (DOI) and Messerschmitt & Morrison 2020 (DOI). THE RESULT THAT DECIDES THE MECHANIC: for a Starshot-optics beacon against aluminium at boiling, acceleration reaches 0.129 AU, destruction 8.57 AU and communication 2.51×1011 ly — so for a BEAM the link budget stops being the limit at all, the signal reach exceeding the observable universe. What replaces it is geometric and is published beside every reach so a reach can never be misread as visibility: the beam lights 2.8×10−21 of the sky (footprint ~4,300 km at Proxima). The contrast is the point: the same 100 GW radiated isotropically — a civilisation appearing, which nobody can aim and nobody can mask — reaches 9.4 light-years. Beam across the universe, or shout across nine. beamGainOverIsotropic = 8/θ² is the identity joining the two (measured 7.12×1020), and twoWayReachM is bounded by the WEAKER end rather than the mean, because a round trip needs both ends to close. ⚠ beamFillDistanceM (L₀) is the ACCELERATION reach and understates the signal reach by 1.2×1017 — naming it a communication range was the error this work supersedes. MODELLED; on-demand, never a frame pathNATURAL
drawEjectaSwarm · powerLawDraw · coneHalfAngleAt · DART_EJECTA_PACKS · integrateBoulder · identityHorizon · escapeSpeedMps · srpBeta · suggestedStepS
natural/ejectapack.ts · natural/ejectaflight.ts
a statistically representative swarm of impact ejecta, drawn from published distributions and flown on a declared force model. WHY THE FACTORY AND NOT THE REGISTRY: Farnham et al. 2025 measured 104 boulders DART threw off Dimorphos, and a survey of the literature found that nobody has published a per-boulder trajectory for them — five groups propagate DART ejecta and all five integrate a SYNTHETIC population, because 214 seconds of measured arc against a dynamics the same literature calls “highly chaotic” does not let an individual rock keep its name. So the discipline propagates DISTRIBUTIONS, which is exactly §4.6’s nominal Factory work: invent an INSTANCE, never a law and never a distribution. Sizes come from a published cumulative power law (q = −3.9, Jewitt et al. 2023), speeds from the Housen & Holsapple 2011 mass–velocity law M(>v) ∝ v−3μ, and the cone from Farnham’s published opening angles (~135° × ~100°, southward). TWO PACKS SHIP, differing only in the published μ — 0.41 for dry soils, 0.55 for competent rock — the habitable-zone multi-method discipline, because which one Dimorphos is nobody here gets to decide by choosing a default (measured: the harder target throws 587 of 6,000 boulders above 1 m/s where the softer throws 1,061). THREE THINGS ARE DECLARED RATHER THAN GUESSED: size and speed are drawn INDEPENDENTLY because no published per-boulder coupling exists (and the archived measurements are image-plane PIXELS, so the coupling is not in a form anyone can read); the elliptical cone boundary between two published angles is OUR reading; and the SFD index has standing only over the 4–10 m it was fitted on, so that is the DEFAULT draw range and widening it to the observed 0.4–7.2 m population makes the census count the cost (3,999 of 4,000 draws — which is precisely why it is not the default: a guard that fires on every draw is a guard someone will weaken). THE DRAW IS EXACT AND THE ANISOTROPY IS THE CONE’S, NOT THE SAMPLER’S — both marginals invert their CDF in closed form, and the azimuth is drawn from a solid-angle-weighted CDF because a uniform azimuth draw would MANUFACTURE the southward concentration the observation reports (measured wide/narrow ratio 1.414 against the 1.416 the two published angles imply on their own). THE FLIGHT KNOWS NO BODY NAMES (the beamphysics rule): primary and secondary μ, radii, mutual orbit and heliocentric distance all arrive as ARGUMENTS, so it flies ejecta off any binary. Anchored outside itself: fed the published Didymos masses and Dimorphos’ orbit, escapeSpeedMps returns 0.2436 m/s, which is what makes Jewitt’s ~0.3 m/s boulders “slightly above the escape velocity of the binary system” as published; a circular orbit closes on its Kepler period to 4.5×10−11; and a coarse step is REFUSED by name rather than returning the plausible wrong orbit a fixed-step integrator silently produces. THE HEADLINE IS A MEASUREMENT, NOT A CAVEAT: identityHorizon flies each boulder twice — once as drawn, once displaced by the positional precision the observation actually has — and reports when the two separate past a declared threshold, so “individual identity does not survive propagation” stops being a borrowed sentence and becomes a number: at 1 % precision 22.4 h, at 3 % 10.6 h, at 10 % immediately. It is falsifiable by construction (perturb by zero and the horizon must be infinite) and it is an OPTIMISTIC bound, stated as such: near-Keplerian neighbours separate polynomially, while the chaos this model’s omitted non-spherical gravity would add separates exponentially, so the real horizon is shorter and never longer. SYNTHETIC; on demand, never a frame pathNATURAL
yarkovskyDrift · yarkovskyColor
yarkovsky.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 overlayNATURAL
orbitPhaseSigmaRad · orbitAlongTrackSigmaM · alongTrackSaturationM · driftPositionSigmaM
lib/sigmagrowth.ts
σ through time — how a value's registry σ honestly GROWS away from its epoch of knowledge (MODELLED, k=1; symmetric in ±Δt — uncertainty grows both ways from when you last looked). Exposed through the factory door as "a FACTORY request" (physical fog of war: "uncertainty grows while you are not looking", design doc §5.8 B) and any far-observer honesty display needs. TWO cited models, each with its domain refused rather than smoothed (A5): (1) two-body along-track growth from σ_a — the classical covariance-propagation result, derived in the header from Kepler's third law alone (n²a³=μ ⇒ δn=−(3/2)(n/a)·δa), σ_M(Δt)=σ_M(0)+(3/2)(n/a)·σ_a·|Δt| and σ_s(Δt)=σ_s(0)+(3/2)·n·σ_a·|Δt| ≡ (3/2)(σ_a/a)·v·|Δt|; test-pinned to the textbook figure — a LEO orbit (a=6,778 km) with σ_a=10 m grows 1,466 m of along-track σ per day (GEO, n smaller: 94.5 m/day). Standard treatments: Vallado, Fundamentals of Astrodynamics and Applications, 4th ed., Microcosm 2013 (no registered DOI — CrossRef checked 2026-07-29, cited as plain text); Montenbruck & Gill 2000, Satellite Orbits (DOI); Battin 1999 (DOI) — both book DOIs verified via CrossRef to resolve to those titles. Variance budget: ONE driving term (σ_a through ∂n/∂a = 100% of the growth); omitted and NAMED: σ_e/σ_i (bounded oscillatory, not secular), the a–M₀ covariance (not published per-object ⇒ the epoch term adds LINEARLY, the conservative bound), every non-two-body force. Stated domain: two-body only (a drag/resonance/close-encounter orbit — anything screenKeplerFidelity flags — grows FASTER than this floor); first-order (σ_a ≥ a refused, null); near-circular for the metre mapping (eccentric callers use the phase form, which is eccentricity-independent); and a declared SATURATION — beyond σ_M ≈ π (σ_s ≈ π·a, exported as alongTrackSaturationM — ~40 yr for the pinned LEO case) the phase has wrapped and only the ellipse is still known, never a silent clamp. (2) linear-drift growth from σ_v — EXACT first-order propagation of x=x₀+v·Δt: σ_pos(Δt)²=σ_pos(0)²+(σ_v·|Δt|)², cross-covariance dropped and SAID (the registry carries per-value σ only); test-pinned: σ_v=1 km/s over 100 yr → 3.16×10¹² m ≈ 21 AU. Guards on every function: a driving σ ≤ 0 / non-finite, a broken orbit, a non-finite Δt ⇒ null — never a fabricated growth. Pure, deterministic, single-element on-demand (§4.5); consumed through the factory door onlymatches the object
derivePointingUncertainty · tleOrbitClass
lib/pointingsigma.ts
how far off might it be, from where you stand? (owner 2026-10-22: «pour chaque objet du registre et pour chaque moment dans le temps un calcul d'incertitude … pas en permanence, mais à la demande») — for ONE record at ONE instant: the σ along-track, cross-track and radial in metres, then the ANGLE seen from the observer (the full 3-D σ over the range — the worst projection on the sky), and a label that carries its own reason, e.g. ±1.1° (TLE de 2 j) for the ISS at 420 km. Single element, on demand (§4.5) — never swept over the population, zero per-frame cost. FIVE regimes, each saying its statistic and its bound: (1) a measured GP/TLE set — the σ at epoch by orbit class (Flohrer et al. 2009, ESA SP-672, Table 1: LEO 0.102/0.471/0.126 km radial/along/out-of-plane; no DOI, linked by URL) and, in LEO only, the MEDIAN growth with age measured on Starlink (Jankovic 2026, arXiv:2605.19850: 0.94 km at 6 h, 11.7 km at 3 d, 38.5 km at 7 d, the paper's own power-law form between them); past 7 days it is a lower bound, never extrapolated, and above LEO, past the 24 h arc, the epoch σ is a lower bound too; a manoeuvre is not priced; the registry's own two-body DRAWING error (measured 3,460 km at 8.3 d, gpage.test.ts) is named and not carried; (2) a placeholder orbit (no element set matched) — no number; (3) a small body with JPL's per-element σ — orbitAlongTrackSigmaM plus a·σ_M₀, cross-track a·√(σ_i²+(sin i·σ_Ω)²), radial √(σ_a²+(a·σ_e)²), phase saturation refused, the MPC U echoed as an independent check (Apophis 2026-10-22: 2.2 km, 0.011″ at 0.3 AU; 46″ at its 2029 flyby); (4) planets and moons — the registry's census against JPL Horizons 1976→2036 (solarpositions.test.ts ceilings, copied and drift-checked) × a: Mars ≤10′ from 1.5 AU, MEASURED; the Moon ±10″ when its ELP series is drawn; (5) stars — only the DISTANCE σ is carried (along the sight line), so the angle is unknown and said so. Anything else: unknown, no number (A5)matches the object
invariablePlane · bestFitPlane · orbitNormal · basisFromNormal
natural/systemplane.ts
the planes a system actually has, for a projection to be cast on something derived rather than assumed. The INVARIABLE plane is perpendicular to the summed orbital angular momentum L = Σ mi·√(μ ai(1−ei²))·n̂(ii, Ωi) — pure algebra on fields the bake already carries, so no integration, no step size and nothing to tune; the LEAST-SQUARES plane of an arbitrary point set is the smallest eigenvector of its covariance. ANCHORED OUTSIDE ITS OWN ARITHMETIC: fed the shipped bake’s eight planets it returns 1.5783° from the ecliptic against the published 1.578° — four significant figures against a value this registry has never ingested; moving from the 8 planets to all 133 mass-and-orbit-bearing children of the star shifts it by 0.0005°, which is the honest statement that the plane is the planets’ and largely Jupiter’s (61.5 % of the angular momentum). Each carries what a caller must print beside it: the invariable plane its DOMINANCE, the fit its RESIDUAL — an fit whose RMS approaches the set’s own extent is not a plane and says so (plane-undetermined) rather than drawing a shrugNATURAL
apparentOcclusion · shadowAt · shadowOnSphere · shadowAxisOnSphere · findEclipses
natural/eclipse.ts · natural/eclipsesearch.ts
eclipses, transits and occultations in ANY stellar system (owner 2026-08-30). The module names no body: positions, radii and the observer all arrive as arguments, so the same two laws answer “is there a total solar eclipse today”, “does this planet transit its star” and “is that moon in the giant’s shadow”. TWO laws kept apart because they answer different questions — the apparent occultation (two discs on the sky: separation, angular radii, magnitude, obscuration) is what an OBSERVER sees, while the shadow cone (ru(z)=Rocc−z(R★−Rocc)/D, rp(z)=Rocc+z(R★+Rocc)/D) is where the shadow FALLS, which is a lunar eclipse and is also how “is there an eclipse somewhere on that planet” is asked without choosing a place. ANCHORED OUTSIDE ITSELF: fed JPL Horizons positions it reproduces the published greatest-eclipse magnitudes of 1.0306 (2017), 1.0566 (2024), 1.0790 (2027) and the annular 0.9520 (2023) to ±0.005 %, and separates total from annular from lunar from nothing on those dates using the cone arithmetic alone. The SEARCH derives its scan step from the configuration’s own fastest angular rate and narrowest possible event and REFUSES a budget that cannot pay it — reporting an empty sky it did not look at would be a false claim about the sky, and a refusal is a true one about us. A5, each measured: light time is NOT applied (~0.0057° for a star at 1 au — seconds on a contact time, never an eclipse invented or destroyed), bodies are SPHERES (a ragged limb is what makes Baily’s beads), the lens area is planar (relative error ~8×10⁻⁵ at half a degree), and no refraction, so a planetary umbra is the GEOMETRIC one. And a caveat a caller must choose: the eclipse canon’s occulter radius is deliberately SMALLER than a mean radius (a mean radius includes mountains a real umbra does not fill), so feeding a registry mean radius reads +0.04 % high — a bias, uniform across all four eclipses, not scatter. Called by the simulation since v2.418: «next eclipse →» in its eclipse mode runs findEclipses over the next 400 days on the selected body (a moon's shadow on its planet, or the planet's shadow on a moon), and finds the 2024-04-08, 2026-08-12 and 2027-08-02 totals and the 2025-03-14 lunar eclipse 3.6–6.3 minutes from their published greatest instantsNATURAL
terrainLit · horizonScan · apparentElevationRad · discAboveEdgeFraction · slopeCosine
natural/terrainshadow.ts
whether a piece of GROUND is lit, on a real height field (owner 2026-08-30: «qu’il calcule les vrais ombres si on est très proche — une des applications c’est le pôle sud lunaire»). The same question as the eclipse laws one scale further down, where the occulter is the terrain itself. A Lambert term on a smooth sphere gives a terminator and nothing else: it never looks ALONG the ground, so it cannot say that a crater floor is dark while the rim above it blazes — and at a polar site, where the star crawls a degree or two up, that is very nearly the whole story. So two questions are answered separately and multiplied: does this ground FACE the star (cos of incidence on the height field’s own gradient, pinned against the analytic identity cos i = sin(E−a)), and is anything IN THE WAY (march the profile toward the star, take the greatest apparent elevation). CURVATURE IS NOT A REFINEMENT HERE — IT IS BIGGER THAN THE DISC IT DECIDES AGAINST: a 2 km rim 20 km away on a 1,737.4 km body reads 5.7106° flat and 5.3775° on the sphere, a difference of 0.3331° against a solar angular radius of 0.2666°, so a flat march does not blur a shadow edge, it inverts it — a rim it calls level with the star’s centre is really a third of a degree lower, and the reading flips from fully blocked to two-thirds clear. Every elevation is therefore exact on the sphere, with no small-angle step. And the answer is a FRACTION of the star’s disc, never a boolean: a place whose horizon stands 0.1° above the star’s centre still catches a sliver, and a sliver is the difference between a site a lander can charge in and one it cannot. REFUSES step-coarser-than-posts — marching a 30 m DEM in 500 m strides walks straight through a ridge and then reports sunlight, the aliasing failure this repository has now been caught by three times, and the guard is falsified by a test that shows the coarse march really does miss. A5, each stated: no refraction (an airless body has none; with air the true horizon sits ~0.6° lower and that is the caller’s to add), no bounced light — a fraction of 0 means no DIRECT starlight and never “black” — and a missing DEM post is COUNTED, never read as a plainNATURAL
planetMagnitude · planetLawOf
natural/planetmagnitude.ts
how bright a planet is (owner 2026-10-13: «render the magnitude of object directly as a fonction of size or brightness or both, ALL objects») — the published V-band laws of The Astronomical Almanac, Mallama & Hilton 2018 (Astronomy and Computing 25, 10–24, 10.1016/j.ascom.2018.08.002; arXiv:1808.01973), each V = 5·log10(r·d) + V1(0) + f(α), every coefficient read from the paper's text on 2026-10-13: Mercury Eq. 2 · Venus Eqs. 3–4 (the forward-scattering branch past α = 163.7°) · Earth Eq. 5 · Mars Eqs. 6–7 with the rotation and season terms L(λe) + L(Ls) of Mallama 2007 (Icarus 192, 404–416, 10.1016/j.icarus.2007.07.011, Tables 6 and 8, as the 2018 authors transcribed them into their supplementary program; Stirling interpolation to the fourth difference; natural/marsterms.ts, reproducing the authors' three test magnitudes within 0.001; the engine reads the sub-Earth and sub-solar west longitudes light-time corrected, matching JPL Horizons within 0.24° — the ΔT turn) · Jupiter Eqs. 8–9 · Saturn Eq. 10 with its rings from the ring-plane latitudes of the observer and the Sun, Eq. 12 for the globe alone past 6.5° · Uranus Eq. 15 with its sub-latitudes · Neptune Eq. 17 after 2000.0 and Eq. 16 before it (−6.89 before 1980, brightening by 0.0054 mag/yr to 2000; printed as an image, read off the rendered page on 2026-10-14; it has no phase term, so it answers only within the 1.9° the Earth ever sees). Pinned on the paper's own statistics (Venus at mean greatest brilliancy −4.81, Jupiter's brightest −2.94). Left out, said (A5): the −0.12 mag of a global Martian dust storm (unpredictable, as the paper says), Neptune before 2000.0 beyond α = 1.9° (Eq. 16 has no phase term — declined, the caller falls back), Saturn with rings beyond 6.5° (unpublished). Replaces, for the eight planets, the diffuse sphere of an assumed 0.2 albedo that read Venus at −1.2. The Moon takes its own published law through the same function: Krisciunas & Schaefer 1991, PASP 103, 1033 (10.1086/132921), eq. (9) after Allen 1976 — m = −12.73 + 0.026 |α| + 4×10⁻⁹ α⁴ at the mean distance, carried to the true distances by the inverse square (our step, stated); the opposition surge within 7° of full (up to ~0.33 mag) is not added. The equation that answered travels with the number; consumed by engine/skyvisibility.ts through the factory door, on demand onlyNATURAL

Footprint derivation

FunctionDerivesOrigin
deriveExhaustPuffs
artificial/exhaust.ts
maneuver exhaust puffs located at navigation-arc Δv discontinuities, with Tsiolkovsky propellant masses — upper-bound proxies, limits declared in the method articleARTIFICIAL
deriveBioburden
artificial/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 articleARTIFICIAL
satMagnitude · designOf · SAT_DESIGNS
artificial/satbrightness.ts
how bright a satellite is (owner 2026-09-30: «la visibilité et la réflexion du soleil pour les satellites») — the intrinsic-brightness term the sky's visibility law lacked, as TWO models with the basis returned beside the number. (a) A paper pack of PUBLISHED phase curves by design, apparent V magnitude against the Sun–satellite–observer phase angle, normalised to 1000 km with 5·log10(d/1000 km) for range: Starlink Series-3000 (v1.5) from Mallama 2022, arXiv:2209.12060, Eq. 1 verbatim — v = 3.817 + 0.06970 φ − 0.0003999 φ² + 5 log(d/1000); Starlink Mini Direct-to-Cell and Mini Internet from Mallama, Cole, Harrington & Respler 2024, arXiv:2407.03092, Table 1 (cubics 7.719 · −0.085395 · 0.001149 · −4.802×10⁻⁶ and 5.822 · −0.008795 · 0.000848 · −5.784×10⁻⁶). Every coefficient was read from the papers' text on 2026-09-30; the Original-Design and VisorSat curves, shown there only as a figure, are NOT in the pack — dropped rather than guessed. These are fits of magnitudes observed THROUGH the air with ~0.4 mag of attitude scatter, so the result says the atmosphere is already inside it and the consumer adds no extinction. designOf is conservative: the GCAT bus code decides (V2MD → DTC, V2M → Mini, `Starlink` with serial ≥ 3000 → Series-3000), a bare name resolves only the serial range the paper keys on, and buses no fetched paper observed (V2MO) return null — null means «use the geometry», never the nearest curve. (b) The Lambert sphere on a declared cross-section: m = m☉ − 2.5 log10(p·A·Φ(φ)/(π r² Δ²)) with Russell 1916's phase law Φ = [sin φ + (π−φ) cos φ]/π (ApJ 43, 173, DOI), equal to sphereMagnitude when A = πR² (test-pinned, ≤ 1.4×10⁻¹⁴ mag); a caller may name another law of the reflected-light table (model, e.g. the specular panel), applied as the exact ratio Φmodel/ΦLambert on the Lambert number — the phase laws themselves live once, in the row below, since 2026-10-23. The cross-section itself comes from the GCAT ingest's Length/Diameter/Span/Shape columns by Cauchy's mean-projection rule (mean projected area of a convex body = surface/4), stated per shape and labelled MODELLED. Consumed by engine/skyvisibility.ts through the factory door, on demand only; no albedo is ever assumed here — the caller declares it. Measured against observation (2026-10-23), never fitted: evaluated as the engine evaluates it on every SCORE observation (IAU CPS SatHub, CC BY 4.0, observers credited by ORCID) that SCORE neither flags discrepant nor computes in shadow, observed − modelled, median per object: Starlink Mini agrees (−0.04 mag, 231 objects); Direct-to-Cell reads 1.22 mag fainter (151); Series-3000 2.14 mag brighter (67); the Lambert sphere at the engine's declared albedo 0.2 is centred (+0.30) but wide (10th–90th percentile −6.79 to +2.42, 2,133 objects) — partly because the cross-section rule does not count a deployed sail or flat array (ACS 3 0.08 m², BlueWalker 3 1.5 m²). The numbers are pinned by satbrightness.score.test.ts as a declared state; no coefficient was movedARTIFICIAL
sphereMagnitude · LAMBERT_SPHERE · SPECULAR_PANEL · REFLECTION_MODELS · reflectionModel
lib/reflectedlight.ts
how much sunlight a body sends back to an observer — the interchangeable phase-law table and the sphere magnitude, ONE copy (owner 2026-10-23: «il n'y a aucune raison de de dupliquer le system tout est depuis la sim»). Until that day this physics lived twice, in the engine's Stargazing photometry and here; measured before the move, the two Russell laws were bit-identical and the two sphere magnitudes agreed to ≤ 1.4×10⁻¹⁴ mag, so nothing had to be chosen — the engine's copy was deleted and Stargazing, its model switch and the telescope's satellite deconfliction now reach this one through the factory door; re-measured on the shipped bake, 161,442 Stargazing magnitudes (three sites and instants × the three models) came out identical to the bit. The laws: Russell 1916's Lambert sphere Φ(α) = [sin α + (π−α) cos α]/π (ApJ 43, 173, DOI) and the specular panel Φ(α) = cos²(α/2), the first-order bisector projection of a flat plate — the pair BRACKETS a satellite, which is neither, so every consumer names the law it used. sphereMagnitude: m = m☉ − 2.5 log10(p R² Φ(α)/(r² Δ²)), m☉ = −26.74, checked against the full Moon (−12.7) and a 30 m sphere at 400 km; +∞ under a phase floor of 10⁻¹² (float dust at α = π once read a back-lit satellite at magnitude 36.2), NaN on degenerate input. What is about the SKY — air mass, twilight, the limiting magnitude — stays in the engineARTIFICIAL NATURAL
reduceStandardMagnitude · toStandardMagnitude · standardMagnitudeAt · standardBandOf · standardMagRecord
artificial/satstandardmag.ts
a satellite's standard magnitude, from what observers measured (owner 2026-10-23: «un modèle de brightness et 3-4 options» — Stargazing's fourth option, «Measured (SCORE)»). The convention is the satellite-observing community's: «the brightness of a half-illuminated satellite at 1000 km distance», the phase adjusted by «the fraction of a spherical object that is illuminated», k(B) = 0.5 + 0.5 cos B (Mallama 2020, arXiv:2012.05100, §2): Mstd = m − 5 log10(d/1000 km) + 2.5 log10(k(α)/k(90°)), and standardMagnitudeAt runs the same law backwards to any range and phase. Ours, said: the paper prints its phase term as 2.5 log10(0.5 + 0.5 cos B), which vanishes at B = 0°, while its words put the standard at half illumination — the reference is placed where the words put it (k(90°) = 0.5); since reduction and propagation share the law, the choice moves the printed Mstd and never a magnitude at a real geometry. Which rows (standardBandOf): Johnson V on any detector, and CLEAR observed by eye or binoculars (SCORE's format: «use "CLEAR" if observing_mode is visual»; Mallama 2020: V is «a close match» to visual); unfiltered CCD/CMOS (31,316 rows) and r · g · i · Gaia G · Lum are refused — no published conversion to V is used and no colour term is invented. SCORE's «potentially discrepant» and not-illuminated flags, a missing phase or range and a satellite under the horizon exclude a row; no extinction is removed or added (SCORE does not state whether a reporter corrected it), so the number carries its observers' air, like the Mallama curves. At least 3 rows per object; the value is the MEDIAN, the scatter 1.4826 × the median absolute deviation. Measured on the 2026-10-23 snapshot: 201 objects from 4,676 rows (805 V, 3,871 visual), scatter quartiles 0.40 · 0.63 · 1.03 mag (p90 1.70) — the attitude of a satellite, which one standard magnitude cannot hold. Reduced at BAKE time (the score annotation writes it as the typed tagged.stdMag — magnitude and scatter to two decimals, N, bands, convention — through standardMagRecord; the stdmag=M±σ/N… note token of the first bake is still READ for an offline copy of it, never written); propagated on demand by engine/skyvisibility.ts through the factory door, one scalar per satellite, no extinction addedARTIFICIAL
satConflict · satCandidatesFromRecords · publishedTleSigma
artificial/satconflict.ts · satcandidates.ts · satsky.ts · satconflictnote.ts
will a satellite cross a telescope field during an exposure, bright enough to leave a trail — and when would be quieter? (owner 2026-10-22: «une deconfliiction avec la présence des satellites de Starlink, et des satellites visibles dans les longueurs d'onde qu'on observe» — «via l'utilisation de SSR»). ONE entry point; the candidates are the registry's own Earth orbiters (23,232 live on the 2026-10-22 bake, 21,354 with a measured GP set). Each object is routed by what is honestly known about it: per satellite when its measured set's σ is published for its age AND its along-track σ seen from the site is no wider than the field — propagated by sgp4lite (below), plane- and phase-pruned, closest approach by golden-section search, a Gaussian probability in both directions (cross-track miss against the field, along-track timing against the exposure); statistical otherwise — Bassa et al. 2022's density model (below), one shell per registry object; unpriced for a measured set with no published σ (deep space, eccentric): its pass is listed with probability null when it touches the field widened by 0.5°, never folded into a number. Visibility in the band: lit by the conical Earth shadow (Montenbruck & Gill 2000, DOI), V magnitude from the published phase curves or the Lambert cross-section (row above), the TRAILED effective magnitude meff = m + 2.5 log10(ω·t/r) of Bassa et al. 2022 Eq. 7 against the exposure's limiting magnitude, extinction 0.12 mag/airmass (Patat et al. 2011, DOI) on the Lambert path only; any band other than V returns magnitude null and the satellite COUNTS. The default σ of a public element set is Jankovic 2026's measured SGP4 error on 501 Starlinks (arXiv:2605.19850: 0.94 / 11.7 / 38.5 km at 6 h / 3 d / 7 d, ÷0.6745 to a σ), null beyond 7 days or outside LEO — the paper measured nothing there. Measured on the shipped bake: every Starlink set is 16.0–114 days old at 2026-10-22 (median 16.6), so today the answer is statistical — and says so in French a 13-year-old can read, with the quieter windows within ±60 min. Cost on this container: ~100 ms for the first call over 23,232 objects, ~20 ms per further window. Each predicted crossing carries its TRACK (2026-10-22): the satellite's J2000 direction from the site at both ends of the part of its pass inside the exposure and within two field radii of the centre, and its angular rate — what SSR's computed telescope image draws as a trail (a line of the satellite's V magnitude, its linear density set by the rate); a statistical answer has no position and draws nothing, the image says how many trails were expectedARTIFICIAL
shellHit · trailsFromHit
artificial/satshell.ts
how many trails to expect when nobody can say which satellite: Bassa, Hainaut & Galadí-Enríquez 2022 (A&A 657, A75, DOI), extending Hainaut & Williams 2020 (A&A 636, A121, DOI) — Ntrail = ρ·(A + L·ω·t), the arcsine latitude density of a circular shell P(φ,i,h), ρ = N·P·d²/cos α, ω the mean of the north- and south-bound apparent speeds. Ours, declared: one shell per registry object (the equations are linear in N), the integrable singularity at |φ| → i replaced by the exact band average from the paper's own integral, circular orbits only (e ≤ 0.05). Anchored: the density integrates to one satellite over the sky (±1 %); McDowell 2020's «20 satellites illuminated at high elevation» (ApJL 892, L36, DOI) lies between our solar-midnight 12.2 and civil-midnight 21.8 — the caption does not say which. ⚠ A declared, unresolved disagreement: against Bassa et al.'s own Fig. 11 legend (FORS2, Paranal) our sky averages are 2.1–2.4× higher at every Sun elevation, while our per-direction arithmetic is term by term the authors' published code; every statistical figure therefore carries a stated ×2 bandARTIFICIAL
sgp4liteInit · sgp4liteAt · sgp4liteModelSigmaM
lib/sgp4lite.ts
where an Earth satellite is from a public mean-element set — the GRAVITY half of SGP4 (Hoots & Roehrich 1980, Spacetrack Report No. 3, no DOI; Vallado, Crawford, Hujsak & Kelso 2006, DOI): the Kozai → Brouwer mean motion, J2/J2²/J4 secular rates, the first-order J2 short-period terms. NOT here, and said: drag (the registry carries no B*), J3, the deep-space terms (SDP4). Measured against an RK4 integration of a J2+J4 Earth: 0.41 km after 24 h for a 550 km Starlink orbit, 0.38 km for the ISS class, against 450–2,230 km when the mean set is read as an osculating ellipse (the engine's conic); outliers kept visible: 15.7 km at 24 h for 97.6°/e = 0.01, 4.0 km near-equatorial. sgp4liteModelSigmaM carries that envelope so a caller adds it in quadrature to the element set's σARTIFICIAL

Dynamics — two-body preliminary-design maths

Closed-form, two-body preliminary-design maths, implemented and tested as a pure library behind the factory door. Everything here is MODELLED / PROJECTED (patched-conic / Lambert fidelity) — real preliminary-design accuracy, never an integrated truth, never baked into the registry. Each function DECLARES the conditions under which it is true and REFUSES outside them, returning nothing rather than a number about a different trajectory: a formula applied outside its regime is not approximate, it is wrong. Their first consumer is the mission-design manoeuvre grammar (a closed vocabulary of manoeuvre types for students and for mission planning); drawing a costed plan as a trajectory in the scene is still future work.

FunctionComputesOrigin
solveLambert
dynamics/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 planeARTIFICIAL
hohmannTransfer
dynamics/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
biellipticTransfer
dynamics/transfer.ts
the THREE-burn transfer between coplanar circular orbits by way of a high intermediate apoapsis — the three Δv's, the budget and the (much longer) time of flight. Beyond a radius ratio of ≈11.94 some bi-elliptic beats the Hohmann and beyond ≈15.58 every one does; those published crossovers are recovered from this code by bisection rather than asserted at a point. Refuses an intermediate apoapsis inside the terminal radii — that is a different trajectory, not a cheaper oneARTIFICIAL
planeChangeDv · combinedPlaneChangeDv
dynamics/transfer.ts
rotating an orbit plane at constant speed, Δv = 2·v·sin(Δi/2) (28.5° costs ≈1.51 km/s at GEO but ≈3.80 km/s in low orbit — the standing argument for buying an inclination change at apogee); and changing radius and plane in ONE burn by the law of cosines, which is always cheaper (a GTO→GEO apogee kick from Cape Canaveral: 1.84 km/s combined against 2.99 km/s split). Both refuse |Δi| > π, where the sine turns back down and a larger rotation would be reported as cheaperARTIFICIAL
escapeC3FromVinf · injectionDvForVinf
dynamics/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
finiteBurnLoss · impulsiveArcLimitRad · finiteBurnDuration
dynamics/finiteburn.ts
where the IMPULSIVE idealisation stops being true. A burn of duration T sweeps an orbital arc Δθ = n·T, and thrust held along a rotating velocity achieves only sin(Δθ/2)/(Δθ/2) of what it spends — the sinc steering loss, derived in the module and re-derived in its test by numerical quadrature. impulsiveArcLimitRad inverts it (the 1% point is 0.4906 rad ≈ 28°), so the impulsive ceiling is COMPUTED from one definition instead of restated as a second; finiteBurnDuration gives the burn time from thrust, mass and exhaust velocity. Refuses past half a revolution, where the constant-rate assumption fails rather than blursARTIFICIAL
flybyTurn · maxFlybyTurnRad
dynamics/flyby.ts
the gravity assist as geometry — the hyperbola's eccentricity e = 1 + rp·v∞²/µ, its turn angle δ = 2·asin(1/e), the impact parameter, and the free central-frame velocity change |Δv| = 2·v∞/e the turn is worth (so a flyby can never deliver a full 2·v∞). The same 5.6 km/s pass turns 158.6° at Jupiter, 81.9° at Earth and 32.0° at Mars. Domain bounds (the body's own radius; its gravitational reach) are optional and the result states WHICH were checked — an absent bound is never reported as a passed oneARTIFICIAL
sphereOfInfluenceM · patchedConicDepart · patchedConicArrive · interplanetaryTransfer
dynamics/patchedconic.ts
CHANGING CENTRAL BODY — the patched-conic handover, without which an interplanetary mission (escape · cruise · capture) cannot be costed as one plan. The Laplace sphere of influence a·(m/M)2/5 (Earth 924,600 km; deliberately NOT the Hill radius, 1,471,600 km — different criteria, 59% apart, and Laplace is the one the patched-conic method wants), the departure handover returning the resulting heliocentric conic, its mirror at arrival, and the whole coplanar-circular mission budget as a composition of the doors above. Earth→Mars: 2.946 + 2.650 km/s heliocentric over 258.9 days, 3.590 km/s out of a 300 km parking orbit, 2.070 km/s into a 500 km Mars orbit. The approximation is quantified ON the result rather than hidden — treating the sphere of influence as a point is 0.62% wrong in position and understates the body-relative speed by 143 m/s (4.9%) at Earth, but only 1.1% at MarsARTIFICIAL
tsiolkovskyPropellant · tsiolkovskyMassRatio
dynamics/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
porkchopGrid
dynamics/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 data a porkchop plot contoursARTIFICIAL
elementsToState
dynamics/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 recoveryARTIFICIAL
applyDeltaV · progradeDeltaV
dynamics/applydv.ts
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 core a trajectory-play interaction would needARTIFICIAL
integrate · totalEnergy
dynamics/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 preservesARTIFICIAL

Determinism, seeds and paper packs

Every run is a pure function of (seed, paperPack, request). The backdrop-fill pack is proto-uniform@0 — honest log-uniform toy distributions for stress-testing, not literature models; real packs replace it without touching any caller. The GENESIS mode already runs on literature packs and nothing else: kroupa01@1 · chabrier03@1 (initial mass function), eker18@1 (mass → luminosity/radius/temperature), kepler-fgkm@1 · petigura13@1 (planet occurrence). Swapping one is not cosmetic — holding the seed fixed and changing only the initial mass function can move a generated star across a boundary of the published literature, so that the same dice yields a system with planets under one paper and a system whose planets are honestly refused under another. 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.

How estimated content reads

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.