@essrt/physics 25.0.0 → 26.0.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.
Files changed (36) hide show
  1. package/package.json +3 -2
  2. package/src/constants/coefficients.d.ts +1 -1
  3. package/src/constants/coefficients.js +2 -2
  4. package/src/constants/generated.js +1 -1
  5. package/src/deltat/deep-time-chain.js +18 -10
  6. package/src/earth/precession-composed.cjs +6 -18
  7. package/src/eclipse/besselian.cjs +5 -6
  8. package/src/eclipse/sun-planetary-completion.cjs +7 -12
  9. package/src/index.js +4 -1
  10. package/src/model/cardinal-instants.js +3 -4
  11. package/src/model/deep-time-chain.js +3 -3
  12. package/src/model/lunar-theory.js +6 -5
  13. package/src/model/one-source-movement.js +8 -8
  14. package/src/model/planet-records.js +2 -2
  15. package/src/model/published-periods.js +1 -1
  16. package/src/model/sun-and-eclipses.js +3 -3
  17. package/src/model/surface.js +10 -6
  18. package/src/moon/arguments.cjs +70 -26
  19. package/src/moon/deep-ecc-channel.cjs +18 -23
  20. package/src/moon/ecc-sensitivities.cjs +87 -0
  21. package/src/moon/month-chain.cjs +7 -16
  22. package/src/moon/series-extension.cjs +3 -3
  23. package/src/moon/series.cjs +5 -8
  24. package/src/planets/chain-artifact.js +2 -2
  25. package/types/constants/coefficients.d.ts +1 -1
  26. package/types/deltat/deep-time-chain.d.ts +13 -8
  27. package/types/index.d.ts +2 -1
  28. package/types/model/deep-time-chain.d.ts +13 -0
  29. package/types/model/lunar-theory.d.ts +9 -3
  30. package/types/model/one-source-movement.d.ts +1 -1
  31. package/types/model/surface.d.ts +17 -4
  32. package/types/model.d.ts +13 -0
  33. package/types/moon/arguments.d.cts +11 -3
  34. package/types/moon/deep-ecc-channel.d.cts +2 -1
  35. package/types/moon/ecc-sensitivities.d.cts +48 -0
  36. package/types/moon/month-chain.d.cts +3 -6
@@ -32,8 +32,8 @@ export function assembleOneSourceMovement(ctx) {
32
32
  // path; the npm package alone has no 8 MB series), the movement runs the
33
33
  // SERIES tier exactly like the browser — killing the mode-vs-series
34
34
  // value split (measured: 6 s on the anomalistic year at J2000).
35
- // The ONE-SOURCE movement: the hybrid's ε(t) (plan 06 Phase 3 S3b — THE
36
- // published obliquity) and the one-family year lengths, on the same
35
+ // The ONE-SOURCE movement: the hybrid's ε(t) (THE published obliquity) and
36
+ // the one-family year lengths, on the same
37
37
  // per-tier sampler.
38
38
  const oneSourceM = (() => {
39
39
  const AEarth = /** @type {any} */ (CHAIN_ARTIFACT).j2000AnchorElements.earth;
@@ -47,7 +47,7 @@ export function assembleOneSourceMovement(ctx) {
47
47
  // 108.6 ± 8.5).
48
48
  const seriesArt = /** @type {any} */ (secularSeriesArtifact);
49
49
  const sb = seriesArt && seriesArt.bodies && seriesArt.bodies.earth;
50
- // Plan 12 §8.5 (owner): the hybrid's own domain is the banked ζ series' span (years; null
50
+ // The hybrid's own domain is the banked ζ series' span (years; null
51
51
  // without a series). Beyond it the ζ-mode tail carries the Quaternary mean with no tidal
52
52
  // evolution — the API refuses the obliquity there and serves the cited mean beside it.
53
53
  const obliquityHybridDomainYears = sb
@@ -73,13 +73,13 @@ export function assembleOneSourceMovement(ctx) {
73
73
  obliquityJ2000Deg: C.earthOrbital.obliquityJ2000_deg,
74
74
  // The CONSTANT's scaling (the torque period), not the published rate of date: the
75
75
  // integration's own ŝ·n̂ carries the obliquity's cosine, so the cited mean obliquity's
76
- // factor (plan 12 §8 option (a)) must not enter twice. Bit-identical to the pre-§8 form.
76
+ // factor must not enter twice.
77
77
  axialPrecessionYearsAtYearFn: (yr) => deepLod.lunisolarTorquePeriodYearsAtAge((startmodelYear - yr) / 1e6) ?? axial0,
78
78
  // THE PRECESSION OF DATE: on top of the secular law above, the solar
79
79
  // torque at the eccentricity of date and the oblateness of date from
80
80
  // the GIA channel — both exactly 1 at J2000, so the J2000 anchor is
81
81
  // untouched. The channel is
82
- // read PURE (alphaGia, not the lattice-pin-aware earthMoiFactorAtAge):
82
+ // read PURE (alphaGia, not the pinned earthMoiFactorAtAge):
83
83
  // the samplers are cached, their values must be pure in year.
84
84
  solarTorqueShareJ2000: EPOCH_PARAMS.precessionSolarShareJ2000,
85
85
  // options.giaEllipticityOfDate === false: the orbital forcing alone (the T1 line derivation).
@@ -100,7 +100,7 @@ export function assembleOneSourceMovement(ctx) {
100
100
  if (need > 2000000) {
101
101
  // The deep tier (5000-yr grid): walked in the queried DIRECTION only,
102
102
  // to two nodes past the query, and EXTENDED by the factory's shared
103
- // walk when a deeper epoch arrives (plan 13 A1). It was built to
103
+ // walk when a deeper epoch arrives. It was built to
104
104
  // ±1.25·|t| in both directions and rebuilt from J2000 on every deeper
105
105
  // probe — bit-identical values, 4× the RK4 steps of one walk.
106
106
  const span = Math.ceil((Math.abs(t) + 2 * 5000) / 5000) * 5000;
@@ -127,7 +127,7 @@ export function assembleOneSourceMovement(ctx) {
127
127
  periOfDateDegAt: (year) => sampleAt(year).periOfDateDeg,
128
128
  /** The hybrid's obliquity at a decimal year, degrees — the banked series inside its span, the α(t)-coupled ζ-tail integration beyond (the deep sampler grows ~0.1 s/Myr). @param {number} year @returns {number} */
129
129
  epsAt: (year) => sampleAt(year).epsDeg,
130
- /** The hybrid's own domain, [yearFrom, yearTo] — the banked ζ series' span (plan 12 §8.5); null without a series. */
130
+ /** The hybrid's own domain, [yearFrom, yearTo] — the banked ζ series' span; null without a series. */
131
131
  obliquityHybridDomainYears,
132
132
  /** The precession of date's two factors at a decimal year (the factory's own — ONE home). @param {number} year @returns {{solarTorque: number, ellipticity: number}} */
133
133
  precessionOfDateFactorsAt: (year) => hist.precessionOfDateFactorsAt(year - 2000),
@@ -139,7 +139,7 @@ export function assembleOneSourceMovement(ctx) {
139
139
  })();
140
140
  const yearLengthsM = oneSourceM.yearLengths;
141
141
  /** THE one-family tropical year of date in SI seconds: route B inside the
142
- * one-family window, the tidal-chain year beyond (plan 06 R1 — the Sun's
142
+ * one-family window, the tidal-chain year beyond (the Sun's
143
143
  * mean longitude, the cardinal instants and the published year lengths
144
144
  * all ride this one function). @param {number} year @returns {number} */
145
145
  const oneFamilyTropicalYearSeconds = (year) => (Math.abs(year - 2000) <= ONE_FAMILY_WINDOW_YEARS
@@ -45,10 +45,10 @@ export function assemblePlanetRecords(ctx) {
45
45
  const gArc = chainModes.g[k] && chainModes.g[k].arcsecPerYr;
46
46
  const sArc = chainModes.s[k] && chainModes.s[k].arcsecPerYr;
47
47
  PUBLISHED_PLANET_RECORDS[k] = Object.freeze({
48
- name: PLANET_DISPLAY_NAMES[k], // presentation — planets/display-names, the deleted JSON's last leaf (plan 11 step 6)
48
+ name: PLANET_DISPLAY_NAMES[k], // presentation — planets/display-names
49
49
  orbitalPeriodInputDays: ar.orbitalPeriodInputDays,
50
50
  longitudePerihelion: ar.longitudePerihelion,
51
- ascendingNodeInvPlane: ar.ascendingNodeInvPlaneClosedForm, // the closed-form verified J2000 node — astro-reference since plan 11 step 2
51
+ ascendingNodeInvPlane: ar.ascendingNodeInvPlaneClosedForm, // the closed-form verified J2000 node (astro-reference)
52
52
  invPlaneInclinationJ2000: ar.invPlaneInclinationJ2000,
53
53
  orbitalEccentricityJ2000: ar.orbitalEccentricityJ2000,
54
54
  axialTiltJ2000: ar.axialTiltJ2000,
@@ -8,7 +8,7 @@ import { ONE_FAMILY_WINDOW_YEARS } from '../earth/year-lengths.cjs';
8
8
  /** @param {import('./sun-and-eclipses.js').Ctx} ctx @returns the bindings the later slices read */
9
9
  export function assemblePublishedPeriods(ctx) {
10
10
  const { certifiedAxialPrecessionJ2000Years, deepLod, yearLengthsM, yearToTMa } = ctx;
11
- // Plan 06 Phase 3 S2 — THE published of-date precession period and mean
11
+ // THE published of-date precession period and mean
12
12
  // tropical year: the one-family route (B) inside the banked tiers
13
13
  // (|Δyear| ≤ ONE_FAMILY_WINDOW_YEARS), the composed lunisolar period
14
14
  // beyond (S5: on the derived J2000 anchor, so the two faces agree at
@@ -56,7 +56,7 @@ export function assembleSunAndEclipses(ctx) {
56
56
  const cyclesTo = (year) => {
57
57
  const dy = year - 2000;
58
58
  const s = dy >= 0 ? 1 : -1, a = Math.abs(dy);
59
- // WARM THE SAMPLER TO THE TARGET FIRST (plan 06 R4, measured): the
59
+ // WARM THE SAMPLER TO THE TARGET FIRST (measured): the
60
60
  // table below grows outward in 1-yr / 100-yr steps, and every step
61
61
  // beyond ~1.6 Myr enlarged the one-family sampler's >2-Myr tier just
62
62
  // past its span, rebuilding the whole deep integration about every 32
@@ -131,7 +131,7 @@ export function assembleSunAndEclipses(ctx) {
131
131
  * (648000 / Math.PI);
132
132
  // FQ-5 N3 — the completion's carriers are FRAMEWORK-derived from the
133
133
  // model's own planet period records (the Moon-elongation rate from the
134
- // sidereal month/year identity). Plan 06 I2 — the carriers are SIDEREAL
134
+ // sidereal month/year identity). The carriers are SIDEREAL
135
135
  // (measured): the records' orbitalPeriodInputDays are OF-DATE periods (their
136
136
  // rates sit +1.39..1.62°/cy above the VSOP sidereal mean motions — the
137
137
  // framework precession plus input rounding), and a perturbation argument
@@ -169,7 +169,7 @@ export function assembleSunAndEclipses(ctx) {
169
169
  },
170
170
  sunLonDegAt: /** @param {number} jdUT */ (jdUT) => eclipseFinders.sunLonDegAt(jdUT),
171
171
  sunCompletionDeg: sunPlanetaryCompletionDeg,
172
- // plan 06 R3 item 1: the location tier on APPARENT places — the Sun's derived κ
172
+ // The location tier on APPARENT places — the Sun's derived κ
173
173
  // (the same helper the cardinal instants use), the Moon's relative light-time
174
174
  // inside the besselian; the series-extension tail now lives in sceneEvalAt.
175
175
  sunAberrationDegAt: /** @param {number} year */ (year) => late.sunAberrationArcsecAt(year) / 3600,
@@ -94,7 +94,7 @@ export function assembleSurface(ctx) {
94
94
  // one-family inside the window, the tidal-chain mean beyond.
95
95
  tropicalYearSecondsAtYear: publishedTropicalYearSecondsAtYear,
96
96
  }),
97
- // Plan 06 Phase 3 S3 → S5 — the lunisolar precession clock as a
97
+ // The lunisolar precession clock as a
98
98
  // first-class surface: Earth's spin clock, ONE home for its published
99
99
  // faces, spoken in PERIODS and their RATIOS — no unit, no integer.
100
100
  // ONE J2000 reading: every face reads 25,771.6 yr at J2000 — the
@@ -108,7 +108,7 @@ export function assembleSurface(ctx) {
108
108
  lunisolar: Object.freeze({
109
109
  /** The mean lunisolar precession period T_p(t), years — 1,296,000/the precession RATE of date (25,771.6 at J2000): THE published deep-time clock. @param {number} year @returns {number} */
110
110
  meanPeriodYearsAtYear: (year) => { const p = deepLod.lunisolarPrecessionPeriodYearsAtAge(yearToTMa(year)); return p === null ? certifiedAxialPrecessionJ2000Years() : p; },
111
- /** THE PRECESSION RATE OF DATE ψ̇(t) = [ω/ω₀]·p₀·[f_S + (1 − f_S)(a₀/a_M)³] × cos ε̄(t)/cos ε̄(0), ″/yr — the constant's scaling on the spin and the lunar torque times the cited mean obliquity's cosine (plan 12 §8 option (a); p₀ = 50.2880, the IAU 2006 input). @param {number} year @returns {number} */
111
+ /** THE PRECESSION RATE OF DATE ψ̇(t) = [ω/ω₀]·p₀·[f_S + (1 − f_S)(a₀/a_M)³] × cos ε̄(t)/cos ε̄(0), ″/yr — the constant's scaling on the spin and the lunar torque times the cited mean obliquity's cosine (p₀ = 50.2880, the IAU 2006 input). @param {number} year @returns {number} */
112
112
  meanRateArcsecPerYrAtYear: (year) => { const r = deepLod.lunisolarPrecessionRateArcsecPerYrAtAge(yearToTMa(year)); return r === null ? 1296000 / certifiedAxialPrecessionJ2000Years() : r; },
113
113
  /** THE PRECESSION CONSTANT OF DATE as a rate on the J2000 obliquity, ″/yr — the spin and torque scaling alone (the hybrid obliquity integration's integrand: its own ŝ·n̂ carries the cosine). @param {number} year @returns {number} */
114
114
  torqueRateArcsecPerYrAtYear: (year) => { const r = deepLod.lunisolarTorqueRateArcsecPerYrAtAge(yearToTMa(year)); return r === null ? 1296000 / certifiedAxialPrecessionJ2000Years() : r; },
@@ -212,9 +212,9 @@ export function assembleSurface(ctx) {
212
212
  // its deep mean is the Quaternary mean on the tail's mean plane (plan 12
213
213
  // §8.3). The cited mean obliquity of date is `meanObliquityCitedDeg`.
214
214
  obliquityDeg: /** @param {number} year @returns {number} */ (year) => oneSourceM.epsAt(year),
215
- /** The hybrid's own domain, [yearFrom, yearTo] — the banked ζ series' span, ±10 Myr about J2000 (plan 12 §8.5: the published surfaces serve `obliquityDeg` inside it only; null without a series, i.e. a bare createModel()). */
215
+ /** The hybrid's own domain, [yearFrom, yearTo] — the banked ζ series' span, ±10 Myr about J2000 (the published surfaces serve `obliquityDeg` inside it only; null without a series, i.e. a bare createModel()). */
216
216
  obliquityHybridDomainYears: oneSourceM.obliquityHybridDomainYears,
217
- /** The cited mean obliquity of date ε̄(t) (Farhat et al. 2022's column; plan 12 §8 option (a)), degrees — a Myr-scale mean; NaN beyond 4,429 Ma. @param {number} year @returns {number} */
217
+ /** The cited mean obliquity of date ε̄(t) (Farhat et al. 2022's column), degrees — a Myr-scale mean; NaN beyond 4,429 Ma. @param {number} year @returns {number} */
218
218
  meanObliquityCitedDeg: /** @param {number} year @returns {number} */ (year) => { const e = chain.meanObliquityCitedDegAtAge(yearToTMa(year)); return e === null ? NaN : e; },
219
219
  eccentricity: eccentricityAt,
220
220
  inclinationDeg,
@@ -234,7 +234,7 @@ export function assembleSurface(ctx) {
234
234
  siderealDaySeconds,
235
235
  stellarDaySeconds,
236
236
  }),
237
- // Plan 06 R1: the instants are the crossings of the ONE Sun (the
237
+ // The instants are the crossings of the ONE Sun (the
238
238
  // certified completed Sun the scene renders), UT model-JD; the RA at a
239
239
  // crossing is the target longitude by construction (λ = 0/90/180/270 ⇒
240
240
  // RA = 0/90/180/270, any obliquity); the per-type year length is the
@@ -266,6 +266,10 @@ export function assembleSurface(ctx) {
266
266
  distanceKmAtYear: /** @param {number} year @returns {number} */ (year) => moonDistanceKmAtYearOrNaN(year),
267
267
  siderealMonthDaysAtYear: moonSiderealMonthDaysAt,
268
268
  synodicMonthDays: moonSynodicMonthDays,
269
+ // The perigee/node eccentricity sensitivities (plan 23): the Meeus-effective
270
+ // pair the record fixes and the PHYSICAL pair the runtime derives from it
271
+ // (moon/ecc-sensitivities.cjs, the ONE home) — the registry's source.
272
+ eccSensitivities: chain.moonEccSensitivities,
269
273
  // The apparent-position chain (truncated Meeus Ch. 47 series on
270
274
  // framework-native arguments). JD(UT) axis — UT→TT applied internally.
271
275
  lonDegAtJD: /** @param {number} jd @returns {number} */ (jd) => moonSeries.truncatedLonDeg(jd),
@@ -288,7 +292,7 @@ export function assembleSurface(ctx) {
288
292
  sunLonCompletedDegAtJD: /** @param {number} jd @returns {number} */ (jd) =>
289
293
  eclipseFinders.sunLonDegAt(jd)
290
294
  - sunPlanetaryCompletionDeg((jdTTFromUT(jd) - j2000JD) / julianCenturyDays),
291
- /** The APPARENT Sun (completed geometric − the derived aberration constant + the leading nutation terms on the model's own arguments) — the quantity Horizons' observer ecliptic longitude is; the cardinal instants are its crossings (plan 06 R1/I1). @param {number} jdUT @returns {number} */
295
+ /** The APPARENT Sun (completed geometric − the derived aberration constant + the leading nutation terms on the model's own arguments) — the quantity Horizons' observer ecliptic longitude is; the cardinal instants are its crossings. @param {number} jdUT @returns {number} */
292
296
  sunApparentLonDegAtJD: /** @param {number} jdUT @returns {number} */ (jdUT) => sunApparentLonDegAtJdUT(jdUT),
293
297
  findLunarInRange: /** @param {number} jdStart @param {number} jdEnd */ (jdStart, jdEnd) => eclipseFinders.findLunarEclipsesInRange(jdStart, jdEnd),
294
298
  findSolarInRange: /** @param {number} jdStart @param {number} jdEnd */ (jdStart, jdEnd) => eclipseFinders.findSolarEclipsesInRange(jdStart, jdEnd),
@@ -20,8 +20,12 @@
20
20
  * with p the IAU general precession.
21
21
  *
22
22
  * Construction (docs/66 §1, abridged): linear rates are observational J2000
23
- * anchors; perigee/node ride the PHASE-AWARE e_E channel integral (s_ϖ
24
- * 2.407 / s_Ω 1.018, Meeus-effective); Lp's planetary T² remainder rides
23
+ * anchors; perigee/node ride the PHASE-AWARE e_E channel integral on the
24
+ * PHYSICAL sensitivities (s_ϖ 2.479 / s_Ω 0.867 — derived from the
25
+ * Meeus-effective 2.407 / 1.018 by removing the frame's T²;
26
+ * moon/ecc-sensitivities.cjs, the ONE home) plus the model's own precession
27
+ * of date, pFix, the ONE frame term every of-date longitude carries (plan 23
28
+ * — so M′ and F are frame-free at every epoch); Lp's planetary T² remainder rides
25
29
  * the bounded e_E² carrier + the obliquity-line carrier (K_PL derived
26
30
  * lazily from the closed v4 budget — zero new constants); D and M are
27
31
  * identity-composed (D ≡ Lp − L_sun, M ≡ L_sun − ϖ_sun) on the injected
@@ -37,6 +41,8 @@
37
41
  // reform). ONE home — time/calendar.cjs; re-exported here for the readers
38
42
  // that import it from the arguments module.
39
43
  const { jdToDecimalYear } = require('../time/calendar.cjs');
44
+ // The Meeus Ch. 47 argument rates — ONE home (plan 23; the sensitivities' derivation reads the same set).
45
+ const { MEEUS_ARGUMENT_RATES_DEG_PER_CY } = require('./ecc-sensitivities.cjs');
40
46
 
41
47
  /**
42
48
  * @typedef {{Lp: number, D: number, M: number, Mp: number, F: number}} MoonArgsDeg
@@ -59,6 +65,7 @@ const SECULAR_COMPLETION_TAPER_YEARS = 27943.083333333332;
59
65
  * elpEarthFigureJ2ArcsecPerCy2: number,
60
66
  * elpGeneralPrecessionPA_T2ArcsecPerCy2: number,
61
67
  * eccE0: number,
68
+ * moonEccSensitivities: ReturnType<typeof import('./ecc-sensitivities.cjs').deriveMoonEccSensitivities>,
62
69
  * },
63
70
  * fns: {
64
71
  * eccAt: (tYr: number) => number,
@@ -94,8 +101,9 @@ function createMoonArguments({ constants, fns }) {
94
101
  j2000JD, julianCenturyDays,
95
102
  eccentricityJ2000, eccentricityDotJ2000, eccentricityDotDotJ2000,
96
103
  elpEarthFigureJ2ArcsecPerCy2, elpGeneralPrecessionPA_T2ArcsecPerCy2,
97
- eccE0,
104
+ eccE0, moonEccSensitivities,
98
105
  } = constants;
106
+ if (!moonEccSensitivities) throw new Error('moon/arguments: constants.moonEccSensitivities is required (the deep-time chain\'s derived pair — plan 23)');
99
107
  const {
100
108
  eccAt, channelIntegral, computeObliquityEarth, jdToSIyear,
101
109
  sunMeanLonDegAtJdTT, sunPerihelionLonDegAtJdTT,
@@ -108,17 +116,26 @@ function createMoonArguments({ constants, fns }) {
108
116
  const bundle = (() => {
109
117
  const LP0 = 218.3164477, D0 = 297.8501921, M0 = 357.5291092,
110
118
  MP0 = 134.9633964, F0 = 93.2720950;
111
- const LPR = 481267.88123421, DR = 445267.1114034, MR = 35999.0502909,
112
- MPR = 477198.8675055, FR = 483202.0175233;
119
+ const { Lp: LPR, D: DR, M: MR, Mp: MPR, F: FR } = MEEUS_ARGUMENT_RATES_DEG_PER_CY; // ONE home (plan 23)
113
120
  const WDOT = LPR - MPR; // perigee ϖ̇ of-date (+4069.0137) = ϖ̇_ICRF + p
114
121
  const NDOT = LPR - FR; // node Ω̇ of-date (−1934.1363) = Ω̇_ICRF + p
115
122
  // e_E channel Taylor CHECKS (documented J2000 reference values — the live
116
123
  // path is the phase-aware channelIntegral; T2_*/T3_* are NOT consumed):
117
124
  const E0 = eccentricityJ2000, EDOT0 = eccentricityDotJ2000;
118
125
  const KAPPA = 3 * E0 * EDOT0 / (1 - E0 * E0);
119
- // v4 frame attribution: FRAME-EFFECTIVE exponents (physical pair after
120
- // removing the IAU ṗ_A frame term: s_ϖ 2.479 / s_Ω 0.867).
121
- const S_W = 2.407, S_N = 1.018;
126
+ // The sensitivities (plan 23; moon/ecc-sensitivities.cjs, the ONE home). The
127
+ // Meeus-EFFECTIVE pair S_W/S_N reproduces Meeus's of-date T² exactly — the
128
+ // documented check below. The live channel runs the PHYSICAL pair
129
+ // S_W_PHYS/S_N_PHYS (the frame's T² removed; the three-body lab's pure-gravity
130
+ // values) on the ICRF rates W_ICRF/N_ICRF, and the frame rides separately:
131
+ // the Meeus polynomial p₀·T + T2F·T² in the snapshot branch (so its T² is
132
+ // Meeus-exact as before), the model's own precession of date (pFix) in the
133
+ // deep branch — ONE frame term on L′, ϖ and Ω alike.
134
+ const SENS = moonEccSensitivities;
135
+ const S_W = SENS.perigeeEffective, S_N = SENS.nodeEffective;
136
+ const S_W_PHYS = SENS.perigeePhysical, S_N_PHYS = SENS.nodePhysical;
137
+ const W_ICRF = SENS.perigeeRateIcrfDegPerCy, N_ICRF = SENS.nodeRateIcrfDegPerCy;
138
+ const P0 = SENS.generalPrecessionDegPerCy, T2F = SENS.frameT2DegPerCy2;
122
139
  const T2_W = S_W * WDOT * KAPPA / 2; // −0.010318 °/cy² (Meeus ϖ −0.010320)
123
140
  const T2_N = S_N * NDOT * KAPPA / 2; // +0.0020752 °/cy² (Meeus Ω +0.0020753)
124
141
  const EDDOT0 = eccentricityDotDotJ2000;
@@ -130,7 +147,7 @@ function createMoonArguments({ constants, fns }) {
130
147
  const T2_LP_TIDAL = (-25.86 / 3600) / 2;
131
148
  const T2_LP_PLANETARY = -0.0015786 - T2_LP_TIDAL; // +7.247″/cy²
132
149
  const T2_LP = T2_LP_TIDAL + T2_LP_PLANETARY;
133
- return { LP0, D0, M0, MP0, F0, LPR, DR, MR, WDOT, NDOT, T2_W, T2_N, T3_W, T3_N, T2_LP, T2_LP_TIDAL, S_W, S_N };
150
+ return { LP0, D0, M0, MP0, F0, LPR, DR, MR, WDOT, NDOT, T2_W, T2_N, T3_W, T3_N, T2_LP, T2_LP_TIDAL, S_W, S_N, S_W_PHYS, S_N_PHYS, W_ICRF, N_ICRF, P0, T2F };
134
151
  })();
135
152
 
136
153
  // ── Bounded Lp carriers (K_PL / C_OBL derived lazily — zero new constants)
@@ -235,6 +252,23 @@ function createMoonArguments({ constants, fns }) {
235
252
  }
236
253
  const obliquityCarrier = makeDeepCarrier(obliquityIntegrand, obliquityCarrierDense);
237
254
 
255
+ /** The frame share's REMAINDER for ϖ and Ω (plan 23). The physical exponents gave
256
+ * up the frame's T² the Meeus-effective pair carried (T2F, Lieske's); pFix
257
+ * supplies the model's own in-window acceleration (ṗΔ_eff/2, self-measured);
258
+ * the difference rides the obliquity carrier's integrand, exactly as L′'s
259
+ * figure+frame part does — so every of-date longitude's T² stays Meeus-exact
260
+ * and ONE frame term (pFix + this remainder) rides L′, ϖ and Ω alike. Bounded
261
+ * (the obliquity cycle), ~0.1° at most. Without the (d′) pair (pdSlope 0) the
262
+ * whole Lieske share rides here and pFix is 0 — the same frame, one carrier.
263
+ * @param {number} T @returns {number} */
264
+ function frameRemainder(T) {
265
+ if (T === 0) return 0;
266
+ const pdHalf = rateCompInit().pdSlopeDegPerCy2 / 2;
267
+ const t2Obl = (elpEarthFigureJ2ArcsecPerCy2 + elpGeneralPrecessionPA_T2ArcsecPerCy2) / 3600 - pdHalf; // L′'s carrier normalization (oblInit)
268
+ const t2Rem = bundle.T2F - pdHalf;
269
+ return t2Obl === 0 ? 0 : obliquityCarrier(T) * (t2Rem / t2Obl);
270
+ }
271
+
238
272
  // ── Secular-ë completion carrier (ṅ campaign, plan §12i item 0 (c)) ──────
239
273
  // The certified snapshot's Lp T³/T⁴ tail is DERIVED physics (v4 D3,
240
274
  // tools/explore/v4-d3-tails.js): the Adams–Laplace channel's curvature
@@ -446,18 +480,22 @@ function createMoonArguments({ constants, fns }) {
446
480
  if (Ntrop === null || Naps === null || Nnod === null) return null; // tidal-lock guard
447
481
  const Tj = (jd - j2000JD) / julianCenturyDays;
448
482
  const dy = y - argsY0;
449
- // pFix rides Lp ONLY: the obliquity carrier's PA reduction compensates
450
- // its ṗΔ·T²/2 there, keeping total Lp T² certified. The apsidal/nodal
451
- // chains' own curvature is ALREADY certified-consistent (v4 checks;
452
- // pre-(d′) isolation −0.20/+0.13″/cy²), so ϖ/Ω take only the tapered
453
- // rate anchors — which self-measure and absorb their Δp rate share.
454
- // Deep time: Mp/F inherit Lp's bounded pFix oscillation uncancelled
455
- // (physically p-free args; bounded, display-class — documented).
456
- const pF = rateCompInit().pFix(dy);
483
+ // ONE equinox for the three of-date longitudes (plan 23): pFix = ∫(p_dyn − p_kin),
484
+ // the model's own precession of date beyond the chains' kinematic mean, rides
485
+ // L′, ϖ AND Ω alike, so the frame-free arguments M′ = L′ − ϖ and F = L′ − Ω
486
+ // cancel it exactly at every epoch. The apsidal/nodal chains run the PHYSICAL
487
+ // exponents (the frame's T² is no longer frozen inside them); the Lieske share
488
+ // they gave up minus pFix's in-window T² rides the obliquity carrier as
489
+ // frameRemainder, as L′'s figure+frame part does, so ϖ and Ω stay Meeus-exact
490
+ // in T²; the tapered rate anchors self-measure. (Before plan 23 pFix rode L′ only while the chains
491
+ // carried the frame share in the Meeus-effective exponents: in the window the
492
+ // two agreed to 0.006″/cy², beyond it M′ and F inherited the whole wobble —
493
+ // measured 2.5° at ±10 kyr, 39° at −1 Myr.)
494
+ const pF = rateCompInit().pFix(dy), fr = frameRemainder(Tj);
457
495
  const Lp = A.LP0 + 360 * Ntrop + planetaryCarrier(Tj) + obliquityCarrier(Tj)
458
496
  + lpSecularCompletion(Tj) + pF;
459
- const w = (A.LP0 - A.MP0) + 360 * Naps; // perigee ϖ (of-date, advance)
460
- const om = (A.LP0 - A.F0) - 360 * Nnod; // node Ω (of-date, regression)
497
+ const w = (A.LP0 - A.MP0) + 360 * Naps + pF + fr; // perigee ϖ (of-date, advance)
498
+ const om = (A.LP0 - A.F0) - 360 * Nnod + pF + fr; // node Ω (of-date, regression)
461
499
  const Lsun = sunMeanLonDegAtJdTT(jd); // the certified Sun's mean longitude (unwrapped)
462
500
  const ws = sunPerihelionLonDegAtJdTT(jd) + 180; // the Sun's perihelion = Earth's mean ϖ of date + 180° (wrapped; M wraps)
463
501
  void A;
@@ -503,8 +541,13 @@ function createMoonArguments({ constants, fns }) {
503
541
  const Tc = Math.max(-100, Math.min(100, T));
504
542
  const Tc2 = Tc * Tc, Tc3 = Tc2 * Tc, Tc4 = Tc3 * Tc;
505
543
  const Lp = A.LP0 + A.LPR * T + A.T2_LP * Tc2 + Tc3 / 538841 - Tc4 / 65194000;
506
- const w = (A.LP0 - A.MP0) + A.WDOT * (T + channelIntegral(T, A.S_W)); // perigee ϖ (of-date)
507
- const om = (A.LP0 - A.F0) + A.NDOT * (T + channelIntegral(T, A.S_N)); // node Ω (of-date)
544
+ // Perigee and node (of-date), plan 23: the ICRF rate on the PHYSICAL channel
545
+ // exponent plus the Meeus polynomial's frame, p₀·T + T2F·T² (clamped with the
546
+ // other tails) — the T² is Meeus-exact as before, the frame share no longer
547
+ // rides the eccentricity channel's wiggle. The deep branch carries the model's
548
+ // own precession of date (pFix) in its place.
549
+ const w = (A.LP0 - A.MP0) + A.W_ICRF * (T + channelIntegral(T, A.S_W_PHYS)) + A.P0 * T + A.T2F * Tc2; // perigee ϖ (of-date)
550
+ const om = (A.LP0 - A.F0) + A.N_ICRF * (T + channelIntegral(T, A.S_N_PHYS)) + A.P0 * T + A.T2F * Tc2; // node Ω (of-date)
508
551
  const Lsun = sunMeanLonDegAtJdTT(jdTT); // the certified Sun's mean longitude of date
509
552
  const ws = sunPerihelionLonDegAtJdTT(jdTT) + 180; // the Sun's perihelion of date
510
553
  return {
@@ -520,12 +563,13 @@ function createMoonArguments({ constants, fns }) {
520
563
  const T2 = T * T, T3 = T2 * T, T4 = T3 * T;
521
564
  /** @param {number} x */
522
565
  const wrap = (x) => ((x % 360) + 360) % 360;
566
+ const R = MEEUS_ARGUMENT_RATES_DEG_PER_CY; // the rates' ONE home (plan 23)
523
567
  return {
524
- Lp: wrap(218.3164477 + 481267.88123421 * T - 0.0015786 * T2 + T3 / 538841 - T4 / 65194000),
525
- D: wrap(297.8501921 + 445267.1114034 * T - 0.0018819 * T2 + T3 / 545868 - T4 / 113065000),
526
- M: wrap(357.5291092 + 35999.0502909 * T - 0.0001536 * T2 + T3 / 24490000),
527
- Mp: wrap(134.9633964 + 477198.8675055 * T + 0.0087414 * T2 + T3 / 69699 - T4 / 14712000),
528
- F: wrap( 93.2720950 + 483202.0175233 * T - 0.0036539 * T2 - T3 / 3526000 + T4 / 863310000),
568
+ Lp: wrap(218.3164477 + R.Lp * T - 0.0015786 * T2 + T3 / 538841 - T4 / 65194000),
569
+ D: wrap(297.8501921 + R.D * T - 0.0018819 * T2 + T3 / 545868 - T4 / 113065000),
570
+ M: wrap(357.5291092 + R.M * T - 0.0001536 * T2 + T3 / 24490000),
571
+ Mp: wrap(134.9633964 + R.Mp * T + 0.0087414 * T2 + T3 / 69699 - T4 / 14712000),
572
+ F: wrap( 93.2720950 + R.F * T - 0.0036539 * T2 - T3 / 3526000 + T4 / 863310000),
529
573
  };
530
574
  }
531
575
 
@@ -12,30 +12,24 @@
12
12
  * — the constant remainder pins the unresolved short/ultra-long content at
13
13
  * the JPL J2000 seed anchor, so e(J2000) is exact by construction.
14
14
  *
15
- * DOMAIN (decision (ii), proper physics — no mixed device): the ENTIRE
16
- * lunar chain reads THIS channel — eccAt (the Δe² argument terms),
17
- * channelIntegral (perigee/node of-date rates), modulation (the
18
- * month/precession chain and its integrated cycle counts), eFactorAt (the
19
- * Meeus E-factor). The Sun/clock machinery (eclipse Sun equation of
20
- * centre, besselian Sun distance, cardinal braid) stays on the H/3 law
21
- * (moon/ecc-channel.cjs) — a CERTIFICATION split, not a physics one: the
22
- * two e's agree within 4.2e-5 wherever the domains overlap, and the H/3
23
- * line keeps its E18 role as the epoch-local tangent inside the fitted
24
- * clock stack.
15
+ * DOMAIN (decision (ii)): the ENTIRE lunar chain reads THIS channel — eccAt
16
+ * (the Δe² argument terms), channelIntegral (perigee/node of-date rates),
17
+ * modulation (the month/precession chain and its integrated cycle counts),
18
+ * eFactorAt (the Meeus E-factor). Earth's eccentricity of date is the
19
+ * N-body series on every other path as well (plan 21: one e-vector of date
20
+ * on every surface).
25
21
  *
26
- * MEASURED at adoption (banked in the plan record): vs the H/3 law the
27
- * attractor-mean modulation shifts are +2,526 ppm (perigee channel,
28
- * s = 2.407) and +1,067 ppm (node, s = 1.018) — month/LOD shifts of
29
- * ~10–25 ppm class, all 41 paleo anchors in bands; the ancient eclipse
30
- * stack's cycle counts shift (χ² IMPROVES — recorded with its
31
- * explanation: this e is La2004-corroborated in-era, 3× closer than the
32
- * H/3 line; theory-corroborated, never tuned). Beyond ~5 Myr the table is
33
- * spectrum-class (phases decohere) — the quasi-periodic ATTRACTOR (mean e
34
- * and the 405-kyr-class beat structure) is the claim, never a pointwise
35
- * ephemeris.
22
+ * MEASURED at adoption (banked in the plan record): the attractor-mean
23
+ * modulation shifts were +2,526 ppm (perigee channel) and +1,067 ppm (node)
24
+ * against the single-line law it replaced — month/LOD shifts of ~10–25 ppm
25
+ * class, all 41 paleo anchors in bands; the ancient eclipse stack's cycle
26
+ * counts shift (χ² IMPROVES — recorded with its explanation: this e is
27
+ * La2004-corroborated in-era; theory-corroborated, never tuned). Beyond
28
+ * ~5 Myr the table is spectrum-class (phases decohere) — the quasi-periodic
29
+ * ATTRACTOR (mean e and the 405-kyr-class beat structure) is the claim,
30
+ * never a pointwise ephemeris.
36
31
  *
37
- * LOAD-BEARING conventions (carried VERBATIM from the era channel —
38
- * moon/ecc-channel.cjs — so the certified numerics match):
32
+ * LOAD-BEARING conventions (the certified numerics):
39
33
  * - channelIntegral uses composite Simpson with step ≤ ~4,000 yr
40
34
  * (N ≥ 2, even);
41
35
  * - modulation(tMa, s) takes age in Myr, positive = past, ≡ 1 at J2000;
@@ -63,7 +57,8 @@
63
57
  *
64
58
  * — ż_J2000 is the run's own z-rate at J2000 (script-written into the
65
59
  * artifact by generate.mjs from the banked series: "we are the source"),
66
- * T_q the H/12 taper the arguments' rate anchors ride. Inside the canon it
60
+ * T_q the arguments' secular-completion taper (SECULAR_COMPLETION_TAPER_YEARS,
61
+ * the one the rate anchors ride). Inside the canon it
67
62
  * restores the run's slope exactly; beyond ±T_q it is a constant vector
68
63
  * offset of ~3e-3, the size of the table's own spectrum-class scatter
69
64
  * there, never a growing polynomial. Absent the two fields (an older
@@ -0,0 +1,87 @@
1
+ /**
2
+ * The lunar perigee/node eccentricity sensitivities — ONE home (plan 23).
3
+ *
4
+ * The Sun's mean perturbation on the lunar perigee and node scales as
5
+ * g(e_E) = (1 − e_E²)^(−3/2); the of-date rates ride the channel
6
+ * rate(t) = rate₀ · [g(e_E(t))/g₀]^s. The pair the record fixes is the
7
+ * MEEUS-EFFECTIVE one: s_ϖ = 2.407 / s_Ω = 1.018 reproduce Meeus Ch. 47's
8
+ * of-date T² coefficients exactly (doc 66 §1, the (ė, s) degeneracy). Each of
9
+ * those T² coefficients contains the equinox's own acceleration — the general
10
+ * precession's T² term, a frame bookkeeping share that has nothing to do with
11
+ * Earth's eccentricity. Removing it gives the PHYSICAL pair the three-body
12
+ * laboratory reproduces from pure gravity (2.479 / 0.867; doc 66 §1):
13
+ *
14
+ * s_phys = (s_eff · Ẋ_of-date · κ/2 − T2_frame) / (Ẋ_ICRF · κ/2),
15
+ * κ = 3 e₀ ė₀ / (1 − e₀²), Ẋ_ICRF = Ẋ_of-date − p₀
16
+ *
17
+ * — derived here from the injected constants, never typed. The runtime (plan
18
+ * 23) carries s_phys in the channel and ONE frame term, the model's own
19
+ * precession of date, on every of-date lunar longitude alike, so the
20
+ * frame-free arguments M′ = L′ − ϖ and F = L′ − Ω cancel it exactly at every
21
+ * epoch. Measured before the change (plan 23 §0): with the frame share frozen
22
+ * inside s_eff on the eccentricity channel, M′ and F inherited L′'s frame term
23
+ * uncancelled — 2.5° at ±10 kyr, 39° at −1 Myr — and the perigee and node
24
+ * carried a 3 % share of the channel's own wiggle that is not theirs; in the
25
+ * historical window the change is ≤ 21″ of ϖ/Ω at ±3000 (seconds of eclipse
26
+ * time).
27
+ *
28
+ * The Meeus Ch. 47 argument RATES live here too (the ONE set the arguments
29
+ * module, its pure-Meeus reference and this derivation share).
30
+ */
31
+
32
+ 'use strict';
33
+
34
+ /** Meeus Ch. 47 mean-argument rates, degrees per Julian century (the J2000 polynomials' linear terms). */
35
+ const MEEUS_ARGUMENT_RATES_DEG_PER_CY = Object.freeze({
36
+ Lp: 481267.88123421, // the Moon's mean longitude L′
37
+ D: 445267.1114034, // the mean elongation
38
+ M: 35999.0502909, // the Sun's mean anomaly
39
+ Mp: 477198.8675055, // the Moon's mean anomaly M′
40
+ F: 483202.0175233, // the argument of latitude
41
+ });
42
+
43
+ /** The Meeus-effective pair: Meeus-exact of-date T² by construction (the shipped record values). */
44
+ const MOON_ECC_SENSITIVITY_PERIGEE = 2.407;
45
+ const MOON_ECC_SENSITIVITY_NODE = 1.018;
46
+
47
+ /**
48
+ * The physical pair and the rate split, derived from the shipped constants.
49
+ * @param {{
50
+ * eccentricityJ2000: number,
51
+ * eccentricityDotJ2000: number,
52
+ * frameT2ArcsecPerCy2: number,
53
+ * generalPrecessionArcsecPerYr: number,
54
+ * }} inputs — e₀ (the catalog secular value the Taylor checks use); ė₀ per
55
+ * Julian century; the general precession's T² coefficient the of-date Meeus
56
+ * polynomials embed (Lieske 1976, the ELP frame), ″/cy²; p₀, the IAU 2006 p_A
57
+ * linear rate, ″/yr
58
+ * @returns {Readonly<{
59
+ * perigeeEffective: number, nodeEffective: number,
60
+ * perigeePhysical: number, nodePhysical: number,
61
+ * kappaPerCy: number, frameT2DegPerCy2: number, generalPrecessionDegPerCy: number,
62
+ * perigeeRateOfDateDegPerCy: number, nodeRateOfDateDegPerCy: number,
63
+ * perigeeRateIcrfDegPerCy: number, nodeRateIcrfDegPerCy: number,
64
+ * }>}
65
+ */
66
+ function deriveMoonEccSensitivities({ eccentricityJ2000, eccentricityDotJ2000, frameT2ArcsecPerCy2, generalPrecessionArcsecPerYr }) {
67
+ const R = MEEUS_ARGUMENT_RATES_DEG_PER_CY;
68
+ const e0 = eccentricityJ2000, ed = eccentricityDotJ2000;
69
+ const kappaPerCy = 3 * e0 * ed / (1 - e0 * e0);
70
+ const generalPrecessionDegPerCy = generalPrecessionArcsecPerYr * 100 / 3600;
71
+ const frameT2DegPerCy2 = frameT2ArcsecPerCy2 / 3600;
72
+ const perigeeRateOfDateDegPerCy = R.Lp - R.Mp; // ϖ̇ of date (+4069.0137) = ϖ̇_ICRF + p₀
73
+ const nodeRateOfDateDegPerCy = R.Lp - R.F; // Ω̇ of date (−1934.1363) = Ω̇_ICRF + p₀
74
+ const perigeeRateIcrfDegPerCy = perigeeRateOfDateDegPerCy - generalPrecessionDegPerCy;
75
+ const nodeRateIcrfDegPerCy = nodeRateOfDateDegPerCy - generalPrecessionDegPerCy;
76
+ const half = kappaPerCy / 2;
77
+ const perigeePhysical = (MOON_ECC_SENSITIVITY_PERIGEE * perigeeRateOfDateDegPerCy * half - frameT2DegPerCy2) / (perigeeRateIcrfDegPerCy * half);
78
+ const nodePhysical = (MOON_ECC_SENSITIVITY_NODE * nodeRateOfDateDegPerCy * half - frameT2DegPerCy2) / (nodeRateIcrfDegPerCy * half);
79
+ return Object.freeze({
80
+ perigeeEffective: MOON_ECC_SENSITIVITY_PERIGEE, nodeEffective: MOON_ECC_SENSITIVITY_NODE,
81
+ perigeePhysical, nodePhysical,
82
+ kappaPerCy, frameT2DegPerCy2, generalPrecessionDegPerCy,
83
+ perigeeRateOfDateDegPerCy, nodeRateOfDateDegPerCy, perigeeRateIcrfDegPerCy, nodeRateIcrfDegPerCy,
84
+ });
85
+ }
86
+
87
+ module.exports = { MEEUS_ARGUMENT_RATES_DEG_PER_CY, MOON_ECC_SENSITIVITY_PERIGEE, MOON_ECC_SENSITIVITY_NODE, deriveMoonEccSensitivities };
@@ -33,10 +33,7 @@
33
33
  * pair is 2.479/0.867 after removing the IAU frame term — doc 66 §1).
34
34
  * - The of-date perigee/node periods are COMPOSITIONS of the inertial chain
35
35
  * with the precession of date (the engines' `…OfDateCyclesBetween` count
36
- * identities N_trop − N_anom and N_drac − N_trop). The former 'OfDate'
37
- * family here — N·(H(t)/H₀)² counts per anchor unit and period ∝ T_yr/H —
38
- * was the era device's counter law (doc 99's "Lunar Precession
39
- * Invariant"); it left at plan 09 step 5c with the per-H counts.
36
+ * identities N_trop − N_anom and N_drac − N_trop).
40
37
  * - apsidalMeetsNodal / lunarLeveling existed ONLY in the browser before
41
38
  * this move (the Node scene aliased apsidal-of-date on a cancellation
42
39
  * argument valid for the paired scene nodes only) — the Node engine gains
@@ -70,13 +67,10 @@
70
67
  * eccentricity channel's modulation; constants are the engine's derived
71
68
  * J2000 anchors (both engines derive them from the same JSON).
72
69
  * fns.precessionPeriodYearsAtAge is the engine's lunisolar precession period
73
- * of date T_p(t), Julian years (the composed rate's period; plan 09 step
74
- * 5c — the tropical month's equinox turn, formerly the counter's 13/H(t),
75
- * 0.086 % slow: the chain's J2000 tropical month sat 5.85 ms above the IAU
76
- * input, the 1/T_p form is within 0.1 ms of it).
70
+ * of date T_p(t), Julian years (the composed rate's period — the tropical
71
+ * month's equinox turn; within 0.1 ms of the IAU input at J2000).
77
72
  * fns.distanceMetresAtAge is the engine's CITED distance history
78
- * (deltat/moon-distance-history; plan 12 option A — the internal quartic
79
- * twin this chain carried until then is deleted; null beyond the span).
73
+ * (deltat/moon-distance-history; null beyond the span).
80
74
  */
81
75
  function createMoonMonthChain({ constants, fns }) {
82
76
  const {
@@ -136,8 +130,7 @@ function createMoonMonthChain({ constants, fns }) {
136
130
 
137
131
  /** Tropical month in seconds (equinox-referenced): the sidereal month less
138
132
  * the equinox's own motion over one month — one turn per the precession
139
- * period of date T_p(t). (Plan 09 step 5c: formerly 13 turns per the
140
- * counter H(t), 0.086 % slow.) @param {number} tMa @returns {number | null} */
133
+ * period of date T_p(t). @param {number} tMa @returns {number | null} */
141
134
  function tropicalMonthSecondsAtAge(tMa) {
142
135
  const tSm = siderealMonthSecondsAtAge(tMa);
143
136
  if (tSm === null) return null;
@@ -146,10 +139,8 @@ function createMoonMonthChain({ constants, fns }) {
146
139
  return tSm * (1 - tSm / (/** @type {number} */ (tP) * tYr));
147
140
  }
148
141
 
149
- // (Plan 09 step 5c: the H² of-date family — apsidal/nodal "cycles per H"
150
- // N·(H(t)/H₀)² and the of-date periods ∝ T_yr/H — is deleted with the per-H
151
- // counts. The of-date perigee and node of date are the engines' count
152
- // compositions of this chain's inertial periods with the tropical month.)
142
+ // The of-date perigee and node are the engines' count compositions of this
143
+ // chain's inertial periods with the tropical month.
153
144
 
154
145
  /** Perigee precession period in seconds — Brouwer–Clemence m² scaling ×
155
146
  * e_E-channel modulation (the factored law: period = invariant mean /
@@ -52,14 +52,14 @@
52
52
  * A1-class correlated-subsample effect (the tracked events sit −1.6″
53
53
  * below the +1.4″ fleet mean and sample the near-annual arguments at
54
54
  * correlated phases; the era-split refutes anchor double-counting and
55
- * the modern era improves most, 3.57 → 3.34). The api gate (8″ then; 12″
56
- * since plan 06 R3 item 1 — the physical ΔT-convention floor) holds
55
+ * the modern era improves most, 3.57 → 3.34). The api gate (12″ — the
56
+ * physical ΔT-convention floor) holds
57
57
  * (max 6.2″). Coefficients are stored with the run→real argument
58
58
  * mapping already applied (the extraction's heliocentric-planet vs
59
59
  * geocentric-sun π-offset is folded into the signs).
60
60
  *
61
61
  * THE J2 NODE FAMILY (FQ-7 Round 3, plan §12i) — five derived terms on
62
- * Ω-family arguments (NOT expressible on the integer Delaunay lattice,
62
+ * Ω-family arguments (NOT expressible as integer combinations of the Delaunay arguments,
63
63
  * which is why every earlier extraction missed them; the 200-yr band
64
64
  * probe named them, the dense 2-day JPL sample confirmed them real, and
65
65
  * the channel isolation identified them as EARTH'S J2 acting on the
@@ -11,8 +11,8 @@
11
11
  *
12
12
  * Full scene form: 60 longitude + 60 latitude terms with E/E² scaling on
13
13
  * M-bearing terms, A1 (Venus, Meeus-observed rate — the 18V−16E−M′
14
- * near-resonance makes it hypersensitive; no lattice identity), A2/A3
15
- * (D2-derived lattice rates, CHAIN-INTEGRATED under deep time through
14
+ * near-resonance makes it hypersensitive; no chain identity), A2/A3
15
+ * (D2-derived rates, CHAIN-INTEGRATED under deep time through
16
16
  * their identified content), all six latitude corrections, the EoC-half
17
17
  * subtraction (the off-centre orbit geometry already provides half the
18
18
  * equation of centre), and the two-term ellipse distance.
@@ -26,7 +26,7 @@
26
26
 
27
27
  'use strict';
28
28
 
29
- // Plan 06 R3 item 1: the DERIVED series-extension tail (the D2 planetary and
29
+ // The DERIVED series-extension tail (the D2 planetary and
30
30
  // node terms, moon/series-extension.cjs) is part of the ONE scene Moon —
31
31
  // formerly added by the besselian tier alone, so the rendered Moon and the
32
32
  // eclipse-location Moon were two different Moons. The truncated finder forms
@@ -98,8 +98,6 @@ function createMoonSeries({ constants, fns }) {
98
98
  const nAps = apsidalOfDateCyclesBetween(yA0, yA);
99
99
  // A3 is the STAR-referenced lunar longitude (Meeus' rate 481,266.484 °/cy
100
100
  // ≡ 360°/sidereal month): the chain's sidereal-orbit count directly.
101
- // Plan 09 step 5c — it was the tropical count minus the counter's 13/H
102
- // precession turns (0.086 % slow on the precession).
103
101
  const nSid = siderealOrbitsBetween(yA0, yA);
104
102
  const nJ = jupiterOrbitsBetween(yA0, yA);
105
103
  if (nT !== null && nAps !== null && nSid !== null && nJ !== null) {
@@ -175,9 +173,8 @@ function createMoonSeries({ constants, fns }) {
175
173
  * Returns everything the scene blocks write:
176
174
  * thetaAddRad — the hierarchy θ increment (EoC-half-subtracted Σl);
177
175
  * lonDeg — full ecliptic longitude (GEOMETRIC, mean equinox of date)
178
- * incl. the derived series-extension tail. (The fitted mean-longitude
179
- * anchor moonMeeusLpCorrection was retired to 0 at plan 06 R3 item 1 and
180
- * its parameter deleted at plan 11 step 2: measured against Horizons' apparent
176
+ * incl. the derived series-extension tail. (No fitted mean-longitude
177
+ * anchor — doc 109 §23: measured against Horizons' apparent
181
178
  * Moon over 1970–2049 the series needs no anchor, −1.0″ ± 1.5″ flat in
182
179
  * elongation; the former +32.75″ was the eclipse tier's mean Sun
183
180
  * compensated — its aberration κ, the I2 long inequality and the trend-ΔT