@essrt/physics 11.2.0 → 11.3.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": "11.2.0",
3
+ "version": "11.3.0",
4
4
  "description": "ESSRT (Expanding Solar System Resonance Theory) physics core — 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": "v16.2",
package/src/model.js CHANGED
@@ -19,7 +19,9 @@
19
19
  */
20
20
  import { deriveEpochParams } from './layer0/derive-params.js';
21
21
  import * as FL from './planets/fibonacci-laws.cjs';
22
- import * as planetOrientation from './planets/orientation.cjs';
22
+ import { buildPlanetChainsFromArtifactData, computePlanetElementsAtYear } from './planets/keplerian-chain.cjs';
23
+ import { createSecularSeriesOverride } from './planets/secular-series.cjs';
24
+ import { computeEquatorNodeOriginSFrameDeg, convertNodeSFrameToEquatorOriginDeg } from './planets/inv-plane-frame.cjs';
23
25
  import { createPhaseMachinery } from './phase/index.cjs';
24
26
  import { createYearLengths, ONE_FAMILY_WINDOW_YEARS } from './earth/year-lengths.cjs';
25
27
  import { createDeepOrbitalHistory } from './earth/deep-orbital-history.cjs';
@@ -728,7 +730,6 @@ export function assembleModel(C, F, laws = {}, secularSeriesArtifact = /** @type
728
730
  });
729
731
  const systemResetN = C.foundational.systemResetN;
730
732
  const t2000 = 2000 - (balancedYear - systemResetN * H);
731
- const balancedJD = startmodelJD - meanSolarYearDays * (startModelYearWithCorrection - balancedYear);
732
733
 
733
734
  /** @param {[number, number]|null} frac @returns {number|null} */
734
735
  const fractionToYears = (frac) => (frac === null ? null : (H * frac[0]) / frac[1]);
@@ -824,39 +825,49 @@ export function assembleModel(C, F, laws = {}, secularSeriesArtifact = /** @type
824
825
  return ch;
825
826
  };
826
827
 
827
- /** Perihelion longitude (linear lattice rate). @param {string} k @param {number} year @returns {number} */
828
- const planetPerihelionDeg = (k, year) => {
829
- const p = PLANET_RECORDS[k];
830
- return (((p.longitudePerihelion + (360.0 * (year - 2000)) / p.perihelionEclipticYears) % 360) + 360) % 360;
828
+ // The planets' elements of date ride THE CHAIN — the only planet path the
829
+ // simulator renders (K5) — with the D5 series handover beyond each planet's
830
+ // measured boundary when the series artifact is supplied: the mirror of the
831
+ // browser's _kcElementsOfDate → _kcSeriesSecularEl. Until v16.2 the API
832
+ // served the retired device here (the record's linear lattice rates:
833
+ // perihelionEclipticYears, ascendingNodePeriod = −8H/N, the balanced-year
834
+ // inclination oscillation) — a published surface disagreeing with the
835
+ // simulator (owner-found audit, 2026-10). Those forms
836
+ // (planets/orientation.cjs) now serve only the structural record and the
837
+ // browser's no-chain bodies (Pluto, Halley, Eros). The chain's argument is
838
+ // dynamical time; the API's decimal year is taken as that argument (ΔT on a
839
+ // secular element is far below its stated accuracy).
840
+ let planetChains = /** @type {any} */ (null);
841
+ let planetSeriesOverride = /** @type {any} */ (null);
842
+ let planetNodeOriginSSDeg = /** @type {number|null} */ (null);
843
+ /** @param {string} k @param {number} year */
844
+ const planetChainElementsAt = (k, year) => {
845
+ if (!planetChains) planetChains = buildPlanetChainsFromArtifactData(/** @type {any} */ (CHAIN_ARTIFACT));
846
+ const el = computePlanetElementsAtYear(year, planetChains[k], planetChains);
847
+ const seriesArt = /** @type {any} */ (secularSeriesArtifact);
848
+ if (!seriesArt) return el;
849
+ if (!planetSeriesOverride) {
850
+ planetSeriesOverride = createSecularSeriesOverride({
851
+ series: seriesArt,
852
+ anchorElements: /** @type {any} */ (CHAIN_ARTIFACT).j2000AnchorElements,
853
+ invariablePlane: /** @type {any} */ (CHAIN_ARTIFACT).invariablePlane,
854
+ planetZModes: /** @type {any} */ (DEEP_MODES_ARTIFACT).planetZ,
855
+ planetZetaModes: /** @type {any} */ (DEEP_MODES_ARTIFACT).planetZeta,
856
+ });
857
+ }
858
+ return planetSeriesOverride.applyToElements(k, year, el);
831
859
  };
832
- /** Ascending node on the invariable plane. @param {string} k @param {number} year @returns {number} */
860
+ /** Ecliptic longitude of perihelion, J2000 ecliptic and equinox (the chain's ϖ). @param {string} k @param {number} year @returns {number} */
861
+ const planetPerihelionDeg = (k, year) => planetChainElementsAt(k, year).lonPeriEclipticDeg;
862
+ /** Ascending node on the model's invariable plane, from the plane's ascending node on the ICRF equator (the Souami & Souchay 2012 origin; derived conversion, inv-plane-frame). @param {string} k @param {number} year @returns {number} */
833
863
  const planetAscNodeDeg = (k, year) => {
834
- const p = PLANET_RECORDS[k];
835
- return planetOrientation.ascendingNodeInvPlaneLinearAt({
836
- ascendingNodeInvPlane: p.ascendingNodeInvPlane,
837
- ascendingNodePeriod: p.ascendingNodePeriod,
838
- perihelionEclipticYears: p.perihelionEclipticYears,
839
- }, year);
840
- };
841
- /** Invariable-plane inclination (signed ICRF rate, scene year→JD axis). @param {string} k @param {number} year @returns {number} */
842
- const planetInclinationDeg = (k, year) => {
843
- const p = PLANET_RECORDS[k];
844
- const jd = startmodelJD + (year - startmodelYear) * meanSolarYearDays;
845
- const yearsSinceBalanced = (jd - balancedJD) / meanSolarYearDays;
846
- return planetOrientation.invPlaneInclinationAt({
847
- isEarth: false,
848
- invPlaneInclinationJ2000: p.invPlaneInclinationJ2000,
849
- invPlaneInclinationMean: p.invPlaneInclinationMean,
850
- invPlaneInclinationAmplitude: p.invPlaneInclinationAmplitude,
851
- inclinationCycleAnchor: p.inclinationCycleAnchor,
852
- longitudePerihelion: p.longitudePerihelion,
853
- perihelionEclipticYears: p.perihelionEclipticYears,
854
- antiPhase: p.antiPhase,
855
- }, yearsSinceBalanced, {
856
- H,
857
- yearsFromBalancedToJ2000: (startmodelJD - balancedJD) / meanSolarYearDays,
858
- });
864
+ if (planetNodeOriginSSDeg === null) {
865
+ planetNodeOriginSSDeg = computeEquatorNodeOriginSFrameDeg(/** @type {any} */ (CHAIN_ARTIFACT).invariablePlane, C.earthOrbital.obliquityJ2000_deg);
866
+ }
867
+ return convertNodeSFrameToEquatorOriginDeg(planetChainElementsAt(k, year).ascNodeInvPlaneDeg, planetNodeOriginSSDeg);
859
868
  };
869
+ /** Inclination to the model's invariable plane (exact orbit-normal rotation). @param {string} k @param {number} year @returns {number} */
870
+ const planetInclinationDeg = (k, year) => planetChainElementsAt(k, year).inclInvPlaneDeg;
860
871
 
861
872
  // ── Time axis: exact JD ↔ model-year conversion ───────────────────────────
862
873
  // The model's `year` inputs live on the SI axis (the axis the fits were
@@ -17,6 +17,15 @@
17
17
  * (ascendingNodeInvPlaneLinearAt — the node-integrator mirror)
18
18
  * and the balanced-year −8H/N node inside the scene tilt
19
19
  * (eclipticInclinationFromBalanced). Do not merge them.
20
+ *
21
+ * SCOPE SINCE v16.2 (owner-found audit): these record-based forms — the
22
+ * planet record's linear lattice rates, the −8H/N node period, the
23
+ * balanced-year inclination oscillation — are the RETIRED device. They serve
24
+ * the structural record and the browser's no-chain bodies (Pluto, Halley,
25
+ * Eros) only. The seven planets' elements of date on every published surface
26
+ * (the simulator, the API's /v1/bodies, the MCP essrt_bodies) ride the N-body
27
+ * Keplerian chain with the series handover (model.js planetChainElementsAt;
28
+ * src/script.js _kcElementsOfDate).
20
29
  */
21
30
 
22
31
  'use strict';