@essrt/physics 7.0.0 → 9.1.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 (41) hide show
  1. package/README.md +2 -2
  2. package/package.json +4 -2
  3. package/src/constants/coefficients.d.ts +1 -38
  4. package/src/constants/coefficients.js +2 -5
  5. package/src/constants/generated.d.ts +109 -25
  6. package/src/constants/generated.js +226 -96
  7. package/src/earth/deep-orbital-history.cjs +10 -0
  8. package/src/earth/frame-of-date.cjs +105 -0
  9. package/src/eclipse/besselian.cjs +41 -17
  10. package/src/eclipse/sun-planetary-completion.cjs +55 -14
  11. package/src/index.js +9 -1
  12. package/src/model.js +262 -124
  13. package/src/moon/apparent.cjs +45 -126
  14. package/src/moon/deep-ecc-channel.cjs +59 -12
  15. package/src/moon/deep-modes-artifact.cjs +4 -2
  16. package/src/moon/month-chain.cjs +21 -10
  17. package/src/moon/series-extension.cjs +2 -1
  18. package/src/moon/series.cjs +21 -4
  19. package/src/planets/chain-artifact.js +2 -2
  20. package/src/planets/fibonacci-laws.cjs +7 -42
  21. package/src/planets/model.cjs +10 -13
  22. package/src/planets/secular-shape.cjs +36 -0
  23. package/src/planets/spin-channel.cjs +391 -0
  24. package/types/constants/coefficients.d.ts +1 -38
  25. package/types/constants/generated.d.ts +109 -25
  26. package/types/earth/deep-orbital-history.d.cts +2 -0
  27. package/types/earth/frame-of-date.d.cts +37 -0
  28. package/types/eclipse/besselian.d.cts +5 -7
  29. package/types/eclipse/sun-planetary-completion.d.cts +14 -10
  30. package/types/index.d.ts +3 -1
  31. package/types/model.d.ts +26 -0
  32. package/types/moon/apparent.d.cts +7 -68
  33. package/types/moon/deep-ecc-channel.d.cts +31 -2
  34. package/types/moon/deep-modes-artifact.d.cts +2 -0
  35. package/types/moon/month-chain.d.cts +4 -0
  36. package/types/planets/fibonacci-laws.d.cts +0 -29
  37. package/types/planets/model.d.cts +10 -4
  38. package/types/planets/secular-shape.d.cts +30 -0
  39. package/types/planets/spin-channel.d.cts +193 -0
  40. package/src/planets/predict.cjs +0 -324
  41. package/types/planets/predict.d.cts +0 -88
@@ -0,0 +1,105 @@
1
+ /**
2
+ * The Earth frame of date — ONE home (holisticuniverse plan 06, R4 "one Earth
3
+ * frame": the scene's axis, equinox and sun plane placed from the engine).
4
+ *
5
+ * The one-source movement's sample carries, at a year, the obliquity ε, the
6
+ * equinox node's longitude in the J2000 ecliptic frame and the orbit normal's
7
+ * in-plane components. From those three the full frame follows, all unit
8
+ * vectors in the J2000 ecliptic frame the chain artifact uses:
9
+ *
10
+ * n̂ — the ecliptic pole of date (the orbit normal; the sun plane's normal)
11
+ * ĝ — the equinox of date: the ascending node of the ecliptic of date on the
12
+ * equator of date, ĝ ∝ ŝ × n̂; it lies in the ecliptic of date at the
13
+ * sample's node longitude
14
+ * ŝ — the spin axis (the celestial pole of date): the ecliptic pole tilted by
15
+ * ε toward longitude ĝ + 90° — ŝ = cos ε·n̂ + sin ε·(n̂ × ĝ)
16
+ *
17
+ * so that ĝ = unit(ŝ × n̂) and ε = ∠(ŝ, n̂) hold by construction. Reconstructing
18
+ * from ANGLES (not from stored vectors) keeps the grid interpolation exact: the
19
+ * node longitude is Hermite-interpolated by the sampler, the normal components
20
+ * and ε are smooth.
21
+ *
22
+ * Both scene twins (src/script.js, tools/lib/scene-graph.js) place the axis,
23
+ * the sun plane and the Sun from this frame every frame — no relative
24
+ * corrections on a device geometry (the retired tilt/azimuth/apsidal/plane
25
+ * corrections and the δ Newton read: docs/41). Measured before the change:
26
+ * the K sun plane and the RA frame's ecliptic parted by 20.5″ at J2000 and 10′
27
+ * at −3000, the rendered Sun −19″ in declination against Horizons at the
28
+ * March 2000 equinox (+19″ in September; 0.1–1″ at the solstice).
29
+ */
30
+ 'use strict';
31
+
32
+ const D2R = Math.PI / 180;
33
+
34
+ /**
35
+ * @typedef {{x: number, y: number, z: number}} Vec3
36
+ */
37
+
38
+ /** @param {number[]} a @param {number[]} b @returns {number[]} */
39
+ function cross(a, b) {
40
+ return [a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0]];
41
+ }
42
+ /** @param {number[]} v @returns {number[]} */
43
+ function unit(v) {
44
+ const n = Math.hypot(v[0], v[1], v[2]);
45
+ return [v[0] / n, v[1] / n, v[2] / n];
46
+ }
47
+
48
+ /**
49
+ * The Earth frame of date from a one-source sample, unit vectors in the J2000
50
+ * ecliptic frame: `n` the ecliptic pole of date, `g` the equinox of date, `s`
51
+ * the spin axis of date. Every vector is `[x, y, z]`.
52
+ * @param {{epsDeg: number, equinoxLonJ2000Deg: number, orbitNormalX: number, orbitNormalY: number}} sample
53
+ * @returns {{n: number[], g: number[], s: number[]}}
54
+ */
55
+ function computeEarthFrameOfDate(sample) {
56
+ const nx = sample.orbitNormalX, ny = sample.orbitNormalY;
57
+ const nz = Math.sqrt(Math.max(0, 1 - nx * nx - ny * ny));
58
+ const n = [nx, ny, nz];
59
+ // the equinox: in the ecliptic of date (⟂ n̂), at the sampled longitude L
60
+ // measured in the J2000 ecliptic — the unit vector (cos L, sin L, z) with
61
+ // z fixed by ĝ·n̂ = 0
62
+ const L = sample.equinoxLonJ2000Deg * D2R;
63
+ const gx = Math.cos(L), gy = Math.sin(L);
64
+ const gz = -(nx * gx + ny * gy) / nz;
65
+ const g = unit([gx, gy, gz]);
66
+ // the spin axis: the pole tilted by ε from n̂ toward longitude ĝ + 90°
67
+ const eps = sample.epsDeg * D2R;
68
+ const w = cross(n, g); // the in-plane direction at ĝ + 90°
69
+ const s = unit([
70
+ Math.cos(eps) * n[0] + Math.sin(eps) * w[0],
71
+ Math.cos(eps) * n[1] + Math.sin(eps) * w[1],
72
+ Math.cos(eps) * n[2] + Math.sin(eps) * w[2],
73
+ ]);
74
+ return { n, g, s };
75
+ }
76
+
77
+ /**
78
+ * The wheel angle θ that puts the Sun at ecliptic longitude λ on the scene's
79
+ * offset circle: the Sun sits at radius 1 (100 scene units) about a centre
80
+ * displaced by −e along the perihelion direction ϖ (the one eccentricity law's
81
+ * single arm), P(θ) = −e·û(ϖ) + û(θ), and the geocentric longitude is the
82
+ * direction of P. Two Newton steps from θ₀ = λ (the offset-circle Jacobian
83
+ * dλ/dθ = 1 − e·cos(θ − ϖ) + O(e²)); converged to <1e-12 rad for e < 0.1.
84
+ * Angles in radians; θ increases with λ (the scene's node angles are
85
+ * λ-handed).
86
+ * @param {number} lambdaRad - the target geocentric ecliptic longitude
87
+ * @param {number} e - the eccentricity (the centre offset in units of the radius)
88
+ * @param {number} periRad - the perihelion longitude ϖ of date (the offset direction is −û(ϖ))
89
+ * @returns {number} θ in radians, in (−π, π]
90
+ */
91
+ function solveWheelAngleForLongitude(lambdaRad, e, periRad) {
92
+ const cx = -e * Math.cos(periRad), cy = -e * Math.sin(periRad);
93
+ let th = lambdaRad;
94
+ for (let k = 0; k < 3; k++) {
95
+ const px = cx + Math.cos(th), py = cy + Math.sin(th);
96
+ const lam = Math.atan2(py, px);
97
+ const r2 = px * px + py * py;
98
+ const dLamDth = (px * Math.cos(th) + py * Math.sin(th)) / r2; // d atan2(py, px)/dθ
99
+ const err = Math.atan2(Math.sin(lambdaRad - lam), Math.cos(lambdaRad - lam));
100
+ th += err / dLamDth;
101
+ }
102
+ return Math.atan2(Math.sin(th), Math.cos(th));
103
+ }
104
+
105
+ module.exports = { computeEarthFrameOfDate, solveWheelAngleForLongitude };
@@ -30,19 +30,36 @@
30
30
  * the observed 63.8/64.2 s — mean 6.3″ vs 7.3″). ~34″ of the raw
31
31
  * offset.
32
32
  *
33
- * 2. Full series, not the truncated finder forms. truncatedLonDeg omits
34
- * the fitted moonMeeusLpCorrection anchor (+33.8″) and truncatedBetaDeg
35
- * omits the −2235·sin(Lp) latitude family (~8″) — both deliberate for
36
- * the certified finder statistics (knife-edge canon events), both
37
- * required here. The injected moonFullAtDaysTT is the series'
38
- * sceneEvalAt — the same evaluation the browser scene ships. Measured:
39
- * ~27″ of the raw offset.
33
+ * 2. Full series, not the truncated finder forms. truncatedBetaDeg omits
34
+ * the −2235·sin(Lp) latitude family (~8″) and both truncated forms omit
35
+ * the derived series-extension tail — deliberate for the certified
36
+ * finder statistics (knife-edge canon events), required here. The
37
+ * injected moonFullAtDaysTT is the series' sceneEvalAt — the same
38
+ * evaluation the browser scene ships (the extension inside it since
39
+ * plan 06 R3 item 1: one scene Moon).
40
40
  *
41
- * Annual aberration is deliberately ABSENT: for ground location a
42
- * common-mode rotation of both bodies moves the ground point by the raw
43
- * angle (~0.6 km), and the elongation content cancels at syzygy (the
44
- * round-3 result). Both bodies here are geometric mean-of-date, matching
45
- * the MEAN sidereal time used for the Earth-fixed mapping.
41
+ * APPARENT PLACES (plan 06 R3 item 1 — measured, the cancellation the I2
42
+ * Sun exposed): both bodies are evaluated mean-of-date (nutation is a common
43
+ * rotation of Sun and Moon and cancels in the elongation) but with their
44
+ * PLANETARY ABERRATION: the Sun's derived κ = 2π a/(c T_sid √(1−e²))
45
+ * (≈20.5″, the light-time of a source at rest in the barycentric frame) and
46
+ * the Moon's RELATIVE light-time (its geocentric motion during dist/c,
47
+ * ≈0.7″). For a body co-moving with the observer the stellar aberration
48
+ * cancels against its barycentric light-time displacement — Horizons'
49
+ * apparent Moon coincides with the geometric Moon to that 0.7″ (the
50
+ * truncated series + extension read −1.0″ ± 1.5″ against it over
51
+ * 1970–2049, flat in elongation) — so "aberrate both bodies, it cancels at
52
+ * syzygy" (the former round-3 reasoning) was the wrong physics: it held the
53
+ * Moon 20.5″ from its apparent place, and the fitted moonMeeusLpCorrection
54
+ * (+32.75″ = κ + the Sun's then-missing long inequality + the trend-ΔT
55
+ * offset) absorbed it. That anchor is retired (0) with the Sun's κ applied
56
+ * here. The mean sidereal time of the Earth-fixed mapping pairs with the
57
+ * mean equinox of the body longitudes as before.
58
+ *
59
+ * The remaining centerline residual on NASA's UT instants (2–5″ in
60
+ * 1999–2026) is the model's TREND ΔT against the observed one (9.5 s below
61
+ * IERS at 2000, 2.9 s at 2024, × the Moon's 0.55″/s) — a ΔT-convention
62
+ * floor, never to be fitted here.
46
63
  *
47
64
  * The scene-umbra conventions (THREE scaffold navigation) never enter this
48
65
  * package (§2h) — this is an independent construction on the shared
@@ -58,7 +75,7 @@
58
75
  * full-series Moon: ecliptic-of-date longitude/latitude (deg) + distance (km), TT axis (days since J2000)
59
76
  * @property {(jdUT: number) => number} sunLonDegAt - geometric mean sun longitude (deg), JD(UT) axis with the finder's internal ΔT
60
77
  * @property {(T: number) => number} sunCompletionDeg - planetary completion (deg) at T centuries TT, SUBTRACTED from the finder sun (see eclipse/sun-planetary-completion.cjs; the finders deliberately stay without it — their fitted anchors and certified canon statistics were produced on the bare form, and elongation-class timing absorbs the omission into the fitted phases)
61
- * @property {(T: number) => {dLonDeg: number, dLatDeg: number}} moonExtensionAt - derived series-extension tail (deg) at T centuries TT, ADDED to the full-series Moon longitude/latitude (see moon/series-extension.cjs; same finder-scoping rationale as sunCompletionDeg — the finders stay on the bare series)
78
+ * @property {(year: number) => number} sunAberrationDegAt - the Sun's derived planetary aberration κ (deg) at calendar year, SUBTRACTED from the geometric Sun longitude (the apparent Sun; see the header)
62
79
  * @property {(jd: number) => number} deltaTSecondsAt - framework ΔT (J2000-zeroed convention)
63
80
  * @property {(year: number) => number} obliquityDegAt - framework obliquity (deg) at calendar year
64
81
  * @property {(year: number) => number} eccentricityAt - framework Earth-orbit eccentricity at calendar year
@@ -68,7 +85,7 @@
68
85
  * moonDiameterKm: number, sunDiameterKm: number, sunDistanceKm: number,
69
86
  * earthFlatteningInverse: number, ttBridgeSeconds: number,
70
87
  * gmstMeanSiderealT0Deg: number, gmstMeanSiderealRateDegPerDay: number,
71
- * gmstMeanSiderealT2Deg: number }} constants
88
+ * gmstMeanSiderealT2Deg: number, speedOfLightKmS: number }} constants
72
89
  */
73
90
 
74
91
  /** @param {BesselianDeps} deps */
@@ -125,12 +142,19 @@ function createBesselian(deps) {
125
142
  const year = deps.yearFromJD(jb);
126
143
  const eps = deps.obliquityDegAt(year) * D2R;
127
144
  const dTT = (jb - K.j2000JD) + deps.deltaTSecondsAt(jb) / 86400;
128
- const sunLon = deps.sunLonDegAt(jb) - deps.sunCompletionDeg(dTT / K.julianCenturyDays);
145
+ // the APPARENT Sun: geometric completed longitude minus its derived aberration κ
146
+ const sunLon = deps.sunLonDegAt(jb) - deps.sunCompletionDeg(dTT / K.julianCenturyDays) - deps.sunAberrationDegAt(year);
147
+ // the APPARENT Moon: the geometric series displaced by its RELATIVE light-time —
148
+ // the Moon's own geocentric motion (central difference, a point rate at this
149
+ // instant, never a mean rate × span) during τ = dist/c
129
150
  const moon = deps.moonFullAtDaysTT(dTT);
130
- const ext = deps.moonExtensionAt(dTT / K.julianCenturyDays);
151
+ const H_DAYS = 0.02;
152
+ const dLon = deps.moonFullAtDaysTT(dTT + H_DAYS).lonDeg - deps.moonFullAtDaysTT(dTT - H_DAYS).lonDeg;
153
+ const moonRateDegPerDay = (((dLon + 540) % 360) - 180) / (2 * H_DAYS);
154
+ const tauDays = moon.distKm / K.speedOfLightKmS / 86400;
131
155
  return {
132
156
  S: eclToEq(sunLon, 0, sunDistanceKm(year, sunLon), eps),
133
- M: eclToEq(moon.lonDeg + ext.dLonDeg, moon.latDeg + ext.dLatDeg, moon.distKm, eps),
157
+ M: eclToEq(moon.lonDeg - moonRateDegPerDay * tauDays, moon.latDeg, moon.distKm, eps),
134
158
  };
135
159
  }
136
160
 
@@ -22,9 +22,23 @@
22
22
  * THE CARRIERS (FQ-5 N3, the doctrine's final mile for the Sun side):
23
23
  * the six planetary mean-longitude RATES are no longer instrument
24
24
  * literals — they are INJECTED by the model wiring, computed live from
25
- * the framework's own planet records (one revolution per the record's
26
- * tropical period; Earth from the framework mean solar year), as is the
27
- * Moon-elongation rate for the EMB-wobble carrier. The J2000 phase
25
+ * the framework's own planet records, as is the Moon-elongation rate for
26
+ * the EMB-wobble carrier. PLAN 06 I2 — the injected rates are SIDEREAL
27
+ * (the record's of-date rate minus the model's own J2000 precession;
28
+ * Earth the framework sidereal year; model.js): a perturbation argument
29
+ * is inertial (D'Alembert — only Σk = 0 arguments are frame-free), and
30
+ * on the N3 of-date carriers every Σk ≠ 0 row (3V−4E, E−2J, 2V−3E,
31
+ * 2E−3J, 2E−3M, 2M−E, 2(2M−E) …) drifted by Σk·ψ(t): 42..52° at −3000,
32
+ * measured against JPL Horizons over ±3000 yr as the dominant ancient
33
+ * scatter of the certified Sun (6.4″ → 4.4″ at −3000, 6.0 → 4.6″ at
34
+ * −2000, 3.6 → 3.0″ at 0 AD on sidereal carriers; 1900–2100 unchanged).
35
+ * The 70 N3 literals are KEPT: the two carrier sets share the J2000
36
+ * anchors and part by ≤ 1.4°·|Σk| at the 200-yr window's edges, and the
37
+ * re-extraction on sidereal carriers (tools/explore/i2-sidereal-carrier-
38
+ * table.mjs) reproduces the composed function (fidelity 0.612 vs 0.614″,
39
+ * JPL 1900–2100 all-phase sd identical to 0.01″) while redistributing
40
+ * the near-degenerate ±M sideband pairs — only the composed function
41
+ * ships, so the literals stay as extracted. The J2000 phase
28
42
  * anchors (ARG_L0, PERI, D0) remain declared epoch constants — the
29
43
  * "anchored by design" class; any constant phase offset is absorbed into
30
44
  * the fitted cos/sin split exactly. N3 gates measured before the swap:
@@ -80,7 +94,7 @@
80
94
  * check`) recomputes it from live constants and fails on mismatch. The
81
95
  * carrier↔table pairing is enforced by both living in this one module
82
96
  * with the rates injected from the same constants the records read. The
83
- * api centerline gate (≤8″ shadow-plane) backstops gross staleness
97
+ * api centerline gate (≤12″ shadow-plane) backstops gross staleness
84
98
  * independently.
85
99
  *
86
100
  * FQ-5 N2 RECORD (the carrier attribution): 8/10 carriers measured
@@ -115,6 +129,26 @@ const ARG_D0 = 297.8501921;
115
129
  * composed difference vs the previous table ≤1.5″ at the ancient presets,
116
130
  * detrended 0.033 min). Individual coefficients redistribute between the
117
131
  * near-degenerate ±M sideband families; only the composed function ships.
132
+ *
133
+ * PLAN 06 I2 — the LONG-PERIOD rows (the last two): the Earth–Mars–
134
+ * Jupiter long inequality 4λ_E − 8λ_Ma + 3λ_J (carrier period 1801 yr;
135
+ * the classical ~1783-yr term of the solar theory) and the Venus–Earth
136
+ * term 8λ_V − 13λ_E (238 yr), DERIVED on the model's own Wisdom–Holman
137
+ * engine (tools/explore/nbody-wh.mjs, the chain artifact's integrator) on
138
+ * the campaign's ONE Horizons J2000 seed, Sun + eight planets, DE440
139
+ * masses, 1PN, order 2, dt 2 d, −5100..+1100 yr: the EMB's osculating
140
+ * mean longitude Ω+ω+M in yearly means, LSQ on [1, T, T²] + cos/sin of
141
+ * the arguments on THESE carriers (tools/explore/i2-long-inequality.mjs).
142
+ * Measured: 6.27″ / 1.84″; step-converged (dt 1 d: 6.272 / 1.869); the
143
+ * integration reproduces DE441's Earth longitude to 0.68″ sd over 6000
144
+ * yr with 0.03″ left at the 1783-yr argument. Neither could come from the
145
+ * 200-yr D2 window (the term's in-window ramp went to the projected-out
146
+ * secular basis; the 240-yr term folded into it). WHY they were missing:
147
+ * the certified Sun integrates a smooth tropical year for its mean
148
+ * longitude; against Horizons its residual carried exactly this 6″ ripple
149
+ * (plan 06 I1 analysis) — with the same phase in the sidereal residual, a
150
+ * perturbation of Earth's mean motion, not a frame effect. Sub-0.2″
151
+ * candidates left out (2J−5S 0.17″, 5V−8E 0.17″: window-dependent phase).
118
152
  * @type {Array<[number[], number[], number, number]>}
119
153
  */
120
154
  const TERMS = [
@@ -188,6 +222,9 @@ const TERMS = [
188
222
  [[0, 0, 1, -1, 0, 0], [0, 0, 1, 0, 0, 0], 0.0188, 0.0523],
189
223
  [[0, 2, -2, 0, 0, 0], [0, 0, 1, 0, 0, 0], -0.0421, -0.0340],
190
224
  [[0, 0, 1, -1, 0, 0], [0, 0, -1, 0, 0, 0], -0.0353, -0.0379],
225
+ // plan 06 I2 — the long-period rows (see the doc comment above)
226
+ [[0, 0, 4, -8, 3, 0], [0, 0, 0, 0, 0, 0], 6.2314, -0.7168],
227
+ [[0, 8, -13, 0, 0, 0], [0, 0, 0, 0, 0, 0], 1.8389, 0.1419],
191
228
  ];
192
229
 
193
230
  const D2R = Math.PI / 180;
@@ -247,15 +284,19 @@ function createSunPlanetaryCompletion({ embWobbleArcsec, carrierRatesDegPerCy })
247
284
  const PAIRED_SUN_HARMONICS_SHA256 = 'cbc189cea1c20292'; // eccentricity unification: Step-0 refit → N2/N3 re-derived (fidelity 0.616″, 70 terms)
248
285
 
249
286
  /** sha256/16 of JSON.stringify([...planets, moonElongation]) — the seven
250
- * full-precision carrier rates (deg/cy TT) the TERMS table was extracted
251
- * under at N3. The model wiring recomputes the rates live from the planet
252
- * records, so a planet-period / year / month input change moves the
253
- * carriers automatically while the table stays frozen — a silent few-
254
- * arcsec stale below the api gate's ≤8″ backstop. test:model recomputes
255
- * this fingerprint from live constants (identical arithmetic to model.js)
256
- * and fails on mismatch: re-run the N3 extraction chain
257
- * (tools/explore/n2-sun-framework-carriers.mjs →
258
- * n3-carrier-swap-preview.mjs), re-embed TERMS, and update this value. */
259
- const PAIRED_CARRIER_RATES_SHA256 = '893e055ee12343bd';
287
+ * full-precision carrier rates (deg/cy TT) the TERMS table pairs with:
288
+ * the SIDEREAL carriers of plan 06 I2 (record rate − the model's J2000
289
+ * precession; Earth the framework sidereal year; the N3 literals kept,
290
+ * the two long-period rows derived on these rates). The model wiring
291
+ * recomputes the rates live from the planet records, so a planet-period /
292
+ * year / month input change moves the carriers automatically while the
293
+ * table stays frozen — a silent few-arcsec stale below the api gate's
294
+ * ≤12″ backstop. test:model recomputes this fingerprint from live
295
+ * constants (identical arithmetic to model.js) and fails on mismatch:
296
+ * re-run the extraction chain (tools/explore/n2-sun-framework-carriers.mjs
297
+ * → i2-sidereal-carrier-table.mjs for the short-period rows,
298
+ * i2-long-inequality.mjs for the long-period rows), re-embed TERMS, and
299
+ * update this value. */
300
+ const PAIRED_CARRIER_RATES_SHA256 = '2d066e92bae955e4';
260
301
 
261
302
  module.exports = { createSunPlanetaryCompletion, PAIRED_SUN_HARMONICS_SHA256, PAIRED_CARRIER_RATES_SHA256 };
package/src/index.js CHANGED
@@ -114,6 +114,9 @@ export { createChainCycleIntegrator } from './chain-cycles/index.cjs';
114
114
  export { createMoonArguments } from './moon/arguments.cjs';
115
115
  export { createMoonSeries } from './moon/series.cjs';
116
116
  export { createMoonApparent } from './moon/apparent.cjs';
117
+ // R4 — the Earth frame of date (sun plane, equinox, spin axis from the one-source
118
+ // sample) and the offset-circle wheel-angle solver: the scene twins' one placement.
119
+ export { computeEarthFrameOfDate, solveWheelAngleForLongitude } from './earth/frame-of-date.cjs';
117
120
  // Phase 8.3 — the planet machinery, extracted by LAW over body records
118
121
  // (survey order: geometry → Fibonacci laws → channels → chains).
119
122
  export { derivePlanetGeometry } from './planets/geometry.cjs';
@@ -124,9 +127,13 @@ export { integrateAscendingNode } from './planets/asc-node-integrator.cjs';
124
127
  export * as planetOrbitChain from './planets/orbit-chain.cjs';
125
128
  // P5/K4.6c — the engine-D Keplerian chain (pure evaluator + the embedded
126
129
  // governed artifact; the browser flag path consumes exactly these).
130
+ export { computeSecularShape } from './planets/secular-shape.cjs';
127
131
  export { buildPlanetChainsFromArtifactData, computePlanetElementsAtYear, computeHeliocentricEclipticFromElements, computePoissonArgRad, computeOsculatingElements, solveKeplerRad, computeApsidalSecularDegPerYr, ANCHOR_EPOCH_YEAR, ANCHOR_EPOCH_JD } from './planets/keplerian-chain.cjs';
128
132
  export { computeEquatorNodeOriginSFrameDeg, convertNodeSFrameToEquatorOriginDeg } from './planets/inv-plane-frame.cjs';
129
133
  export { createSecularSeriesOverride } from './planets/secular-series.cjs';
134
+ // Plan 06 Phase 7 — the planets' spin channel (the precession constant from
135
+ // each planet's own torques, the spin integrated on its own ζ plane history).
136
+ export { computePlanetPrecessionConstant, createPlanetSpinChannel, createPlanetSpinChannelFromArtifacts, computeObliquityJ2000Deg } from './planets/spin-channel.cjs';
130
137
  export { CHAIN_ARTIFACT, CHAIN_ARTIFACT_HASH } from './planets/chain-artifact.js';
131
138
  // Engine-switch Stage B, T5d-(d): the deep-time Earth-z channel (the deep
132
139
  // lunar-chain modulation rides it; era consumers stay on the H/3 channel).
@@ -143,7 +150,8 @@ export { createYearLengths, ONE_FAMILY_WINDOW_YEARS } from './earth/year-lengths
143
150
  // (spin ω(t) × [solar torque + lunar torque on the recession history]) —
144
151
  // leg-1's physical rate; the structural H(t)/13 clock is its named diagnostic.
145
152
  export { computeSolarTorqueShare, createComposedPrecession } from './earth/precession-composed.cjs';
146
- export { createPredictivePrecession, calcPlanetPerihelionLongDeg } from './planets/predict.cjs';
153
+ // (planets/predict.cjs — the planet predictive-precession feature basis — was
154
+ // retired at plan 06 R8 with PREDICT_COEFFS_PHYSICAL; docs/retired-record.md.)
147
155
  // L10 — the composition front door: one law set, N body records. Thin by
148
156
  // design; engines keep their direct call sites (see planets/model.cjs).
149
157
  export { createPlanetModel } from './planets/model.cjs';