@essrt/physics 20.0.0 → 21.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 (55) hide show
  1. package/README.md +4 -4
  2. package/package.json +3 -8
  3. package/src/cardinal/one-source-structure.cjs +3 -2
  4. package/src/chain-cycles/index.cjs +12 -30
  5. package/src/constants/coefficients.d.ts +16 -92
  6. package/src/constants/coefficients.js +5 -21
  7. package/src/constants/generated.d.ts +12 -16
  8. package/src/constants/generated.js +21 -25
  9. package/src/deltat/deep-time.cjs +36 -92
  10. package/src/deltat/recession-history.cjs +2 -1
  11. package/src/earth/deep-orbital-history.cjs +4 -4
  12. package/src/earth/precession-composed.cjs +3 -3
  13. package/src/earth/year-lengths.cjs +16 -1
  14. package/src/eclipse/sun-planetary-completion.cjs +11 -12
  15. package/src/index.js +22 -46
  16. package/src/layer0/derive-params.js +10 -5
  17. package/src/layer0/index.js +27 -73
  18. package/src/layer1/index.js +6 -37
  19. package/src/model.js +190 -215
  20. package/src/moon/arguments.cjs +57 -83
  21. package/src/moon/deep-modes-artifact.cjs +2 -2
  22. package/src/moon/month-chain.cjs +25 -59
  23. package/src/moon/series.cjs +9 -5
  24. package/src/phase/deep-calendar.cjs +35 -80
  25. package/src/planets/chain-artifact.js +2 -2
  26. package/src/planets/geometry.cjs +52 -23
  27. package/src/planets/model.cjs +5 -5
  28. package/types/chain-cycles/index.d.cts +9 -4
  29. package/types/constants/coefficients.d.ts +16 -92
  30. package/types/constants/generated.d.ts +12 -16
  31. package/types/deltat/deep-time.d.cts +3 -16
  32. package/types/earth/year-lengths.d.cts +12 -0
  33. package/types/eclipse/sun-planetary-completion.d.cts +0 -9
  34. package/types/index.d.ts +2 -12
  35. package/types/layer0/derive-params.d.ts +7 -4
  36. package/types/layer0/index.d.ts +6 -13
  37. package/types/layer1/index.d.ts +0 -2
  38. package/types/model.d.ts +14 -11
  39. package/types/moon/arguments.d.cts +23 -22
  40. package/types/moon/deep-modes-artifact.d.cts +3 -3
  41. package/types/moon/month-chain.d.cts +7 -16
  42. package/types/moon/series.d.cts +2 -2
  43. package/types/phase/deep-calendar.d.cts +14 -50
  44. package/types/planets/geometry.d.cts +27 -11
  45. package/types/planets/model.d.cts +9 -3
  46. package/src/cardinal/index.cjs +0 -324
  47. package/src/moon/ecc-channel.cjs +0 -141
  48. package/src/phase/index.cjs +0 -186
  49. package/src/planets/ecc-channel.cjs +0 -59
  50. package/src/sun/longitude-correction.cjs +0 -68
  51. package/types/cardinal/index.d.cts +0 -80
  52. package/types/moon/ecc-channel.d.cts +0 -30
  53. package/types/phase/index.d.cts +0 -38
  54. package/types/planets/ecc-channel.d.cts +0 -20
  55. package/types/sun/longitude-correction.d.cts +0 -41
@@ -12,11 +12,6 @@
12
12
  * factory wiring).
13
13
  * - moiFactorAtAge — the L1-orbital-coupled GIA α(t). The lattice-α pin
14
14
  * machinery (_withLatticeAlpha) is ENGINE STATE and stays there.
15
- * - siderealYearDaysFourierAt — the IAU-base integrated-phase Fourier
16
- * evaluator (Phase D matched pair). 8.4-1 S-D2: the browser's old Actual
17
- * divided by its epoch-aware f(Y) evaluator instead, double-counting the
18
- * deep-time drift already in mean(t) — 12% wrong at −400 Ma. Both engines
19
- * now inject the ripple-form evaluator.
20
15
  * - cycleLodSumAt / swingLodAt / swingLodRateAt — the engine-GATED
21
16
  * cycle-stack sums (flags are engine dispatch).
22
17
  *
@@ -50,11 +45,9 @@ const { createComposedPrecession } = require('../earth/precession-composed.cjs')
50
45
  * @property {number} aMoonNowMetres - Farhat polynomial anchor
51
46
  * @property {number} alpha1PerMa @property {number} alpha3PerMa3
52
47
  * @property {number} alpha4PerMa4
53
- * @property {number} holisticYearJ2000
54
- * @property {number} lodNowH13Seconds - the H/13-identity mean LOD at J2000
48
+ * @property {number} lodNowH13Seconds - ω₀, the J2000 day length (the SI day since plan 09; identifier kept)
55
49
  * @property {number} meanSiderealYearJ2000Seconds
56
50
  * @property {number} solarMassLossFracPerYear
57
- * @property {number} siderealYearDaysKinematicJ2000 - Actual-LOD numerator
58
51
  * @property {number} precessionSolarShareJ2000 - f_S, the solar fraction of the J2000
59
52
  * precession torque (derive-params) — the unit H(t) = 13·T_p,composed needs it
60
53
  */
@@ -64,7 +57,6 @@ const { createComposedPrecession } = require('../earth/precession-composed.cjs')
64
57
  * @property {DeepTimeLodConstants} constants
65
58
  * @property {(tMa: number) => number} moonDistanceMetresAtAge
66
59
  * @property {(tMa: number) => number} moiFactorAtAge - GIA α(t)
67
- * @property {(year: number) => number} siderealYearDaysFourierAt
68
60
  * @property {(year: number) => number} cycleLodSumAt - gated δLOD sum (incl. swing)
69
61
  * @property {(year: number) => number} swingLodAt - gated swing δLOD alone
70
62
  * @property {(year: number) => number} swingLodRateAt - gated analytic swing rate
@@ -117,26 +109,18 @@ function createDeepTimeLod(deps) {
117
109
  return (s === null) ? null : s / 3600;
118
110
  }
119
111
 
120
- /** The FROZEN ERA CLOCK's phase convention: H_era(t) = H_J2000 · LOD(t)/LOD_J2000
121
- * (pure spin scaling — the pre-Phase-3 "H/13 identity"). The frozen devices
122
- * (the cardinal era clock, the year-length comb family, the ∫dt/H phase
123
- * table) were fitted against THIS counter; it ships with their coefficients
124
- * as a named device constant (plan 06 D8: two named counters). It is NOT
125
- * the unit H(t) below.
126
- * @param {number} t_Ma @returns {number|null} */
127
- function eraClockHAtAge(t_Ma) {
128
- return eraClockHFromLod(lodSecondsAtAge(t_Ma));
129
- }
112
+ // (Plan 09 step 7a deleted the FROZEN ERA CLOCK's public counter
113
+ // `eraClockHAtAge` — H_era(t) = H₀·LOD(t)/LOD₀, plan 06 D8's second named
114
+ // counter — with its year twins; step 7b deleted the unit itself, `hAtAge`
115
+ // = H_era/[f_S + (1 − f_S)(a₀/a_M)³] — H(t) was 13.011 composed precession
116
+ // periods, a fit constant's multiple of T_p(t), never a period of anything
117
+ // the model computes. The physics it scaled is the composed precession
118
+ // below: ψ̇(t) and T_p(t) = 1,296,000/ψ̇ are the published quantities.)
130
119
  // The `…FromLod` twins take an ALREADY-COMPUTED LOD(t): the Simpson ΔT
131
120
  // integrand below evaluated the LOD four times and the tropical year twice
132
121
  // per node through these helpers (measured 8.8 → 4.8 ms per cardinal panel
133
122
  // year with the model's ΔT memo). Same operations, same inputs — every
134
123
  // value bit-identical (11,958-value sweep, 0 differences).
135
- /** @param {number|null} LOD_s @returns {number|null} */
136
- function eraClockHFromLod(LOD_s) {
137
- if (LOD_s === null) return null;
138
- return K.holisticYearJ2000 * LOD_s / K.lodNowH13Seconds;
139
- }
140
124
 
141
125
  // The composed lunisolar precession rate (plan 06 D6 → Phase 3 → S5):
142
126
  // ψ̇(t) = [ω(t)/ω₀]·p₀·[f_S + (1 − f_S)(a₀/a_M(t))³], p₀ the model's
@@ -155,23 +139,6 @@ function createDeepTimeLod(deps) {
155
139
  yearToTMa: /** @param {number} year */ (year) => (2000 - year) / 1e6,
156
140
  });
157
141
 
158
- /** The unit H(t) = H_era / [f_S + (1 − f_S)(a₀/a_M)³] — the internal unit
159
- * scales WITH the composed lunisolar precession period (H(t)/T_p(t) =
160
- * H₀/axial0 = 13.011 at every epoch) but is NOT 13 of them: H₀ was fitted
161
- * on the perihelion-of-date beat, and the "H = 13·T_p" claim is retired
162
- * (plan 06 S5; docs/retired-record.md). Spelled in the SAME operations as
163
- * layer0's holisticHCore so the layer0 gate holds the twins bit-identical.
164
- * ≡ H_era wherever (a₀/a_M)³ ≈ 1. Identifier kept (plan 06 P4).
165
- * @param {number} t_Ma @returns {number|null} */
166
- function hAtAge(t_Ma) {
167
- return hFromLod(t_Ma, lodSecondsAtAge(t_Ma));
168
- }
169
- /** @param {number} t_Ma @param {number|null} LOD_s @returns {number|null} */
170
- function hFromLod(t_Ma, LOD_s) {
171
- const hEra = eraClockHFromLod(LOD_s);
172
- const term = composed.torqueTermAtAge(t_Ma);
173
- return hEra === null || term === null ? null : hEra / term;
174
- }
175
142
 
176
143
  /** The composed lunisolar precession rate, ″/yr — p₀·[ω/ω₀]·[f_S + (1 − f_S)
177
144
  * (a₀/a_M)³] on the derived J2000 anchor (S5). ≡ 1,296,000·(H₀/axial0)/H(t).
@@ -196,32 +163,32 @@ function createDeepTimeLod(deps) {
196
163
  // a(t) = a₀·(1−Δm)): T ∝ M⁻² ⇒ T(t) = T₀·(1−Δm)² — the SAME Driver-2
197
164
  // law the planet chains use (orbit-chain driver2PeriodSecondsAtAge).
198
165
  // The previous (1 − 2Δm) was this law's first-order Taylor — the one
199
- // form in the model inconsistent with it, and the entire source of the
200
- // day-count invariant's 0.17 ppm residual: with the product form,
201
- // H·(days/yr)·(AU₀/AU)² = TOTAL_DAYS_IN_H holds EXACTLY
202
- // (tools/explore/deep-time-sensitivity.js §5; docs/99 §near-invariant).
166
+ // form in the model inconsistent with it (measured on the retired day-count
167
+ // identity of the era counter: with the product form the counter's
168
+ // H_era·(days/yr)·(AU₀/AU)² held exactly — a tautology of spin scaling ∘
169
+ // Kepler, deleted with the counter and the unit at plan 09 steps 7a/7b).
203
170
  return K.meanSiderealYearJ2000Seconds * (1 - mass_loss_fraction) * (1 - mass_loss_fraction);
204
171
  }
205
172
 
206
- /** @param {number} t_Ma @returns {number} tropical = sidereal · (1 − 13/H(t)).
207
- * The 13/H(t) here is the unit's CALENDAR convention (one turn per H₀/13
208
- * of the unit — the kinematic day/year identities on H/(H − 13) and the
209
- * deep JD↔year calendar ride it), NOT a precession claim: the published
210
- * precession period is the composed T_p (S5), 0.086 % apart. Kept
211
- * unchanged in S5 so nothing certified moves (calendar, goldens, CSV);
212
- * plan-06 D2 DECIDED: relabel, not re-base — the 0.086 % is the fit
213
- * anchor's convention (H₀/T_p = 13.011, constant at every epoch beyond
214
- * ±2 Myr, measured), and re-basing would move every comb coefficient
215
- * for a rounding-level gain. This tier stays a named device. */
173
+ /** Tropical year of date, seconds — the sidereal year less the equinox's
174
+ * own motion over one year: one turn per the composed lunisolar precession
175
+ * period T_p(t), 1/T_trop = 1/T_sid + ψ̇(t)/(1,296,000″ · Julian-year s).
176
+ * Plan 09 step 5d: it was the unit's calendar convention sid·(1 − 13/H(t))
177
+ * — plan 06 D2 had kept it as a named device — 0.086 % slow on the equinox
178
+ * term (1.0 s of year at J2000), and the deep JD↔year calendar integrates
179
+ * THIS. The SAME operations as layer0's tropicalYearSecondsCore (the
180
+ * layer0 gate holds the twins bit-identical). Past the tidal chain's domain
181
+ * the J2000 rate stands in. @param {number} t_Ma @returns {number} */
216
182
  function tropicalYearSecondsAtAge(t_Ma) {
217
183
  return tropicalYearSecondsFromLod(t_Ma, lodSecondsAtAge(t_Ma));
218
184
  }
219
185
  /** @param {number} t_Ma @param {number|null} LOD_s @returns {number} */
220
186
  function tropicalYearSecondsFromLod(t_Ma, LOD_s) {
221
187
  const sidSec = siderealYearSecondsAtAge(t_Ma);
222
- const Ht = hFromLod(t_Ma, LOD_s);
223
- if (Ht === null) return sidSec * (1 - 13 / K.holisticYearJ2000);
224
- return sidSec * (1 - 13 / Ht);
188
+ const term = composed.torqueTermAtAge(t_Ma);
189
+ const p0 = composed.p0ArcsecPerYr;
190
+ const rate = (LOD_s === null || !(LOD_s > 0) || term === null) ? p0 : (K.lodNowH13Seconds / LOD_s) * p0 * term;
191
+ return 1 / (1 / sidSec + rate / (1296000 * 365.25 * 86400));
225
192
  }
226
193
 
227
194
  /** @param {number} t_Ma @returns {number|null} */
@@ -237,25 +204,9 @@ function createDeepTimeLod(deps) {
237
204
  return tropicalYearSecondsAtAge(t_Ma) / LOD_s;
238
205
  }
239
206
 
240
- // ── The frozen era clock's twins (device tier) ──────────────────────────
241
- // The same forms on H_era — the bases the frozen cardinal clock (its drift
242
- // integrand and real-LOD convention) and the year-length comb family were
243
- // fitted against. Bit-identical to the pre-Phase-3 tropicalYearSecondsAtAge /
244
- // yearInDaysAtAge; the physical (unit) forms above are what the model
245
- // publishes.
246
- /** @param {number} t_Ma @returns {number} */
247
- function eraClockTropicalYearSecondsAtAge(t_Ma) {
248
- const sidSec = siderealYearSecondsAtAge(t_Ma);
249
- const Ht = eraClockHAtAge(t_Ma);
250
- if (Ht === null) return sidSec * (1 - 13 / K.holisticYearJ2000);
251
- return sidSec * (1 - 13 / Ht);
252
- }
253
- /** @param {number} t_Ma @returns {number|null} */
254
- function eraClockYearInDaysAtAge(t_Ma) {
255
- const LOD_s = lodSecondsAtAge(t_Ma);
256
- if (LOD_s === null) return null;
257
- return eraClockTropicalYearSecondsAtAge(t_Ma) / LOD_s;
258
- }
207
+ // (Plan 09 step 7a: the frozen era clock's year twins on H_era —
208
+ // T_sid·(1 − 13/H_era) and its day count, the bases the deleted cardinal
209
+ // record and year-length combs were fitted against — are deleted.)
259
210
 
260
211
  /**
261
212
  * The solar day's "ecliptic missing motion" correction, seconds: the mean
@@ -323,17 +274,9 @@ function createDeepTimeLod(deps) {
323
274
  return tidal + deps.cycleLodSumAt(year);
324
275
  }
325
276
 
326
- /** ACTUAL LOD: tidal mean × Fourier ripple —
327
- * actual(t) = mean(t) × Y_days_kinematic_J2000 / Y_days_fourier(year).
328
- * Fixed bases (the ripple isolates year-to-year variation; the deep-time
329
- * drift is already in mean(t)). @param {number} t_Ma @returns {number|null} */
330
- function lodSecondsActualAtAge(t_Ma) {
331
- const mean_t = lodSecondsAtAge(t_Ma);
332
- if (mean_t === null) return null;
333
- const year_at_t = 2000 - t_Ma * 1e6;
334
- const Y_days_fourier = deps.siderealYearDaysFourierAt(year_at_t);
335
- return mean_t * K.siderealYearDaysKinematicJ2000 / Y_days_fourier;
336
- }
277
+ // (Plan 09: the "Actual LOD" — the tidal mean × the retired sidereal-year
278
+ // comb's ripple — is deleted with the comb; the ripple was the sidereal
279
+ // year's λ̇ variation misattributed to the day length.)
337
280
 
338
281
  /**
339
282
  * dLOD/dt driver decomposition, ms/century per channel.
@@ -401,18 +344,19 @@ function createDeepTimeLod(deps) {
401
344
  }
402
345
 
403
346
  return {
404
- lodSecondsAtAge, lodSecondsAtAgeWithAlpha, lodHoursAtAge, hAtAge,
347
+ lodSecondsAtAge, lodSecondsAtAgeWithAlpha, lodHoursAtAge,
405
348
  lunisolarPrecessionRateArcsecPerYrAtAge, lunisolarPrecessionPeriodYearsAtAge,
406
349
  // the composition's terms (plan 06 Phase 3 S3, the lunisolar surface): (a₀/a_M)³ and f_S + (1 − f_S)(a₀/a_M)³
407
350
  lunarTorqueFactorAtAge: composed.lunarTorqueFactorAtAge,
408
351
  precessionTorqueTermAtAge: composed.torqueTermAtAge,
409
352
  siderealYearSecondsAtAge, tropicalYearSecondsAtAge, tropicalYearDaysAtAge,
353
+ // the same law on a caller-supplied LOD (the browser's L1-α sensitivity sweep; plan 09 step 7c)
354
+ tropicalYearSecondsFromLod,
410
355
  // the solar day's ecliptic missing-motion term on the nodal period (plan 06 T2 item; one home)
411
356
  eclipticLodCorrectionSecondsAtAge,
412
357
  yearInDaysAtAge, deltaTRawSecondsAtAge, lodSecondsWithCorrectionsAtAge,
413
- lodSecondsActualAtAge, dLodDtDecompositionAtAge,
414
- // the frozen era clock's named counter and bases (device tier, plan 06 D8)
415
- eraClockHAtAge, eraClockTropicalYearSecondsAtAge, eraClockYearInDaysAtAge,
358
+ dLodDtDecompositionAtAge,
359
+ // (plan 09 step 7a: the frozen era clock's counter and bases left with the last comb)
416
360
  };
417
361
  }
418
362
 
@@ -4,7 +4,8 @@
4
4
  *
5
5
  * Background (docs/99 §"The ungated mid-Precambrian window", docs/106 §D,
6
6
  * and the research record in tools/explore/{farhat-divergence-probe,
7
- * regime-aware-recession-study,fit-regime-recession}.js): Farhat 2022's
7
+ * fit-regime-recession}.js — the hand-shaped regime-aware-recession-study.js
8
+ * was deleted at plan 09 step 7e): Farhat 2022's
8
9
  * central result is that lunar recession followed a resonant STAIRCASE —
9
10
  * a single smooth quartic anchored at the modern LLR rate, the gated
10
11
  * 0–650 Ma era and the Roche crossing cannot follow it through the
@@ -16,10 +16,10 @@
16
16
  * shim tools/lib/deep-orbital-history.js (the deep insolation extractor),
17
17
  * and the browser's published ε surfaces (VFP chart, Earth-panel row) via
18
18
  * the generated deep-modes embed. The ERA machinery (frame conversions,
19
- * lunar D5, besselian, the scene's A-solve and Step 6b) stays on the
20
- * certified fitted law — measured: the hybrid differs from it by 5″ rms in
21
- * 1900–2100 / 19.5″ in 1600–2400, mostly hybrid-side there — the same
22
- * certification split as e and ϖ.
19
+ * lunar D5, besselian) rode the comb-era fitted ε law until plan 09 deleted
20
+ * it (measured at the time: the hybrid differed from that law by 5″ rms in
21
+ * 1900–2100 / 19.5″ in 1600–2400, mostly hybrid-side); since then every
22
+ * surface reads this hybrid — the one obliquity of date.
23
23
  *
24
24
  * The climatic precession is the PHYSICAL of-date angle from the moving
25
25
  * equinox γ = unit(ŝ×n̂) to the perihelion direction, measured in the orbit
@@ -26,9 +26,9 @@
26
26
  * composed period — H(t)/T_p(t) = H₀/axial0 = 13.011 at every epoch — but
27
27
  * is not 13 of them; the 13 is a fit-era label that leaves the physics.
28
28
  * The pre-Phase-3 structural clock 13·1,296,000/H_era(t) (pure ω-scaling,
29
- * H_era = H₀·LOD/LOD₀) survives only as the FROZEN ERA CLOCK's named phase
30
- * convention (eraClockHAtAge) and in docs/retired-record.md, with its
31
- * record: it read 70.9 ″/yr against Lantink et al. 2022's 108.6 ± 8.5 at
29
+ * H_era = H₀·LOD/LOD₀) survived as the FROZEN ERA CLOCK's named phase
30
+ * convention (eraClockHAtAge) until plan 09 step 7a deleted it with the last
31
+ * comb; its record (doc 110 chain 2, the paleo-anchors gate rows): it read 70.9 ″/yr against Lantink et al. 2022's 108.6 ± 8.5 at
32
32
  * 2.46 Ga and 65.2 against Meyers & Malinverno 2018's 85.79 ± 2.72 at
33
33
  * 1.4 Ga, where the composed rate reads 104.6 and 86.6.
34
34
  *
@@ -159,4 +159,19 @@ function createYearLengths({ sampleAt, massLossSiderealSecondsAtYearFn }) {
159
159
  */
160
160
  const ONE_FAMILY_WINDOW_YEARS = 2000000;
161
161
 
162
- module.exports = { createYearLengths, ONE_FAMILY_WINDOW_YEARS };
162
+ /** The J2000 mean tropical year, DAYS — derived in ONE home from two IAU
163
+ * inputs, the sidereal year and the general precession in longitude p_A
164
+ * (″ per JULIAN year), in the exact rate form
165
+ * 1/T_trop = 1/T_sid + p_A / (1,296,000″ · 365.25 d)
166
+ * — the same beat `shorterYear` evaluates of date. 365.242190469 d on the
167
+ * IAU 2006 inputs. Plan 09: replaces the Meeus & Savoie 1992 input
168
+ * 365.2421897 (66 ms shorter, whose beat with the sidereal year read
169
+ * 25,770.7 yr against p_A's 25,771.6 — three inputs over-determining a
170
+ * two-parameter identity). Counting p_A per tropical or sidereal year
171
+ * instead moves this by 26 ms; IAU states p_A per Julian year.
172
+ * @param {number} siderealYearDays @param {number} generalPrecessionArcsecPerJulianYr @returns {number} */
173
+ function computeMeanTropicalYearJ2000Days(siderealYearDays, generalPrecessionArcsecPerJulianYr) {
174
+ return 1 / (1 / siderealYearDays + generalPrecessionArcsecPerJulianYr / (1296000 * 365.25));
175
+ }
176
+
177
+ module.exports = { createYearLengths, computeMeanTropicalYearJ2000Days, ONE_FAMILY_WINDOW_YEARS };
@@ -67,8 +67,9 @@
67
67
  * besselian.cjs), so a Sun-only nutation term is a frame
68
68
  * inconsistency for elongation. Removed: the nutation-free syzygy
69
69
  * fleet improves 3.877 → 3.756″ and the fuller-bridged Sun
70
- * comparison 2.344 → 2.123″ (fq7s-jpl-preview.mjs --no-2le;
71
- * fq7s-annual-channel.mjs). This file now carries ZERO fitted
70
+ * comparison 2.344 → 2.123″ (measured by the fq7s preview and
71
+ * annual-channel instruments, deleted at plan 09 step 7e — docs/109
72
+ * §22). This file now carries ZERO fitted
72
73
  * constants. The Earth-around-EMB wobble is DERIVED: amplitude
73
74
  * a_M·μ/AU with μ = 1/(1+M_E/M_M), injected by the model wiring
74
75
  * from live package constants (6.4399″ at current constants), sign
@@ -393,15 +394,13 @@ function createSunPlanetaryCompletion({ embWobbleArcsec, carrierRatesDegPerCy, e
393
394
  return { sunPlanetaryCompletionDeg };
394
395
  }
395
396
 
396
- /** sha256/16 of JSON.stringify(FITTED_COEFFICIENTS.SUN_LONGITUDE_HARMONICS)
397
- * at derivation time — the matched-pair fingerprint asserted by test:model.
398
- * Unchanged from v1/v2: SUN_HARMONICS did not move in the D2 or N3
399
- * landings. Plan 07 R10 moved the hash WITHOUT a refit: the three (sin, cos)
400
- * pairs were rotated exactly from the t₀ phase origin to J2000
401
- * (tools/fit/reorigin-combs-j2000.mjs), the finder Sun is bit-identical, so
402
- * the residual this table was derived from is unchanged — the table stands
403
- * (fidelity 0.616″, 70 terms), only the fingerprint is re-recorded. */
404
- const PAIRED_SUN_HARMONICS_SHA256 = '53530a28a60b3c4a'; // was cbc189cea1c20292 (eccentricity unification: Step-0 refit → N2/N3 re-derived); R10 rotation, same Sun
397
+ /* (Plan 09 step 5a: PAIRED_SUN_HARMONICS_SHA256 — the sha256/16 of the Step-0
398
+ * SUN_LONGITUDE_HARMONICS this table was derived beside, last 53530a28a60b3c4a
399
+ * (the R10 rotation of a comb never refit since the eccentricity unification)
400
+ * — is retired with the comb. The comb left every Sun path at plan 06 R4, so
401
+ * the residual the table was derived from is the certified Sun's; the table
402
+ * stands (fidelity 0.616″, 70 terms) and the carrier-rate pair below remains
403
+ * its enforced matched pair.) */
405
404
 
406
405
  /** sha256/16 of JSON.stringify([...planets, moonElongation]) — the seven
407
406
  * full-precision carrier rates (deg/cy TT) the tables pair with: since plan
@@ -421,4 +420,4 @@ const PAIRED_SUN_HARMONICS_SHA256 = '53530a28a60b3c4a'; // was cbc189cea1c2029
421
420
  * was the I2 record-based carrier set. */
422
421
  const PAIRED_CARRIER_RATES_SHA256 = '26552b86ad69eaf2'; // running-mean series re-bank (mean=1 dump): carriers moved in the 9th digit, LONG_PERIOD_TERMS + the 8V−13E row re-derived on them; history: 8e11456fcf8db81c (I3), 2d066e92bae955e4 (I2)
423
422
 
424
- module.exports = { createSunPlanetaryCompletion, computeCarrierRatesDegPerCy, eccVectorOfDateEmbedded, PAIRED_SUN_HARMONICS_SHA256, PAIRED_CARRIER_RATES_SHA256 };
423
+ module.exports = { createSunPlanetaryCompletion, computeCarrierRatesDegPerCy, eccVectorOfDateEmbedded, PAIRED_CARRIER_RATES_SHA256 };
package/src/index.js CHANGED
@@ -54,7 +54,6 @@ const NEVER_INJECTABLE = Object.keys(REFERENCE_DATA);
54
54
  * @typedef {{
55
55
  * constants: Constants,
56
56
  * hash: string,
57
- * computeLatticePeriodsYears: () => {axialPrecessionPeriodYears: number, inclinationPrecessionPeriodYears: number, perihelionPrecessionPeriodYears: number},
58
57
  * eccentricity: (year: number) => number,
59
58
  * identity: ModelIdentity,
60
59
  * } & ModelSurfaces} Model
@@ -95,24 +94,25 @@ export { FITTED_COEFFICIENTS, COEFFICIENTS_HASH } from './constants/index.js';
95
94
  export { createEpochPrimitives } from './layer0/index.js';
96
95
  export { deriveEpochParams } from './layer0/derive-params.js';
97
96
  export { createDerivedViews } from './layer1/index.js';
98
- // Phase 7 — the shared integrated-phase and cardinal-point machinery (CJS on
99
- // purpose: tools/lib requires the same files via the exports-map subpaths;
100
- // re-exported here so bundled ESM consumers need only the package root).
101
- export { createPhaseMachinery } from './phase/index.cjs';
102
- // The deep-time calendar (year ↔ JD under the drifting year length, the
103
- // H-balanced event finder) — ONE implementation for both engines since the
104
- // year/day collapse (formerly the PHASE-B-DUPLICATE family).
97
+ // (Plan 09 step 7a: the Phase 7 integrated-phase machinery `createPhaseMachinery`
98
+ // — the ∫dt/H_era table and the cycle counters every comb read — and the
99
+ // frozen cardinal record evaluator `createCardinalModel` (the §10 derived
100
+ // form on the deleted CARDINAL_POINT_* coefficients) are DELETED; the
101
+ // cardinal instants are createModel().cardinal, the one Sun's crossings.)
102
+ // The deep-time calendar (year ↔ JD under the drifting year length) — ONE
103
+ // implementation for both engines since the year/day collapse (formerly the
104
+ // PHASE-B-DUPLICATE family). CJS on purpose: tools/lib requires the same
105
+ // file via the exports-map subpath; re-exported here so bundled ESM
106
+ // consumers need only the package root.
105
107
  export { createDeepCalendar } from './phase/deep-calendar.cjs';
106
- export { createCardinalModel } from './cardinal/index.cjs';
107
108
  // D4b: the one-source cardinal structure — the EoC layer (year lengths,
108
109
  // crossing offsets, the e(t)-proportional spread) on the movement's own
109
- // e(t)/ϖ(t). Absolute dates deliberately excluded (per-renderer mean chain);
110
- // the frozen createCardinalModel stays the certified era device.
110
+ // e(t)/ϖ(t). Absolute dates deliberately excluded (per-renderer mean chain).
111
111
  export { createCardinalStructure } from './cardinal/one-source-structure.cjs';
112
112
  // Phase 8.2 — the lunar machinery, extracted layer by layer (survey order:
113
113
  // eccentricity channel → month chain → cycle tables → arguments → series →
114
114
  // apparent). Same CJS + root re-export convention.
115
- export { createMoonEccChannel } from './moon/ecc-channel.cjs';
115
+ // (plan 09 step 6: createMoonEccChannel — the H/3 eccentricity law — is deleted; Earth's e of date is the N-body series on every path)
116
116
  export { createMoonMonthChain } from './moon/month-chain.cjs';
117
117
  export { createChainCycleIntegrator } from './chain-cycles/index.cjs';
118
118
  export { createMoonArguments } from './moon/arguments.cjs';
@@ -127,8 +127,8 @@ export { computeEarthFrameOfDate, solveWheelAngleForLongitude } from './earth/fr
127
127
  // (planets/orientation) and the ascending-node integrator
128
128
  // (planets/asc-node-integrator) are DELETED at plan 07 R5/R6: the planets'
129
129
  // elements of date have one home, the N-body chain.
130
- export { derivePlanetGeometry } from './planets/geometry.cjs';
131
- export { eccentricityFromCycles, computeEccentricityIntegrated } from './planets/ecc-channel.cjs';
130
+ export { derivePlanetGeometry, scaffoldOrbitInputs } from './planets/geometry.cjs';
131
+ // (plan 09 step 6: eccentricityFromCycles / computeEccentricityIntegrated — the H/16 law-of-cosines eccentricity — are deleted; no runtime read them)
132
132
  export * as planetOrbitChain from './planets/orbit-chain.cjs';
133
133
  // P5/K4.6c — the engine-D Keplerian chain (pure evaluator + the embedded
134
134
  // governed artifact; the browser flag path consumes exactly these).
@@ -150,7 +150,7 @@ export { createDeepOrbitalHistory } from './earth/deep-orbital-history.cjs';
150
150
  // D6: the sidereal-year-of-date channel (banked λ̇ ratio × the caller's mass-loss law)
151
151
  export { createSiderealYearChannel } from './earth/sidereal-year-channel.cjs';
152
152
  // S2: THE ONE of-date year-length family (years + precession beats, SI seconds)
153
- export { createYearLengths, ONE_FAMILY_WINDOW_YEARS } from './earth/year-lengths.cjs';
153
+ export { createYearLengths, computeMeanTropicalYearJ2000Days, ONE_FAMILY_WINDOW_YEARS } from './earth/year-lengths.cjs';
154
154
  // Plan 06 D6: THE ONE home of the composed lunisolar precession rate ψ̇(t)
155
155
  // (spin ω(t) × [solar torque + lunar torque on the recession history]) —
156
156
  // leg-1's physical rate; the structural H(t)/13 clock is its named diagnostic.
@@ -174,7 +174,8 @@ export { createEclipseFinders } from './eclipse/finders.cjs';
174
174
  // major — the published model package carries no comparison references;
175
175
  // the K2 one-way wall is package-structural.)
176
176
  // Phase 9 — S-P8: the fitted sun-longitude harmonic stack (three copies → one).
177
- export { createSunLongitudeCorrection } from './sun/longitude-correction.cjs';
177
+ // (plan 09 step 5a: createSunLongitudeCorrection — the Step-0 Sun comb's evaluator,
178
+ // retired from the Sun node at plan 06 R4 — is deleted with the comb and its fitter.)
178
179
 
179
180
  /**
180
181
  * Build a model bound to a set of constants.
@@ -243,36 +244,11 @@ export const createModel = (constants = GENERATED, opts = {}) => {
243
244
  constants: ctx,
244
245
  hash,
245
246
 
246
- /**
247
- * The fit-era lattice identities H/13, H/3, H/16, in years — DEVICE tier.
248
- *
249
- * PURE ALGEBRA OVER THE CONTEXT. No epoch, no formula, no fit. They exist
250
- * here for one reason: a hash-only counterfactual test would still pass if
251
- * `createModel` ignored its argument entirely. Something has to READ the
252
- * context and return a number for injection to be demonstrated end to end.
253
- *
254
- * These are NOT the published periods (plan 06 S5): the axial precession
255
- * period is `epoch.axialPrecessionYearsAtYear` (25,771.4 yr at J2000, the
256
- * of-date year laws' beat); H/13 = 25,793.6 is the fit anchor's reading,
257
- * 0.086 % slow — H₀ was fitted on the perihelion-of-date beat. Likewise
258
- * H/3 and H/16 against the chain's apsidal and perihelion-of-date periods.
259
- * The property names keep their historical form (plan 06 P4).
260
- *
261
- * `divisor` and `period` are never interchangeable (CLAUDE.md): 13 is the
262
- * divisor, H/13 years is the identity's value. The names say which.
263
- *
264
- * @returns {{axialPrecessionPeriodYears: number, inclinationPrecessionPeriodYears: number, perihelionPrecessionPeriodYears: number}}
265
- */
266
- computeLatticePeriodsYears: () => {
267
- const H = /** @type {{holisticyearLength: number}} */ (
268
- /** @type {Record<string, unknown>} */ (ctx).foundational
269
- ).holisticyearLength;
270
- return {
271
- axialPrecessionPeriodYears: H / 13,
272
- inclinationPrecessionPeriodYears: H / 3,
273
- perihelionPrecessionPeriodYears: H / 16,
274
- };
275
- },
247
+ // Plan 09: the fit-era lattice identities H/13, H/3, H/16
248
+ // (`computeLatticePeriodsYears`, DEVICE tier) left this surface — the
249
+ // published periods are `epoch.axialPrecessionYearsAtYear` and the
250
+ // lunisolar surface's apsidal and perihelion-of-date periods; the
251
+ // counterfactual gate now reads the obliquity anchor through the assembly.
276
252
 
277
253
  /**
278
254
  * Earth eccentricity at a year — the Phase-6 promise, fulfilled by the
@@ -27,9 +27,8 @@ import { computeSolarTorqueShare } from '../earth/precession-composed.cjs';
27
27
  * @property {number} alpha1PerMa
28
28
  * @property {number} alpha3PerMa3
29
29
  * @property {number} alpha4PerMa4
30
- * @property {number} holisticYearJ2000 H
31
30
  * @property {number} meanSiderealYearSeconds
32
- * @property {number} meanSiderealYearDaysKinematic
31
+ * @property {number} lodJ2000Seconds ω₀: the J2000 day length, SI seconds (the SI day since plan 09)
33
32
  * @property {number} sunMassKg M_SUN
34
33
  * @property {number} gmEarthAloneKm3S2
35
34
  * @property {number} gmMoonAloneKm3S2
@@ -43,6 +42,7 @@ import { computeSolarTorqueShare } from '../earth/precession-composed.cjs';
43
42
  * @property {number} astronomicalUnitKm 1 AU (km)
44
43
  * @property {number} earthOrbitalEccentricityJ2000
45
44
  * @property {number} moonEclipticInclinationJ2000Deg
45
+ * @property {number} axialPrecessionJ2000Years the model's ONE J2000 precession reading (1,296,000/p_A; plan 09)
46
46
  */
47
47
 
48
48
  /**
@@ -54,8 +54,10 @@ export const deriveEpochParams = (raw) => {
54
54
  const cSiMPerS = raw.speedOfLightKmPerS ? raw.speedOfLightKmPerS * 1000 : 299792458;
55
55
  const dmDtTotalKgS = raw.solarLuminosityW / (cSiMPerS * cSiMPerS) + raw.solarWindKgPerS;
56
56
 
57
- // J2000 anchors derived from framework constants
58
- const lodNowH13Seconds = raw.meanSiderealYearSeconds / raw.meanSiderealYearDaysKinematic;
57
+ // J2000 anchors. Plan 09: ω₀ is the SI day (an input, 86,400 s); the
58
+ // identifier keeps its historical name — the H/13 kinematic-day
59
+ // construction it once named (86,399.99968 s) is deleted.
60
+ const lodNowH13Seconds = raw.lodJ2000Seconds;
59
61
  const solarMassLossFracPerYear = dmDtTotalKgS * raw.meanSiderealYearSeconds / raw.sunMassKg;
60
62
 
61
63
  // Earth mass, moments
@@ -93,10 +95,13 @@ export const deriveEpochParams = (raw) => {
93
95
  moonEccentricityFactor,
94
96
  earthMassKg,
95
97
  earthRadiusM,
96
- holisticYearJ2000: raw.holisticYearJ2000,
97
98
  lodNowH13Seconds,
98
99
  siderealYearJ2000Seconds: raw.meanSiderealYearSeconds,
99
100
  solarMassLossFracPerYear,
100
101
  precessionSolarShareJ2000,
102
+ // p₀, the composed precession rate's J2000 anchor — the tropical year of
103
+ // date's equinox term (plan 09 step 5d; the same expression the deep-time
104
+ // factory's composed module resolves, so the twins stay bit-identical)
105
+ precessionRateJ2000ArcsecPerYr: 1296000 / raw.axialPrecessionJ2000Years,
101
106
  });
102
107
  };