@essrt/physics 1.17.0 → 2.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.
@@ -2,14 +2,14 @@
2
2
  // Gives the TypeScript website full type safety at the boundary (§2g) while
3
3
  // packages/physics stays JavaScript.
4
4
 
5
- export declare const CONSTANTS_HASH: "844b86db470b9937";
5
+ export declare const CONSTANTS_HASH: "2f39a17827ddce26";
6
6
 
7
7
  export declare const MODEL_VERSION: string;
8
8
 
9
9
  export declare const PREPRINT_DOI: string;
10
10
 
11
11
  export declare const DEFAULT_CONSTANTS: {
12
- readonly hash: "844b86db470b9937";
12
+ readonly hash: "2f39a17827ddce26";
13
13
  readonly additionalBodies: {
14
14
  "pluto": {
15
15
  "name": string;
@@ -32,17 +32,17 @@
32
32
  * carry it so a counterfactual is reproducible (§2d).
33
33
  * @type {string}
34
34
  */
35
- export const CONSTANTS_HASH = "844b86db470b9937";
35
+ export const CONSTANTS_HASH = "2f39a17827ddce26";
36
36
 
37
37
  /** Model version label — single source: public/input/model-version.json (§10 two-axis scheme). */
38
- export const MODEL_VERSION = "v11.0";
38
+ export const MODEL_VERSION = "v12.0";
39
39
 
40
40
  /** Canonical preprint DOI — single source: public/input/model-version.json. */
41
41
  export const PREPRINT_DOI = "10.21203/rs.3.rs-8758810/v4";
42
42
 
43
43
  /** @type {Readonly<Record<string, unknown>>} */
44
44
  export const DEFAULT_CONSTANTS = Object.freeze({
45
- hash: "844b86db470b9937",
45
+ hash: "2f39a17827ddce26",
46
46
  additionalBodies: {
47
47
  "pluto": {
48
48
  "name": "Pluto",
@@ -179,7 +179,7 @@ export const DEFAULT_CONSTANTS = Object.freeze({
179
179
  "alpha1PerMa": -0.000099375895103,
180
180
  "alpha3PerMa3": -6.4186463489e-12,
181
181
  "alpha4PerMa4": 1.3619800519e-16,
182
- "alphaClimateScalePerMille": -3.93e-7,
182
+ "alphaClimateScalePerMille": -3.665e-7,
183
183
  "dtStackTaperFullHalfwidthYr": 300000,
184
184
  "dtStackTaperTotalHalfwidthYr": 400000,
185
185
  "recessionRegime": {
@@ -207,8 +207,8 @@ export const DEFAULT_CONSTANTS = Object.freeze({
207
207
  }
208
208
  },
209
209
  earth: {
210
- "earthtiltMean": 23.413527499101747,
211
- "earthInvPlaneInclinationAmplitude": 0.6360475695866625,
210
+ "earthtiltMean": 23.413526608469965,
211
+ "earthInvPlaneInclinationAmplitude": 0.636069722432876,
212
212
  "eccentricityBase": 0.015386009686374918,
213
213
  "eccentricityAmplitude": 0.0013559440307290061
214
214
  },
@@ -228,7 +228,7 @@ export const DEFAULT_CONSTANTS = Object.freeze({
228
228
  "perihelionPassageJ2000_JD": 2451547.042,
229
229
  "earthInclinationJ2000_deg": 1.57869,
230
230
  "earthInclinationRate_arcsecPerCentury": -18,
231
- "deltaTStart": 55.85417672145975,
231
+ "deltaTStart": 55.15957982403355,
232
232
  "sunTilt": 7.155
233
233
  },
234
234
  foundational: {
@@ -238,7 +238,7 @@ export const DEFAULT_CONSTANTS = Object.freeze({
238
238
  "startmodelJD": 2451716.5,
239
239
  "startmodelYear": 2000.5,
240
240
  "correctionDays": -0.828832119703292,
241
- "correctionSun": 0.4968839022012559,
241
+ "correctionSun": 0.4971540149655503,
242
242
  "temperatureGraphMostLikely": 14.5,
243
243
  "startAngleModel": 89.91949879,
244
244
  "useVariableSpeed": true,
@@ -248,7 +248,7 @@ export const DEFAULT_CONSTANTS = Object.freeze({
248
248
  "moonStartposApsidal": 347.5476,
249
249
  "moonStartposNodal": 64.0435,
250
250
  "moonStartposMoon": 67.8443,
251
- "moonMeeusLpCorrection": 0.009081766072295829
251
+ "moonMeeusLpCorrection": 0.00908174470925335
252
252
  },
253
253
  moonMeeus: {
254
254
  "elpW1T2Decomposition_arcsecPerCy2": {
@@ -432,8 +432,8 @@ export const DEFAULT_CONSTANTS = Object.freeze({
432
432
  "mercury": {
433
433
  "name": "Mercury",
434
434
  "eocFraction": -0.527,
435
- "startpos": 83.65212772217342,
436
- "angleCorrection": 0.971595956003533,
435
+ "startpos": 83.64651142941864,
436
+ "angleCorrection": 0.9727205912043573,
437
437
  "perihelionEclipticFraction": [
438
438
  8,
439
439
  11
@@ -462,7 +462,7 @@ export const DEFAULT_CONSTANTS = Object.freeze({
462
462
  "name": "Venus",
463
463
  "eocFraction": 0.436,
464
464
  "startpos": 249.28769121856186,
465
- "angleCorrection": -2.7506208719906127,
465
+ "angleCorrection": -2.789778861448692,
466
466
  "perihelionEclipticFraction": [
467
467
  -8,
468
468
  6
@@ -488,7 +488,7 @@ export const DEFAULT_CONSTANTS = Object.freeze({
488
488
  "name": "Mars",
489
489
  "eocFraction": -0.066224,
490
490
  "startpos": 121.4634461571797,
491
- "angleCorrection": -2.110262688821635,
491
+ "angleCorrection": -2.104652936098656,
492
492
  "perihelionEclipticFraction": [
493
493
  8,
494
494
  36
@@ -517,7 +517,7 @@ export const DEFAULT_CONSTANTS = Object.freeze({
517
517
  "name": "Jupiter",
518
518
  "eocFraction": 0.495,
519
519
  "startpos": 13.887946755371052,
520
- "angleCorrection": 0.9306112039524912,
520
+ "angleCorrection": 0.9333205235053406,
521
521
  "perihelionEclipticFraction": [
522
522
  8,
523
523
  39
@@ -545,8 +545,8 @@ export const DEFAULT_CONSTANTS = Object.freeze({
545
545
  "saturn": {
546
546
  "name": "Saturn",
547
547
  "eocFraction": 0.54,
548
- "startpos": 11.279046793476084,
549
- "angleCorrection": -0.17887349563889998,
548
+ "startpos": 11.279308392461772,
549
+ "angleCorrection": -0.1784695052193328,
550
550
  "perihelionEclipticFraction": [
551
551
  -8,
552
552
  65
@@ -575,7 +575,7 @@ export const DEFAULT_CONSTANTS = Object.freeze({
575
575
  "name": "Uranus",
576
576
  "eocFraction": 0.53,
577
577
  "startpos": 44.900388945775106,
578
- "angleCorrection": -0.7329070274012324,
578
+ "angleCorrection": -0.7343433510960402,
579
579
  "perihelionEclipticFraction": [
580
580
  1,
581
581
  3
@@ -605,7 +605,7 @@ export const DEFAULT_CONSTANTS = Object.freeze({
605
605
  "name": "Neptune",
606
606
  "eocFraction": 0.585,
607
607
  "startpos": 47.9552024382285,
608
- "angleCorrection": 2.332347646694906,
608
+ "angleCorrection": 2.3327665835675617,
609
609
  "perihelionEclipticFraction": [
610
610
  2,
611
611
  1
@@ -110,79 +110,83 @@ const ARG_D0 = 297.8501921;
110
110
  * [[6 mean-longitude multipliers lMe,lV,lE,lM,lJ,lS],
111
111
  * [6 mean-anomaly multipliers MMe,MV,ME,MMa,MJ,MS], cos″, sin″].
112
112
  * 70 terms ≥ 0.05″ from the N3 framework-carrier extraction (79-term
113
- * LSQ on the D2 derived signal, fidelity 0.61″).
113
+ * LSQ on the D2 derived signal, fidelity 0.616″) — re-derived under the
114
+ * ONE eccentricity law (unification; D2 combined residual 0.60″,
115
+ * composed difference vs the previous table ≤1.5″ at the ancient presets,
116
+ * detrended 0.033 min). Individual coefficients redistribute between the
117
+ * near-degenerate ±M sideband families; only the composed function ships.
114
118
  * @type {Array<[number[], number[], number, number]>}
115
119
  */
116
120
  const TERMS = [
117
- [[0, 0, 1, 0, -2, 0], [0, 0, 1, 0, 0, 0], 23.4846, 2.3099],
118
- [[0, 0, 2, 0, -2, 0], [0, 0, 0, 0, 0, 0], -1.7235, -14.0062],
119
- [[0, 0, 2, 0, -3, 0], [0, 0, 0, 0, 1, 0], 7.4894, -7.7252],
120
- [[0, 3, -3, 0, 0, 0], [0, 0, -1, 0, 0, 0], 5.7813, 1.7078],
121
- [[0, 3, -4, 0, 0, 0], [0, 0, 0, 0, 0, 0], 1.1877, 5.8649],
122
- [[0, 0, 1, 0, -1, 0], [0, 0, 0, 0, 0, 0], 1.6357, -4.9485],
123
- [[0, 2, -3, 0, 0, 0], [0, 0, 1, 0, 0, 0], -4.9053, -0.3900],
124
- [[0, 1, -1, 0, 0, 0], [0, 0, 0, 0, 0, 0], 0.1351, 4.8331],
125
- [[0, 0, 2, -3, 0, 0], [0, 0, 0, 1, 0, 0], -0.2239, -3.1687],
126
- [[0, 0, 1, 0, -2, 0], [0, 0, 0, 0, 1, 0], -2.1749, -1.7705],
127
- [[0, 0, 1, -1, 0, 0], [0, 0, 0, -1, 0, 0], 0.8107, -2.5127],
128
- [[0, 0, 1, 0, -1, 0], [0, 0, -1, 0, 0, 0], -2.5403, -0.1821],
129
- [[0, 0, -1, 2, 0, 0], [0, 0, 0, 0, 0, 0], -1.3152, -2.0575],
130
- [[0, 2, -2, 0, 0, 0], [0, 0, 0, 0, 0, 0], -1.8073, -0.8142],
131
- [[0, 3, -3, 0, 0, 0], [0, -1, 0, 0, 0, 0], -0.8611, 1.7708],
132
- [[0, 0, -1, 2, 0, 0], [0, 0, -1, 0, 0, 0], 1.2659, 1.1195],
133
- [[0, 0, 2, -2, 0, 0], [0, 0, -1, 0, 0, 0], 1.1646, 1.0865],
134
- [[0, 0, 1, 0, -1, 0], [0, 0, 0, 0, -1, 0], 0.4560, -1.2051],
135
- [[0, 0, -2, 4, 0, 0], [0, 0, 0, -1, 0, 0], -0.2198, 1.2107],
136
- [[0, 3, -3, 0, 0, 0], [0, 0, 0, 0, 0, 0], 0.5260, -1.0137],
137
- [[0, 2, -2, 0, 0, 0], [0, 0, -1, 0, 0, 0], -1.1195, 0.1107],
138
- [[0, 0, 2, -2, 0, 0], [0, 0, 0, 0, 0, 0], 0.8202, -0.7125],
139
- [[0, 3, -4, 0, 0, 0], [0, 0, -1, 0, 0, 0], 0.9722, 0.3524],
140
- [[0, 0, 2, -3, 0, 0], [0, 0, 0, 0, 0, 0], 0.9763, -0.2018],
141
- [[0, 3, -4, 0, 0, 0], [0, 0, 1, 0, 0, 0], 0.1162, 0.9095],
142
- [[0, 0, 2, -2, 0, 0], [0, 0, 0, -1, 0, 0], 0.2940, 0.8000],
143
- [[0, 2, -3, 0, 0, 0], [0, 0, 0, 0, 0, 0], 0.2210, -0.6939],
144
- [[0, 0, 2, 0, -2, 0], [0, 0, 0, 0, -1, 0], -0.2188, 0.6572],
145
- [[0, 0, 1, 0, -2, 0], [0, 0, 0, 0, 0, 0], 0.6135, 0.3150],
146
- [[0, 1, -1, 0, 0, 0], [0, -1, 0, 0, 0, 0], 0.6161, -0.1008],
147
- [[0, 0, 1, -1, 0, 0], [0, 0, 0, 1, 0, 0], 0.4387, -0.4123],
148
- [[0, 0, 2, 0, -2, 0], [0, 0, -1, 0, 0, 0], -0.1825, 0.5176],
149
- [[0, 2, -3, 0, 0, 0], [0, 1, 0, 0, 0, 0], 0.1125, -0.5348],
150
- [[0, 0, -2, 4, 0, 0], [0, 0, -1, 0, 0, 0], -0.4800, 0.2245],
151
- [[0, 0, 1, 0, 0, -1], [0, 0, 0, 0, 0, 0], 0.0845, -0.4012],
152
- [[0, 0, 1, 0, -1, 0], [0, 0, 1, 0, 0, 0], 0.1622, -0.3517],
153
- [[0, 0, 2, 0, -3, 0], [0, 0, -1, 0, 0, 0], 0.3786, 0.0361],
154
- [[0, 0, 2, -3, 0, 0], [0, 0, 0, -1, 0, 0], 0.0701, -0.3556],
155
- [[0, 0, 1, -1, 0, 0], [0, 0, 0, 0, 0, 0], -0.2643, -0.2045],
156
- [[0, 0, 1, 0, -1, 0], [0, 0, 0, 0, 1, 0], 0.2650, -0.1462],
157
- [[0, 0, 1, 0, 0, -1], [0, 0, 0, 0, 0, 1], 0.3016, 0.0060],
158
- [[0, 0, -1, 2, 0, 0], [0, 0, 0, 1, 0, 0], -0.0582, -0.2912],
159
- [[0, 0, 2, 0, -2, 0], [0, 0, 0, 0, 1, 0], -0.2051, -0.2135],
160
- [[0, 0, 1, 0, -2, 0], [0, 0, 0, 0, -1, 0], 0.0858, 0.2762],
161
- [[0, 0, 2, -3, 0, 0], [0, 0, -1, 0, 0, 0], 0.1911, 0.2163],
162
- [[0, 0, -1, 2, 0, 0], [0, 0, 0, -1, 0, 0], 0.2815, -0.0450],
163
- [[0, 2, -3, 0, 0, 0], [0, 0, -1, 0, 0, 0], 0.2490, 0.0551],
164
- [[0, 0, 1, 0, 0, -1], [0, 0, -1, 0, 0, 0], -0.0456, 0.2371],
165
- [[0, 0, 2, 0, -3, 0], [0, 0, 0, 0, 0, 0], 0.1560, -0.1469],
166
- [[0, 3, -4, 0, 0, 0], [0, 1, 0, 0, 0, 0], -0.1412, 0.1568],
167
- [[0, 3, -4, 0, 0, 0], [0, -1, 0, 0, 0, 0], -0.1616, -0.1314],
168
- [[0, 0, -2, 4, 0, 0], [0, 0, 0, 0, 0, 0], 0.1728, -0.0849],
169
- [[0, 1, -1, 0, 0, 0], [0, 0, -1, 0, 0, 0], -0.0449, 0.1649],
121
+ [[0, 3, -3, 0, 0, 0], [0, 0, -1, 0, 0, 0], -9.2558, -0.3232],
122
+ [[0, 3, -4, 0, 0, 0], [0, 0, 0, 0, 0, 0], -0.1950, -9.2459],
123
+ [[0, 0, 1, 0, -2, 0], [0, 0, 0, 0, 1, 0], -1.4662, -6.4341],
124
+ [[0, 1, -1, 0, 0, 0], [0, 0, 0, 0, 0, 0], 0.1345, 4.8332],
125
+ [[0, 2, -2, 0, 0, 0], [0, 0, 0, 0, 0, 0], -2.1364, -2.9549],
126
+ [[0, 2, -3, 0, 0, 0], [0, 0, 1, 0, 0, 0], -2.8927, -1.1913],
127
+ [[0, 0, 1, 0, -2, 0], [0, 0, 1, 0, 0, 0], 2.8982, -1.0900],
128
+ [[0, 2, -2, 0, 0, 0], [0, 0, -1, 0, 0, 0], 0.7820, 2.8796],
129
+ [[0, 0, 1, 0, -1, 0], [0, 0, -1, 0, 0, 0], -2.5401, -0.1829],
130
+ [[0, 0, 2, 0, -2, 0], [0, 0, 0, 0, 0, 0], -0.2456, -2.1163],
131
+ [[0, 0, 1, -1, 0, 0], [0, 0, 0, -1, 0, 0], 2.1028, 0.1572],
132
+ [[0, 0, 2, -2, 0, 0], [0, 0, -1, 0, 0, 0], 2.0062, 0.4493],
133
+ [[0, 0, 2, 0, -3, 0], [0, 0, 0, 0, 1, 0], 0.2164, 1.7839],
134
+ [[0, 2, -3, 0, 0, 0], [0, 0, 0, 0, 0, 0], -1.5284, 0.8126],
135
+ [[0, 0, 1, 0, -1, 0], [0, 0, 0, 0, -1, 0], -0.9353, -1.1855],
136
+ [[0, 0, 2, -3, 0, 0], [0, 0, 0, 1, 0, 0], 0.4254, -1.4438],
137
+ [[0, 3, -3, 0, 0, 0], [0, -1, 0, 0, 0, 0], -1.2408, 0.7438],
138
+ [[0, 0, 1, 0, -2, 0], [0, 0, 0, 0, 0, 0], 1.3145, -0.1985],
139
+ [[0, 0, 2, 0, -2, 0], [0, 0, -1, 0, 0, 0], -0.4728, 1.1130],
140
+ [[0, 3, -4, 0, 0, 0], [0, 0, -1, 0, 0, 0], 0.9746, 0.3524],
141
+ [[0, 0, -1, 2, 0, 0], [0, 0, -1, 0, 0, 0], -0.9141, -0.1697],
142
+ [[0, 3, -4, 0, 0, 0], [0, 0, 1, 0, 0, 0], -0.7605, 0.1501],
143
+ [[0, 0, -1, 2, 0, 0], [0, 0, 0, -1, 0, 0], 0.6794, -0.0282],
144
+ [[0, 0, -1, 2, 0, 0], [0, 0, 0, 0, 0, 0], -0.6021, 0.2300],
145
+ [[0, 0, 1, 0, -1, 0], [0, 0, 0, 0, 0, 0], -0.2055, -0.6053],
146
+ [[0, 0, 1, -1, 0, 0], [0, 0, 0, 0, 0, 0], -0.6212, -0.0277],
147
+ [[0, 0, 2, 0, -3, 0], [0, 0, 0, 0, 0, 0], 0.0277, 0.5852],
148
+ [[0, 0, -2, 4, 0, 0], [0, 0, -1, 0, 0, 0], -0.4801, 0.2245],
149
+ [[0, 0, 2, -2, 0, 0], [0, 0, 0, -1, 0, 0], 0.0605, -0.5014],
150
+ [[0, 0, -2, 4, 0, 0], [0, 0, 0, 0, 0, 0], 0.4682, 0.1671],
151
+ [[0, 0, 2, -2, 0, 0], [0, 0, 0, 0, 0, 0], 0.2949, 0.3878],
152
+ [[0, 0, 1, 0, 0, -1], [0, 0, 0, 0, 0, 0], 0.0845, -0.4011],
153
+ [[0, 2, -3, 0, 0, 0], [0, 1, 0, 0, 0, 0], 0.0589, -0.3744],
154
+ [[0, 3, -3, 0, 0, 0], [0, 0, 0, 0, 0, 0], -0.3257, -0.1827],
155
+ [[0, 0, 2, 0, -3, 0], [0, 0, -1, 0, 0, 0], 0.0149, 0.3557],
156
+ [[0, 0, -2, 4, 0, 0], [0, 0, 0, -1, 0, 0], -0.3152, -0.0762],
157
+ [[0, 3, -4, 0, 0, 0], [0, -1, 0, 0, 0, 0], 0.0714, 0.3142],
158
+ [[0, 0, -1, 2, 0, 0], [0, 0, 0, 1, 0, 0], 0.1331, -0.2622],
159
+ [[0, 0, 2, -3, 0, 0], [0, 0, -1, 0, 0, 0], 0.2826, 0.0458],
160
+ [[0, 2, -3, 0, 0, 0], [0, 0, -1, 0, 0, 0], -0.1689, -0.2243],
161
+ [[0, 0, 1, 0, -1, 0], [0, 0, 1, 0, 0, 0], -0.0262, -0.2757],
162
+ [[0, 0, 2, -3, 0, 0], [0, 0, 0, 0, 0, 0], 0.2267, -0.1326],
163
+ [[0, 0, 1, 0, -2, 0], [0, 0, 0, 0, -1, 0], -0.2245, -0.0951],
164
+ [[0, 0, 1, 0, 0, -1], [0, 0, -1, 0, 0, 0], -0.0453, 0.2368],
165
+ [[0, 2, -2, 0, 0, 0], [0, -1, 0, 0, 0, 0], -0.2075, 0.0622],
166
+ [[0, 3, -4, 0, 0, 0], [0, 1, 0, 0, 0, 0], -0.1413, 0.1567],
167
+ [[0, 1, -1, 0, 0, 0], [0, 0, -1, 0, 0, 0], 0.0858, -0.1399],
170
168
  [[0, 0, 2, 0, -3, 0], [0, 0, 1, 0, 0, 0], 0.1632, -0.0164],
171
- [[0, 2, -2, 0, 0, 0], [0, -1, 0, 0, 0, 0], 0.0534, -0.1430],
172
- [[0, 0, 2, -3, 0, 0], [0, 0, 1, 0, 0, 0], 0.1316, -0.0275],
173
- [[0, 0, -2, 4, 0, 0], [0, 0, 1, 0, 0, 0], 0.1216, 0.0451],
174
- [[0, 0, 2, -2, 0, 0], [0, 0, 0, 1, 0, 0], -0.1046, 0.0620],
175
- [[0, 0, 1, -1, 0, 0], [0, 0, 1, 0, 0, 0], -0.1075, -0.0488],
176
- [[0, 0, 2, 0, 0, -2], [0, 0, 0, 0, 0, 0], -0.0385, 0.1030],
177
- [[0, 0, 1, 0, 0, -1], [0, 0, 0, 0, 0, -1], -0.0308, 0.1049],
178
- [[0, 1, -1, 0, 0, 0], [0, 1, 0, 0, 0, 0], -0.0875, -0.0250],
169
+ [[0, 0, 2, -3, 0, 0], [0, 0, 1, 0, 0, 0], 0.1316, -0.0276],
170
+ [[0, 0, -2, 4, 0, 0], [0, 0, 1, 0, 0, 0], 0.1219, 0.0452],
171
+ [[0, 0, 2, 0, -2, 0], [0, 0, 0, 0, 1, 0], -0.1243, -0.0271],
172
+ [[0, 1, -1, 0, 0, 0], [0, -1, 0, 0, 0, 0], 0.1139, -0.0172],
173
+ [[0, 0, 2, 0, 0, -2], [0, 0, 0, 0, 0, 0], -0.0385, 0.1031],
174
+ [[0, 0, 1, 0, 0, -1], [0, 0, 0, 0, 0, -1], -0.0309, 0.1052],
175
+ [[0, 0, 1, 0, -1, 0], [0, 0, 0, 0, 1, 0], 0.0945, 0.0475],
176
+ [[0, 0, 2, -3, 0, 0], [0, 0, 0, -1, 0, 0], -0.0981, -0.0051],
177
+ [[0, 0, 1, 0, 0, -1], [0, 0, 0, 0, 0, 1], -0.0827, 0.0500],
178
+ [[0, 0, 2, 0, -2, 0], [0, 0, 0, 0, -1, 0], 0.0866, -0.0204],
179
+ [[0, 1, -1, 0, 0, 0], [0, 1, 0, 0, 0, 0], -0.0085, -0.0855],
179
180
  [[0, 0, 1, 0, -2, 0], [0, 0, -1, 0, 0, 0], -0.0738, 0.0295],
180
181
  [[0, 0, 2, 0, -3, 0], [0, 0, 0, 0, -1, 0], 0.0097, 0.0787],
181
- [[0, 1, -1, 0, 0, 0], [0, 0, 1, 0, 0, 0], -0.0016, 0.0762],
182
- [[0, 2, -2, 0, 0, 0], [0, 0, 1, 0, 0, 0], 0.0562, -0.0490],
183
- [[0, 3, -3, 0, 0, 0], [0, 0, 1, 0, 0, 0], 0.0638, -0.0362],
184
- [[0, 0, 2, 0, -2, 0], [0, 0, 1, 0, 0, 0], -0.0085, 0.0686],
185
- [[0, 2, -2, 0, 0, 0], [0, 1, 0, 0, 0, 0], -0.0453, 0.0505],
182
+ [[0, 1, -1, 0, 0, 0], [0, 0, 1, 0, 0, 0], -0.0016, 0.0764],
183
+ [[0, 0, 1, -1, 0, 0], [0, 0, 0, 1, 0, 0], 0.0655, 0.0358],
184
+ [[0, 3, -3, 0, 0, 0], [0, 0, 1, 0, 0, 0], 0.0517, -0.0513],
185
+ [[0, 0, 2, 0, -2, 0], [0, 0, 1, 0, 0, 0], -0.0085, 0.0687],
186
+ [[0, 2, -2, 0, 0, 0], [0, 1, 0, 0, 0, 0], -0.0274, 0.0580],
187
+ [[0, 0, 2, -2, 0, 0], [0, 0, 0, 1, 0, 0], 0.0521, 0.0217],
188
+ [[0, 0, 1, -1, 0, 0], [0, 0, 1, 0, 0, 0], 0.0188, 0.0523],
189
+ [[0, 2, -2, 0, 0, 0], [0, 0, 1, 0, 0, 0], -0.0421, -0.0340],
186
190
  [[0, 0, 1, -1, 0, 0], [0, 0, -1, 0, 0, 0], -0.0353, -0.0379],
187
191
  ];
188
192
 
@@ -240,7 +244,7 @@ function createSunPlanetaryCompletion({ embWobbleArcsec, carrierRatesDegPerCy })
240
244
  * at derivation time — the matched-pair fingerprint asserted by test:model.
241
245
  * Unchanged from v1/v2: SUN_HARMONICS did not move in the D2 or N3
242
246
  * landings. */
243
- const PAIRED_SUN_HARMONICS_SHA256 = 'e2cf42e9770c9e0a';
247
+ const PAIRED_SUN_HARMONICS_SHA256 = 'cbc189cea1c20292'; // eccentricity unification: Step-0 refit → N2/N3 re-derived (fidelity 0.616″, 70 terms)
244
248
 
245
249
  /** sha256/16 of JSON.stringify([...planets, moonElongation]) — the seven
246
250
  * full-precision carrier rates (deg/cy TT) the TERMS table was extracted
package/src/model.js CHANGED
@@ -86,7 +86,9 @@ export function assembleModel(C, F) {
86
86
 
87
87
  const earthtiltMean = C.earth.earthtiltMean;
88
88
  const earthInclAmplitude = C.earth.earthInvPlaneInclinationAmplitude;
89
- const eccentricityBase = C.earth.eccentricityBase;
89
+ // eccentricityAmplitude: the Law-4 input A (the 1246 triangle closure; the
90
+ // wobble-marker distance). It is the K calibration input ONLY — Earth's
91
+ // eccentricity law does not use it; see eccentricityAt (base' derived) below.
90
92
  const eccentricityAmplitude = C.earth.eccentricityAmplitude;
91
93
  const earthRAAngle = 2 * earthInclAmplitude - (earthInclAmplitude * earthInclAmplitude) / earthtiltMean;
92
94
  const earthInclMean = C.earthOrbital.earthInclinationJ2000_deg
@@ -305,13 +307,46 @@ export function assembleModel(C, F) {
305
307
  }
306
308
  return obliq;
307
309
  };
310
+ // ECCENTRICITY UNIFICATION — ONE law for the whole model (plan
311
+ // IP-eccentricity-unification, decision D1 = form (e)). Earth's orbital
312
+ // eccentricity is the magnitude of a vector sum, e = |v₁ + v₂|: v₁ of
313
+ // length base' along the ICRF perihelion (rotating once per H/3), v₂ of
314
+ // length base'/2 FIXED in space along the inclination-cycle anchor
315
+ // direction. Their relative angle θ rides the System-Reset lattice phase
316
+ // (θ(t) = 3(t − balancedYear)/H·360° − 180°, θ(J2000) = 81.178°) — the
317
+ // SAME anchor the inclination law and the Moon channel ride (their
318
+ // extremes coincide: max −23,200, min −79,100). Then
319
+ // e(t) = base' · (1 + cos θ(t) / 2), base' = e(J2000) / (1 + cos θ(J2000) / 2)
320
+ // base' is DERIVED from the observed J2000 eccentricity and the anchor
321
+ // (0.015520; the Law-5 balance moves 99.8636 → 99.8645%, Earth's weight
322
+ // there being 0.05%). No new constants. Why H/3 and not the former H/16
323
+ // beat law: eccentricity is frame-invariant and may carry only fixed-frame
324
+ // lattice periods; H/16 is the OF-DATE perihelion period (13 + 3 = 16 —
325
+ // the H/3 rotation seen from the H/13 equinox) and belongs to ϖ_of-date;
326
+ // measured, the H/16 law's present ė (−0.84e-5/cy) is 5× below the
327
+ // observed −4.20e-5 while this law reads −4.31e-5 (Phase-0 record:
328
+ // tools/explore/fq7s-h3-law-candidate.mjs; JPL Sun 1.49″, registry 0.80″,
329
+ // syzygy 3.72″). Consumers: the eclipse Sun (equation of centre), the
330
+ // besselian Sun distance, the Moon channel (E-factor, perigee/node T²),
331
+ // and the cardinal-point braid — one eccentricity everywhere.
332
+ // ONE implementation for all three runtimes: moon/ecc-channel.cjs (the
333
+ // Node engine's deep-time.js and the browser's script.js instantiate the
334
+ // same channel with the same inputs). Its phase counter runs from J2000
335
+ // (θ₀ = ϖ_ICRF(J2000) − 21.77° = 81.178°, the System-Reset anchor in
336
+ // anchor form — doc 66 §1); base' is derived inside from the observed
337
+ // J2000 eccentricity.
338
+ const moonEcc = createMoonEccChannel({
339
+ cyclesBetween,
340
+ eccentricityBase: C.earth.eccentricityBase,
341
+ perihelionLongitudeJ2000Deg: C.earthOrbital.earthPerihelionLongitudeJ2000,
342
+ inclinationCycleAnchorDeg: C.earthOrbital.earthInclinationCycleAnchor,
343
+ eccentricityJ2000: C.earthOrbital.earthEccentricityJ2000,
344
+ });
308
345
  /** @param {number} year @returns {number} */
309
- const eccentricityAt = (year) => {
310
- const th = phaseRadians(balancedYear, year, 16);
311
- return Math.sqrt(eccentricityBase * eccentricityBase
312
- + eccentricityAmplitude * eccentricityAmplitude
313
- - 2 * eccentricityBase * eccentricityAmplitude * Math.cos(th));
314
- };
346
+ const eccentricityAt = (year) => moonEcc.eccAt(year - 2000);
347
+ /** de/dyear of the one law — the cardinal braid's equation-of-centre
348
+ * derivative rides it. @param {number} year @returns {number} */
349
+ const eccentricityRateAt = (year) => moonEcc.eccRateAt(year - 2000);
315
350
  /** @param {number} year @returns {number} */
316
351
  const inclinationDeg = (year) => earthInclMean
317
352
  - earthInclAmplitude * Math.cos(phaseRadians(balancedYear, year, 3));
@@ -379,8 +414,6 @@ export function assembleModel(C, F) {
379
414
  balancedYear,
380
415
  meanSolarYearDays,
381
416
  hJ2000: H,
382
- eccentricityBase,
383
- eccentricityAmplitude,
384
417
  tiltMeanDeg: earthtiltMean,
385
418
  raAngleDeg: earthRAAngle,
386
419
  inclAmplitudeDeg: earthInclAmplitude,
@@ -396,6 +429,7 @@ export function assembleModel(C, F) {
396
429
  meanHAtAgeMa: (tMa) => deepLod.hAtAge(tMa),
397
430
  meanYearRealLodDays: (tMa) => deepLod.yearInDaysAtAge(tMa),
398
431
  eccentricityAt,
432
+ eccentricityRateAt,
399
433
  },
400
434
  });
401
435
  /** Tropical year: mean of the four cardinal intervals. @param {number} year @returns {number} */
@@ -612,14 +646,9 @@ export function assembleModel(C, F) {
612
646
  const moonAnomalisticMonthDays = totalDaysInH / (nSid - nApsidalEJ2000);
613
647
  const moonSynodicMonthDays = totalDaysInH / (nSid + 13 - H);
614
648
 
615
- // The framework H/3 eccentricity line (the Moon channel's view of the
616
- // wobble movement NOT the H/16 orbital eccentricity above)
617
- const moonEcc = createMoonEccChannel({
618
- cyclesBetween,
619
- eccentricityBase,
620
- perihelionLongitudeJ2000Deg: C.earthOrbital.earthPerihelionLongitudeJ2000,
621
- inclinationCycleAnchorDeg: C.earthOrbital.earthInclinationCycleAnchor,
622
- });
649
+ // moonEcc the model's ONE eccentricity law is created above (with
650
+ // eccentricityAt); the Moon channel's E-factor e(t)/e(J2000) and its
651
+ // perigee/node channel ride it, e(J2000) being the observed value exactly.
623
652
 
624
653
  // Layer-2 month/precession chain (Brouwer-Clemence m² scaling × the
625
654
  // e_E-line modulation)
@@ -860,29 +889,11 @@ export function assembleModel(C, F) {
860
889
  // D2 completion table is unchanged (residual 2lE re-fit ≈ 0.1″ — noise).
861
890
  const sunL0Deg = C.earthOrbital.sunMeanLongitudeJ2000_deg;
862
891
  const sunTropicalRateDegPerCy = 360 * julianCenturyDays / meanSolarYearDays;
863
- // FQ-7-Sun option C-small — ONE eccentricity law for Sun and Moon in the
864
- // eclipse chain. Eccentricity is frame-invariant (e = |z|, z = e·e^{iϖ}),
865
- // so it may carry only FIXED-FRAME lattice content: the H/3 line the Moon's
866
- // E-factor already rides (moon/ecc-channel.cjs). H/16 is the OF-DATE
867
- // perihelion period (13 + 3 = 16: the H/3 apsidal rotation seen from the
868
- // H/13 equinox) — it belongs to ϖ_of-date, not to e. The previous form
869
- // added the H/16 law's own slope (−0.84e-5/cy) on top of the H/3 line,
870
- // and that slope WAS the measured Sun-side ė tension (annual channel
871
- // T·sinM −3.7″/cy; JPL sides with the H/3 line: fq7s-ecc-consistency.mjs).
872
- // Anchor: the H/16 law's J2000 value (the observed e, anchored by design),
873
- // evaluated once — an explicit law change, not a hidden freeze; the
874
- // cardinal-point path keeps the H/16 law (eccentricityAt) unchanged.
875
- // Measured at the swap: JPL Sun 2.123 → 1.487″ (1900–2100), registry
876
- // window 0.93 → 0.80″, syzygy fleet 3.756 → 3.719″, T·sinM −3.65 → −0.19″/cy,
877
- // curvature term unchanged in size; the H/16 term at the corpus epochs
878
- // detrends to 0.174 min — below the ancient corpus's discrimination.
879
- const sunEccentricityJ2000 = eccentricityAt(2000);
880
- /** @param {number} year @returns {number} */
881
- const sunEccentricityAt = (year) => {
882
- const cos3 = -Math.cos(phaseRadians(balancedYear, year, 3));
883
- const cos3J2000 = -Math.cos(phaseRadians(balancedYear, 2000, 3));
884
- return sunEccentricityJ2000 + (eccentricityBase / 2) * (cos3 - cos3J2000);
885
- };
892
+ // The eclipse Sun's eccentricity IS the model's one eccentricity law
893
+ // (eccentricityAt above) the former sunEccentricityAt (FQ-7-Sun option
894
+ // C-small: the J2000-anchored H/3 line) was the additive-anchor form of the
895
+ // same movement and is retired by the unification (measured identical on
896
+ // every modern gate).
886
897
  const sunMeanLongitudeDegAt = (() => {
887
898
  // SW PHASE B — the CLOSED FORM on the integrated lattice phase
888
899
  // (supersedes the E5 ±3,000-yr trapezoid table; valid at EVERY epoch,
@@ -960,7 +971,7 @@ export function assembleModel(C, F) {
960
971
  frameworkSun: {
961
972
  sunMeanLongitudeJ2000Deg: sunL0Deg,
962
973
  tropicalRateDegPerCy: sunTropicalRateDegPerCy,
963
- eccentricityAt: sunEccentricityAt,
974
+ eccentricityAt,
964
975
  perihelionLongitudeDegAt: earthPerihelionDeg,
965
976
  meanLongitudeDegAt: sunMeanLongitudeDegAt,
966
977
  },
@@ -1104,7 +1115,7 @@ export function assembleModel(C, F) {
1104
1115
  frameworkSunDeps: Object.freeze({
1105
1116
  sunMeanLongitudeJ2000Deg: sunL0Deg,
1106
1117
  tropicalRateDegPerCy: sunTropicalRateDegPerCy,
1107
- eccentricityAt: sunEccentricityAt,
1118
+ eccentricityAt,
1108
1119
  perihelionLongitudeDegAt: earthPerihelionDeg,
1109
1120
  meanLongitudeDegAt: sunMeanLongitudeDegAt,
1110
1121
  }),
@@ -8,10 +8,14 @@
8
8
  * max. The observed J2000 e (−0.86%), ė (+1.7%) and the sign of ë are
9
9
  * PREDICTIONS of this line, not inputs.
10
10
  *
11
- * NOT the same quantity as the Sun machinery's eccentricity: Earth's own
12
- * orbital e for the cardinal-point/EoC path keeps the H/16 perihelion law
13
- * (`cardinal`'s injected eccentricityAt). This line is the MOON channel's
14
- * view of the H/3 movement two different laws, deliberately.
11
+ * ONE law for the eclipse chain (FQ-7-Sun option C-small, doc 66 §5): the
12
+ * eclipse Sun's equation of centre rides this same H/3 line (anchored at
13
+ * its J2000 value, model.js sunEccentricityAt) eccentricity is
14
+ * frame-invariant and may carry only fixed-frame lattice periods; the
15
+ * H/16 perihelion cycle is the H/3 rotation seen from the H/13 equinox
16
+ * (13 + 3 = 16) and belongs to ϖ, not e (doc 108). Only the
17
+ * cardinal-point/deep-time path still keeps the H/16 law (`cardinal`'s
18
+ * injected eccentricityAt) — a recorded, not yet resolved, split.
15
19
  *
16
20
  * Extracted VERBATIM from src/script.js (_FW_ECC, _fwEarthEcc,
17
21
  * _eCompModulation, _fwChannelIntegral, the framework branch of _fwEFactor),
@@ -39,6 +43,7 @@
39
43
  * @param {{
40
44
  * cyclesBetween: (yearA: number, yearB: number, divisorN: number) => (number | null),
41
45
  * eccentricityBase: number,
46
+ * eccentricityJ2000?: number,
42
47
  * perihelionLongitudeJ2000Deg: number,
43
48
  * inclinationCycleAnchorDeg: number,
44
49
  * }} deps — cyclesBetween MUST be the engine's own H-lattice phase counter
@@ -51,10 +56,21 @@ function createMoonEccChannel({
51
56
  eccentricityBase,
52
57
  perihelionLongitudeJ2000Deg,
53
58
  inclinationCycleAnchorDeg,
59
+ eccentricityJ2000,
54
60
  }) {
55
61
  const th0 = (perihelionLongitudeJ2000Deg - inclinationCycleAnchorDeg) * Math.PI / 180;
56
- const amplitude = eccentricityBase / 2;
57
- const mean = eccentricityBase;
62
+ // ECCENTRICITY UNIFICATION (plan IP-eccentricity-unification, D1 = form
63
+ // (e)): this line is the model's ONE eccentricity law for every consumer
64
+ // (eclipse Sun, Sun distance, Moon E-factor and T² channel, cardinal
65
+ // braid, scene). When the observed J2000 eccentricity is supplied the
66
+ // mean is DERIVED from it and the shared anchor — base' = e0 / (1 +
67
+ // cos θ₀ / 2) = 0.015520 — so e(J2000) is exact by construction; the
68
+ // legacy form (mean = the Law-5 base, e(J2000) a −0.86% prediction) is
69
+ // kept for callers that do not supply it.
70
+ const mean = eccentricityJ2000 !== undefined
71
+ ? eccentricityJ2000 / (1 + Math.cos(th0) / 2)
72
+ : eccentricityBase;
73
+ const amplitude = mean / 2;
58
74
  const e0 = mean + amplitude * Math.cos(th0); // J2000 anchor, exact by construction
59
75
  const g0 = Math.pow(1 - e0 * e0, -1.5); // (1−e²)^(−3/2) at the anchor
60
76
 
@@ -102,7 +118,21 @@ function createMoonEccChannel({
102
118
  return eccAt(tYr) / e0;
103
119
  }
104
120
 
105
- return { eccAt, modulation, channelIntegral, eFactorAt, th0, amplitude, mean, e0, g0 };
121
+ /** de/dyear of the line at tYr years from J2000 (the cardinal braid's
122
+ * equation-of-centre derivative): −amplitude·sin(θ)·dθ/dt, with dθ/dt
123
+ * from the phase counter's two-point difference over ±1 yr (exact for a
124
+ * linear phase, ppm-class under the integrated one). Returns 0 past the
125
+ * tidal-lock asymptote, where eccAt returns the mean.
126
+ * @param {number} tYr @returns {number} */
127
+ function eccRateAt(tYr) {
128
+ const c = cyclesBetween(2000, 2000 + tYr, 3);
129
+ if (c === null) return 0;
130
+ const cp = cyclesBetween(2000, 2000 + tYr + 1, 3), cm = cyclesBetween(2000, 2000 + tYr - 1, 3);
131
+ const dth = 2 * Math.PI * ((cp === null || cm === null) ? 0 : (cp - cm) / 2);
132
+ return -amplitude * Math.sin(th0 + 2 * Math.PI * c) * dth;
133
+ }
134
+
135
+ return { eccAt, eccRateAt, modulation, channelIntegral, eFactorAt, th0, amplitude, mean, e0, g0 };
106
136
  }
107
137
 
108
138
  module.exports = { createMoonEccChannel };
@@ -87,7 +87,7 @@ function beatPair(t1, t2) {
87
87
  * @property {(year: number) => number} computeObliquityEarthDeg
88
88
  * @property {(year: number) => number} computeEccentricityEarth
89
89
  * @property {number} obliquityMeanDeg - the fitted solstice-obliquity mean
90
- * @property {number} eccentricityMean - sqrt(base² + amplitude²)
90
+ * @property {number} eccentricityMean - Earth's mean eccentricity (the one law's base′)
91
91
  */
92
92
 
93
93
  /**