⚠ 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:
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.
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 |
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.
| Function | Generates | Origin |
|---|---|---|
generateSystem · generateSystemsgenesis/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 variant | NATURAL |
sampleImfMass · imfCdf · imfQuantilegenesis/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 neighbourhood | NATURAL |
mainSequenceStructuregenesis/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 · emitGenesisSystemsgenesis/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 one | NATURAL |
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 |
screenKeplerFidelitynatural/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 one | NATURAL |
reachBandOf · bandsCanMeetnatural/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 0 | NATURAL |
impactGatenatural/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 produced | 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 |
deriveEpicyclic · evalEpicyclic · epicyclicFrequenciesnatural/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 invented | NATURAL |
deriveSystemFill · mutualHillDeltanatural/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 · discResolvedRangeMnatural/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 path | NATURAL |
deriveStarVariability · drawStarVariability · logGCgsOf · amplitudeAtQuantile · luminosityAtW · variabilitySurvival · dimensionlessPeriod · speedFractionFromLuminosityFraction · captureCeilingFractionFromLuminosityFraction · arrivalSpreadnatural/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 path | NATURAL |
deriveLocalGroupOrbitsnatural/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 · 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 |
beamRangeForFluxM · beaconDamageReachM · beaconSignalReachM · twoWayReachM · isotropicRangeForFluxM · beamGainOverIsotropic · beamSailAccelMps2 · beamedElectricThrustN · damageFluxWPerM2 · radiometerFloorWPerM2Hz · systemEquivalentFluxDensity · DETECTION_FLOOR_PACKSnatural/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 path | NATURAL |
drawEjectaSwarm · powerLawDraw · coneHalfAngleAt · DART_EJECTA_PACKS · integrateBoulder · identityHorizon · escapeSpeedMps · srpBeta · suggestedStepSnatural/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 path | 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 |
orbitPhaseSigmaRad · orbitAlongTrackSigmaM · alongTrackSaturationM · driftPositionSigmaMlib/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 only | matches the object |
invariablePlane · bestFitPlane · orbitNormal · basisFromNormalnatural/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 shrug | NATURAL |
apparentOcclusion · shadowAt · shadowOnSphere · shadowAxisOnSphere · findEclipsesnatural/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 | NATURAL |
terrainLit · horizonScan · apparentElevationRad · discAboveEdgeFraction · slopeCosinenatural/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 plain | 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, 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.
| 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 |
biellipticTransferdynamics/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 one | ARTIFICIAL |
planeChangeDv · combinedPlaneChangeDvdynamics/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 cheaper | 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 |
finiteBurnLoss · impulsiveArcLimitRad · finiteBurnDurationdynamics/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 blurs | ARTIFICIAL |
flybyTurn · maxFlybyTurnRaddynamics/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 one | ARTIFICIAL |
sphereOfInfluenceM · patchedConicDepart · patchedConicArrive · interplanetaryTransferdynamics/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 Mars | 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 data a porkchop plot 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 | 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 need | 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 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.
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.