@essrt/physics 1.3.0 → 1.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -53,7 +53,7 @@ The canonical assembly, wired once inside the package:
53
53
  import { createModel, DEFAULT_CONSTANTS } from '@essrt/physics';
54
54
 
55
55
  const model = createModel();
56
- model.identity.modelVersion; // 'v10.0' + both content hashes
56
+ model.identity.modelVersion; // the shipped model identity (e.g. 'v11.0') + both content hashes
57
57
  model.epoch.hAtYear(2000 - 380e6); // 306189 — Devonian H (the Wells 1963 match)
58
58
  model.earth.obliquityDeg(2000); // 23.4393
59
59
  model.cardinal.jd(2000, 'SS'); // 2451716.575 — June solstice 2000 (USNO)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@essrt/physics",
3
- "version": "1.3.0",
3
+ "version": "1.3.1",
4
4
  "description": "ESSRT (Expanding Solar System Resonance Theory) physics core \u2014 pure, injectable-constants, no I/O, no globals, no DOM. The complete model incl. fitted coefficients; every published version immutably ships one recorded model identity.",
5
5
  "essrt": {
6
6
  "modelVersion": "v11.0",
@@ -113,7 +113,15 @@ function createDeepTimeLod(deps) {
113
113
  function siderealYearSecondsAtAge(t_Ma) {
114
114
  if (t_Ma === 0) return K.meanSiderealYearJ2000Seconds;
115
115
  const mass_loss_fraction = K.solarMassLossFracPerYear * t_Ma * 1e6;
116
- return K.meanSiderealYearJ2000Seconds * (1 - 2 * mass_loss_fraction);
116
+ // Exact Kepler under the model's mass-history convention (a·M = const,
117
+ // a(t) = a₀·(1−Δm)): T ∝ M⁻² ⇒ T(t) = T₀·(1−Δm)² — the SAME Driver-2
118
+ // law the planet chains use (orbit-chain driver2PeriodSecondsAtAge).
119
+ // The previous (1 − 2Δm) was this law's first-order Taylor — the one
120
+ // form in the model inconsistent with it, and the entire source of the
121
+ // day-count invariant's 0.17 ppm residual: with the product form,
122
+ // H·(days/yr)·(AU₀/AU)² = TOTAL_DAYS_IN_H holds EXACTLY
123
+ // (tools/explore/deep-time-sensitivity.js §5; docs/99 §near-invariant).
124
+ return K.meanSiderealYearJ2000Seconds * (1 - mass_loss_fraction) * (1 - mass_loss_fraction);
117
125
  }
118
126
 
119
127
  /** @param {number} t_Ma @returns {number} tropical = sidereal · (1 − 13/H(t)) */
@@ -118,7 +118,12 @@ export const createEpochPrimitives = ({ params: p, alphaAtAgeMa }) => {
118
118
  */
119
119
  const siderealYearSecondsCore = (t) => {
120
120
  if (t === 0) return p.siderealYearJ2000Seconds;
121
- return p.siderealYearJ2000Seconds * (1 - 2 * p.solarMassLossFracPerYear * t * 1e6);
121
+ // Exact Kepler product form (T M⁻² under a·M = const, a(t) = a₀·(1−Δm))
122
+ // — the same Driver-2 law as the planet chains and deltat/deep-time.cjs.
123
+ // MUST stay the bit-exact twin of siderealYearSecondsAtAge there (the
124
+ // transparency gate holds the pair at 84/84 round-trip).
125
+ const dm = p.solarMassLossFracPerYear * t * 1e6;
126
+ return p.siderealYearJ2000Seconds * (1 - dm) * (1 - dm);
122
127
  };
123
128
 
124
129
  /**