@essrt/physics 1.10.0 → 1.11.0

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@essrt/physics",
3
- "version": "1.10.0",
3
+ "version": "1.11.0",
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",
@@ -58,6 +58,17 @@
58
58
  * recomputes it from live constants and fails on mismatch. The api
59
59
  * centerline gate (≤8″ shadow-plane) backstops gross staleness
60
60
  * independently.
61
+ *
62
+ * E4/E5 PAIRING VERDICT (20.3h Phase 0): the framework-native Sun
63
+ * landing REPLACED the finder Sun form (Meeus Ch. 25 → the assembled
64
+ * framework Sun with the f(Y)+torque drift). The re-derivation this
65
+ * header calls for was MEASURED INSTEAD: the residual 2lE re-fit under
66
+ * the new chain is noise (−0.12″ sin / −0.03″ cos vs the declared-fitted
67
+ * +1.42″ — tools/explore/e3b-native-sun.mjs §2), the all-phase Sun
68
+ * residual improved to 0.95″, and every gate stayed green — the table's
69
+ * planetary content is chain-independent physics and the pairing holds
70
+ * WITHOUT re-extraction. The +1.42″ 2lE term is thereby measured to be
71
+ * genuinely planetary-class, not a Meeus-EoC absorber.
61
72
  */
62
73
 
63
74
  'use strict';
package/src/model.js CHANGED
@@ -837,9 +837,18 @@ export function assembleModel(C, F) {
837
837
  // osculating e = H/16 channel + inclination coupling.
838
838
  // L(t) = L0 + the mean tropical rate + the f(Y) drift SHAPE only,
839
839
  // ∫(rate_SI(y) − rate_SI(2000)) dy: the rate ANCHOR stays the mean
840
- // year (eclipse-endorsed); the drift is the Step 6d year-harmonic
840
+ // year (eclipse-endorsed); the drift is the Step 6c year-harmonic
841
841
  // claim in SI/TT (year-in-days × LOD — the LOD-day part of the
842
- // raw drift is UT-vs-TT and stays ΔT's job). Trapezoid table,
842
+ // raw drift is UT-vs-TT and stays ΔT's job) PLUS the derived
843
+ // TORQUE term (E5): the year harmonics carry only the GEOMETRIC
844
+ // equinox displacement (the tilt nodes — the exact 8:3 amplitude
845
+ // signature); the classical luni-solar torque adds a precession-
846
+ // RATE modulation δp = −p₀·tan ε·δε(t) on the model's own
847
+ // two-component obliquity law (−A cos φ₃ + A cos φ₈). Both
848
+ // lengthen the year at obliquity max, so they ADD; per-divisor
849
+ // drift scale 1 + p₀·tan²ε·H/(2π·div) = 1.306 (H/8) / 1.815
850
+ // (H/3) — the structure the ancient corpus blind-selected before
851
+ // the derivation existed. Zero new constants. Trapezoid table,
843
852
  // 10-yr steps over −3000..3000; outside, the drift freezes at the
844
853
  // edge (rate reverts to linear — the finder domain is the corpus
845
854
  // era).
@@ -861,10 +870,19 @@ export function assembleModel(C, F) {
861
870
  const Y_LO = -3000, Y_HI = 3000, STEP = 10;
862
871
  /** @type {Float64Array|null} */
863
872
  let cum = null;
873
+ const precessionP0DegPerYr = 13 * 360 / H;
874
+ const tanEps = Math.tan(earthtiltMean * Math.PI / 180);
875
+ /** E5 — the two-component obliquity excursion, radians, integrated phase.
876
+ * @param {number} year @returns {number} */
877
+ const obliquityExcursionRad = (year) => (
878
+ -earthInclAmplitude * Math.cos(phaseRadians(balancedYear, year, 3))
879
+ + earthInclAmplitude * Math.cos(phaseRadians(balancedYear, year, 8))
880
+ ) * Math.PI / 180;
864
881
  /** @param {number} year @returns {number} */
865
882
  const rateSIYr = (year) => 360 * (365.25 * 86400)
866
883
  / (tropicalYearDirectDays(year)
867
- * (deepLod.lodSecondsAtAge(yearToTMa(year)) ?? meanLengthOfDay));
884
+ * (deepLod.lodSecondsAtAge(yearToTMa(year)) ?? meanLengthOfDay))
885
+ - precessionP0DegPerYr * tanEps * obliquityExcursionRad(year);
868
886
  return /** @param {number} year @returns {number} */ (year) => {
869
887
  if (cum === null) {
870
888
  const n = (Y_HI - Y_LO) / STEP + 1;
@@ -62,7 +62,14 @@ const DELAUNAY = {
62
62
  };
63
63
 
64
64
  /** Longitude tail: [kD, kM, kMp, kF, sin″] — 47 derived terms ≥ 0.1″
65
- * (RMS content 2.02″). */
65
+ * (RMS content 2.02″), plus the 20.3h ROUND-2 block at the end: five
66
+ * dt-halving-converged terms beyond the D2 catalog's order-7 bound
67
+ * (m20h-extraction-r2.mjs, the same D1 3-body lab). The lead term
68
+ * [6,0,−2,0] extracted at 0.572″ vs the MPP02-comparison target 0.57″
69
+ * (m20h-alias-breaker.mjs) — the integrator predicted the independent
70
+ * reference again. 4-gate out-of-sample (m20h-gate-preview.mjs):
71
+ * all-phase λ 3.03 → 2.96″, β unchanged, fleet improves, centerlines
72
+ * 2.71 → 2.69″ with the 2001 max 7.3 → 6.7″. */
66
73
  const LON_TERMS = [
67
74
  [2, 0, 1, 2, -0.9900],
68
75
  [2, 0, -4, 0, 0.9465],
@@ -111,6 +118,12 @@ const LON_TERMS = [
111
118
  [1, 0, -3, 0, -0.1252],
112
119
  [2, 0, 2, 2, -0.1236],
113
120
  [1, -1, 1, 0, -0.1225],
121
+ // 20.3h ROUND 2 — beyond the order-7 catalog bound (see header note):
122
+ [6, 0, -2, 0, 0.572],
123
+ [6, 0, -3, 0, 0.294],
124
+ [4, 0, -2, 2, -0.169],
125
+ [4, -2, -2, 0, 0.161],
126
+ [0, 0, 5, 0, 0.112],
114
127
  ];
115
128
 
116
129
  /** Latitude tail: [kD, kM, kMp, kF, sin″] — 30 derived terms ≥ 0.1″