SSM-JTK – Reproducibility & audit trail + Safety guards (1.5 + 1.6)

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 any atanh.
  • Wrap discipline: unwrap for fits/events; wrap once for display (wrap360 at the end).
  • Caps: auxiliary rapidities are range-checked; no unbounded deltas.
  • Bounded snapping: event alignment uses at most +-1 day 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)