@essrt/physics 20.0.1 → 22.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 (63) hide show
  1. package/README.md +4 -4
  2. package/package.json +4 -8
  3. package/src/cardinal/one-source-structure.cjs +3 -2
  4. package/src/chain-cycles/index.cjs +12 -30
  5. package/src/climate/l1-orbital.cjs +3 -1
  6. package/src/constants/coefficients.d.ts +17 -93
  7. package/src/constants/coefficients.js +7 -22
  8. package/src/constants/generated.d.ts +18 -156
  9. package/src/constants/generated.js +33 -168
  10. package/src/deltat/deep-time.cjs +36 -92
  11. package/src/deltat/recession-history.cjs +2 -1
  12. package/src/earth/deep-orbital-history.cjs +4 -4
  13. package/src/earth/frame-of-date.cjs +25 -1
  14. package/src/earth/precession-composed.cjs +3 -3
  15. package/src/earth/year-lengths.cjs +16 -1
  16. package/src/eclipse/sun-planetary-completion.cjs +11 -12
  17. package/src/index.js +28 -48
  18. package/src/layer0/derive-params.js +10 -5
  19. package/src/layer0/index.js +27 -73
  20. package/src/layer1/index.js +6 -37
  21. package/src/model.js +200 -225
  22. package/src/moon/arguments.cjs +57 -83
  23. package/src/moon/deep-modes-artifact.cjs +2 -2
  24. package/src/moon/month-chain.cjs +25 -59
  25. package/src/moon/series.cjs +14 -10
  26. package/src/phase/deep-calendar.cjs +35 -80
  27. package/src/planets/chain-artifact.js +2 -2
  28. package/src/planets/display-names.cjs +30 -0
  29. package/src/planets/geometry.cjs +79 -29
  30. package/src/planets/model.cjs +12 -11
  31. package/src/planets/spin-channel.cjs +46 -2
  32. package/types/chain-cycles/index.d.cts +9 -4
  33. package/types/climate/l1-orbital.d.cts +3 -1
  34. package/types/constants/coefficients.d.ts +17 -93
  35. package/types/constants/generated.d.ts +18 -156
  36. package/types/deltat/deep-time.d.cts +3 -16
  37. package/types/earth/frame-of-date.d.cts +9 -0
  38. package/types/earth/year-lengths.d.cts +12 -0
  39. package/types/eclipse/sun-planetary-completion.d.cts +0 -9
  40. package/types/index.d.ts +4 -13
  41. package/types/layer0/derive-params.d.ts +7 -4
  42. package/types/layer0/index.d.ts +6 -13
  43. package/types/layer1/index.d.ts +0 -2
  44. package/types/model.d.ts +8 -6
  45. package/types/moon/arguments.d.cts +23 -22
  46. package/types/moon/deep-modes-artifact.d.cts +3 -3
  47. package/types/moon/month-chain.d.cts +7 -16
  48. package/types/moon/series.d.cts +2 -4
  49. package/types/phase/deep-calendar.d.cts +14 -50
  50. package/types/planets/display-names.d.cts +2 -0
  51. package/types/planets/geometry.d.cts +36 -13
  52. package/types/planets/model.d.cts +7 -6
  53. package/types/planets/spin-channel.d.cts +4 -0
  54. package/src/cardinal/index.cjs +0 -324
  55. package/src/moon/ecc-channel.cjs +0 -141
  56. package/src/phase/index.cjs +0 -186
  57. package/src/planets/ecc-channel.cjs +0 -59
  58. package/src/sun/longitude-correction.cjs +0 -68
  59. package/types/cardinal/index.d.cts +0 -80
  60. package/types/moon/ecc-channel.d.cts +0 -30
  61. package/types/phase/index.d.cts +0 -38
  62. package/types/planets/ecc-channel.d.cts +0 -20
  63. 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,11 +26,35 @@
26
26
  * the K sun plane and the RA frame's ecliptic parted by 20.5″ at J2000 and 10′
27
27
  * at −3000, the rendered Sun −19″ in declination against Horizons at the
28
28
  * March 2000 equinox (+19″ in September; 0.1–1″ at the solstice).
29
+ *
30
+ * THE SCENE'S WORLD FRAME (plan 11 step 4) is the J2000 ecliptic itself:
31
+ * world Y is the J2000 ecliptic pole and the J2000 equinox lies in the world
32
+ * XZ plane at the view azimuth `SCENE_EQUINOX_VIEW_AZIMUTH_DEG` (atan2(x, z)).
33
+ * `computeSceneWorldFrameJ2000` is the bridge R (ecliptic J2000 → world) both
34
+ * twins place every frame of date through. The azimuth is the ONE scene
35
+ * literal the retired K-device scaffold leaves behind — the pose the scaffold
36
+ * encoded at J2000, measured on the Node twin (its 0.026° pole tilt dropped),
37
+ * kept for visual continuity; no observable rides it (every physical reading
38
+ * is taken in the placed Earth frame, which is R-invariant by construction).
29
39
  */
30
40
  'use strict';
31
41
 
32
42
  const D2R = Math.PI / 180;
33
43
 
44
+ /** The J2000 equinox's azimuth in the scene's world XZ plane, degrees (atan2(x, z)) — the view convention. */
45
+ const SCENE_EQUINOX_VIEW_AZIMUTH_DEG = 158.2265109779131;
46
+
47
+ /**
48
+ * The scene's world frame: R maps a J2000-ecliptic vector to world, columns
49
+ * [ĝ, n̂ × ĝ, n̂] = [the equinox, longitude 90°, the ecliptic pole] with
50
+ * n̂ = world Y exactly and ĝ at the view azimuth.
51
+ * @returns {number[][]} a 3×3 rotation matrix, rows × columns
52
+ */
53
+ function computeSceneWorldFrameJ2000() {
54
+ const a = SCENE_EQUINOX_VIEW_AZIMUTH_DEG * D2R, s = Math.sin(a), c = Math.cos(a);
55
+ return [[s, c, 0], [0, 0, 1], [c, -s, 0]];
56
+ }
57
+
34
58
  /**
35
59
  * @typedef {{x: number, y: number, z: number}} Vec3
36
60
  */
@@ -102,4 +126,4 @@ function solveWheelAngleForLongitude(lambdaRad, e, periRad) {
102
126
  return Math.atan2(Math.sin(th), Math.cos(th));
103
127
  }
104
128
 
105
- module.exports = { computeEarthFrameOfDate, solveWheelAngleForLongitude };
129
+ module.exports = { computeEarthFrameOfDate, solveWheelAngleForLongitude, computeSceneWorldFrameJ2000, SCENE_EQUINOX_VIEW_AZIMUTH_DEG };
@@ -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,14 +54,14 @@ 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
61
60
  */
62
61
 
63
62
  /**
64
- * Generated at build time from `public/input/{model-parameters,astro-reference}.json`
63
+ * Generated at build time from `public/input/astro-reference.json` (plus the
64
+ * deep-time block the generator assembles; model-parameters.json is deleted, plan 11)
65
65
  * (§2g) by `tools/constants/generate.mjs`. 324 values across 15 blocks.
66
66
  *
67
67
  * Free parameters and measured anchors only. Validation targets are excluded by
@@ -95,24 +95,25 @@ export { FITTED_COEFFICIENTS, COEFFICIENTS_HASH } from './constants/index.js';
95
95
  export { createEpochPrimitives } from './layer0/index.js';
96
96
  export { deriveEpochParams } from './layer0/derive-params.js';
97
97
  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).
98
+ // (Plan 09 step 7a: the Phase 7 integrated-phase machinery `createPhaseMachinery`
99
+ // — the ∫dt/H_era table and the cycle counters every comb read — and the
100
+ // frozen cardinal record evaluator `createCardinalModel` (the §10 derived
101
+ // form on the deleted CARDINAL_POINT_* coefficients) are DELETED; the
102
+ // cardinal instants are createModel().cardinal, the one Sun's crossings.)
103
+ // The deep-time calendar (year ↔ JD under the drifting year length) — ONE
104
+ // implementation for both engines since the year/day collapse (formerly the
105
+ // PHASE-B-DUPLICATE family). CJS on purpose: tools/lib requires the same
106
+ // file via the exports-map subpath; re-exported here so bundled ESM
107
+ // consumers need only the package root.
105
108
  export { createDeepCalendar } from './phase/deep-calendar.cjs';
106
- export { createCardinalModel } from './cardinal/index.cjs';
107
109
  // D4b: the one-source cardinal structure — the EoC layer (year lengths,
108
110
  // 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.
111
+ // e(t)/ϖ(t). Absolute dates deliberately excluded (per-renderer mean chain).
111
112
  export { createCardinalStructure } from './cardinal/one-source-structure.cjs';
112
113
  // Phase 8.2 — the lunar machinery, extracted layer by layer (survey order:
113
114
  // eccentricity channel → month chain → cycle tables → arguments → series →
114
115
  // apparent). Same CJS + root re-export convention.
115
- export { createMoonEccChannel } from './moon/ecc-channel.cjs';
116
+ // (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
117
  export { createMoonMonthChain } from './moon/month-chain.cjs';
117
118
  export { createChainCycleIntegrator } from './chain-cycles/index.cjs';
118
119
  export { createMoonArguments } from './moon/arguments.cjs';
@@ -120,15 +121,15 @@ export { createMoonSeries } from './moon/series.cjs';
120
121
  export { createMoonApparent } from './moon/apparent.cjs';
121
122
  // R4 — the Earth frame of date (sun plane, equinox, spin axis from the one-source
122
123
  // sample) and the offset-circle wheel-angle solver: the scene twins' one placement.
123
- export { computeEarthFrameOfDate, solveWheelAngleForLongitude } from './earth/frame-of-date.cjs';
124
+ export { computeEarthFrameOfDate, solveWheelAngleForLongitude, computeSceneWorldFrameJ2000, SCENE_EQUINOX_VIEW_AZIMUTH_DEG } from './earth/frame-of-date.cjs';
124
125
  // Phase 8.3 — the planet machinery, extracted by LAW over body records
125
126
  // (survey order: geometry → channels → chains). The ψ/K amplitude laws
126
127
  // (planets/fibonacci-laws), the record-based orientation forms
127
128
  // (planets/orientation) and the ascending-node integrator
128
129
  // (planets/asc-node-integrator) are DELETED at plan 07 R5/R6: the planets'
129
130
  // 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';
131
+ export { derivePlanetGeometry, scaffoldOrbitInputs } from './planets/geometry.cjs';
132
+ // (plan 09 step 6: eccentricityFromCycles / computeEccentricityIntegrated — the H/16 law-of-cosines eccentricity — are deleted; no runtime read them)
132
133
  export * as planetOrbitChain from './planets/orbit-chain.cjs';
133
134
  // P5/K4.6c — the engine-D Keplerian chain (pure evaluator + the embedded
134
135
  // governed artifact; the browser flag path consumes exactly these).
@@ -150,7 +151,7 @@ export { createDeepOrbitalHistory } from './earth/deep-orbital-history.cjs';
150
151
  // D6: the sidereal-year-of-date channel (banked λ̇ ratio × the caller's mass-loss law)
151
152
  export { createSiderealYearChannel } from './earth/sidereal-year-channel.cjs';
152
153
  // 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';
154
+ export { createYearLengths, computeMeanTropicalYearJ2000Days, ONE_FAMILY_WINDOW_YEARS } from './earth/year-lengths.cjs';
154
155
  // Plan 06 D6: THE ONE home of the composed lunisolar precession rate ψ̇(t)
155
156
  // (spin ω(t) × [solar torque + lunar torque on the recession history]) —
156
157
  // leg-1's physical rate; the structural H(t)/13 clock is its named diagnostic.
@@ -160,6 +161,9 @@ export { computeSolarTorqueShare, createComposedPrecession } from './earth/prece
160
161
  // L10 — the composition front door: one law set, N body records. Thin by
161
162
  // design; engines keep their direct call sites (see planets/model.cjs).
162
163
  export { createPlanetModel } from './planets/model.cjs';
164
+ // plan 11 step 6 — the planets' presentation names, the last leaf of the
165
+ // deleted model-parameters.json (code, not an input: not injectable, not hashed).
166
+ export { PLANET_DISPLAY_NAMES } from './planets/display-names.cjs';
163
167
  // Phase 8.4 — the climate/ΔT machinery, extracted layer by layer.
164
168
  export { createDeltaTCycles } from './deltat/cycles.cjs';
165
169
  export { createDeepTimeLod } from './deltat/deep-time.cjs';
@@ -174,7 +178,8 @@ export { createEclipseFinders } from './eclipse/finders.cjs';
174
178
  // major — the published model package carries no comparison references;
175
179
  // the K2 one-way wall is package-structural.)
176
180
  // Phase 9 — S-P8: the fitted sun-longitude harmonic stack (three copies → one).
177
- export { createSunLongitudeCorrection } from './sun/longitude-correction.cjs';
181
+ // (plan 09 step 5a: createSunLongitudeCorrection — the Step-0 Sun comb's evaluator,
182
+ // retired from the Sun node at plan 06 R4 — is deleted with the comb and its fitter.)
178
183
 
179
184
  /**
180
185
  * Build a model bound to a set of constants.
@@ -243,36 +248,11 @@ export const createModel = (constants = GENERATED, opts = {}) => {
243
248
  constants: ctx,
244
249
  hash,
245
250
 
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
- },
251
+ // Plan 09: the fit-era lattice identities H/13, H/3, H/16
252
+ // (`computeLatticePeriodsYears`, DEVICE tier) left this surface — the
253
+ // published periods are `epoch.axialPrecessionYearsAtYear` and the
254
+ // lunisolar surface's apsidal and perihelion-of-date periods; the
255
+ // counterfactual gate now reads the obliquity anchor through the assembly.
276
256
 
277
257
  /**
278
258
  * 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
  };