@essrt/physics 1.13.0 → 1.14.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.13.0",
3
+ "version": "1.14.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",
@@ -766,8 +766,8 @@ export const REFERENCE_DATA = Object.freeze({
766
766
  "sunSiderealYearDiffSeconds": 0.02,
767
767
  "frameworkSunVsJplRmsArcsec": 0.95,
768
768
  "meeusCh25SunVsJplRmsArcsec": 1.28,
769
- "moonSeriesLonVsJplRmsArcsec": 2.96,
770
- "moonSeriesLatVsJplRmsArcsec": 0.65,
769
+ "moonSeriesLonVsJplRmsArcsec": 2.92,
770
+ "moonSeriesLatVsJplRmsArcsec": 0.61,
771
771
  "mercuryNewtonianArcsecCy": 532,
772
772
  "mercuryObservedICRFArcsecCy": 575,
773
773
  "mercuryPark2017RateArcsecCy": 575.31,
@@ -235,4 +235,16 @@ function createSunPlanetaryCompletion({ embWobbleArcsec, carrierRatesDegPerCy })
235
235
  * landings. */
236
236
  const PAIRED_SUN_HARMONICS_SHA256 = 'e2cf42e9770c9e0a';
237
237
 
238
- module.exports = { createSunPlanetaryCompletion, PAIRED_SUN_HARMONICS_SHA256 };
238
+ /** sha256/16 of JSON.stringify([...planets, moonElongation]) — the seven
239
+ * full-precision carrier rates (deg/cy TT) the TERMS table was extracted
240
+ * under at N3. The model wiring recomputes the rates live from the planet
241
+ * records, so a planet-period / year / month input change moves the
242
+ * carriers automatically while the table stays frozen — a silent few-
243
+ * arcsec stale below the api gate's ≤8″ backstop. test:model recomputes
244
+ * this fingerprint from live constants (identical arithmetic to model.js)
245
+ * and fails on mismatch: re-run the N3 extraction chain
246
+ * (tools/explore/n2-sun-framework-carriers.mjs →
247
+ * n3-carrier-swap-preview.mjs), re-embed TERMS, and update this value. */
248
+ const PAIRED_CARRIER_RATES_SHA256 = '893e055ee12343bd';
249
+
250
+ module.exports = { createSunPlanetaryCompletion, PAIRED_SUN_HARMONICS_SHA256, PAIRED_CARRIER_RATES_SHA256 };
@@ -56,6 +56,30 @@
56
56
  * (max 6.2″). Coefficients are stored with the run→real argument
57
57
  * mapping already applied (the extraction's heliocentric-planet vs
58
58
  * geocentric-sun π-offset is folded into the signs).
59
+ *
60
+ * THE J2 NODE FAMILY (FQ-7 Round 3, plan §12i) — five derived terms on
61
+ * Ω-family arguments (NOT expressible on the integer Delaunay lattice,
62
+ * which is why every earlier extraction missed them; the 200-yr band
63
+ * probe named them, the dense 2-day JPL sample confirmed them real, and
64
+ * the channel isolation identified them as EARTH'S J2 acting on the
65
+ * lunar orbit — the same channel whose secular piece DLT-1 derives as
66
+ * the Earth-figure +0.1925″/cy² T² term). Extracted from the B−A
67
+ * differential of epoch-phased 3-body twin integrations (J2 on vs off,
68
+ * identical ICs; per-run fits on each run's OWN mean angles — fitting
69
+ * the raw differential leaks A·δrate·t quadrature, measured as 2.4″
70
+ * fake rows), dt-halving converged ≤0.003″. TWO DOCUMENTED CONTROLS
71
+ * certify the channel and calibrate the run→instrument frame mapping:
72
+ * the derived pure-Ω λ term reproduces the Meeus flattening additive
73
+ * (+1962e-6 sin(Lp−F)) at 1.028, and the derived β sin(Lp) reproduces
74
+ * the −2235e-6 additive at 0.971 — both already shipped via the
75
+ * catalog additive family and therefore NOT re-shipped here. JPL
76
+ * out-of-sample (validation only, never fit): official all-phase λ
77
+ * 2.964 → 2.922″, β 0.653 → 0.606″; dense 2-day λ 2.378 → 2.321″,
78
+ * β 0.655 → 0.601″; syzygy-fleet elongation improves. Instruments:
79
+ * fq7-band-probe.mjs · fq7-jpl-band.mjs · fq7-j2-node.mjs ·
80
+ * fq7-r3-ship.mjs · fq7-r3-preview.mjs. The Ω carrier polynomial is an
81
+ * IAU-class instrument literal — the same DECLARED-INPUT status as the
82
+ * Delaunay carriers above (Ω ≡ Lp − F of the same catalog class).
59
83
  */
60
84
 
61
85
  'use strict';
@@ -198,6 +222,27 @@ const PLANETARY_LON_TERMS = [
198
222
  [[0, 1, 0, -1, 0, 0, -1], -0.0077, 0.2235],
199
223
  ];
200
224
 
225
+ /** Lunar mean-node polynomial [deg at J2000, deg/cy, deg/cy²] TT —
226
+ * the Ω carrier for the J2 node family (declared input, see header). */
227
+ const OMEGA = [125.0445479, -1934.1362891, 0.0020754];
228
+
229
+ /**
230
+ * The J2 node family (see header): [[kD,kM,kMp,kF,kΩ], sin″] — pure
231
+ * sin-parity (the derivation's cos components read ≤0.005″), ADD-composed
232
+ * like the Delaunay tail.
233
+ * @type {Array<[number[], number]>}
234
+ */
235
+ const NODE_LON_TERMS = [
236
+ [[0, 0, 1, 0, -1], -0.544],
237
+ [[0, 0, 1, 0, 1], 0.546],
238
+ [[0, 0, 0, 2, 1], 0.371],
239
+ [[2, 0, 0, 0, 1], 0.103],
240
+ ];
241
+ /** @type {Array<[number[], number]>} */
242
+ const NODE_LAT_TERMS = [
243
+ [[0, 0, 0, 1, -1], -0.375],
244
+ ];
245
+
201
246
  const D2R = Math.PI / 180;
202
247
 
203
248
  /**
@@ -219,6 +264,9 @@ function moonSeriesExtensionDeg(T) {
219
264
  const th = k[0] * l[0] + k[1] * l[1] + k[2] * l[2] + k[3] * l[3] + k[4] * l[4] + k[5] * D + k[6] * Mp;
220
265
  lon += cA * Math.cos(th) + sA * Math.sin(th);
221
266
  }
267
+ const Om = poly(OMEGA);
268
+ for (const [k, s] of NODE_LON_TERMS) lon += s * Math.sin(k[0] * D + k[1] * M + k[2] * Mp + k[3] * F + k[4] * Om);
269
+ for (const [k, s] of NODE_LAT_TERMS) lat += s * Math.sin(k[0] * D + k[1] * M + k[2] * Mp + k[3] * F + k[4] * Om);
222
270
  return { dLonDeg: lon / 3600, dLatDeg: lat / 3600 };
223
271
  }
224
272