1.5 Reproducibility & audit trail (end-to-end)
Every printed line is re-generatable from the manifest plus inputs.
Manifest (per planet, minimal concept).
{ "t0": "YYYY-MM-DD",
"a0_deg": <float>,
"n_deg_per_day": <float>,
"harmonics": [ { "P_days": <float>, "H": <int>, "c": [ ... ], "d": [ ... ] } ]
}
Evaluate (runtime; both families).t = days_since(date, t0)y = a0_deg + n_deg_per_day*t + sum_k[ c_k*sin(omega_k*t) + d_k*cos(omega_k*t) ]L_hat_deg = wrap360(y)
Family note: fixed-n uses n_deg_per_day = 360.0 / P_sid; free-n uses the stored slope.
Optional alignment band for UI (does not change L_hat_deg).clamp01(z) = max(0, min(1, z))v(t) = |dL/dt| ; n_ref = n_deg_per_day (or 360/P_sid for fixed-n)s_stat = clamp01( 1 - v/n_ref )d_cusp = min_k | wrap360(L(t) - 30*k) |d0 = 2.0 (deg, typical), s_cusp = exp( - (d_cusp/d0)^2 )a(t) = tanh( u0 - alpha*( w1*s_stat + w2*s_cusp ) ) (illustrative; a(t) is metadata only)
1.6 Safety guards (always-on)
- Clamps: apply
a := clamp_a(a)before anyatanh. - Wrap discipline: unwrap for fits/events; wrap once for display (
wrap360at the end). - Caps: auxiliary rapidities are range-checked; no unbounded deltas.
- Bounded snapping: event alignment uses at most
+-1day to resolve clear neighbor mismatches. - Flags over force: prefer labeled states (
SIDED/OSC/MULTI/NOFIT) over brittle thresholds.
Navigation
Back: SSM-JTK – Conservative fit & model selection (1.4)
Next: SSM-JTK – What we claim / do not claim (1.7)