Research — the digital twin
Decision Log — engine changes and the reasoning behind them
Each entry records what was changed, why, and where it sits at high-school, undergraduate, and graduate level.
Source material for SolarSystemClassroom curriculum. Each entry records what was changed, why, and where it sits at high-school / undergraduate / graduate level. Entries are in the order the decisions were made, which is also roughly the order of increasing depth.
1. Why the mission objective is not a weighted sum
What we changed
The original ranker scored every candidate mission with a single additive cost: one point per crew-day, a quarter point per day of launch slip, 0.05 days per thousand tonnes of propellant lifted from Earth, 0.005 per thousand from a depot, thirty days per percentage point of reserve dipped. Whichever mission scored lowest won.
We deleted it. The replacement normalises each objective onto a common scale, filters to the non-dominated set, constructs an ideal point, and selects the candidate whose worst normalised objective is least bad.
Why
Ask where "thirty days per point of reserve" came from and there is no honest answer. It is an exchange rate — a claim that thirty days of crew life are worth exactly one percentage point of propellant margin — and nobody has ever measured such a thing. Every weight in that list is a smuggled value judgement wearing the costume of a physical constant.
The deeper problem is that the numbers are not merely unknown, they are unknowable in principle, because they are not facts about the world. They are facts about how much risk a particular crew, on a particular mission, is willing to accept. Putting them in a source file makes an ethical decision look like an engineering one.
The alternative asks only for something defensible: which objectives matter, not what they are worth relative to each other.
The mathematics
Each candidate is a point in cost space. Normalise every objective so that 0 is the best value any candidate achieved and 1 is the worst:
$$c_i = \frac{x_i - x_i^{\text{ideal}}}{x_i^{\text{nadir}} - x_i^{\text{ideal}}}$$Candidate A dominates B if A is at least as good on every objective and strictly better on at least one. The Pareto frontier (or efficient frontier) is the set of candidates dominated by nobody. Everything else can be discarded without argument: something else beats it outright.
Selection among the survivors uses the Chebyshev (or $L^\infty$) distance from the ideal point:
$$\text{score} = \max_i c_i, \qquad \text{winner} = \arg\min_{\text{candidates}} \max_i c_i$$Geometrically: put the ideal point at the origin, and grow a cube outward from it. The first candidate the cube touches is the mission that flies, and it sits on the cube's surface. This is why the visualisation in the mission builder draws an actual cube — the selection rule is literally the picture.
The result that makes this more than a preference
A weighted sum, no matter what weights you choose, can only ever select points on the convex hull of the Pareto frontier. Any efficient solution sitting in a concave dent of the frontier is unreachable by every possible choice of weights. The Chebyshev scalarisation has no such limitation: for a suitable reference point, every Pareto-optimal solution is reachable.
So the change is not a matter of taste. The old scoring function was structurally incapable of selecting whole classes of good missions, and no amount of tuning its seven weights would have fixed that.
Empirical note worth teaching from
On a 372-candidate population with four objectives, 107 candidates were non-dominated — 29% of the field. With enough objectives, "on the efficient frontier" stops being a meaningful filter, because it is easy to be best-at-something when there are four somethings. The frontier tells you what is arguable; it does not tell you what wins. This surprises people and it should be presented as a surprise.
Teaching notes
High school. Entirely accessible with no calculus. Two objectives on a scatter plot, students circle the non-dominated points by hand, then find the one closest to the ideal corner. The normalisation is ratio arithmetic. The punchline — that averaging two scores with made-up weights can never pick certain good answers — is demonstrable with a hand-drawn concave frontier and a ruler.
Undergraduate. Formal dominance and Pareto optimality; the $L^p$ family of scalarisations with $p = 1$ (weighted sum), $p = 2$, and $p = \infty$ (Chebyshev) as a single parameterised idea; the convex-hull limitation of weighted sums, proved. Connects directly to the LP unit (next entry) as its non-linear counterpart.
Graduate. Scalarisation theory proper: necessary and sufficient conditions for a scalarisation to recover the whole Pareto set, the augmented Chebyshev method and why the augmentation term is needed to exclude weakly-efficient points, and the equivalence between Chebyshev compromise programming and the game-theoretic maximin criterion.
2. Why this is not a linear programming problem
What we changed
Nothing in the code — but the question was asked directly and the answer shaped everything after it, so it belongs in the log.
Why it matters
The instinct that mission selection "looks like a maximise-subject-to-constraints problem" is correct in spirit and wrong in structure, and the gap between those two is one of the most useful things an applied mathematics student can learn.
The four obstructions
Exponential, not linear. The rocket equation gives propellant burned as $m_p = m_0(1 - e^{-\Delta v / V_e})$. The decision variable sits in an exponent.
Quadratic on top of the exponential. Burn time for the constant-power drive is $t = m_p V_e^2 / (2\eta P)$ — the exponential expression multiplied by the square of the same variable.
No closed form for the constraint. Δv on a transfer is the output of Lambert's problem, a two-point boundary value problem solved numerically against an ephemeris. It cannot be written as a linear expression in anything, because it cannot be written down at all.
Partly discrete. Launch date, route variant, and whether to include an optional leg are integer choices. Even if the continuous relaxation were linear, this would be a mixed-integer program.
The feasible set is not a polytope. LP's entire power comes from the fact that on a polytope the optimum sits at a vertex and simplex can walk to it; none of that machinery survives here.
Teaching notes
High school. Present LP as the thing that does work — resource allocation, mixing problems, the graphical two-variable method — and use the rocket equation as the honest counterexample. A student who plots $m_p$ against $V_e$ sees a curve, not a line, and that is the whole lesson in one picture.
Undergraduate. This is the ideal capstone for an LP/optimisation unit: state the four obstructions, identify convexity as the real dividing line (not linearity), and introduce the successors — convex programming, nonlinear programming, mixed-integer programming, and heuristic global search — as the honest response when convexity fails.
Graduate. Formal characterisation of the feasible set; why the problem admits no useful relaxation with a tight bound; and the practical consequence, which is that we search rather than solve and must therefore reason about the quality of the search population (see entry 6).
3. The rocket equation and the safety/speed antagonism
The observation that drove it
Stated in the project as an objection to an early framing: "how much fuel I have left is the opposite of shortness of trip, which may require more fuel burned."
This is correct, and it turned out to be the strongest argument for the maximin structure rather than against it.
The mathematics
For the variable-exhaust-velocity drive at fixed jet power, two functions of $V_e$ run in opposite directions:
$$m_p(V_e) = m_0\left(1 - e^{-\Delta v / V_e}\right) \quad \text{strictly decreasing}$$$$t(V_e) = \frac{m_p(V_e)\, V_e^2}{2\eta P} \quad \text{strictly increasing}$$Raise the exhaust velocity and you burn less propellant but take longer. Lower it and you arrive sooner with emptier tanks. There is no setting that improves both. The antagonism is not a modelling artefact; it is a theorem.
The nuance that is the actual lesson
The objectives are only opposed at a fixed departure date. Across launch windows they are not. A better planetary alignment gives you a shorter flight and more propellant remaining, simultaneously, for free — because the geometry is kinder, not because you traded anything.
This is the distinction between moving along a frontier (a genuine trade-off, where someone must lose) and moving toward one (a Pareto improvement, where nobody does). Students conflate these constantly, and almost every bad argument about engineering trade-offs is an instance of the confusion. The window search exists to harvest the free lunches; the Chebyshev rule only arbitrates once they are exhausted.
A second coupling discovered later
Entry 7 adds a genuinely physical link between the two: propellant mass shields the crew from solar particle events, so burning propellant thins the storm shelter. Safety-as-margin and safety-as-dose turn out to be the same quantity seen twice. This was not designed in — it was noticed — and it is a good example of a model producing a coupling its authors did not put there.
Teaching notes
High school. Tabulate. Fix Δv and $m_0$, step $V_e$ from 50 to 100 km/s, compute $m_p$ and $t$ at each step, plot both. The opposition appears in the arithmetic without a single derivative. Then change the alignment (a smaller Δv) and watch both columns improve at once — the free lunch, visible in a spreadsheet.
Undergraduate. Prove the monotonicity by differentiation. Show that the maximin solution — maximise $\min(s, r)$ where $s$ is the fraction of schedule remaining and $r$ the fraction of tanks remaining — sits exactly at the crossing point $s = r$, and that $r - s$ is strictly increasing, so a single bisection finds it. "You have used the same fraction of your schedule as of your tanks."
Graduate. The full multi-objective structure, the relationship between the leg-level maximin and the campaign-level Chebyshev rule, and the conditions under which the leg-optimal choice is not campaign-optimal (which is entry 6's subject).
4. Power-limited propulsion: Δv is the wrong currency
What we changed
The engine priced every leg from Δv obtained by a Lambert solve, then selected an exhaust velocity, then computed propellant from the rocket equation. This is inconsistent: on a low-thrust leg the Δv depends on the thrust, so changing $V_e$ invalidates the trajectory that produced the Δv. A drift diagnostic fires whenever the selected $V_e$ departs more than 5% from the trajectory's basis; selecting 75 km/s against a 50 km/s basis is 50% drift, so it fired on essentially every leg.
The first proposed fix was a fixed-point iteration: solve, select, re-solve, until $V_e$ stops moving. That fix was wrong — not incorrect, but a workaround for a deeper error.
Why the first fix was wrong
Lambert's problem gives a two-impulse transfer: burn, coast, burn. It is a chemical-rocket model. The Hyperion's plasma drive thrusts continuously for months. Using Lambert to price it is not a calibration error to be iterated away; it is a category error — asking a chemical question about an electric engine. The 50% drift was the symptom, not the disease.
The correct formulation
The drive is power-limited: roughly constant jet power, exhaust velocity free to vary. For that class — and only that class — the propellant has a closed form that eliminates the circularity entirely.
From $P = \tfrac{1}{2}\dot m V_e^2$, $F = \dot m V_e$, and $a = F/m$:
$$\dot m = \frac{m^2 a^2}{2P} \quad\Longrightarrow\quad \frac{d}{dt}\left(\frac{1}{m}\right) = \frac{\dot m}{m^2} = \frac{a^2}{2P}$$Integrating from departure to arrival:
$$\boxed{\ \frac{1}{m_f} = \frac{1}{m_0} + \frac{J}{2P}, \qquad J \equiv \int_0^{t_f} a^2\,dt\ }$$so that $m_p = m_0 - m_f = \dfrac{m_0^2 J}{2P + m_0 J}$.
Neither $V_e$ nor Δv appears. Propellant depends on exactly one number, $J$ — the integral of squared acceleration — which is a property of the trajectory and its endpoints alone. There is no fixed point to iterate because there is no circularity left.
The exhaust velocity is not a dial at all. It emerges as the optimal throttle law:
$$V_e(t) = \frac{2P}{m(t)\,a(t)}$$an output of the solution rather than an input to it.
A structural consequence
Fixed-$V_e$ (thrust-limited) engines produce bang–off–bang optimal thrust profiles — thrust, coast, thrust — because propellant cost is linear in impulse. Power-limited engines with the quadratic cost above thrust continuously; coasting is never optimal. So "when do we coast" stops being a search dimension for this ship.
Historical note, and why it belongs in the curriculum
This is not new. It is J. H. Irving's 1959 result, developed by Lawden and Marec, and it is the standard formulation for power-limited low-thrust in the literature. It was derived with slide rules. The reason the project was using a worse model is not that a better one is unknown — it is that Lambert was already in the codebase. That is an ordinary and instructive failure mode, and worth saying out loud to students who assume engineering practice tracks the literature.
How $J$ is actually computed
Two tiers, matching the two-stage search:
- Coarse — a closed-form Edelbaum-class minimum-energy bound on
$J$for near-circular, near-coplanar transfers. Cheap, and a genuine lower bound, which lets it double as an admissible search heuristic (entry 6) and as a physics-derived ideal-point bound for the frontier (entry 1). One derivation, three uses. - Fine — Sims-Flanagan transcription: divide the leg into N segments, represent each segment's thrust as a bounded impulse at its midpoint, propagate forward from departure and backward from arrival to a match point, and solve the resulting constrained nonlinear program. This is the transcription behind JPL's MALTO and EMTG.
Honest limits
Exhaust velocity is bounded to 50–100 km/s, so where the unconstrained optimal law wants to leave that band it clips and the arc becomes constrained. Chemical (methalox) burns remain genuinely impulsive and stay on the Lambert model. The mission therefore carries two propulsion models — correctly, because it has two kinds of engine.
Teaching notes
High school. More accessible than it looks. The relation $\dot m = F^2 / 2P$ follows from $P = \tfrac12 \dot m V_e^2$ and $F = \dot m V_e$ by pure algebra — substitute and eliminate $V_e$. Students can derive it. The qualitative payoff is memorable: for a fixed power plant, doubling thrust quadruples fuel consumption. That single sentence explains why deep-space electric propulsion is slow, and it needs no calculus.
Undergraduate. The full derivation via $d(1/m)/dt$; recognising $J = \int a^2 dt$ as a quadratic cost functional; the contrast between linear-in-impulse (chemical) and quadratic-in-acceleration (power-limited) cost and the different optimal thrust profiles each implies. A good bridge from calculus into optimal control.
Graduate. Lawden's primer vector theory; the minimum-energy problem as the classical solvable case of low-thrust optimal control; Pontryagin's principle applied to the constrained-$V_e$ variant; direct transcription methods and the trade between Sims-Flanagan and collocation; convergence behaviour of the resulting NLP.
5. Lambert's problem and a real geometric bug
What it is
Given two position vectors and a time of flight, find the conic arc connecting them. A two-point boundary value problem in the two-body model — the workhorse of every interplanetary trajectory tool, including this one.
The bug worth teaching
The solver originally computed the transfer angle from $|\mathbf{r}_1 \times \mathbf{r}_2|$, taking the magnitude of the cross product as $\sin \Delta\nu$. Because a magnitude is never negative, every geometry was folded into the 0–180° "short way" and every transfer sweeping more than half a revolution was solved wrongly. That class includes the slow, efficient Earth–Mars transfers — the economy class, and exactly the ones a fuel-conscious mission wants.
The fix is to use the z-component of $\mathbf{r}_1 \times \mathbf{r}_2$, which is signed and therefore determines the actual sweep direction for the requested sense of motion.
This is a wonderful teaching bug: one absolute-value sign, silently discarding half the solution space, in code that ran and produced plausible-looking answers for months.
Teaching notes
High school. Conic sections as orbits; the Hohmann transfer as the special case with a closed-form answer; synodic periods and launch windows as pure arithmetic. Students can compute the Earth–Mars synodic period (about 25.6 months) and predict every launch window for the next two decades with a calculator.
Undergraduate. Kepler's equation and its solution by Newton iteration; the universal-variable formulation; bisection on the universal anomaly; the short-way/long-way branch and the geometric reason it exists.
Graduate. Multi-revolution Lambert solutions and their high-energy/low-energy branch pairs; the singular behaviour near 180° transfer angles where the orbital plane becomes undetermined; why the whole two-body apparatus is nonetheless the wrong model for the continuously-thrusting legs (entry 4).
6. Search structure: how a greedy optimiser produced an absurd trajectory
The symptom
The optimiser returned a mission that departed Mars, crossed inside Mars' orbit, and then re-crossed Mars' orbit outbound to 16 Psyche — instead of simply departing Mars at the second crossing. Physically legal. Obviously stupid. Nobody had told it not to, and nothing in its cost function noticed.
The immediate cause
Three of the five scoring modes were pruning heuristics rather than burn estimates: they differenced a chord velocity against the body's own heliocentric velocity. For Earth–Mars that reports a departure Δv of 20–35 km/s where the true injection is about 3.1 km/s, because Earth itself moves at 29.78 km/s. Under a number that large and that wrong, an arc that dives inward and climbs back out scores no worse than a direct one. Replacing those modes with a real Lambert solve fixed the symptom.
The structural cause, which was not fixed
The search is a beam search. At each leg it expands every surviving partial mission, sorts by cost-so-far, and keeps the best N:
frontier = expanded
.OrderBy(item => item.Score)
.ThenBy(item => item.FinalArrivalUtc)
.Take(BeamWidth)
.ToList();
Score is cost accumulated so far. At the Mars node it knows nothing whatsoever about the Psyche leg. So a Mars departure that costs a little more now but sets up a far better Psyche transfer is discarded before it can prove itself. The tiebreaker — earliest arrival — actively prefers the hurried departure that creates the problem.
There is a second, quieter defect: the N survivors are not N distinct ideas. They are the same Mars arrival sampled N times at neighbouring dates off the same time-of-flight grid. Effective diversity is close to one.
This is the classic horizon failure of greedy search, and correcting the units of the score does not touch it. Fixing the cost function is not the same as fixing the search.
The three remedies
Diversity-preserving retention. Keep the best candidate per (body, arrival-epoch bin) rather than the global best N. Cheapest possible fix; guarantees the "wait for the second crossing" option survives to be evaluated.
Admissible lookahead (A*). Rank partial sequences by cost-so-far plus a lower bound on the cost to complete. The Edelbaum-class $J$ bound from entry 4 is a genuine lower bound, hence admissible, hence the pruning becomes provably safe rather than merely lucky.
Multi-objective dynamic programming. Discretise the state as (body, arrival-epoch bin, propellant bin) and solve by backward induction. This structurally cannot produce the pathology: the value of being at Mars on a given date already incorporates the best achievable completion from there, so a locally-good-globally-bad state cannot exist. Each state carries a small non-dominated set rather than a scalar cost — which means the terminal state's set is the Pareto frontier from entry 1. Complexity is O(states × transitions) rather than O(beam^legs), so at twelve legs it is cheaper than the beam it replaces.
The regression guard
Compute the perihelion $q = a(1-e)$ of each heliocentric transfer arc and compare it to $\min(r_{\text{departure}}, r_{\text{arrival}})$. An outbound leg whose perihelion drops well below its departure radius is diving inward. This is surfaced as a flag and a filter, not a prohibition — genuinely fast transfers legitimately dip, and forbidding it would prune real solutions. The point is that the failure can never again be silent.
Teaching notes
High school. Greedy algorithms on a small graph drawn on paper. Students construct their own counterexample where taking the cheapest first step guarantees a worse total — this takes about ten minutes and never stops being useful. Then the orbital version, drawn with a compass: two circles, a departure point, and the question of whether to leave now or wait one more crossing.
Undergraduate. Dijkstra and A*; what admissibility means and why an inadmissible heuristic can return the wrong answer; Bellman's principle of optimality; dynamic programming versus greedy versus exhaustive search; the state-space explosion and discretisation as the response.
Graduate. Multi-objective dynamic programming with non-dominated sets at each state; complexity and the growth of the Pareto set with the number of objectives; label-correcting versus label-setting algorithms; approximation schemes that bound the set size and the error that bounding introduces.
7. Radiation: separating what is deterministic from what is not
What we changed
The dose axis carried a distance multiplier defaulting to 1.0, which meant "dose" was elapsed days under another name. Under the Chebyshev rule this is worse than uninformative: the rule takes the worst normalised objective, so an objective appearing twice effectively doubles its own weight — reintroducing exactly the hand-tuned weighting that entry 1 removed, smuggled in through duplication.
The replacement separates two physically distinct hazards with genuinely different mathematics.
What the measurements actually say
Anchoring on flight data rather than assumption:
- MSL/RAD, Earth–Mars cruise:
$1.75 \pm 0.30$mSv/day dose equivalent behind roughly 16 g/cm² average shielding, quality factor$3.82 \pm 0.25$, totalling about 466 mSv over the transit. - Of that total, five solar energetic particle events contributed 24.7 mSv — about 5%. The remaining 95% was galactic cosmic radiation.
- Radial gradient of GCR intensity:
$2 \pm 2.5$%/AU at 250–700 MeV (the dose-relevant band);$6.6 \pm 4$%/AU above 50 MeV in the inner heliosphere.
The correction this forced
An earlier version of this analysis claimed a fast trip at 3 AU could dose worse than a slower one inside Mars' orbit. That was wrong. At roughly 3%/AU, going from 1 AU to 3 AU buys something like 5–10% more dose rate. It is not a multiplier. A distance-only dose model really would be elapsed-days × 1.06 — still a mirror, just a slightly warped one.
What genuinely decorrelates dose from elapsed time is not distance. It is two other things:
Solar cycle phase. GCR intensity varies inversely with solar activity — the heliosphere's magnetic field modulates the incoming flux, so dose rate is highest at solar minimum. The swing is roughly a factor of 1.5–2. Because the cycle is periodic and the mission's launch date is a decision variable, this puts a real, physically-derived periodic term on the launch-timing axis.
The solar particle event tail. The 5% figure above is a median contribution. The distribution of event fluences is heavily right-skewed: an August-1972 or October-1989 class event behind thin shielding is not a dose increment, it is an acute radiation syndrome. Modelled as a non-homogeneous Poisson process with rate driven by cycle phase and fluence drawn from a lognormal or power-law-with-exponential-rollover distribution — the family NASA uses for mission dose planning. A two-state (quiet / active) Markov chain is the defensible simplification.
The consequence for the decision rule
Dose is no longer a scalar. It is a distribution, so the objective must be a percentile, not a mean — the 95th. A mission ranked on expected dose is a mission that kills its crew one run in twenty and never displays the fact.
The coupling nobody designed
Solar protons are comparatively soft (hundreds of MeV) and are genuinely stopped by areal density. Galactic cosmic rays are not — past roughly 20 g/cm², additional mass produces secondary particle showers and can make matters worse. So shielding mass helps against one hazard and not the other.
The Hyperion carries 8,000 t of argon and tens of thousands of tonnes of methalox. If the storm shelter sits inside the tankage, that propellant is the shield — and the shelter thins as the ship burns. Dose and propellant margin become physically coupled: the same propellant that buys speed is the wall between the crew and the next flare, and the ship is least protected at its furthest point from home.
This vindicates the original objection in entry 3 in a way that was not anticipated. The antagonism between margin and speed is not merely a consequence of the rocket equation; it is also a radiation-shielding fact.
Teaching notes
High school. Unit arithmetic with real numbers: 1.75 mSv/day × trip duration, compared against occupational and regulatory limits. Percentage reasoning on the GCR-vs-SPE split. Reading the sunspot record and predicting cycle phase at a chosen launch date. Probability as observed frequency — five events in 253 days gives an event rate students can compute and then use.
Undergraduate. Poisson processes and the exponential inter-arrival distribution; non-homogeneous rates; heavy-tailed distributions and why the mean is the wrong summary statistic for one; percentiles and quantile estimation; Monte Carlo simulation of total mission dose; the inverse relationship between solar activity and GCR flux as a modulation-potential model.
Graduate. Continuous-time Markov chains with cycle-driven transition rates; extreme value theory applied to event fluence; chance-constrained and risk-constrained optimisation; the design trade between shelter areal density and delivered payload; secondary particle production and why shielding effectiveness against GCR is non-monotonic in mass.
8. Meta: the ways a model can be wrong while appearing to work
The most transferable material here, and the least likely to appear in a textbook. Each of these was a real error in this project, not a hypothetical.
A default value can silently duplicate an objective. The dose multiplier defaulting to 1.0 made dose a copy of elapsed time. Nothing failed; nothing warned; the chart displayed four axes of which three were distinct. Under a maximin rule, a duplicated objective doubles its own weight. Lesson: a default is a modelling assumption, and unexamined defaults are the most dangerous kind because they never look like decisions.
Using a model outside its domain is a category error, not a calibration error. Lambert's problem for a continuously-thrusting drive produced numbers that were wrong by a factor of two and could not be fixed by tuning, iterating, or adding correction terms. Lesson: when a diagnostic fires on every single case, the diagnostic is not detecting drift — it is detecting that the wrong model is in use.
Fixing the score is not fixing the search. Replacing heuristic Δv with real Lambert Δv cured the visible symptom of the Mars pathology while leaving the greedy horizon failure that caused it fully intact. The bug would have returned under different geometry. Lesson: distinguish the proximate cause from the structural one, and be suspicious of a fix that makes a symptom disappear without any change to the mechanism that produced it.
A biased search yields an honest-looking, wrong frontier. The ideal point is constructed from the best value each objective achieved in the population the search returned. A search that only ever samples the minimum-Δv corner produces a frontier with one end missing and a "closest to ideal" answer that is closest to the wrong ideal. Everything downstream looks rigorous. Lesson: in a search-based method, the quality of the answer is bounded by the diversity of the population, and no amount of sophistication in the selection rule can recover what the search never generated.
Silent truncation reads as complete coverage. A search that caps results, samples, or skips retries and does not say so produces output indistinguishable from an exhaustive one. Lesson: report what was dropped.
The literature is often ahead of the code. The correct power-limited formulation was published in 1959 and derived with slide rules. It was not used here because a different solver was already present. Lesson: "what does the existing code do" and "what is the right thing to do" are independent questions, and conflating them is how a project acquires permanent technical debt.
Teaching notes
Suitable at every level, and arguably the most important content in this directory. At high school it is a discussion of what it means to check your work when there is no answer key. At undergraduate level it belongs in any numerical methods or modelling course as a set of concrete case studies. At graduate level it is research methodology — specifically, the epistemics of computational science, where the failure mode is not a wrong answer but a plausible one.
Log opened August 2026. Entries added as engine decisions are made.