@essrt/physics 26.0.0 → 26.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.
package/package.json CHANGED
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "name": "@essrt/physics",
3
- "version": "26.0.0",
3
+ "version": "26.1.0",
4
4
  "description": "ESSRT (Expanding Solar System Resonance Theory) physics core — pure, injectable-constants, no I/O, no globals, no DOM. The complete model incl. fitted coefficients; every published version immutably ships one recorded model identity.",
5
5
  "essrt": {
6
- "modelVersion": "v27.1",
6
+ "modelVersion": "v27.2",
7
7
  "_note": "The model identity this package version ships (IP-unified-architecture §10: package semver tracks the API axis; the model version + CONSTANTS_HASH/COEFFICIENTS_HASH in src/constants/ carry the scientific identity). The version-pinning gate enforces this pairing against public/input/model-version.json."
8
8
  },
9
9
  "type": "module",
@@ -28,7 +28,9 @@
28
28
  * NUMERICS ARE LOAD-BEARING: fixed 10-yr grid over ±250 kyr, per-cell
29
29
  * 3-point Simpson at build, LINEAR interpolation on read; beyond the dense
30
30
  * grid a COARSE cumulative table (1-kyr cells, the same per-cell Simpson,
31
- * anchored at the dense edge) grown lazily in 250-kyr chunks in the direction
31
+ * anchored at the dense edge; read with a 3-point Simpson over the partial
32
+ * cell, so the count's RATE is continuous — plan 23 follow-up, see the tier
33
+ * note below) grown lazily in 250-kyr chunks in the direction
32
34
  * asked for — the owner's playback at 1,000 yr/s past year 250,000 had fallen
33
35
  * to 190 ms of JS per frame: the former fallback, an adaptive Simpson of up to
34
36
  * 1,024 samples per call cached by exact year pair, re-integrated every one
@@ -136,9 +138,19 @@ function createChainCycleIntegrator({
136
138
  // Per chain and per direction, a cumulative table in COARSE_STEP cells that
137
139
  // starts at the dense edge with the edge's own value and grows by COARSE_CHUNK
138
140
  // years whenever a year beyond its reach is asked for. The cells are built
139
- // with the same 3-point Simpson as the dense grid; the read is the same
140
- // linear interpolation. The period laws vary on Myr scales at deep time, so
141
- // 1-kyr cells hold the count to far below a cycle — the old fallback sampled
141
+ // with the same 3-point Simpson as the dense grid; the read is a 3-point
142
+ // Simpson over the partial cell from the cell's start (three integrand
143
+ // evaluations per read), NOT the dense grid's linear interpolation: a
144
+ // linear read makes the count's rate piecewise constant per cell, and the
145
+ // of-date node and perigee are SMALL differences of two large counts
146
+ // (N_drac − N_trop: 13.4 − 13.37 cycles/yr), so each table's per-cell slope
147
+ // step — 1e-6 of its own rate, the month's tidal drift over 1 kyr — landed
148
+ // fully on the difference: a ±0.3-d sawtooth per cell on the node period
149
+ // beyond ±250 kyr (measured on the Node Regression panel, plan 23
150
+ // follow-up). On the dense 10-yr grid the same step is 100× smaller and
151
+ // below every reader, so its linear read — the byte-identical in-window
152
+ // path — stays. The period laws vary on Myr scales at deep time, so 1-kyr
153
+ // cells hold the count to far below a cycle — the old fallback sampled
142
154
  // ~1 per kyr too, but re-did the whole span on every call.
143
155
  const COARSE_STEP = 1000, COARSE_CHUNK = 250000, COARSE_LIMIT_YEARS = 600e6;
144
156
  /** @typedef {{ cum: number[], ok: boolean }} CoarseSide */
@@ -178,9 +190,13 @@ function createChainCycleIntegrator({
178
190
  if (distance > COARSE_LIMIT_YEARS) return null;
179
191
  if (side.cum.length < Math.ceil(distance / COARSE_STEP) + 1) growCoarse(periodFnSeconds, side, edgeYear, dir, distance);
180
192
  if (!side.ok || side.cum.length < Math.ceil(distance / COARSE_STEP) + 1) return null;
181
- const idxF = distance / COARSE_STEP;
182
- const i = Math.floor(idxF);
183
- return side.cum[i] + (idxF - i) * (side.cum[i + 1] - side.cum[i]);
193
+ const i = Math.floor(distance / COARSE_STEP);
194
+ // the partial cell from its start y0 to y: a 3-point Simpson, signed by (y − y0)
195
+ const y0 = edgeYear + dir * i * COARSE_STEP;
196
+ if (y === y0) return side.cum[i];
197
+ const f0 = integrandAt(periodFnSeconds, y0), fm = integrandAt(periodFnSeconds, (y0 + y) / 2), f1 = integrandAt(periodFnSeconds, y);
198
+ if (f0 === null || fm === null || f1 === null) return null;
199
+ return side.cum[i] + (f0 + 4 * fm + f1) * ((y - y0) / 6);
184
200
  }
185
201
  /** C(y) anywhere the tables reach: dense inside the grid, coarse beyond.
186
202
  * @param {PeriodSecondsAtAge} periodFnSeconds @param {Float64Array} tab @param {number} y @returns {number | null} */
@@ -2,7 +2,7 @@
2
2
  // The fitted coefficients' shapes for TypeScript consumers (§2g); values live
3
3
  // in coefficients.js, emitted VERBATIM from the fit artifacts under data/.
4
4
 
5
- export declare const COEFFICIENTS_HASH: "1d7ef7b022b91f6c";
5
+ export declare const COEFFICIENTS_HASH: "a1e5567e03d1936e";
6
6
 
7
7
  export declare const FITTED_COEFFICIENTS: {
8
8
  readonly BALANCE_PRESETS: Array<Array<number | string>>;
@@ -310,7 +310,7 @@ export declare const FITTED_COEFFICIENTS: {
310
310
  "ratio": number;
311
311
  "label": string;
312
312
  };
313
- "39.5560": {
313
+ "39.5561": {
314
314
  "period_kyr": number;
315
315
  "lr04_post_mpt_amp": number;
316
316
  "epica_amp": number;
@@ -324,7 +324,7 @@ export declare const FITTED_COEFFICIENTS: {
324
324
  "ratio": number;
325
325
  "label": string;
326
326
  };
327
- "40.9239": {
327
+ "40.9240": {
328
328
  "period_kyr": number;
329
329
  "lr04_post_mpt_amp": number;
330
330
  "epica_amp": number;
@@ -20,15 +20,15 @@
20
20
  */
21
21
 
22
22
  /** @type {string} */
23
- export const COEFFICIENTS_HASH = "1d7ef7b022b91f6c";
23
+ export const COEFFICIENTS_HASH = "a1e5567e03d1936e";
24
24
 
25
25
  /** @type {Readonly<Record<string, unknown>>} */
26
26
  export const FITTED_COEFFICIENTS = Object.freeze({
27
27
  BALANCE_PRESETS: [["A",99.99472339,34,1,34,0,3,0,5,0,3,1,8,0,34,1,99.8851,7,7,5.5,0,12,1,85,36,36,11,3,54.52,218.64,236.07,287.06,116.26,21.33,354.04],["A",99.99776117,55,1,34,0,3,0,5,0,3,1,8,0,34,1,99.883,7,7,5.1,0,15,1,85,36,36,11,3,54.52,218.64,236.07,287.06,116.26,21.33,354.04],["A",99.99422845,13,1,55,1,3,0,5,0,3,1,21,0,34,0,99.8669,7,7,3.5,0,2,1,85,36,36,12,3,54.52,38.64,236.07,287.06,116.26,21.33,174.04],["A",99.99744637,21,0,34,0,5,0,5,0,3,1,21,0,34,0,99.8636,7,7,5.1,1,9,1,62,36,36,12,3,234.52,218.64,236.07,287.06,116.26,21.33,174.04],["A",99.99403253,21,0,55,0,3,0,5,0,3,1,8,0,34,1,99.863,7,7,3.3,0,9,1,85,36,36,11,3,234.52,218.64,236.07,287.06,116.26,21.33,354.04],["B",99.99533843,21,1,34,1,21,0,8,0,5,1,13,0,34,1,99.3938,7,7,4,0,9,1,35,39,39,12,3,54.52,38.64,236.07,287.06,116.26,21.33,354.04],["B",99.99507239,21,1,55,1,34,0,8,0,5,1,13,0,34,1,99.3775,7,7,2.2,0,9,1,32,39,39,12,3,54.52,38.64,236.07,287.06,116.26,21.33,354.04],["B",99.99738873,55,1,55,1,55,0,8,0,5,1,13,0,34,1,99.3701,7,7,1.9,0,15,1,30,39,39,12,3,54.52,38.64,236.07,287.06,116.26,21.33,354.04],["B",99.99487312,13,0,55,1,55,1,8,0,5,1,13,0,34,1,99.3024,7,7,2.2,0,2,1,30,39,39,12,3,234.52,38.64,56.07,287.06,116.26,21.33,354.04],["B",99.99489704,13,1,55,0,34,1,8,0,5,1,13,0,34,1,99.2544,7,7,2.3,0,2,1,32,39,39,12,3,54.52,218.64,56.07,287.06,116.26,21.33,354.04],["B",99.99530418,21,0,55,0,13,1,8,0,5,1,13,0,34,1,99.2526,7,7,1.9,0,9,1,40,39,39,12,3,234.52,218.64,56.07,287.06,116.26,21.33,354.04],["B",99.99888446,34,1,55,0,21,1,8,0,5,1,13,0,34,1,99.2452,7,7,2.1,0,12,1,35,39,39,12,3,54.52,218.64,56.07,287.06,116.26,21.33,354.04],["A",99.99955832,13,0,34,0,3,1,5,0,3,1,8,0,55,1,99.1096,7,7,5.6,0,2,1,85,36,36,11,3,234.52,218.64,56.07,287.06,116.26,21.33,354.04],["A",99.99648221,21,1,55,1,5,1,5,0,3,1,8,0,55,1,99.1063,7,7,3.1,0,9,1,62,36,36,11,3,54.52,38.64,56.07,287.06,116.26,21.33,354.04],["A",99.99973516,55,0,34,1,5,1,5,0,3,1,8,0,55,1,99.086,7,7,4.9,0,15,1,62,36,36,11,3,234.52,38.64,56.07,287.06,116.26,21.33,354.04]],
28
- CLIMATE_FORMULA_COEFFS: {"config":{"L1_lines":[{"family":"climatic precession","label":"p+g4","arcsecPerYr":68.20497787152276,"periodKyr":19.001545641452537,"relAmp":0.6717464199951804},{"family":"climatic precession","label":"p+g3","arcsecPerYr":67.65690623723043,"periodKyr":19.15547239857139,"relAmp":0.460782442830978},{"family":"climatic precession","label":"p+g2","arcsecPerYr":57.7403835908232,"periodKyr":22.44529598528639,"relAmp":0.8620464713605362},{"family":"climatic precession","label":"p+g1","arcsecPerYr":55.878226162522175,"periodKyr":23.19329171671584,"relAmp":0.19921489972571554},{"family":"climatic precession","label":"p+g5","arcsecPerYr":54.545319108164605,"periodKyr":23.76005899662999,"relAmp":1},{"family":"obliquity","label":"p+s7","arcsecPerYr":47.52668719388872,"periodKyr":27.268889891543882,"relAmp":0.10427252954025028},{"family":"obliquity","label":"p+s1","arcsecPerYr":44.933851006791144,"periodKyr":28.842397679293658,"relAmp":0.5416339451073867},{"family":"obliquity","label":"p+ζ14","arcsecPerYr":44.68230043443376,"periodKyr":29.004773420333045,"relAmp":0.14236226024182447},{"family":"obliquity","label":"p+ζ9","arcsecPerYr":43.758346063718456,"periodKyr":29.61720715204449,"relAmp":0.1009465170347195},{"family":"obliquity","label":"p+s2","arcsecPerYr":43.476583344095644,"periodKyr":29.809150128997057,"relAmp":0.47895780932341964},{"family":"obliquity","label":"p+s4","arcsecPerYr":32.763640723164436,"periodKyr":39.5560435713027,"relAmp":0.4849220480959469},{"family":"obliquity","label":"p+ζ4","arcsecPerYr":32.21536211501139,"periodKyr":40.229254458577174,"relAmp":0.3238058217329259},{"family":"obliquity","label":"p+s3","arcsecPerYr":31.668510863152665,"periodKyr":40.92393247034353,"relAmp":1},{"family":"obliquity","label":"p+ζ7","arcsecPerYr":31.12051824153533,"periodKyr":41.644550709000725,"relAmp":0.17878079100604266},{"family":"obliquity","label":"p+s6","arcsecPerYr":24.17122814428236,"periodKyr":53.6174658674332,"relAmp":0.16050040214935987},{"family":"eccentricity","label":"g4−g5","arcsecPerYr":13.659658763358156,"periodKyr":94.8779191670953,"relAmp":0.7792461802378098},{"family":"eccentricity","label":"z6−g5","arcsecPerYr":13.381652320125703,"periodKyr":96.84902648762181,"relAmp":0.10995041848327905},{"family":"eccentricity","label":"g3−g5","arcsecPerYr":13.111587129065821,"periodKyr":98.8438689567201,"relAmp":0.5345215810740946},{"family":"eccentricity","label":"z5−g5","arcsecPerYr":12.831040163189634,"periodKyr":101.00506143827943,"relAmp":0.15474467548919818},{"family":"eccentricity","label":"z7−g5","arcsecPerYr":12.567419265426008,"periodKyr":103.12379754572216,"relAmp":0.10461932722318636},{"family":"eccentricity","label":"g4−g1","arcsecPerYr":12.326751709000584,"periodKyr":105.13718703798536,"relAmp":0.15523744965772213},{"family":"eccentricity","label":"g3−g1","arcsecPerYr":11.77868007470825,"periodKyr":110.0293064910417,"relAmp":0.1064846631749067},{"family":"eccentricity","label":"g4−g2","arcsecPerYr":10.464594280699554,"periodKyr":123.8461774280429,"relAmp":0.6717464199951804},{"family":"eccentricity","label":"g3−g2","arcsecPerYr":9.91652264640722,"periodKyr":130.69097366197656,"relAmp":0.460782442830978},{"family":"eccentricity","label":"z5−g2","arcsecPerYr":9.635975680531033,"periodKyr":134.49598078775747,"relAmp":0.13339710146729455},{"family":"eccentricity fundamental","label":"g₂−g₅","periodKyr":405.6256163323513,"arcsecPerYr":3.1950644826586005,"note":"the engine’s 20-Myr mean beat; the long-eccentricity metronome"},{"family":"climate-internal harmonic","label":"(g₂−g₅)/2","periodKyr":202.81280816617564,"note":"carbon-thermostat 2nd harmonic (doc 92 §3), not orbital forcing"},{"family":"climate-internal harmonic","label":"(g₂−g₅)/3","periodKyr":135.20853877745043,"note":"carbon-thermostat 3rd harmonic (doc 92 §3), not orbital forcing"}],"L1_source":"data/l1-physical-lines.json","L2_periods_kyr":{"405-kyr (fundamental)":404.5,"202-kyr (2nd harmonic)":202.25,"135-kyr (3rd harmonic)":134.83},"L3_transitions_ma":{"PETM":56,"EOT":34,"Mi-1":23,"MMCT":14,"iNHG":2.7,"MPT":1},"description":"Climate formula = intercept + L1 + L2 + L3 (in normalized units). De-normalize: y_raw = y_norm * y_std + y_mean + (trend_slope*t_kyr + trend_intercept)."},"regimes":{"lr04-post-mpt":{"label":"LR04 post-MPT","regime":"post-mpt","window_kyr":[0,1000],"n_samples":1001,"intercept":-0.006261479472116254,"L1":[{"period_kyr":19.001545641452537,"label":"climatic precession p+g4","a":0.08243240524922227,"b":-0.13304882592424963},{"period_kyr":19.15547239857139,"label":"climatic precession p+g3","a":0.055467018911117716,"b":0.0361252309677097},{"period_kyr":22.44529598528639,"label":"climatic precession p+g2","a":0.1356814594372895,"b":0.10397401220238245},{"period_kyr":23.19329171671584,"label":"climatic precession p+g1","a":0.004029396320670009,"b":-0.12019564741136535},{"period_kyr":23.76005899662999,"label":"climatic precession p+g5","a":-0.1741892047467476,"b":-0.0894619114957137},{"period_kyr":27.268889891543882,"label":"obliquity p+s7","a":0.0019179579971294047,"b":0.045652411597653014},{"period_kyr":28.842397679293658,"label":"obliquity p+s1","a":-0.0776831184333972,"b":-0.27561881164941293},{"period_kyr":29.004773420333045,"label":"obliquity p+ζ14","a":0.10709251537972231,"b":0.16481016562432482},{"period_kyr":29.61720715204449,"label":"obliquity p+ζ9","a":-0.6221367449208888,"b":0.09703216393216468},{"period_kyr":29.809150128997057,"label":"obliquity p+s2","a":0.3906872073645143,"b":-0.3974044955904187},{"period_kyr":39.5560435713027,"label":"obliquity p+s4","a":0.03286470555244542,"b":0.31826889014339},{"period_kyr":40.229254458577174,"label":"obliquity p+ζ4","a":-1.0063540117559187,"b":0.011829200163799403},{"period_kyr":40.92393247034353,"label":"obliquity p+s3","a":-0.32304958008169904,"b":-1.136404569230472},{"period_kyr":41.644550709000725,"label":"obliquity p+ζ7","a":0.5719436695842656,"b":0.2977185771922728},{"period_kyr":53.6174658674332,"label":"obliquity p+s6","a":0.03013201836874352,"b":0.01772074727072398},{"period_kyr":94.8779191670953,"label":"eccentricity g4−g5","a":-0.021088386357628833,"b":-2.195508899861955},{"period_kyr":96.84902648762181,"label":"eccentricity z6−g5","a":0.5991316818649339,"b":1.1476243724890838},{"period_kyr":98.8438689567201,"label":"eccentricity g3−g5","a":1.186923212842382,"b":0.31207279706718605},{"period_kyr":101.00506143827943,"label":"eccentricity z5−g5","a":-0.2104698841408345,"b":-0.13274643330087674},{"period_kyr":103.12379754572216,"label":"eccentricity z7−g5","a":-0.6785302619449846,"b":0.8192703043142138},{"period_kyr":105.13718703798536,"label":"eccentricity g4−g1","a":0.02944413337667165,"b":0.9936969221330343},{"period_kyr":110.0293064910417,"label":"eccentricity g3−g1","a":-0.9979419969659299,"b":-0.20796003201060137},{"period_kyr":123.8461774280429,"label":"eccentricity g4−g2","a":-0.3841854998790626,"b":-0.14573560890988857},{"period_kyr":130.69097366197656,"label":"eccentricity g3−g2","a":0.9854674214965893,"b":0.3880259413113173},{"period_kyr":134.49598078775747,"label":"eccentricity z5−g2","a":-0.2514289239233489,"b":-0.06535702517105219},{"period_kyr":405.6256163323513,"label":"eccentricity fundamental g₂−g₅","a":-0.07967976063217527,"b":-0.0475325959700533},{"period_kyr":202.81280816617564,"label":"climate-internal harmonic (g₂−g₅)/2","a":-0.024237037439603676,"b":0.17942472816716207},{"period_kyr":135.20853877745043,"label":"climate-internal harmonic (g₂−g₅)/3","a":-0.6840182828195369,"b":0.18329165821989277}],"L2":[],"L3":[],"denormalization":{"y_mean":1.5012965895430689e-15,"y_std":0.43131092949760913,"trend_slope":-0.00008678094360729054,"trend_intercept":4.192006855420027},"r2":{"l1_only":0.7804378878452816,"l1_l2":0.7804378878452816,"l1_l2_l3":0.7804378878452816,"delta_l2":0,"delta_l3":0}},"lr04-inhg-mpt":{"label":"LR04 inhg-MPT","regime":"inhg-mpt","window_kyr":[1000,2700],"n_samples":1701,"intercept":0.0005407849101125603,"L1":[{"period_kyr":19.001545641452537,"label":"climatic precession p+g4","a":0.03503877506864678,"b":-0.09856246238430366},{"period_kyr":19.15547239857139,"label":"climatic precession p+g3","a":-0.005005693307662373,"b":0.07295430743550124},{"period_kyr":22.44529598528639,"label":"climatic precession p+g2","a":0.11897109293971353,"b":-0.061556377105412174},{"period_kyr":23.19329171671584,"label":"climatic precession p+g1","a":-0.022416871997079618,"b":-0.07917844873891108},{"period_kyr":23.76005899662999,"label":"climatic precession p+g5","a":-0.12822120342945703,"b":0.01172670259894143},{"period_kyr":27.268889891543882,"label":"obliquity p+s7","a":0.019252355487766215,"b":-0.006808609813554689},{"period_kyr":28.842397679293658,"label":"obliquity p+s1","a":-0.10404810022894623,"b":-0.13081433820526067},{"period_kyr":29.004773420333045,"label":"obliquity p+ζ14","a":-0.004623963342169635,"b":-0.15757830994963606},{"period_kyr":29.61720715204449,"label":"obliquity p+ζ9","a":0.19982877327336845,"b":-0.03031495540202861},{"period_kyr":29.809150128997057,"label":"obliquity p+s2","a":0.12354646397869687,"b":0.10862284559119528},{"period_kyr":39.5560435713027,"label":"obliquity p+s4","a":0.11668229925473106,"b":-0.2691641896579636},{"period_kyr":40.229254458577174,"label":"obliquity p+ζ4","a":0.00453142560761946,"b":-0.2056884780191695},{"period_kyr":40.92393247034353,"label":"obliquity p+s3","a":-0.5826353220778854,"b":-0.5193032125987076},{"period_kyr":41.644550709000725,"label":"obliquity p+ζ7","a":0.22531232553500583,"b":0.017688684764672058},{"period_kyr":53.6174658674332,"label":"obliquity p+s6","a":-0.2293234422961013,"b":0.1088135079622009},{"period_kyr":94.8779191670953,"label":"eccentricity g4−g5","a":0.1609120605368916,"b":0.03757149633919268},{"period_kyr":96.84902648762181,"label":"eccentricity z6−g5","a":-0.053464905746749336,"b":1.3428130379574261},{"period_kyr":98.8438689567201,"label":"eccentricity g3−g5","a":-0.953206115882617,"b":1.198468176780739},{"period_kyr":101.00506143827943,"label":"eccentricity z5−g5","a":0.0697660042105355,"b":0.18007778017482998},{"period_kyr":103.12379754572216,"label":"eccentricity z7−g5","a":1.2361966199819392,"b":0.6242750704518865},{"period_kyr":105.13718703798536,"label":"eccentricity g4−g1","a":0.278251208675922,"b":0.7838878059317373},{"period_kyr":110.0293064910417,"label":"eccentricity g3−g1","a":0.1181957404284075,"b":-0.22218992068223625},{"period_kyr":123.8461774280429,"label":"eccentricity g4−g2","a":-0.11106886118721995,"b":-0.0021299158908131555},{"period_kyr":130.69097366197656,"label":"eccentricity g3−g2","a":0.04948019917501678,"b":-0.06668089878492656},{"period_kyr":134.49598078775747,"label":"eccentricity z5−g2","a":0.44223319062230126,"b":-0.31488032653078424},{"period_kyr":405.6256163323513,"label":"eccentricity fundamental g₂−g₅","a":0.13859459137445662,"b":0.08861345077557807},{"period_kyr":202.81280816617564,"label":"climate-internal harmonic (g₂−g₅)/2","a":-0.15224783180023477,"b":0.08152674915375335},{"period_kyr":135.20853877745043,"label":"climate-internal harmonic (g₂−g₅)/3","a":-0.2435177242679818,"b":0.5907913888353428}],"L2":[],"L3":[],"denormalization":{"y_mean":2.117321276827753e-15,"y_std":0.2533430989053228,"trend_slope":-0.00028446235786389366,"trend_intercept":4.264486402612575},"r2":{"l1_only":0.6089630016266958,"l1_l2":0.6089630016266958,"l1_l2_l3":0.6089630016266958,"delta_l2":0,"delta_l3":0}},"lr04-pre-inhg":{"label":"LR04 pre-iNHG","regime":"pre-inhg","window_kyr":[2700,5320],"n_samples":2621,"intercept":-0.019780930727055078,"L1":[{"period_kyr":19.001545641452537,"label":"climatic precession p+g4","a":-0.035805318768695416,"b":-0.004163434196977289},{"period_kyr":19.15547239857139,"label":"climatic precession p+g3","a":0.029482033603654978,"b":-0.019598473935002414},{"period_kyr":22.44529598528639,"label":"climatic precession p+g2","a":-0.02793575500828427,"b":-0.056285852892666854},{"period_kyr":23.19329171671584,"label":"climatic precession p+g1","a":-0.03339282100161001,"b":-0.010058177000955015},{"period_kyr":23.76005899662999,"label":"climatic precession p+g5","a":0.04866527102370943,"b":-0.007002487725596251},{"period_kyr":27.268889891543882,"label":"obliquity p+s7","a":0.01494876216897791,"b":-0.00600395082493102},{"period_kyr":28.842397679293658,"label":"obliquity p+s1","a":0.03662170896068062,"b":-0.03183419814670585},{"period_kyr":29.004773420333045,"label":"obliquity p+ζ14","a":-0.021943012656484573,"b":-0.014608030305763298},{"period_kyr":29.61720715204449,"label":"obliquity p+ζ9","a":0.022948381776825955,"b":-0.014611274220878268},{"period_kyr":29.809150128997057,"label":"obliquity p+s2","a":-0.03508296021275506,"b":0.07685077337256473},{"period_kyr":39.5560435713027,"label":"obliquity p+s4","a":-0.03573136549654231,"b":-0.16083844295608896},{"period_kyr":40.229254458577174,"label":"obliquity p+ζ4","a":-0.015687032747370627,"b":-0.10021667133442705},{"period_kyr":40.92393247034353,"label":"obliquity p+s3","a":-0.38903903447828914,"b":-0.3594149228478518},{"period_kyr":41.644550709000725,"label":"obliquity p+ζ7","a":0.06662831466813979,"b":0.12304542048600829},{"period_kyr":53.6174658674332,"label":"obliquity p+s6","a":-0.18571987618832642,"b":0.20076484098397995},{"period_kyr":94.8779191670953,"label":"eccentricity g4−g5","a":0.20725718824624959,"b":-0.13573905739305128},{"period_kyr":96.84902648762181,"label":"eccentricity z6−g5","a":-1.016197228050766,"b":-0.3791586630016193},{"period_kyr":98.8438689567201,"label":"eccentricity g3−g5","a":0.588952118966851,"b":2.0260550833505913},{"period_kyr":101.00506143827943,"label":"eccentricity z5−g5","a":0.67416919090064,"b":-2.4475589224592733},{"period_kyr":103.12379754572216,"label":"eccentricity z7−g5","a":-1.9393057263933409,"b":0.8411568643788081},{"period_kyr":105.13718703798536,"label":"eccentricity g4−g1","a":0.5703002446288725,"b":0.6882960432008728},{"period_kyr":110.0293064910417,"label":"eccentricity g3−g1","a":0.16670952357483337,"b":-0.1573271009310834},{"period_kyr":123.8461774280429,"label":"eccentricity g4−g2","a":-0.02856253535420218,"b":0.032546781500317146},{"period_kyr":130.69097366197656,"label":"eccentricity g3−g2","a":0.037215669189511996,"b":-0.33646151609290054},{"period_kyr":134.49598078775747,"label":"eccentricity z5−g2","a":-0.1658706246879772,"b":1.539988216595495},{"period_kyr":405.6256163323513,"label":"eccentricity fundamental g₂−g₅","a":0.2741625959109228,"b":0.12324647540286211},{"period_kyr":202.81280816617564,"label":"climate-internal harmonic (g₂−g₅)/2","a":0.02857267433363002,"b":-0.06634102256884705},{"period_kyr":135.20853877745043,"label":"climate-internal harmonic (g₂−g₅)/3","a":-1.1531669594196328,"b":-0.6431671723141338}],"L2":[],"L3":[],"denormalization":{"y_mean":2.2229875746786803e-16,"y_std":0.1419188719967453,"trend_slope":-0.0001616384823512257,"trend_intercept":3.7150997304817532},"r2":{"l1_only":0.45467379777332084,"l1_l2":0.45467379777332084,"l1_l2_l3":0.45467379777332084,"delta_l2":0,"delta_l3":0}},"lr04-full":{"label":"LR04 full","regime":"lr04-full","window_kyr":[0,5320],"n_samples":5321,"intercept":-0.0017589880483601524,"L1":[{"period_kyr":19.001545641452537,"label":"climatic precession p+g4","a":0.03065294954958657,"b":-0.05942340186614521},{"period_kyr":19.15547239857139,"label":"climatic precession p+g3","a":0.007132695862213462,"b":0.008893436015245587},{"period_kyr":22.44529598528639,"label":"climatic precession p+g2","a":0.08099490602121032,"b":-0.015103919935149979},{"period_kyr":23.19329171671584,"label":"climatic precession p+g1","a":-0.002268964818697816,"b":-0.06635825644407431},{"period_kyr":23.76005899662999,"label":"climatic precession p+g5","a":-0.07546505691235277,"b":-0.03155946054640326},{"period_kyr":27.268889891543882,"label":"obliquity p+s7","a":0.014043408537645977,"b":0.006715083715687971},{"period_kyr":28.842397679293658,"label":"obliquity p+s1","a":0.01816121699590161,"b":-0.057687903639246606},{"period_kyr":29.004773420333045,"label":"obliquity p+ζ14","a":-0.016937378888613464,"b":-0.04998298185931903},{"period_kyr":29.61720715204449,"label":"obliquity p+ζ9","a":0.0022086271646274205,"b":-0.01446306003921708},{"period_kyr":29.809150128997057,"label":"obliquity p+s2","a":-0.025581978214192315,"b":0.0309901479615117},{"period_kyr":39.5560435713027,"label":"obliquity p+s4","a":-0.01912379263568336,"b":-0.16671053844571732},{"period_kyr":40.229254458577174,"label":"obliquity p+ζ4","a":-0.04630363429779309,"b":-0.10917338902200727},{"period_kyr":40.92393247034353,"label":"obliquity p+s3","a":-0.41712274283288603,"b":-0.3046404579465512},{"period_kyr":41.644550709000725,"label":"obliquity p+ζ7","a":0.13911951669837083,"b":0.07911630465552824},{"period_kyr":53.6174658674332,"label":"obliquity p+s6","a":-0.11986934492884664,"b":0.10752585565025971},{"period_kyr":94.8779191670953,"label":"eccentricity g4−g5","a":-0.07815055836386586,"b":-0.26561277912623493},{"period_kyr":96.84902648762181,"label":"eccentricity z6−g5","a":-0.07259616119062533,"b":-0.030964091224476492},{"period_kyr":98.8438689567201,"label":"eccentricity g3−g5","a":-0.17395488558053873,"b":0.000791562409108805},{"period_kyr":101.00506143827943,"label":"eccentricity z5−g5","a":-0.09381475188544089,"b":-0.030909749477917838},{"period_kyr":103.12379754572216,"label":"eccentricity z7−g5","a":-0.08438264932950987,"b":0.07861972783593148},{"period_kyr":105.13718703798536,"label":"eccentricity g4−g1","a":-0.10328452012029149,"b":-0.005340280670694572},{"period_kyr":110.0293064910417,"label":"eccentricity g3−g1","a":0.05724261959550306,"b":0.0032869687306770756},{"period_kyr":123.8461774280429,"label":"eccentricity g4−g2","a":-0.07899912903992748,"b":0.12103605418237409},{"period_kyr":130.69097366197656,"label":"eccentricity g3−g2","a":0.07725377061255671,"b":-0.042569198289196725},{"period_kyr":134.49598078775747,"label":"eccentricity z5−g2","a":0.05454951133541687,"b":0.12003087432548318},{"period_kyr":405.6256163323513,"label":"eccentricity fundamental g₂−g₅","a":0.09355861032874926,"b":0.04910094786175068},{"period_kyr":202.81280816617564,"label":"climate-internal harmonic (g₂−g₅)/2","a":-0.015314835256918,"b":0.06009591046934088},{"period_kyr":135.20853877745043,"label":"climate-internal harmonic (g₂−g₅)/3","a":-0.1348709644191516,"b":0.038488007580443406}],"L2":[],"L3":[{"label":"iNHG","t_kyr":2700,"beta":-0.18331470559226293},{"label":"MPT","t_kyr":1000,"beta":0.07582828689178801}],"denormalization":{"y_mean":8.786640107689267e-16,"y_std":0.26728652336026737,"trend_slope":-0.0002890388734746666,"trend_intercept":4.253595893576046},"r2":{"l1_only":0.3253727364799045,"l1_l2":0.3253727364799045,"l1_l2_l3":0.3329006744474764,"delta_l2":0,"delta_l3":0.007527937967571896}},"cenogrid-d18o":{"label":"CENOGRID δ¹⁸O","regime":"cenogrid","window_kyr":[0,67000],"n_samples":13401,"intercept":-0.000017149874728015547,"L1":[{"period_kyr":19.001545641452537,"label":"climatic precession p+g4","a":0.004113360713096271,"b":0.000612283902668832},{"period_kyr":19.15547239857139,"label":"climatic precession p+g3","a":-0.0012149371734561723,"b":-0.0009668646537135993},{"period_kyr":22.44529598528639,"label":"climatic precession p+g2","a":0.0012714780768614783,"b":-0.0002881147551297321},{"period_kyr":23.19329171671584,"label":"climatic precession p+g1","a":-0.0006778613450571236,"b":-0.005621596479389052},{"period_kyr":23.76005899662999,"label":"climatic precession p+g5","a":-0.001515503629558838,"b":-0.002068925655515646},{"period_kyr":27.268889891543882,"label":"obliquity p+s7","a":-0.002565411547005455,"b":-0.005348100347444994},{"period_kyr":28.842397679293658,"label":"obliquity p+s1","a":0.00205522005878024,"b":-0.00495817115741807},{"period_kyr":29.004773420333045,"label":"obliquity p+ζ14","a":0.00016456274134544775,"b":-0.004296237979604353},{"period_kyr":29.61720715204449,"label":"obliquity p+ζ9","a":-0.0006244500892602428,"b":-0.001165673604421498},{"period_kyr":29.809150128997057,"label":"obliquity p+s2","a":-0.0010393464818332387,"b":0.005147306929711322},{"period_kyr":39.5560435713027,"label":"obliquity p+s4","a":-0.0018512861037702439,"b":-0.009394782199841967},{"period_kyr":40.229254458577174,"label":"obliquity p+ζ4","a":-0.011344743890066494,"b":0.002808220849832007},{"period_kyr":40.92393247034353,"label":"obliquity p+s3","a":-0.009436854682939293,"b":-0.01468445459856143},{"period_kyr":41.644550709000725,"label":"obliquity p+ζ7","a":0.0042241945335908405,"b":0.0017810339313177066},{"period_kyr":53.6174658674332,"label":"obliquity p+s6","a":-0.0025897836013760184,"b":0.011152367274696552},{"period_kyr":94.8779191670953,"label":"eccentricity g4−g5","a":0.008877256794435202,"b":-0.030348499725273995},{"period_kyr":96.84902648762181,"label":"eccentricity z6−g5","a":0.002058215396660861,"b":-0.0102380290686626},{"period_kyr":98.8438689567201,"label":"eccentricity g3−g5","a":-0.013651372027095434,"b":0.026204095651746275},{"period_kyr":101.00506143827943,"label":"eccentricity z5−g5","a":0.0016749310912643912,"b":0.0032330230939125173},{"period_kyr":103.12379754572216,"label":"eccentricity z7−g5","a":-0.0045207256593481245,"b":0.007893320582307411},{"period_kyr":105.13718703798536,"label":"eccentricity g4−g1","a":-0.00903932084953775,"b":-0.003374507433399841},{"period_kyr":110.0293064910417,"label":"eccentricity g3−g1","a":0.012542290542401285,"b":0.007438159113483984},{"period_kyr":123.8461774280429,"label":"eccentricity g4−g2","a":-0.008945876001624905,"b":0.024560145567884547},{"period_kyr":130.69097366197656,"label":"eccentricity g3−g2","a":0.007764302786340008,"b":-0.01256656435499126},{"period_kyr":134.49598078775747,"label":"eccentricity z5−g2","a":-0.005043269259928858,"b":-0.010094256207375025},{"period_kyr":405.6256163323513,"label":"eccentricity fundamental g₂−g₅","a":0.04455260862673471,"b":-0.04012837519912692},{"period_kyr":202.81280816617564,"label":"climate-internal harmonic (g₂−g₅)/2","a":0.003128157801043029,"b":0.005403795833748374},{"period_kyr":135.20853877745043,"label":"climate-internal harmonic (g₂−g₅)/3","a":-0.004077914496712917,"b":0.005390561847374758}],"L2":[],"L3":[{"label":"PETM","t_kyr":56000,"beta":1.9399569971013908},{"label":"EOT","t_kyr":34000,"beta":-1.6915666401480203},{"label":"Mi-1","t_kyr":23000,"beta":1.3791513990309312},{"label":"MMCT","t_kyr":14000,"beta":-0.572671926373438},{"label":"iNHG","t_kyr":2700,"beta":-0.9437051105483468},{"label":"MPT","t_kyr":1000,"beta":0.9558155283721813}],"denormalization":{"y_mean":3.1388799311243884e-16,"y_std":0.5138368170014185,"trend_slope":-0.000060475169948230774,"trend_intercept":3.5886100819307556},"r2":{"l1_only":0.003982477644316917,"l1_l2":0.003982477644316917,"l1_l2_l3":0.6165986669115189,"delta_l2":0,"delta_l3":0.612616189267202}},"cenogrid-d13c":{"label":"CENOGRID δ¹³C","regime":"cenogrid","window_kyr":[0,67000],"n_samples":13401,"intercept":0.000029167142837877794,"L1":[{"period_kyr":19.001545641452537,"label":"climatic precession p+g4","a":0.0009091211263757299,"b":-0.00022116955382656643},{"period_kyr":19.15547239857139,"label":"climatic precession p+g3","a":-0.0036110914239109258,"b":-0.0013639914286166707},{"period_kyr":22.44529598528639,"label":"climatic precession p+g2","a":-0.003593719675301214,"b":-0.0005757686344194319},{"period_kyr":23.19329171671584,"label":"climatic precession p+g1","a":0.0017764098127505648,"b":0.0002860904810720027},{"period_kyr":23.76005899662999,"label":"climatic precession p+g5","a":0.0032087474575965857,"b":-0.005816006950035958},{"period_kyr":27.268889891543882,"label":"obliquity p+s7","a":-0.003452658156298422,"b":-0.0038120306386585506},{"period_kyr":28.842397679293658,"label":"obliquity p+s1","a":-0.002875785120574504,"b":-0.0007160123280881073},{"period_kyr":29.004773420333045,"label":"obliquity p+ζ14","a":-0.0022073252427677035,"b":-0.006006795458916419},{"period_kyr":29.61720715204449,"label":"obliquity p+ζ9","a":-0.004491336700841414,"b":-0.0021993238453384637},{"period_kyr":29.809150128997057,"label":"obliquity p+s2","a":-0.0029297335798159473,"b":0.0044208048966603505},{"period_kyr":39.5560435713027,"label":"obliquity p+s4","a":0.004978066935301678,"b":0.007304975606576264},{"period_kyr":40.229254458577174,"label":"obliquity p+ζ4","a":-0.005517829851657612,"b":-0.0072555999128625995},{"period_kyr":40.92393247034353,"label":"obliquity p+s3","a":0.016532384832742213,"b":0.005779168971437518},{"period_kyr":41.644550709000725,"label":"obliquity p+ζ7","a":-0.0020334137893681346,"b":-0.0032463318268662984},{"period_kyr":53.6174658674332,"label":"obliquity p+s6","a":0.008915520385862822,"b":-0.004054842658865113},{"period_kyr":94.8779191670953,"label":"eccentricity g4−g5","a":0.009282350179674114,"b":-0.003845643885828626},{"period_kyr":96.84902648762181,"label":"eccentricity z6−g5","a":0.003148705803677386,"b":0.0010190486063635078},{"period_kyr":98.8438689567201,"label":"eccentricity g3−g5","a":-0.006504944756519977,"b":0.02207049906695835},{"period_kyr":101.00506143827943,"label":"eccentricity z5−g5","a":0.005252439907282622,"b":0.010723726397858617},{"period_kyr":103.12379754572216,"label":"eccentricity z7−g5","a":0.015463024799094347,"b":-0.007890675546466504},{"period_kyr":105.13718703798536,"label":"eccentricity g4−g1","a":-0.006704077743705797,"b":-0.004724121909536135},{"period_kyr":110.0293064910417,"label":"eccentricity g3−g1","a":0.015135186028105955,"b":0.004363573345518807},{"period_kyr":123.8461774280429,"label":"eccentricity g4−g2","a":0.0004352946111127517,"b":0.007735862744259145},{"period_kyr":130.69097366197656,"label":"eccentricity g3−g2","a":0.003434785257031687,"b":-0.015481600223384788},{"period_kyr":134.49598078775747,"label":"eccentricity z5−g2","a":-0.002674848114343516,"b":-0.019656539178381276},{"period_kyr":405.6256163323513,"label":"eccentricity fundamental g₂−g₅","a":0.04090552798768797,"b":-0.08954033006650247},{"period_kyr":202.81280816617564,"label":"climate-internal harmonic (g₂−g₅)/2","a":0.006897983129686607,"b":-0.0012436409136020801},{"period_kyr":135.20853877745043,"label":"climate-internal harmonic (g₂−g₅)/3","a":0.0010627051676048676,"b":-0.007315104756639584}],"L2":[],"L3":[{"label":"PETM","t_kyr":56000,"beta":1.2940570130685973},{"label":"EOT","t_kyr":34000,"beta":-0.6519384387930998},{"label":"Mi-1","t_kyr":23000,"beta":-0.7981218317897845},{"label":"MMCT","t_kyr":14000,"beta":0.8751969732966116},{"label":"iNHG","t_kyr":2700,"beta":1.3323529427123229},{"label":"MPT","t_kyr":1000,"beta":-1.3351822986622328}],"denormalization":{"y_mean":-1.6966918546618317e-16,"y_std":0.5116419176812778,"trend_slope":0.000014091551862757799,"trend_intercept":0.17563680335949733},"r2":{"l1_only":0.006340718980238025,"l1_l2":0.006340718980238025,"l1_l2_l3":0.3485557923662824,"delta_l2":0,"delta_l3":0.3422150733860444}},"epica-co2":{"label":"EPICA CO₂","regime":"epica-co2","window_kyr":[0,800],"n_samples":801,"intercept":0.04772254604975318,"L1":[{"period_kyr":19.001545641452537,"label":"climatic precession p+g4","a":-0.057570776887117814,"b":-0.09305753505681291},{"period_kyr":19.15547239857139,"label":"climatic precession p+g3","a":0.09859328006243295,"b":-0.029102256953414563},{"period_kyr":22.44529598528639,"label":"climatic precession p+g2","a":-0.007484720088752561,"b":-0.07760955237320875},{"period_kyr":23.19329171671584,"label":"climatic precession p+g1","a":-0.0909416836692997,"b":0.12567965726306307},{"period_kyr":23.76005899662999,"label":"climatic precession p+g5","a":0.11298232171200909,"b":0.046583545925097766},{"period_kyr":27.268889891543882,"label":"obliquity p+s7","a":0.0008630260369831555,"b":-0.08271274340575904},{"period_kyr":28.842397679293658,"label":"obliquity p+s1","a":-0.13415104828436483,"b":-0.3066079534826644},{"period_kyr":29.004773420333045,"label":"obliquity p+ζ14","a":0.30261366057060307,"b":0.37231443283049376},{"period_kyr":29.61720715204449,"label":"obliquity p+ζ9","a":-0.10401218357234651,"b":0.06069068218917706},{"period_kyr":29.809150128997057,"label":"obliquity p+s2","a":0.07675437255974785,"b":0.08743704031465308},{"period_kyr":39.5560435713027,"label":"obliquity p+s4","a":0.25267178254331357,"b":-0.21263516454336073},{"period_kyr":40.229254458577174,"label":"obliquity p+ζ4","a":0.19849521917299795,"b":0.3201965078162932},{"period_kyr":40.92393247034353,"label":"obliquity p+s3","a":0.3341068581562226,"b":0.07642828266009302},{"period_kyr":41.644550709000725,"label":"obliquity p+ζ7","a":-0.18113992323652417,"b":0.19410852702442669},{"period_kyr":53.6174658674332,"label":"obliquity p+s6","a":-0.1024218182699044,"b":0.0723717802476003},{"period_kyr":94.8779191670953,"label":"eccentricity g4−g5","a":-0.621846077440066,"b":1.1004444096667692},{"period_kyr":96.84902648762181,"label":"eccentricity z6−g5","a":-0.23620585040294723,"b":-0.017168309605683746},{"period_kyr":98.8438689567201,"label":"eccentricity g3−g5","a":-0.27726306323229327,"b":-0.3987499029607976},{"period_kyr":101.00506143827943,"label":"eccentricity z5−g5","a":-0.21762767555019835,"b":-0.3914548769902655},{"period_kyr":103.12379754572216,"label":"eccentricity z7−g5","a":0.0028804917250010997,"b":-0.3340840253957438},{"period_kyr":105.13718703798536,"label":"eccentricity g4−g1","a":0.24680293909130355,"b":-0.3624401368740964},{"period_kyr":110.0293064910417,"label":"eccentricity g3−g1","a":0.5954751281788466,"b":-0.628274638605115},{"period_kyr":123.8461774280429,"label":"eccentricity g4−g2","a":0.31357248585780995,"b":-0.8333120447957345},{"period_kyr":130.69097366197656,"label":"eccentricity g3−g2","a":0.2126406564260409,"b":-0.3953416358958512},{"period_kyr":134.49598078775747,"label":"eccentricity z5−g2","a":0.32440577796298,"b":0.15122266440140847},{"period_kyr":405.6256163323513,"label":"eccentricity fundamental g₂−g₅","a":0.2715566850177307,"b":0.10051230972588084},{"period_kyr":202.81280816617564,"label":"climate-internal harmonic (g₂−g₅)/2","a":0.2223335990505698,"b":-0.14842020528136166},{"period_kyr":135.20853877745043,"label":"climate-internal harmonic (g₂−g₅)/3","a":0.3958866159294755,"b":0.287857524742149}],"L2":[],"L3":[],"denormalization":{"y_mean":2.980553797944989e-14,"y_std":25.51737494167102,"trend_slope":-0.006455378442643299,"trend_intercept":227.89326737247322},"r2":{"l1_only":0.7238243015482515,"l1_l2":0.7238243015482515,"l1_l2_l3":0.7238243015482515,"delta_l2":0,"delta_l3":0},"carbon_amplification_ratios":{"19.0015":{"period_kyr":19.001545641452537,"lr04_post_mpt_amp":0.15651546733468003,"epica_amp":0.1094262271223689,"ratio":0.6991400210202912,"label":"climatic precession p+g4"},"19.1555":{"period_kyr":19.15547239857139,"lr04_post_mpt_amp":0.0661938252358682,"epica_amp":0.10279871707979582,"ratio":1.5529955658778376,"label":"climatic precession p+g3"},"22.4453":{"period_kyr":22.44529598528639,"lr04_post_mpt_amp":0.1709387423859612,"epica_amp":0.07796963289882035,"ratio":0.4561261643236695,"label":"climatic precession p+g2"},"23.1933":{"period_kyr":23.19329171671584,"lr04_post_mpt_amp":0.12026316847375294,"epica_amp":0.1551314477414814,"ratio":1.2899331500262141,"label":"climatic precession p+g1"},"23.7601":{"period_kyr":23.76005899662999,"lr04_post_mpt_amp":0.19581959212185912,"epica_amp":0.12220896763491464,"ratio":0.6240895832265018,"label":"climatic precession p+g5"},"27.2689":{"period_kyr":27.268889891543882,"lr04_post_mpt_amp":0.045692682647884404,"epica_amp":0.08271724569669524,"ratio":1.8102952355441335,"label":"obliquity p+s7"},"28.8424":{"period_kyr":28.842397679293658,"lr04_post_mpt_amp":0.2863571131028035,"epica_amp":0.3346713924054784,"ratio":1.168720374287786,"label":"obliquity p+s1"},"29.0048":{"period_kyr":29.004773420333045,"lr04_post_mpt_amp":0.19654820666562553,"epica_amp":0.4797843937205882,"ratio":2.4410520037804955,"label":"obliquity p+ζ14"},"29.6172":{"period_kyr":29.61720715204449,"lr04_post_mpt_amp":0.629658137577938,"epica_amp":0.12042380676625035,"ratio":0.19125268074748658,"label":"obliquity p+ζ9"},"29.8092":{"period_kyr":29.809150128997057,"lr04_post_mpt_amp":0.5572852295851364,"epica_amp":0.11634633524966242,"ratio":0.2087734055615917,"label":"obliquity p+s2"},"39.5560":{"period_kyr":39.5560435713027,"lr04_post_mpt_amp":0.3199612090615895,"epica_amp":0.33023740383850775,"ratio":1.0321170019548844,"label":"obliquity p+s4"},"40.2293":{"period_kyr":40.229254458577174,"lr04_post_mpt_amp":1.006423532591397,"epica_amp":0.37673087961074553,"ratio":0.3743263818968116,"label":"obliquity p+ζ4"},"40.9239":{"period_kyr":40.92393247034353,"lr04_post_mpt_amp":1.181429801621263,"epica_amp":0.34273703484945034,"ratio":0.2901035968274341,"label":"obliquity p+s3"},"41.6446":{"period_kyr":41.644550709000725,"lr04_post_mpt_amp":0.6447913712069252,"epica_amp":0.2654991375762386,"ratio":0.41175975584052155,"label":"obliquity p+ζ7"},"53.6175":{"period_kyr":53.6174658674332,"lr04_post_mpt_amp":0.0349565932952164,"epica_amp":0.12541093825468444,"ratio":3.5876189992417302,"label":"obliquity p+s6"},"94.8779":{"period_kyr":94.8779191670953,"lr04_post_mpt_amp":2.195610177015087,"epica_amp":1.2639898903054725,"ratio":0.57568957528875,"label":"eccentricity g4−g5"},"96.8490":{"period_kyr":96.84902648762181,"lr04_post_mpt_amp":1.2946043691202604,"epica_amp":0.23682895646287871,"ratio":0.18293539100583617,"label":"eccentricity z6−g5"},"98.8439":{"period_kyr":98.8438689567201,"lr04_post_mpt_amp":1.2272636814692346,"epica_amp":0.4856709702506422,"ratio":0.3957348185104076,"label":"eccentricity g3−g5"},"101.0051":{"period_kyr":101.00506143827943,"lr04_post_mpt_amp":0.24883566401213555,"epica_amp":0.4478824911568282,"ratio":1.7999127775148231,"label":"eccentricity z5−g5"},"103.1238":{"period_kyr":103.12379754572216,"lr04_post_mpt_amp":1.0637702514670326,"epica_amp":0.33409644304781483,"ratio":0.3140682328604945,"label":"eccentricity z7−g5"},"105.1372":{"period_kyr":105.13718703798536,"lr04_post_mpt_amp":0.9941330544987269,"epica_amp":0.43849121263877044,"ratio":0.4410789990881769,"label":"eccentricity g4−g1"},"110.0293":{"period_kyr":110.0293064910417,"lr04_post_mpt_amp":1.0193800097226737,"epica_amp":0.8656325142888301,"ratio":0.8491754851307403,"label":"eccentricity g3−g1"},"123.8462":{"period_kyr":123.8461774280429,"lr04_post_mpt_amp":0.41089824290408106,"epica_amp":0.890357606745006,"ratio":2.1668566904844337,"label":"eccentricity g4−g2"},"130.6910":{"period_kyr":130.69097366197656,"lr04_post_mpt_amp":1.0591081955880004,"epica_amp":0.44889983051690424,"ratio":0.4238469991894285,"label":"eccentricity g3−g2"},"134.4960":{"period_kyr":134.49598078775747,"lr04_post_mpt_amp":0.2597846117930443,"epica_amp":0.3579209451882179,"ratio":1.3777603789455908,"label":"eccentricity z5−g2"},"405.6256":{"period_kyr":405.6256163323513,"lr04_post_mpt_amp":0.09278045017164487,"epica_amp":0.28956131921278855,"ratio":3.120930311041786,"label":"eccentricity fundamental g₂−g₅"},"202.8128":{"period_kyr":202.81280816617564,"lr04_post_mpt_amp":0.18105432074852218,"epica_amp":0.267321504190256,"ratio":1.4764712771564055,"label":"climate-internal harmonic (g₂−g₅)/2"},"135.2085":{"period_kyr":135.20853877745043,"lr04_post_mpt_amp":0.7081502970446216,"epica_amp":0.4894774430173151,"ratio":0.6912055887854445,"label":"climate-internal harmonic (g₂−g₅)/3"}}},"cenco2pip":{"label":"CenCO2PIP CO₂ (deep-time)","regime":"cenco2pip","window_kyr":[0,66000],"n_samples":661,"intercept":0.012710824053600382,"L1":[{"period_kyr":19.001545641452537,"label":"climatic precession p+g4","a":-0.0020339097875183287,"b":0.00022217434249469092},{"period_kyr":19.15547239857139,"label":"climatic precession p+g3","a":-0.0026330372957351893,"b":-0.0010667673119131998},{"period_kyr":22.44529598528639,"label":"climatic precession p+g2","a":-0.0005776950930113517,"b":0.000032950521448107256},{"period_kyr":23.19329171671584,"label":"climatic precession p+g1","a":-0.0009280348093158135,"b":0.00043817183410515236},{"period_kyr":23.76005899662999,"label":"climatic precession p+g5","a":0.00039345948924086015,"b":-0.0001325991420445382},{"period_kyr":27.268889891543882,"label":"obliquity p+s7","a":-0.00034971658008570356,"b":0.00044797074965526734},{"period_kyr":28.842397679293658,"label":"obliquity p+s1","a":-0.000384552814850494,"b":0.0002464837014044273},{"period_kyr":29.004773420333045,"label":"obliquity p+ζ14","a":-0.0006574156746607922,"b":-0.000012233691518947901},{"period_kyr":29.61720715204449,"label":"obliquity p+ζ9","a":-0.000746100134783839,"b":0.00048357672982657276},{"period_kyr":29.809150128997057,"label":"obliquity p+s2","a":-0.00032599519815770274,"b":-0.00027525326939174447},{"period_kyr":39.5560435713027,"label":"obliquity p+s4","a":-0.0005573847158311762,"b":4.3975189479108535e-7},{"period_kyr":40.229254458577174,"label":"obliquity p+ζ4","a":-0.0005356992277551539,"b":-0.00019124518224546627},{"period_kyr":40.92393247034353,"label":"obliquity p+s3","a":-0.0005284820040348964,"b":-0.0004813309679522161},{"period_kyr":41.644550709000725,"label":"obliquity p+ζ7","a":-0.0001566004948480356,"b":-0.0004534211464664248},{"period_kyr":53.6174658674332,"label":"obliquity p+s6","a":-0.003351261355073938,"b":-0.003242899060603807},{"period_kyr":94.8779191670953,"label":"eccentricity g4−g5","a":-0.031325382675099635,"b":-0.03179415675054521},{"period_kyr":96.84902648762181,"label":"eccentricity z6−g5","a":0.031647279429596026,"b":0.035781144994991465},{"period_kyr":98.8438689567201,"label":"eccentricity g3−g5","a":0.2000640346774423,"b":-0.16437244619996433},{"period_kyr":101.00506143827943,"label":"eccentricity z5−g5","a":0.08062539180186565,"b":0.09521996832194717},{"period_kyr":103.12379754572216,"label":"eccentricity z7−g5","a":-0.024917964042491587,"b":-0.014039090852651901},{"period_kyr":105.13718703798536,"label":"eccentricity g4−g1","a":0.012133891790271134,"b":0.038609897092132146},{"period_kyr":110.0293064910417,"label":"eccentricity g3−g1","a":-0.002137453954107797,"b":-0.015874702815844674},{"period_kyr":123.8461774280429,"label":"eccentricity g4−g2","a":-0.0004683979086828761,"b":0.0007068946905901684},{"period_kyr":130.69097366197656,"label":"eccentricity g3−g2","a":-0.00011026351065852435,"b":0.0017567884155732486},{"period_kyr":134.49598078775747,"label":"eccentricity z5−g2","a":0.00044347228519818526,"b":0.00035600816532370405},{"period_kyr":405.6256163323513,"label":"eccentricity fundamental g₂−g₅","a":0.00010755815185458945,"b":-0.00009538520712884004},{"period_kyr":202.81280816617564,"label":"climate-internal harmonic (g₂−g₅)/2","a":-0.0005635917105186019,"b":0.00013706239529518924},{"period_kyr":135.20853877745043,"label":"climate-internal harmonic (g₂−g₅)/3","a":-0.001380824480642591,"b":0.001765260855687019}],"L2":[],"L3":[{"label":"PETM","t_kyr":56000,"beta":-2.2502412590909224},{"label":"EOT","t_kyr":34000,"beta":1.5689083792079281},{"label":"Mi-1","t_kyr":23000,"beta":-0.21259657117148378},{"label":"MMCT","t_kyr":14000,"beta":-0.3699202766740759},{"label":"iNHG","t_kyr":2700,"beta":-0.242273520660646},{"label":"MPT","t_kyr":1000,"beta":0.24998700836465093}],"denormalization":{"y_mean":-2.091425032821257e-13,"y_std":209.18154000668048,"trend_slope":0.013251639299066168,"trend_intercept":214.15971983891893},"r2":{"l1_only":0.04732438630711089,"l1_l2":0.04732438630711089,"l1_l2_l3":0.6918024309879351,"delta_l2":0,"delta_l3":0.6444780446808243}}},"meta":{"script":"export_climate_formula_browser.py","consumer":"src/script.js — Climate Formula Explorer modal","stitched_lr04_r2":0.9214013227358522,"stitched_lr04_note":"R² of the three-regime stitched curve (post-MPT / iNHG-MPT / pre-iNHG blocks) against the raw gridded LR04 stack, 0-5320 kyr"}},
29
- DT_ANCHOR: {"deltaTStartSeconds":56.07578931788113,"usnoTargetLodSeconds":86400.0012},
30
- DT_RESONATOR: {"display_name":"Core-mantle swing","driver":"Resonator","functional_class":"episode (2-kick IMPULSE-CONSISTENT windowed damped oscillation — sin-only kicks, displacement-continuous; zero before first kick)","kick_epochs_year":[-1600,1600],"kick_coefficients_s":[{"cos":0,"sin":621.6213108466346},{"cos":0,"sin":1.2866895294935952}],"T0_lattice_n":685,"T0_yr":3916.1109489051096,"Q":1.8,"drive_tones":[{"pair":"bond-hallstatt","dn":726,"period_yr":3694.9531680440773,"phi_locked_rad":-0.4616152283022974,"amp_s":0,"phase_convention":"cos(2π·dn/8H·y − φ_locked), kick-1-envelope-shared","retired":"RETIRED (plan 06 D7 follow-up, 2026-09): shipped at amplitude 0 — measured to buy nothing once the GIA channel became the lagged response (kicks-only 11.89 / 21.04 s vs all three 12.04 / 21.34 s); dn/phase kept as the convention for the diagnostic column (DT_RESONATOR_COMPONENTS)."}],"rms_s":21.414677831410778,"raw_at_j2000_s":-83.11825338761497,"lod_raw_at_j2000_s_per_day":0.0004964519119797189,"deep_time_checks_s":{"900":-245.8439379884609,"2000":-82.32559425279462,"5000":5.334235000224568,"100000":-1.545960510634632e-17,"-100000":0,"-5000":0,"-801":0},"regeneration_rule":"drive-tone menu = Δn difference tones of the ACTIVE flag set (any count); refit this script after any stack change (3rd/5th cycle)","status":"JOINT WORLD SHIPPED (--joint --write): the two impulse kicks from the joint equality-constrained fit, the drive tone retired at amplitude 0 (plan 06 D7 follow-up); phases/epochs/T0/Q remain the Stage-1/3 convention. Default-ON.","impulse_consistent":true},
31
- DT_STACK: {"bond":{"lattice_n":1830,"period_yr":1465.8666666666666,"cos_coeff_s":165.17852694965433,"sin_coeff_s":329.7237072368537,"raw_at_j2000_s":139.42470773904614,"amplitude_s":368.78404097692743,"phase_deg":63.39094331476465,"source":"Stage D anchored fit (USNO LOD constraint active)","joint_mode":true},"hallstatt":{"lattice_n":1104,"period_yr":2429.8333333333335,"cos_coeff_s":-63.68849357995361,"sin_coeff_s":48.4125581385265,"raw_at_j2000_s":-71.63007485262531,"amplitude_s":80,"phase_deg":142.75986135238932,"target_amp_source":"CAPPED from anchored quad-fit free amp 100.73 s → 80 s prior","joint_mode":true},"jose5":{"lattice_n":2989,"period_yr":897.469387755102,"cos_coeff_s":-41.090618540470736,"sin_coeff_s":28.487910909042153,"raw_at_j2000_s":22.691082853696596,"amplitude_s":50.00000000000001,"phase_deg":145.26663270646682,"target_amp_source":"CAPPED from anchored quad-fit free amp 86.44 s → 50 s prior","joint_mode":true},"jose4":{"lattice_n":3749,"period_yr":715.5337423312883,"cos_coeff_s":38.2917424385587,"sin_coeff_s":-32.15186559158088,"raw_at_j2000_s":41.578586872059155,"amplitude_s":50.00000000000001,"phase_deg":-40.018678859355795,"target_amp_source":"unconstrained: quad-fit free amp 47.06 s (below 50 s prior — no cap applied)","joint_mode":true}},
28
+ CLIMATE_FORMULA_COEFFS: {"config":{"L1_lines":[{"family":"climatic precession","label":"p+g4","arcsecPerYr":68.20497787152276,"periodKyr":19.001545641452537,"relAmp":0.6717464199951804},{"family":"climatic precession","label":"p+g3","arcsecPerYr":67.65690623723043,"periodKyr":19.15547239857139,"relAmp":0.460782442830978},{"family":"climatic precession","label":"p+g2","arcsecPerYr":57.7403835908232,"periodKyr":22.44529598528639,"relAmp":0.8620464713605362},{"family":"climatic precession","label":"p+g1","arcsecPerYr":55.878226162522175,"periodKyr":23.19329171671584,"relAmp":0.19921489972571554},{"family":"climatic precession","label":"p+g5","arcsecPerYr":54.545319108164605,"periodKyr":23.76005899662999,"relAmp":1},{"family":"obliquity","label":"p+s7","arcsecPerYr":47.5266588616995,"periodKyr":27.268906147417248,"relAmp":0.10427252954025028},{"family":"obliquity","label":"p+s1","arcsecPerYr":44.93382267460193,"periodKyr":28.842415865333038,"relAmp":0.5416339451073867},{"family":"obliquity","label":"p+ζ14","arcsecPerYr":44.682272102244546,"periodKyr":29.004791811714906,"relAmp":0.14236226024182447},{"family":"obliquity","label":"p+ζ9","arcsecPerYr":43.75831773152924,"periodKyr":29.617226328291668,"relAmp":0.1009465170347195},{"family":"obliquity","label":"p+s2","arcsecPerYr":43.47655501190643,"periodKyr":29.8091695546043,"relAmp":0.47895780932341964},{"family":"obliquity","label":"p+s4","arcsecPerYr":32.76361239097522,"periodKyr":39.55607777721681,"relAmp":0.4849220480959469},{"family":"obliquity","label":"p+ζ4","arcsecPerYr":32.21533378282217,"periodKyr":40.2292898387119,"relAmp":0.3238058217329259},{"family":"obliquity","label":"p+s3","arcsecPerYr":31.66848253096345,"periodKyr":40.923969082915576,"relAmp":1},{"family":"obliquity","label":"p+ζ7","arcsecPerYr":31.120489909346112,"periodKyr":41.644588622327085,"relAmp":0.17878079100604266},{"family":"obliquity","label":"p+s6","arcsecPerYr":24.171199812093143,"periodKyr":53.61752871496249,"relAmp":0.16050040214935987},{"family":"eccentricity","label":"g4−g5","arcsecPerYr":13.659658763358156,"periodKyr":94.8779191670953,"relAmp":0.7792461802378098},{"family":"eccentricity","label":"z6−g5","arcsecPerYr":13.381652320125703,"periodKyr":96.84902648762181,"relAmp":0.10995041848327905},{"family":"eccentricity","label":"g3−g5","arcsecPerYr":13.111587129065821,"periodKyr":98.8438689567201,"relAmp":0.5345215810740946},{"family":"eccentricity","label":"z5−g5","arcsecPerYr":12.831040163189634,"periodKyr":101.00506143827943,"relAmp":0.15474467548919818},{"family":"eccentricity","label":"z7−g5","arcsecPerYr":12.567419265426008,"periodKyr":103.12379754572216,"relAmp":0.10461932722318636},{"family":"eccentricity","label":"g4−g1","arcsecPerYr":12.326751709000584,"periodKyr":105.13718703798536,"relAmp":0.15523744965772213},{"family":"eccentricity","label":"g3−g1","arcsecPerYr":11.77868007470825,"periodKyr":110.0293064910417,"relAmp":0.1064846631749067},{"family":"eccentricity","label":"g4−g2","arcsecPerYr":10.464594280699554,"periodKyr":123.8461774280429,"relAmp":0.6717464199951804},{"family":"eccentricity","label":"g3−g2","arcsecPerYr":9.91652264640722,"periodKyr":130.69097366197656,"relAmp":0.460782442830978},{"family":"eccentricity","label":"z5−g2","arcsecPerYr":9.635975680531033,"periodKyr":134.49598078775747,"relAmp":0.13339710146729455},{"family":"eccentricity fundamental","label":"g₂−g₅","periodKyr":405.6256163323513,"arcsecPerYr":3.1950644826586005,"note":"the engine’s 20-Myr mean beat; the long-eccentricity metronome"},{"family":"climate-internal harmonic","label":"(g₂−g₅)/2","periodKyr":202.81280816617564,"note":"carbon-thermostat 2nd harmonic (doc 92 §3), not orbital forcing"},{"family":"climate-internal harmonic","label":"(g₂−g₅)/3","periodKyr":135.20853877745043,"note":"carbon-thermostat 3rd harmonic (doc 92 §3), not orbital forcing"}],"L1_source":"data/l1-physical-lines.json","L2_periods_kyr":{"405-kyr (fundamental)":404.5,"202-kyr (2nd harmonic)":202.25,"135-kyr (3rd harmonic)":134.83},"L3_transitions_ma":{"PETM":56,"EOT":34,"Mi-1":23,"MMCT":14,"iNHG":2.7,"MPT":1},"description":"Climate formula = intercept + L1 + L2 + L3 (in normalized units). De-normalize: y_raw = y_norm * y_std + y_mean + (trend_slope*t_kyr + trend_intercept)."},"regimes":{"lr04-post-mpt":{"label":"LR04 post-MPT","regime":"post-mpt","window_kyr":[0,1000],"n_samples":1001,"intercept":-0.006261599801050812,"L1":[{"period_kyr":19.001545641452537,"label":"climatic precession p+g4","a":0.082432569026859,"b":-0.13304910582737045},{"period_kyr":19.15547239857139,"label":"climatic precession p+g3","a":0.055467205713348844,"b":0.036125403621177665},{"period_kyr":22.44529598528639,"label":"climatic precession p+g2","a":0.1356815395217974,"b":0.10397374581445296},{"period_kyr":23.19329171671584,"label":"climatic precession p+g1","a":0.004029541170622819,"b":-0.12019560019609504},{"period_kyr":23.76005899662999,"label":"climatic precession p+g5","a":-0.17418905453714204,"b":-0.08946188630724133},{"period_kyr":27.268906147417248,"label":"obliquity p+s7","a":0.0019230416069616063,"b":0.045651647891608305},{"period_kyr":28.842415865333038,"label":"obliquity p+s1","a":-0.07772762434063019,"b":-0.2756250852104706},{"period_kyr":29.004791811714906,"label":"obliquity p+ζ14","a":0.10714373913583963,"b":0.1647900025830038},{"period_kyr":29.617226328291668,"label":"obliquity p+ζ9","a":-0.6220964418038535,"b":0.09708536990429989},{"period_kyr":29.8091695546043,"label":"obliquity p+s2","a":0.3906413121270396,"b":-0.397425433031512},{"period_kyr":39.55607777721681,"label":"obliquity p+s4","a":0.03287092051454721,"b":0.3182437726095808},{"period_kyr":40.2292898387119,"label":"obliquity p+ζ4","a":-1.0063110076137878,"b":0.011863846564191899},{"period_kyr":40.923969082915576,"label":"obliquity p+s3","a":-0.32312414242408694,"b":-1.136345395979474},{"period_kyr":41.644588622327085,"label":"obliquity p+ζ7","a":0.5719591440543469,"b":0.2976615710688269},{"period_kyr":53.61752871496249,"label":"obliquity p+s6","a":0.030139847024031358,"b":0.01771557720651296},{"period_kyr":94.8779191670953,"label":"eccentricity g4−g5","a":-0.02108847154972597,"b":-2.19551138151326},{"period_kyr":96.84902648762181,"label":"eccentricity z6−g5","a":0.5991339544857626,"b":1.1476263766560002},{"period_kyr":98.8438689567201,"label":"eccentricity g3−g5","a":1.1869253433369662,"b":0.31207343960571327},{"period_kyr":101.00506143827943,"label":"eccentricity z5−g5","a":-0.21047050684922874,"b":-0.13274559347681283},{"period_kyr":103.12379754572216,"label":"eccentricity z7−g5","a":-0.6785313191175962,"b":0.8192726341367963},{"period_kyr":105.13718703798536,"label":"eccentricity g4−g1","a":0.029443915700263487,"b":0.9936986491668811},{"period_kyr":110.0293064910417,"label":"eccentricity g3−g1","a":-0.9979454733740254,"b":-0.20796044328115149},{"period_kyr":123.8461774280429,"label":"eccentricity g4−g2","a":-0.3841888407687438,"b":-0.1457354872697259},{"period_kyr":130.69097366197656,"label":"eccentricity g3−g2","a":0.9854679028340256,"b":0.3880220645216982},{"period_kyr":134.49598078775747,"label":"eccentricity z5−g2","a":-0.25142886456814856,"b":-0.06535721911085138},{"period_kyr":405.6256163323513,"label":"eccentricity fundamental g₂−g₅","a":-0.07967979956456855,"b":-0.047532666125553624},{"period_kyr":202.81280816617564,"label":"climate-internal harmonic (g₂−g₅)/2","a":-0.024237211304726045,"b":0.17942475404584923},{"period_kyr":135.20853877745043,"label":"climate-internal harmonic (g₂−g₅)/3","a":-0.68401721864114,"b":0.18329294138954288}],"L2":[],"L3":[],"denormalization":{"y_mean":1.5012965895430689e-15,"y_std":0.43131092949760913,"trend_slope":-0.00008678094360729054,"trend_intercept":4.192006855420027},"r2":{"l1_only":0.7804375067209136,"l1_l2":0.7804375067209136,"l1_l2_l3":0.7804375067209136,"delta_l2":0,"delta_l3":0}},"lr04-inhg-mpt":{"label":"LR04 inhg-MPT","regime":"inhg-mpt","window_kyr":[1000,2700],"n_samples":1701,"intercept":0.0005407945238550157,"L1":[{"period_kyr":19.001545641452537,"label":"climatic precession p+g4","a":0.035038697900469776,"b":-0.09856233456883343},{"period_kyr":19.15547239857139,"label":"climatic precession p+g3","a":-0.0050055873000230955,"b":0.07295450844777218},{"period_kyr":22.44529598528639,"label":"climatic precession p+g2","a":0.1189707336083613,"b":-0.061556481183347445},{"period_kyr":23.19329171671584,"label":"climatic precession p+g1","a":-0.022417211678624593,"b":-0.07917860548424852},{"period_kyr":23.76005899662999,"label":"climatic precession p+g5","a":-0.12822098008948085,"b":0.011726379273122145},{"period_kyr":27.268906147417248,"label":"obliquity p+s7","a":0.019253583137398833,"b":-0.006811777303043942},{"period_kyr":28.842415865333038,"label":"obliquity p+s1","a":-0.10407446438276668,"b":-0.1307970655195877},{"period_kyr":29.004791811714906,"label":"obliquity p+ζ14","a":-0.004653228450289371,"b":-0.15758023790494996},{"period_kyr":29.617226328291668,"label":"obliquity p+ζ9","a":0.19983427595294445,"b":-0.030365954887064533},{"period_kyr":29.8091695546043,"label":"obliquity p+s2","a":0.12358880765404787,"b":0.10860240473230665},{"period_kyr":39.55607777721681,"label":"obliquity p+s4","a":0.11660509555060611,"b":-0.2692086622401496},{"period_kyr":40.2292898387119,"label":"obliquity p+ζ4","a":0.004438742288984998,"b":-0.2056720629293153},{"period_kyr":40.923969082915576,"label":"obliquity p+s3","a":-0.5827733879668409,"b":-0.5191599231280841},{"period_kyr":41.644588622327085,"label":"obliquity p+ζ7","a":0.22529730269500345,"b":0.017663100228184708},{"period_kyr":53.61752871496249,"label":"obliquity p+s6","a":-0.22929202500409512,"b":0.10886523178026528},{"period_kyr":94.8779191670953,"label":"eccentricity g4−g5","a":0.16091225627385192,"b":0.03756959488628836},{"period_kyr":96.84902648762181,"label":"eccentricity z6−g5","a":-0.05346309938007432,"b":1.3428060555145303},{"period_kyr":98.8438689567201,"label":"eccentricity g3−g5","a":-0.9532005030349247,"b":1.1984612690364072},{"period_kyr":101.00506143827943,"label":"eccentricity z5−g5","a":0.06976557078692491,"b":0.18007593952402745},{"period_kyr":103.12379754572216,"label":"eccentricity z7−g5","a":1.2361887687342203,"b":0.6242698241337999},{"period_kyr":105.13718703798536,"label":"eccentricity g4−g1","a":0.2782500662455729,"b":0.7838810405427987},{"period_kyr":110.0293064910417,"label":"eccentricity g3−g1","a":0.11819499898152587,"b":-0.2221892717784572},{"period_kyr":123.8461774280429,"label":"eccentricity g4−g2","a":-0.11106845333381837,"b":-0.0021299971398698186},{"period_kyr":130.69097366197656,"label":"eccentricity g3−g2","a":0.04947901851561723,"b":-0.06668073514545314},{"period_kyr":134.49598078775747,"label":"eccentricity z5−g2","a":0.44222786180672413,"b":-0.31488000222020074},{"period_kyr":405.6256163323513,"label":"eccentricity fundamental g₂−g₅","a":0.1385945293920966,"b":0.08861358143487359},{"period_kyr":202.81280816617564,"label":"climate-internal harmonic (g₂−g₅)/2","a":-0.15224767486821475,"b":0.08152656948678338},{"period_kyr":135.20853877745043,"label":"climate-internal harmonic (g₂−g₅)/3","a":-0.24351423105434325,"b":0.5907889361502039}],"L2":[],"L3":[],"denormalization":{"y_mean":2.117321276827753e-15,"y_std":0.2533430989053228,"trend_slope":-0.00028446235786389366,"trend_intercept":4.264486402612575},"r2":{"l1_only":0.6089622611717074,"l1_l2":0.6089622611717074,"l1_l2_l3":0.6089622611717074,"delta_l2":0,"delta_l3":0}},"lr04-pre-inhg":{"label":"LR04 pre-iNHG","regime":"pre-inhg","window_kyr":[2700,5320],"n_samples":2621,"intercept":-0.01978128420246711,"L1":[{"period_kyr":19.001545641452537,"label":"climatic precession p+g4","a":-0.03580507973907532,"b":-0.004163296038171838},{"period_kyr":19.15547239857139,"label":"climatic precession p+g3","a":0.029482146560380618,"b":-0.019598575387339112},{"period_kyr":22.44529598528639,"label":"climatic precession p+g2","a":-0.02793561984412768,"b":-0.056285597003484567},{"period_kyr":23.19329171671584,"label":"climatic precession p+g1","a":-0.03339344700332514,"b":-0.010057893440145294},{"period_kyr":23.76005899662999,"label":"climatic precession p+g5","a":0.04866558654249398,"b":-0.007003106339032228},{"period_kyr":27.268906147417248,"label":"obliquity p+s7","a":0.014945206229944758,"b":-0.006013718029498849},{"period_kyr":28.842415865333038,"label":"obliquity p+s1","a":0.03659352999829785,"b":-0.031848715912644376},{"period_kyr":29.004791811714906,"label":"obliquity p+ζ14","a":-0.021945277796354024,"b":-0.014588070628483996},{"period_kyr":29.617226328291668,"label":"obliquity p+ζ9","a":0.022945223074794158,"b":-0.014615341699566353},{"period_kyr":29.8091695546043,"label":"obliquity p+s2","a":-0.03504174594236702,"b":0.07686265798004002},{"period_kyr":39.55607777721681,"label":"obliquity p+s4","a":-0.035834461164148707,"b":-0.16080639830211058},{"period_kyr":40.2292898387119,"label":"obliquity p+ζ4","a":-0.01574863690392035,"b":-0.10018327768000293},{"period_kyr":40.923969082915576,"label":"obliquity p+s3","a":-0.38923561668464834,"b":-0.3592128864512913},{"period_kyr":41.644588622327085,"label":"obliquity p+ζ7","a":0.0666644162931373,"b":0.12301623264822864},{"period_kyr":53.61752871496249,"label":"obliquity p+s6","a":-0.18560482759086044,"b":0.20084798554298505},{"period_kyr":94.8779191670953,"label":"eccentricity g4−g5","a":0.20725858472850203,"b":-0.13573555478071403},{"period_kyr":96.84902648762181,"label":"eccentricity z6−g5","a":-1.0161864008771713,"b":-0.37916952305916485},{"period_kyr":98.8438689567201,"label":"eccentricity g3−g5","a":0.5889243526694297,"b":2.026043894219197},{"period_kyr":101.00506143827943,"label":"eccentricity z5−g5","a":0.674179064635289,"b":-2.447521913872399},{"period_kyr":103.12379754572216,"label":"eccentricity z7−g5","a":-1.9392786388870076,"b":0.8411384140330604},{"period_kyr":105.13718703798536,"label":"eccentricity g4−g1","a":0.5702933503358304,"b":0.6882833795705612},{"period_kyr":110.0293064910417,"label":"eccentricity g3−g1","a":0.16670723937186288,"b":-0.157327138899017},{"period_kyr":123.8461774280429,"label":"eccentricity g4−g2","a":-0.028563986340683856,"b":0.032547454212518846},{"period_kyr":130.69097366197656,"label":"eccentricity g3−g2","a":0.03721523736581127,"b":-0.3364571543706422},{"period_kyr":134.49598078775747,"label":"eccentricity z5−g2","a":-0.16585357364556103,"b":1.5399798343428315},{"period_kyr":405.6256163323513,"label":"eccentricity fundamental g₂−g₅","a":0.27416217667042886,"b":0.1232463684579172},{"period_kyr":202.81280816617564,"label":"climate-internal harmonic (g₂−g₅)/2","a":0.028572513361765937,"b":-0.06634153361168266},{"period_kyr":135.20853877745043,"label":"climate-internal harmonic (g₂−g₅)/3","a":-1.1531696833038918,"b":-0.6431516714664054}],"L2":[],"L3":[],"denormalization":{"y_mean":2.2229875746786803e-16,"y_std":0.1419188719967453,"trend_slope":-0.0001616384823512257,"trend_intercept":3.7150997304817532},"r2":{"l1_only":0.45466691777331913,"l1_l2":0.45466691777331913,"l1_l2_l3":0.45466691777331913,"delta_l2":0,"delta_l3":0}},"lr04-full":{"label":"LR04 full","regime":"lr04-full","window_kyr":[0,5320],"n_samples":5321,"intercept":-0.0017594442067554764,"L1":[{"period_kyr":19.001545641452537,"label":"climatic precession p+g4","a":0.030653248828978838,"b":-0.05942350042079483},{"period_kyr":19.15547239857139,"label":"climatic precession p+g3","a":0.007132467646760274,"b":0.00889346045248779},{"period_kyr":22.44529598528639,"label":"climatic precession p+g2","a":0.08099544126604592,"b":-0.015104023210019024},{"period_kyr":23.19329171671584,"label":"climatic precession p+g1","a":-0.0022687884125290325,"b":-0.06635740004795854},{"period_kyr":23.76005899662999,"label":"climatic precession p+g5","a":-0.07546493808551995,"b":-0.031559806535336785},{"period_kyr":27.268906147417248,"label":"obliquity p+s7","a":0.014044611584100156,"b":0.0067116130949529396},{"period_kyr":28.842415865333038,"label":"obliquity p+s1","a":0.018156070504627007,"b":-0.05769209107673573},{"period_kyr":29.004791811714906,"label":"obliquity p+ζ14","a":-0.016937892903193467,"b":-0.04998100183225644},{"period_kyr":29.617226328291668,"label":"obliquity p+ζ9","a":0.0022108299667193652,"b":-0.014471741599317106},{"period_kyr":29.8091695546043,"label":"obliquity p+s2","a":-0.025563882575889194,"b":0.030997389732802638},{"period_kyr":39.55607777721681,"label":"obliquity p+s4","a":-0.019174276513080974,"b":-0.16670301535160126},{"period_kyr":40.2292898387119,"label":"obliquity p+ζ4","a":-0.046332620172037334,"b":-0.10915920384492028},{"period_kyr":40.923969082915576,"label":"obliquity p+s3","a":-0.41722734354102786,"b":-0.3045429714864705},{"period_kyr":41.644588622327085,"label":"obliquity p+ζ7","a":0.13911640253566376,"b":0.07908102204296569},{"period_kyr":53.61752871496249,"label":"obliquity p+s6","a":-0.11982484735154347,"b":0.1075601512063676},{"period_kyr":94.8779191670953,"label":"eccentricity g4−g5","a":-0.07815149309609569,"b":-0.26561311217061434},{"period_kyr":96.84902648762181,"label":"eccentricity z6−g5","a":-0.07259701223776335,"b":-0.030963823278142608},{"period_kyr":98.8438689567201,"label":"eccentricity g3−g5","a":-0.17395536780158055,"b":0.0007920877657910108},{"period_kyr":101.00506143827943,"label":"eccentricity z5−g5","a":-0.09381457474099936,"b":-0.030909390200411946},{"period_kyr":103.12379754572216,"label":"eccentricity z7−g5","a":-0.08438228103346493,"b":0.07861984239215711},{"period_kyr":105.13718703798536,"label":"eccentricity g4−g1","a":-0.10328419278380341,"b":-0.005340015475780911},{"period_kyr":110.0293064910417,"label":"eccentricity g3−g1","a":0.05724257014471312,"b":0.003286266021403028},{"period_kyr":123.8461774280429,"label":"eccentricity g4−g2","a":-0.07900004842300087,"b":0.12103628420135798},{"period_kyr":130.69097366197656,"label":"eccentricity g3−g2","a":0.07725354094784148,"b":-0.04256825456998332},{"period_kyr":134.49598078775747,"label":"eccentricity z5−g2","a":0.05454973179068978,"b":0.1200357372085461},{"period_kyr":405.6256163323513,"label":"eccentricity fundamental g₂−g₅","a":0.09355780768106586,"b":0.0491005306751859},{"period_kyr":202.81280816617564,"label":"climate-internal harmonic (g₂−g₅)/2","a":-0.015315361983286493,"b":0.060095183483304365},{"period_kyr":135.20853877745043,"label":"climate-internal harmonic (g₂−g₅)/3","a":-0.134874128816246,"b":0.03848362052622878}],"L2":[],"L3":[{"label":"iNHG","t_kyr":2700,"beta":-0.18331459595720692},{"label":"MPT","t_kyr":1000,"beta":0.07582824645011141}],"denormalization":{"y_mean":8.786640107689267e-16,"y_std":0.26728652336026737,"trend_slope":-0.0002890388734746666,"trend_intercept":4.253595893576046},"r2":{"l1_only":0.32538277595053355,"l1_l2":0.32538277595053355,"l1_l2_l3":0.3329107046316774,"delta_l2":0,"delta_l3":0.007527928681143825}},"cenogrid-d18o":{"label":"CENOGRID δ¹⁸O","regime":"cenogrid","window_kyr":[0,67000],"n_samples":13401,"intercept":-0.000017153189963441282,"L1":[{"period_kyr":19.001545641452537,"label":"climatic precession p+g4","a":0.0041133563757953726,"b":0.0006122983124506615},{"period_kyr":19.15547239857139,"label":"climatic precession p+g3","a":-0.0012149238468332543,"b":-0.0009668638659978924},{"period_kyr":22.44529598528639,"label":"climatic precession p+g2","a":0.001271474975558205,"b":-0.0002880835940532768},{"period_kyr":23.19329171671584,"label":"climatic precession p+g1","a":-0.0006778305944323756,"b":-0.005621586695796224},{"period_kyr":23.76005899662999,"label":"climatic precession p+g5","a":-0.0015154728839008066,"b":-0.0020688961615997646},{"period_kyr":27.268906147417248,"label":"obliquity p+s7","a":-0.0025838705308555013,"b":-0.005343337153924464},{"period_kyr":28.842415865333038,"label":"obliquity p+s1","a":0.0020378113308972034,"b":-0.004964761212448048},{"period_kyr":29.004791811714906,"label":"obliquity p+ζ14","a":0.00015190071101328032,"b":-0.004300567138597734},{"period_kyr":29.617226328291668,"label":"obliquity p+ζ9","a":-0.0006289738284916266,"b":-0.0011571215814992946},{"period_kyr":29.8091695546043,"label":"obliquity p+s2","a":-0.0010285392327511055,"b":0.005153146635298594},{"period_kyr":39.55607777721681,"label":"obliquity p+s4","a":-0.001866579735495099,"b":-0.009381223027510955},{"period_kyr":40.2292898387119,"label":"obliquity p+ζ4","a":-0.011305875483692452,"b":0.0028442994919008584},{"period_kyr":40.923969082915576,"label":"obliquity p+s3","a":-0.009463768159600965,"b":-0.014712775901222155},{"period_kyr":41.644588622327085,"label":"obliquity p+ζ7","a":0.004221879395797408,"b":0.0017683663051216685},{"period_kyr":53.61752871496249,"label":"obliquity p+s6","a":-0.0025427431745709064,"b":0.011125457232795979},{"period_kyr":94.8779191670953,"label":"eccentricity g4−g5","a":0.008877268834356383,"b":-0.030348507200221336},{"period_kyr":96.84902648762181,"label":"eccentricity z6−g5","a":0.002058209296970645,"b":-0.010238014497041124},{"period_kyr":98.8438689567201,"label":"eccentricity g3−g5","a":-0.013651379318455887,"b":0.026204106335075465},{"period_kyr":101.00506143827943,"label":"eccentricity z5−g5","a":0.0016749516949839862,"b":0.003233024729202968},{"period_kyr":103.12379754572216,"label":"eccentricity z7−g5","a":-0.00452072476296185,"b":0.00789334014868309},{"period_kyr":105.13718703798536,"label":"eccentricity g4−g1","a":-0.00903930523210411,"b":-0.0033745117991191027},{"period_kyr":110.0293064910417,"label":"eccentricity g3−g1","a":0.01254228306792841,"b":0.007438162399727605},{"period_kyr":123.8461774280429,"label":"eccentricity g4−g2","a":-0.008945881544730524,"b":0.02456014359917774},{"period_kyr":130.69097366197656,"label":"eccentricity g3−g2","a":0.007764308761380718,"b":-0.012566547694615883},{"period_kyr":134.49598078775747,"label":"eccentricity z5−g2","a":-0.005043263446453649,"b":-0.010094265773878905},{"period_kyr":405.6256163323513,"label":"eccentricity fundamental g₂−g₅","a":0.04455260970399607,"b":-0.04012838466748332},{"period_kyr":202.81280816617564,"label":"climate-internal harmonic (g₂−g₅)/2","a":0.0031281720790908413,"b":0.005403791627168142},{"period_kyr":135.20853877745043,"label":"climate-internal harmonic (g₂−g₅)/3","a":-0.00407789816964086,"b":0.005390573907260856}],"L2":[],"L3":[{"label":"PETM","t_kyr":56000,"beta":1.9399569133341423},{"label":"EOT","t_kyr":34000,"beta":-1.6915666426837683},{"label":"Mi-1","t_kyr":23000,"beta":1.3791514319762492},{"label":"MMCT","t_kyr":14000,"beta":-0.5726719293808323},{"label":"iNHG","t_kyr":2700,"beta":-0.9437043782356765},{"label":"MPT","t_kyr":1000,"beta":0.9558147944349952}],"denormalization":{"y_mean":3.1388799311243884e-16,"y_std":0.5138368170014185,"trend_slope":-0.000060475169948230774,"trend_intercept":3.5886100819307556},"r2":{"l1_only":0.003982293170482154,"l1_l2":0.003982293170482154,"l1_l2_l3":0.6165984200404458,"delta_l2":0,"delta_l3":0.6126161268699637}},"cenogrid-d13c":{"label":"CENOGRID δ¹³C","regime":"cenogrid","window_kyr":[0,67000],"n_samples":13401,"intercept":0.000029171728885359142,"L1":[{"period_kyr":19.001545641452537,"label":"climatic precession p+g4","a":0.0009091320399139437,"b":-0.00022115928548263435},{"period_kyr":19.15547239857139,"label":"climatic precession p+g3","a":-0.0036110811186118646,"b":-0.0013639908854225027},{"period_kyr":22.44529598528639,"label":"climatic precession p+g2","a":-0.0035936996494176513,"b":-0.0005757456806313066},{"period_kyr":23.19329171671584,"label":"climatic precession p+g1","a":0.0017764391388285852,"b":0.00028609196921533693},{"period_kyr":23.76005899662999,"label":"climatic precession p+g5","a":0.0032087864912957284,"b":-0.005815994175685588},{"period_kyr":27.268906147417248,"label":"obliquity p+s7","a":-0.0034613398621327444,"b":-0.0038007916055494088},{"period_kyr":28.842415865333038,"label":"obliquity p+s1","a":-0.002880030481366175,"b":-0.0007184357446750403},{"period_kyr":29.004791811714906,"label":"obliquity p+ζ14","a":-0.00222924550740814,"b":-0.005993305851952227},{"period_kyr":29.617226328291668,"label":"obliquity p+ζ9","a":-0.0045122307992258226,"b":-0.002182774632434506},{"period_kyr":29.8091695546043,"label":"obliquity p+s2","a":-0.002911752724172761,"b":0.00443735412417718},{"period_kyr":39.55607777721681,"label":"obliquity p+s4","a":0.004970040842946216,"b":0.007303213638112271},{"period_kyr":40.2292898387119,"label":"obliquity p+ζ4","a":-0.005537469385975506,"b":-0.007230261221794727},{"period_kyr":40.923969082915576,"label":"obliquity p+s3","a":0.016532276911093206,"b":0.005746291082190887},{"period_kyr":41.644588622327085,"label":"obliquity p+ζ7","a":-0.00202261648778182,"b":-0.003241192550382815},{"period_kyr":53.61752871496249,"label":"obliquity p+s6","a":0.008930111444512818,"b":-0.004090929946156231},{"period_kyr":94.8779191670953,"label":"eccentricity g4−g5","a":0.00928235281110003,"b":-0.0038456358179925565},{"period_kyr":96.84902648762181,"label":"eccentricity z6−g5","a":0.0031487257084246633,"b":0.001019046575856615},{"period_kyr":98.8438689567201,"label":"eccentricity g3−g5","a":-0.006504925311475366,"b":0.02207049946408811},{"period_kyr":101.00506143827943,"label":"eccentricity z5−g5","a":0.005252438822833155,"b":0.010723725703556185},{"period_kyr":103.12379754572216,"label":"eccentricity z7−g5","a":0.015463040483976124,"b":-0.007890682816031471},{"period_kyr":105.13718703798536,"label":"eccentricity g4−g1","a":-0.006704077568200228,"b":-0.004724118051800087},{"period_kyr":110.0293064910417,"label":"eccentricity g3−g1","a":0.01513520161974935,"b":0.004363577757359086},{"period_kyr":123.8461774280429,"label":"eccentricity g4−g2","a":0.00043530659007362527,"b":0.007735868213717512},{"period_kyr":130.69097366197656,"label":"eccentricity g3−g2","a":0.003434795162201869,"b":-0.01548160717282774},{"period_kyr":134.49598078775747,"label":"eccentricity z5−g2","a":-0.002674843271039882,"b":-0.01965653360618317},{"period_kyr":405.6256163323513,"label":"eccentricity fundamental g₂−g₅","a":0.04090553415162765,"b":-0.08954032654679996},{"period_kyr":202.81280816617564,"label":"climate-internal harmonic (g₂−g₅)/2","a":0.006897984812984875,"b":-0.0012436402634086845},{"period_kyr":135.20853877745043,"label":"climate-internal harmonic (g₂−g₅)/3","a":0.0010627090126314764,"b":-0.007315110344460395}],"L2":[],"L3":[{"label":"PETM","t_kyr":56000,"beta":1.2940570636469433},{"label":"EOT","t_kyr":34000,"beta":-0.651938379643522},{"label":"Mi-1","t_kyr":23000,"beta":-0.7981219419366887},{"label":"MMCT","t_kyr":14000,"beta":0.875197090932599},{"label":"iNHG","t_kyr":2700,"beta":1.3323528555767734},{"label":"MPT","t_kyr":1000,"beta":-1.335182279280602}],"denormalization":{"y_mean":-1.6966918546618317e-16,"y_std":0.5116419176812778,"trend_slope":0.000014091551862757799,"trend_intercept":0.17563680335949733},"r2":{"l1_only":0.006340691329060011,"l1_l2":0.006340691329060011,"l1_l2_l3":0.34855578574981616,"delta_l2":0,"delta_l3":0.34221509442075615}},"epica-co2":{"label":"EPICA CO₂","regime":"epica-co2","window_kyr":[0,800],"n_samples":801,"intercept":0.04772250565346167,"L1":[{"period_kyr":19.001545641452537,"label":"climatic precession p+g4","a":-0.05757052391935907,"b":-0.09305698714821553},{"period_kyr":19.15547239857139,"label":"climatic precession p+g3","a":0.09859259619848049,"b":-0.029102368881593788},{"period_kyr":22.44529598528639,"label":"climatic precession p+g2","a":-0.007485074899471478,"b":-0.07760949021966575},{"period_kyr":23.19329171671584,"label":"climatic precession p+g1","a":-0.09094210739116673,"b":0.12567998232492333},{"period_kyr":23.76005899662999,"label":"climatic precession p+g5","a":0.1129816995567211,"b":0.04658363645006909},{"period_kyr":27.268906147417248,"label":"obliquity p+s7","a":0.0008573046772781812,"b":-0.08271460205364659},{"period_kyr":28.842415865333038,"label":"obliquity p+s1","a":-0.13418427589390933,"b":-0.3065802210556564},{"period_kyr":29.004791811714906,"label":"obliquity p+ζ14","a":0.30264371068997126,"b":0.372269555996678},{"period_kyr":29.617226328291668,"label":"obliquity p+ζ9","a":-0.10400040514362394,"b":0.06071412030976109},{"period_kyr":29.8091695546043,"label":"obliquity p+s2","a":0.07674807125272162,"b":0.08742294868218459},{"period_kyr":39.55607777721681,"label":"obliquity p+s4","a":0.25267469088322486,"b":-0.21264732735656397},{"period_kyr":40.2292898387119,"label":"obliquity p+ζ4","a":0.1985065673388669,"b":0.32022925390857215},{"period_kyr":40.923969082915576,"label":"obliquity p+s3","a":0.33407907444977286,"b":0.07638772763941364},{"period_kyr":41.644588622327085,"label":"obliquity p+ζ7","a":-0.18111984141723292,"b":0.19412014579724163},{"period_kyr":53.61752871496249,"label":"obliquity p+s6","a":-0.102421483378701,"b":0.07238187610949562},{"period_kyr":94.8779191670953,"label":"eccentricity g4−g5","a":-0.6218471138338892,"b":1.1004457556552618},{"period_kyr":96.84902648762181,"label":"eccentricity z6−g5","a":-0.2362041415387267,"b":-0.01716911823443268},{"period_kyr":98.8438689567201,"label":"eccentricity g3−g5","a":-0.2772633452327795,"b":-0.3987515044009958},{"period_kyr":101.00506143827943,"label":"eccentricity z5−g5","a":-0.21762888581514123,"b":-0.3914542724050446},{"period_kyr":103.12379754572216,"label":"eccentricity z7−g5","a":0.0028810008532560716,"b":-0.3340823690226681},{"period_kyr":105.13718703798536,"label":"eccentricity g4−g1","a":0.2468045673913495,"b":-0.36243987669955635},{"period_kyr":110.0293064910417,"label":"eccentricity g3−g1","a":0.5954725578323181,"b":-0.6282748203534358},{"period_kyr":123.8461774280429,"label":"eccentricity g4−g2","a":0.31357278944415057,"b":-0.8333137268990354},{"period_kyr":130.69097366197656,"label":"eccentricity g3−g2","a":0.21264050907592402,"b":-0.3953396925919381},{"period_kyr":134.49598078775747,"label":"eccentricity z5−g2","a":0.32440609087814,"b":0.1512223862227542},{"period_kyr":405.6256163323513,"label":"eccentricity fundamental g₂−g₅","a":0.27155662596449115,"b":0.10051237650574972},{"period_kyr":202.81280816617564,"label":"climate-internal harmonic (g₂−g₅)/2","a":0.2223336292381805,"b":-0.14842010272579745},{"period_kyr":135.20853877745043,"label":"climate-internal harmonic (g₂−g₅)/3","a":0.39588643435898874,"b":0.28785664530604516}],"L2":[],"L3":[],"denormalization":{"y_mean":2.980553797944989e-14,"y_std":25.51737494167102,"trend_slope":-0.006455378442643299,"trend_intercept":227.89326737247322},"r2":{"l1_only":0.723825049396513,"l1_l2":0.723825049396513,"l1_l2_l3":0.723825049396513,"delta_l2":0,"delta_l3":0},"carbon_amplification_ratios":{"19.0015":{"period_kyr":19.001545641452537,"lr04_post_mpt_amp":0.15651579152862083,"epica_amp":0.10942562808342772,"ratio":0.699134745540471,"label":"climatic precession p+g4"},"19.1555":{"period_kyr":19.15547239857139,"lr04_post_mpt_amp":0.06619407599203991,"epica_amp":0.1027980928795714,"ratio":1.5529802529751038,"label":"climatic precession p+g3"},"22.4453":{"period_kyr":22.44529598528639,"lr04_post_mpt_amp":0.1709386439214186,"epica_amp":0.07796960509331242,"ratio":0.4561262643990288,"label":"climatic precession p+g2"},"23.1933":{"period_kyr":23.19329171671584,"lr04_post_mpt_amp":0.12026312613825264,"epica_amp":0.1551319594859149,"ratio":1.2899378593200512,"label":"climatic precession p+g1"},"23.7601":{"period_kyr":23.76005899662999,"lr04_post_mpt_amp":0.19581944699695486,"epica_amp":0.12220842695836241,"ratio":0.6240872846518806,"label":"climatic precession p+g5"},"27.2689":{"period_kyr":27.268906147417248,"lr04_post_mpt_amp":0.045692133286174004,"epica_amp":0.08271904474909511,"ratio":1.8103563742804079,"label":"obliquity p+s7"},"28.8424":{"period_kyr":28.842415865333038,"lr04_post_mpt_amp":0.28637522794913195,"epica_amp":0.33465930711651803,"ratio":1.1686042452525351,"label":"obliquity p+s1"},"29.0048":{"period_kyr":29.004791811714906,"lr04_post_mpt_amp":0.1965592169991406,"epica_amp":0.47976852537672665,"ratio":2.440834536794193,"label":"obliquity p+ζ14"},"29.6172":{"period_kyr":29.617226328291668,"lr04_post_mpt_amp":0.6296265178297925,"epica_amp":0.12042544861874531,"ratio":0.19126489308904876,"label":"obliquity p+ζ9"},"29.8092":{"period_kyr":29.8091695546043,"lr04_post_mpt_amp":0.5572679872024051,"epica_amp":0.11633158813194598,"ratio":0.20875340196007566,"label":"obliquity p+s2"},"39.5561":{"period_kyr":39.55607777721681,"lr04_post_mpt_amp":0.31993686286555395,"epica_amp":0.3302474606182808,"ratio":1.032226976473979,"label":"obliquity p+s4"},"40.2293":{"period_kyr":40.2292898387119,"lr04_post_mpt_amp":1.0063809392570864,"epica_amp":0.3767646909352054,"ratio":0.37437582155851873,"label":"obliquity p+ζ4"},"40.9240":{"period_kyr":40.923969082915576,"lr04_post_mpt_amp":1.1813932750701814,"epica_amp":0.3427009088390781,"ratio":0.29008198715090855,"label":"obliquity p+s3"},"41.6446":{"period_kyr":41.644588622327085,"lr04_post_mpt_amp":0.6447787786198793,"epica_amp":0.2654939320574878,"ratio":0.4117597242045805,"label":"obliquity p+ζ7"},"53.6175":{"period_kyr":53.61752871496249,"lr04_post_mpt_amp":0.03496072159426824,"epica_amp":0.1254164911270599,"ratio":3.587354190870642,"label":"obliquity p+s6"},"94.8779":{"period_kyr":94.8779191670953,"lr04_post_mpt_amp":2.1956126593701737,"epica_amp":1.2639915720143144,"ratio":0.5756896903559022,"label":"eccentricity g4−g5"},"96.8490":{"period_kyr":96.84902648762181,"lr04_post_mpt_amp":1.2946071974982711,"epica_amp":0.23682731071604635,"ratio":0.18293372010730122,"label":"eccentricity z6−g5"},"98.8439":{"period_kyr":98.8438689567201,"lr04_post_mpt_amp":1.2272659053208135,"epica_amp":0.4856724460701151,"ratio":0.39573530395041645,"label":"eccentricity g3−g5"},"101.0051":{"period_kyr":101.00506143827943,"lr04_post_mpt_amp":0.2488357426916047,"epica_amp":0.44788255081583905,"ratio":1.7999124481522881,"label":"eccentricity z5−g5"},"103.1238":{"period_kyr":103.12379754572216,"lr04_post_mpt_amp":1.0637727201187808,"epica_amp":0.33409479112628293,"ratio":0.3140659511262687,"label":"eccentricity z7−g5"},"105.1372":{"period_kyr":105.13718703798536,"lr04_post_mpt_amp":0.9941347743278315,"epica_amp":0.438491914072792,"ratio":0.44107894160454386,"label":"eccentricity g4−g1"},"110.0293":{"period_kyr":110.0293064910417,"lr04_post_mpt_amp":1.019383496922233,"epica_amp":0.865630878043006,"ratio":0.8491709750614527,"label":"eccentricity g3−g1"},"123.8462":{"period_kyr":123.8461774280429,"lr04_post_mpt_amp":0.41090132345975183,"epica_amp":0.8903592879945408,"ratio":2.166844537023625,"label":"eccentricity g4−g2"},"130.6910":{"period_kyr":130.69097366197656,"lr04_post_mpt_amp":1.059107223123218,"epica_amp":0.4488980492703841,"ratio":0.42384570652499337,"label":"eccentricity g3−g2"},"134.4960":{"period_kyr":134.49598078775747,"lr04_post_mpt_amp":0.2597846031387007,"epica_amp":0.3579211112713804,"ratio":1.377761064154691,"label":"eccentricity z5−g2"},"405.6256":{"period_kyr":405.6256163323513,"lr04_post_mpt_amp":0.09278051954830373,"epica_amp":0.28956128701201084,"ratio":3.1209276303012983,"label":"eccentricity fundamental g₂−g₅"},"202.8128":{"period_kyr":202.81280816617564,"lr04_post_mpt_amp":0.18105436966901248,"epica_amp":0.2673214723574539,"ratio":1.4764707023981098,"label":"climate-internal harmonic (g₂−g₅)/2"},"135.2085":{"period_kyr":135.20853877745043,"lr04_post_mpt_amp":0.7081496012572424,"epica_amp":0.4894767789755957,"ratio":0.6912053302107113,"label":"climate-internal harmonic (g₂−g₅)/3"}}},"cenco2pip":{"label":"CenCO2PIP CO₂ (deep-time)","regime":"cenco2pip","window_kyr":[0,66000],"n_samples":661,"intercept":0.012710823332535535,"L1":[{"period_kyr":19.001545641452537,"label":"climatic precession p+g4","a":-0.0020338617801976266,"b":0.00022208633139098044},{"period_kyr":19.15547239857139,"label":"climatic precession p+g3","a":-0.0026329706784686893,"b":-0.0010668787332187707},{"period_kyr":22.44529598528639,"label":"climatic precession p+g2","a":-0.0005773515330844987,"b":0.00003291307390918333},{"period_kyr":23.19329171671584,"label":"climatic precession p+g1","a":-0.0009279217927520931,"b":0.00043826337409753457},{"period_kyr":23.76005899662999,"label":"climatic precession p+g5","a":0.0003935664632165048,"b":-0.00013247538208650822},{"period_kyr":27.268906147417248,"label":"obliquity p+s7","a":-0.00034673240956895274,"b":0.0004492328879011475},{"period_kyr":28.842415865333038,"label":"obliquity p+s1","a":-0.0003814047506930234,"b":0.00024647169666917456},{"period_kyr":29.004791811714906,"label":"obliquity p+ζ14","a":-0.0006561438457021104,"b":-0.000009234244011747765},{"period_kyr":29.617226328291668,"label":"obliquity p+ζ9","a":-0.0007415078762596315,"b":0.00048539168484503263},{"period_kyr":29.8091695546043,"label":"obliquity p+s2","a":-0.00032575297135806897,"b":-0.0002768928850926805},{"period_kyr":39.55607777721681,"label":"obliquity p+s4","a":-0.0005578089164868538,"b":0.000002532301888910431},{"period_kyr":40.2292898387119,"label":"obliquity p+ζ4","a":-0.0005369607748816922,"b":-0.00018901440570610276},{"period_kyr":40.923969082915576,"label":"obliquity p+s3","a":-0.0005310699479013138,"b":-0.00047953946468817354},{"period_kyr":41.644588622327085,"label":"obliquity p+ζ7","a":-0.00016030653793037454,"b":-0.00045444969546296066},{"period_kyr":53.61752871496249,"label":"obliquity p+s6","a":-0.0033519053865770287,"b":-0.0032382954142333026},{"period_kyr":94.8779191670953,"label":"eccentricity g4−g5","a":-0.03132542098776035,"b":-0.03179411879600634},{"period_kyr":96.84902648762181,"label":"eccentricity z6−g5","a":0.031647295012709374,"b":0.03578118100828458},{"period_kyr":98.8438689567201,"label":"eccentricity g3−g5","a":0.20006403256246674,"b":-0.16437243706923396},{"period_kyr":101.00506143827943,"label":"eccentricity z5−g5","a":0.08062540387177358,"b":0.09521995627738682},{"period_kyr":103.12379754572216,"label":"eccentricity z7−g5","a":-0.02491796986013184,"b":-0.014039062779737035},{"period_kyr":105.13718703798536,"label":"eccentricity g4−g1","a":0.012133958115513273,"b":0.03860990013383617},{"period_kyr":110.0293064910417,"label":"eccentricity g3−g1","a":-0.002137273435450621,"b":-0.015874644486902144},{"period_kyr":123.8461774280429,"label":"eccentricity g4−g2","a":-0.00046859356446693305,"b":0.0007067808363629786},{"period_kyr":130.69097366197656,"label":"eccentricity g3−g2","a":-0.00011035789585776747,"b":0.0017566689342053362},{"period_kyr":134.49598078775747,"label":"eccentricity z5−g2","a":0.0004433859046877901,"b":0.00035608509416867537},{"period_kyr":405.6256163323513,"label":"eccentricity fundamental g₂−g₅","a":0.00010765685191621403,"b":-0.00009531205076887192},{"period_kyr":202.81280816617564,"label":"climate-internal harmonic (g₂−g₅)/2","a":-0.0005633780713438881,"b":0.0001369956977748804},{"period_kyr":135.20853877745043,"label":"climate-internal harmonic (g₂−g₅)/3","a":-0.0013808240665499367,"b":0.0017651150118173323}],"L2":[],"L3":[{"label":"PETM","t_kyr":56000,"beta":-2.2502408814529162},{"label":"EOT","t_kyr":34000,"beta":1.5689079946773803},{"label":"Mi-1","t_kyr":23000,"beta":-0.21259643895733238},{"label":"MMCT","t_kyr":14000,"beta":-0.3699202105260202},{"label":"iNHG","t_kyr":2700,"beta":-0.24227399068087263},{"label":"MPT","t_kyr":1000,"beta":0.24998745524516897}],"denormalization":{"y_mean":-2.091425032821257e-13,"y_std":209.18154000668048,"trend_slope":0.013251639299066168,"trend_intercept":214.15971983891893},"r2":{"l1_only":0.047324371008972466,"l1_l2":0.047324371008972466,"l1_l2_l3":0.6918021804874894,"delta_l2":0,"delta_l3":0.644477809478517}}},"meta":{"script":"export_climate_formula_browser.py","consumer":"src/script.js — Climate Formula Explorer modal","stitched_lr04_r2":0.9214009610608173,"stitched_lr04_note":"R² of the three-regime stitched curve (post-MPT / iNHG-MPT / pre-iNHG blocks) against the raw gridded LR04 stack, 0-5320 kyr"}},
29
+ DT_ANCHOR: {"deltaTStartSeconds":56.07581799402068,"usnoTargetLodSeconds":86400.0012},
30
+ DT_RESONATOR: {"display_name":"Core-mantle swing","driver":"Resonator","functional_class":"episode (2-kick IMPULSE-CONSISTENT windowed damped oscillation — sin-only kicks, displacement-continuous; zero before first kick)","kick_epochs_year":[-1600,1600],"kick_coefficients_s":[{"cos":0,"sin":621.6253091372357},{"cos":0,"sin":1.2850007806442048}],"T0_lattice_n":685,"T0_yr":3916.1109489051096,"Q":1.8,"drive_tones":[{"pair":"bond-hallstatt","dn":726,"period_yr":3694.9531680440773,"phi_locked_rad":-0.4616152283022974,"amp_s":0,"phase_convention":"cos(2π·dn/8H·y − φ_locked), kick-1-envelope-shared","retired":"RETIRED (plan 06 D7 follow-up, 2026-09): shipped at amplitude 0 — measured to buy nothing once the GIA channel became the lagged response (kicks-only 11.89 / 21.04 s vs all three 12.04 / 21.34 s); dn/phase kept as the convention for the diagnostic column (DT_RESONATOR_COMPONENTS)."}],"rms_s":21.41469844571876,"raw_at_j2000_s":-83.11960900896855,"lod_raw_at_j2000_s_per_day":0.0004964512181330436,"deep_time_checks_s":{"900":-245.8439379884609,"2000":-82.32559425279462,"5000":5.334235000224568,"100000":-1.545960510634632e-17,"-100000":0,"-5000":0,"-801":0},"regeneration_rule":"drive-tone menu = Δn difference tones of the ACTIVE flag set (any count); refit this script after any stack change (3rd/5th cycle)","status":"JOINT WORLD SHIPPED (--joint --write): the two impulse kicks from the joint equality-constrained fit, the drive tone retired at amplitude 0 (plan 06 D7 follow-up); phases/epochs/T0/Q remain the Stage-1/3 convention. Default-ON.","impulse_consistent":true},
31
+ DT_STACK: {"bond":{"lattice_n":1830,"period_yr":1465.8666666666666,"cos_coeff_s":165.17830836273438,"sin_coeff_s":329.72368120425097,"raw_at_j2000_s":139.42483205973076,"amplitude_s":368.7839197964807,"phase_deg":63.39097186679068,"source":"Stage D anchored fit (USNO LOD constraint active)","joint_mode":true},"hallstatt":{"lattice_n":1104,"period_yr":2429.8333333333335,"cos_coeff_s":-63.68853392916495,"sin_coeff_s":48.41250505761507,"raw_at_j2000_s":-71.6300451611975,"amplitude_s":80,"phase_deg":142.75990910530456,"target_amp_source":"CAPPED from anchored quad-fit free amp 100.73 s → 80 s prior","joint_mode":true},"jose5":{"lattice_n":2989,"period_yr":897.469387755102,"cos_coeff_s":-41.0905713231876,"sin_coeff_s":28.487979014560363,"raw_at_j2000_s":22.691156700635617,"amplitude_s":49.99999999999999,"phase_deg":145.26653774170026,"target_amp_source":"CAPPED from anchored quad-fit free amp 86.44 s → 50 s prior","joint_mode":true},"jose4":{"lattice_n":3749,"period_yr":715.5337423312883,"cos_coeff_s":38.291732965080044,"sin_coeff_s":-32.15187687415778,"raw_at_j2000_s":41.578595054682985,"amplitude_s":50,"phase_deg":-40.018695741432126,"target_amp_source":"unconstrained: quad-fit free amp 47.06 s (below 50 s prior — no cap applied)","joint_mode":true}},
32
32
  MEEUS_DISTANCE_TERMS: {"meanKm":385000.56,"terms":[[0,0,1,0,-20905355],[2,0,-1,0,-3699111],[2,0,0,0,-2955968],[0,0,2,0,-569925],[0,1,0,0,48888],[0,0,0,2,-3149],[2,0,-2,0,246158],[2,-1,-1,0,-152138],[2,0,1,0,-170733],[2,-1,0,0,-204586],[0,1,-1,0,-129620],[1,0,0,0,108743],[0,1,1,0,104755],[2,0,0,-2,10321],[0,0,1,2,0],[0,0,1,-2,79661],[4,0,-1,0,-34782],[0,0,3,0,-23210],[4,0,-2,0,-21636],[2,1,-1,0,24208],[2,1,0,0,30824],[1,0,-1,0,-8379],[1,1,0,0,-16675],[2,-1,1,0,-12831],[2,0,2,0,-10445],[4,0,0,0,-11650],[2,0,-3,0,14403],[0,1,-2,0,-7003],[2,0,-1,2,0],[2,-1,-2,0,10056],[1,0,1,0,6322],[2,-2,0,0,-9884],[0,1,2,0,5751],[0,2,0,0,0],[2,-2,-1,0,-4950],[2,0,1,-2,4130],[2,0,0,2,0],[4,-1,-1,0,-3958],[0,0,2,2,0],[3,0,-1,0,3258],[2,1,1,0,2616],[4,-1,-2,0,-1897],[0,2,-1,0,-2117],[2,2,-1,0,2354],[2,1,-2,0,0],[2,-1,0,-2,0],[4,0,1,0,-1423],[0,0,4,0,-1117],[4,-1,0,0,-1571],[1,0,-2,0,-1739],[2,1,0,-2,0],[0,0,2,-2,-4421],[1,1,1,0,0],[3,0,-2,0,0],[4,0,-3,0,0],[2,-1,2,0,0],[0,2,1,0,1165],[1,1,-1,0,0],[2,0,3,0,0],[2,0,-1,-2,8752]]},
33
33
  MEEUS_LATITUDE_TERMS: [[0,0,0,1,5128122],[0,0,1,1,280602],[0,0,1,-1,277693],[2,0,0,-1,173237],[2,0,-1,1,55413],[2,0,-1,-1,46271],[2,0,0,1,32573],[0,0,2,1,17198],[2,0,1,-1,9266],[0,0,2,-1,8822],[2,-1,0,-1,8216],[2,0,-2,-1,4324],[2,0,1,1,4200],[2,1,0,-1,-3359],[2,-1,-1,1,2463],[2,-1,0,1,2211],[2,-1,-1,-1,2065],[0,1,-1,-1,-1870],[4,0,-1,-1,1828],[0,1,0,1,-1794],[0,0,0,3,-1749],[0,1,-1,1,-1565],[1,0,0,1,-1491],[0,1,1,1,-1475],[0,1,1,-1,-1410],[0,1,0,-1,-1344],[1,0,0,-1,-1335],[0,0,3,1,1107],[4,0,0,-1,1021],[4,0,-1,1,833],[0,0,1,-3,777],[4,0,-2,1,671],[2,0,0,-3,607],[2,0,2,-1,596],[2,-1,1,-1,491],[2,0,-2,1,-451],[0,0,3,-1,439],[2,0,2,1,422],[2,0,-3,-1,421],[2,1,-1,1,-366],[2,1,0,1,-351],[4,0,0,1,331],[2,-1,1,1,315],[2,-2,0,-1,302],[0,0,1,3,-283],[2,1,1,-1,-229],[1,1,0,-1,223],[1,1,0,1,223],[0,1,-2,-1,-220],[2,1,-1,-1,-220],[1,0,1,1,-185],[2,-1,-2,-1,181],[0,1,2,1,-177],[4,0,-2,-1,176],[4,-1,-1,-1,166],[1,0,1,-1,-164],[4,0,1,-1,132],[1,0,-1,-1,-119],[4,-1,0,-1,115],[2,-2,0,1,107]],
34
34
  MEEUS_LONGITUDE_TERMS: [[0,0,1,0,6288774],[2,0,-1,0,1274027],[2,0,0,0,658314],[0,0,2,0,213618],[0,1,0,0,-185116],[0,0,0,2,-114332],[2,0,-2,0,58793],[2,-1,-1,0,57066],[2,0,1,0,53322],[2,-1,0,0,45758],[0,1,-1,0,-40923],[1,0,0,0,-34720],[0,1,1,0,-30383],[2,0,0,-2,15327],[0,0,1,2,-12528],[0,0,1,-2,10980],[4,0,-1,0,10675],[0,0,3,0,10034],[4,0,-2,0,8548],[2,1,-1,0,-7888],[2,1,0,0,-6766],[1,0,-1,0,-5163],[1,1,0,0,4987],[2,-1,1,0,4036],[2,0,2,0,3994],[4,0,0,0,3861],[2,0,-3,0,3665],[0,1,-2,0,-2689],[2,0,-1,2,-2602],[2,-1,-2,0,2390],[1,0,1,0,-2348],[2,-2,0,0,2236],[0,1,2,0,-2120],[0,2,0,0,-2069],[2,-2,-1,0,2048],[2,0,1,-2,-1773],[2,0,0,2,-1595],[4,-1,-1,0,1215],[0,0,2,2,-1110],[3,0,-1,0,-892],[2,1,1,0,-810],[4,-1,-2,0,759],[0,2,-1,0,-713],[2,2,-1,0,-700],[2,1,-2,0,691],[2,-1,0,-2,596],[4,0,1,0,549],[0,0,4,0,537],[4,-1,0,0,520],[1,0,-2,0,-487],[2,1,0,-2,-399],[0,0,2,-2,-381],[1,1,1,0,351],[3,0,-2,0,-340],[4,0,-3,0,330],[2,-1,2,0,327],[0,2,1,0,-323],[1,1,-1,0,299],[2,0,3,0,294]],
@@ -39,7 +39,7 @@
39
39
  export const CONSTANTS_HASH = "da713fc2d846767d";
40
40
 
41
41
  /** Model version label — single source: public/input/model-version.json (§10 two-axis scheme). */
42
- export const MODEL_VERSION = "v27.1";
42
+ export const MODEL_VERSION = "v27.2";
43
43
 
44
44
  /** Canonical preprint DOI — single source: public/input/model-version.json. */
45
45
  export const PREPRINT_DOI = "10.21203/rs.3.rs-8758810/v4";
@@ -90,6 +90,7 @@ function createCoRotatingAnchoredModeSum(modes, anchor) {
90
90
  * axialPrecessionYearsAtYearFn?: (year: number) => number,
91
91
  * solarTorqueShareJ2000?: number,
92
92
  * dynamicalEllipticityRatioAtYearFn?: (year: number) => number,
93
+ * spinCheckpoints?: { spacingYr: number, checkpoints: ReadonlyArray<{t: number, s: number[]}> },
93
94
  * }} deps — mode tables from the governed deep artifact (choose the ζ tier
94
95
  * per consumer: era = its own 8-term extraction, deep = the 16-term
95
96
  * table; NEVER a slice); anchors from the chain artifact's one home; the
@@ -115,6 +116,14 @@ function createDeepOrbitalHistory({
115
116
  axialPrecessionYearsJ2000, obliquityJ2000Deg,
116
117
  axialPrecessionYearsAtYearFn,
117
118
  solarTorqueShareJ2000, dynamicalEllipticityRatioAtYearFn,
119
+ // PLAN 24 — the checkpoint bank: the walk's exact state (ŝ, t) every `spacingYr`
120
+ // from J2000 over the model's domain, written by the continuous walk
121
+ // (tools/verify/spin-axis-bank.js, data/spin-axis-checkpoints.json). A build
122
+ // seats its walk on the nearest checkpoint on the near side of the query and
123
+ // walks at most one spacing — the same step sequence as the continuous walk,
124
+ // so every node is bit-identical (the purity gate's bank row). Absent, the
125
+ // walk runs from S0 as before.
126
+ spinCheckpoints,
118
127
  }) {
119
128
  const D2R = Math.PI / 180, R2D = 180 / Math.PI;
120
129
 
@@ -551,23 +560,91 @@ function createDeepOrbitalHistory({
551
560
  };
552
561
  }
553
562
 
554
- /** The factory's walks, one per step size — see build(). @type {Map<number, { grid: Map<number, any>, frontier: Record<number, { s: number[], t: number }> }>} */
563
+ // ── THE STEP SCHEDULE — ONE place, the generator's and every runtime's (plan 24) ──
564
+ // 5-yr RK4 inside ±50 kyr (the certified-precision zone, unchanged). Beyond:
565
+ // the largest divisor of 1000 up to 50 yr that keeps ≥ 100 steps per
566
+ // precession cycle of the torque period at the 1000-yr cell's near edge —
567
+ // 50 yr over the whole ±500-Myr validity domain and to ~3.5 Ga (T_p ≥ 5 kyr),
568
+ // shrinking toward genesis (T_p 598 yr at 4.4 Ga → 5-yr steps). Constant per
569
+ // 1000-yr cell and an integer, so the walk lands exactly on every grid node
570
+ // (1000, 5000) and on the bank's (250 kyr), and t stays exact.
571
+ // MEASURED (plan 24, 2026-10): the former fixed 250-yr step was outside RK4's
572
+ // asymptotic regime beyond a few Myr — against a 50-yr walk the obliquity
573
+ // parted by 0.8″ at 5 Ma, 318″ at 100 Ma, 0.12° at 500 Ma, 2° at 2.46 Ga, and
574
+ // at 4 Ga the axis had collapsed onto the orbit normal (ε 0.07°); the equinox
575
+ // phase by 9° at 100 Ma. The 50-yr walk IS converged: 0.10″ / 10″ at 100 Ma
576
+ // against a 10-yr walk (ratios 3,000–30,000 where fourth order predicts 625).
577
+ // STRICT < so the walk switches AT the ±50,000 boundary (a grid node).
578
+ const STEP_CANDIDATES = [50, 25, 20, 10, 5, 4, 2, 1];
579
+ let stepCellKey = NaN, stepCellH = 5;
580
+ const hStepAt = (/** @type {number} */ t) => {
581
+ const a = Math.abs(t);
582
+ if (a < 50000) return 5;
583
+ const cellKey = (t < 0 ? -1 : 1) * Math.floor(a / 1000) * 1000;
584
+ if (cellKey === stepCellKey) return stepCellH;
585
+ const Tp = axialPrecessionYearsAtYearFn ? axialPrecessionYearsAtYearFn(2000 + cellKey) : axialPrecessionYearsJ2000;
586
+ let h = 1;
587
+ for (const c of STEP_CANDIDATES) if (c * 100 <= Tp) { h = c; break; }
588
+ stepCellKey = cellKey; stepCellH = h;
589
+ return h;
590
+ };
591
+ /** One RK4 walk from (s, t) to tEnd (|tEnd| ≥ |t|, same side of J2000), the schedule's steps
592
+ * — or a FIXED step for a diagnostic (the generator's convergence row); returns the end state.
593
+ * @param {number[]} s @param {number} t @param {number} tEnd @param {number} [fixedStepYr]
594
+ * @returns {{ s: number[], t: number }} */
595
+ function walkFrom(s, t, tEnd, fixedStepYr) {
596
+ const dir = tEnd < t ? -1 : 1;
597
+ while (dir < 0 ? t > tEnd : t < tEnd) {
598
+ const h = fixedStepYr ?? hStepAt(t);
599
+ s = rk4(s, t, dir * h);
600
+ t += dir * h;
601
+ }
602
+ return { s, t };
603
+ }
604
+ /** The continuous walk's states at every multiple of spacingYr from J2000 to tEndYr (one
605
+ * direction) — the bank generator's instrument; no grid is built.
606
+ * @param {number} tEndYr @param {number} spacingYr @returns {Array<{t: number, s: number[]}>} */
607
+ function recordStates(tEndYr, spacingYr) {
608
+ const dir = tEndYr < 0 ? -1 : 1;
609
+ /** @type {Array<{t: number, s: number[]}>} */ const out = [];
610
+ let s = S0A, t = 0;
611
+ while (dir < 0 ? t > tEndYr : t < tEndYr) {
612
+ const h = hStepAt(t);
613
+ s = rk4(s, t, dir * h);
614
+ t += dir * h;
615
+ if (t % spacingYr === 0) out.push({ t, s: s.slice() });
616
+ }
617
+ return out;
618
+ }
619
+ // The bank, indexed by t (years from J2000; both directions).
620
+ /** @type {Map<number, number[]> | null} */
621
+ const bank = spinCheckpoints && spinCheckpoints.checkpoints ? new Map(spinCheckpoints.checkpoints.map((/** @type {{t: number, s: number[]}} */ c) => [c.t, c.s])) : null;
622
+ const bankSpacing = spinCheckpoints && bank ? spinCheckpoints.spacingYr : 0;
623
+
624
+ /** The factory's walks, one per grid step: the shared node grid and, per direction, the
625
+ * COVERED SEGMENTS — contiguous node ranges [from, to] (|t|) each with the live frontier
626
+ * state at `to` (plan 24: a frontier per direction became segments, so a seated walk can
627
+ * start anywhere and a later nearer query fills its own gap).
628
+ * @typedef {{ from: number, to: number, s: number[], t: number }} Seg
629
+ * @type {Map<number, { grid: Map<number, any>, segs: Record<number, Seg[]> }>} */
555
630
  const walks = new Map();
556
631
  /**
557
- * Integrate once over [min(t0,t1,0), max(t0,t1,0)] and return a sampler
558
- * on a stepYr grid (linear interpolation; angles interpolated on the
559
- * wrapped difference). t in years from J2000, negative = past.
632
+ * Return a sampler on a stepYr grid over [min(t0,t1,0), max(t0,t1,0)]:
633
+ * the nodes around the far ends are built now (linear interpolation of the
634
+ * scalars, C1 on the angles); any node the sampler meets missing is built on
635
+ * demand. t in years from J2000, negative = past.
560
636
  * @param {number} t0Yr @param {number} t1Yr @param {number} stepYr
561
637
  */
562
638
  function build(t0Yr, t1Yr, stepYr) {
563
639
  const tMin = Math.min(t0Yr, t1Yr, 0), tMax = Math.max(t0Yr, t1Yr, 0);
564
- // D1 stepping contract: a build reaching beyond the ±50-kyr fine zone
565
- // integrates at 250-yr steps there, so its grid must be 250-aligned or
566
- // at() would meet missing keys. Fail loud, not subtly coarse.
567
- if (Math.max(Math.abs(tMin), Math.abs(tMax)) > 50000 && stepYr % 250 !== 0) {
568
- throw new Error(`deep-orbital-history: builds beyond ±50 kyr need stepYr % 250 === 0 (got ${stepYr})`);
640
+ // The stepping contract: beyond the ±50-kyr fine zone the walk steps on
641
+ // STEP_CANDIDATES, every one a divisor of 100, so a grid there must be
642
+ // 100-aligned (the samplers' 1000/5000, the series generator's 500-yr seam
643
+ // probe) or at() would meet missing keys. Fail loud, not subtly coarse.
644
+ if (Math.max(Math.abs(tMin), Math.abs(tMax)) > 50000 && stepYr % 100 !== 0) {
645
+ throw new Error(`deep-orbital-history: builds beyond ±50 kyr need stepYr % 100 === 0 (got ${stepYr})`);
569
646
  }
570
- // ONE WALK PER STEP SIZE, EXTENDED, NEVER RESTARTED (plan 13 A1, measured):
647
+ // ONE WALK PER GRID STEP, EXTENDED, NEVER RESTARTED (plan 13 A1, measured):
571
648
  // every caller's tier routing asked for `build(span, -span, step)` and
572
649
  // rebuilt from J2000 whenever a deeper epoch arrived, so the four deep
573
650
  // fixture anchors (380…2460 Ma) walked ~49 million RK4 steps — 14 of the
@@ -575,56 +652,68 @@ function createDeepOrbitalHistory({
575
652
  // ~5 million. The walk is a pure function of t from the fixed J2000 state
576
653
  // S0, so continuing a stored walk from its last (s, t) yields the SAME
577
654
  // step sequence as a fresh walk to the farther end: bit-identical nodes
578
- // (the sampler-order-purity gate pins this). The grid and the two
579
- // direction frontiers live on the factory, keyed by stepYr; a returned
580
- // sampler reads the shared grid, which only ever gains nodes.
655
+ // (the sampler-order-purity gate pins this). PLAN 24: the same purity lets
656
+ // a walk start from a BANKED state — a checkpoint IS the continuous walk's
657
+ // state at that t — so a query seats on the nearest checkpoint on its near
658
+ // side and walks at most one spacing (250 kyr: ~5,000 steps) instead of
659
+ // from J2000 (−4.43 Gyr: 17.7 million steps at the former step, ~90
660
+ // million at this one).
581
661
  let w = walks.get(stepYr);
582
662
  const S0 = S0A;
583
- // D1-revised adaptive stepping: 5-yr RK4 near the era (the certified-
584
- // precision zone), 250-yr beyond ±50 kyr — still 103 steps per
585
- // precession cycle and ≥196 samples of the fastest ζ mode (49 kyr), so
586
- // the integration stays deep in RK4's convergence regime while ±500 Myr
587
- // becomes a seconds-class one-time build (measured: coarse-vs-fine
588
- // agree to <1e-4° at ±1 Myr — the generator's regression gate).
589
- // STRICT < so the walk switches AT the ±50,000 boundary (50,000 is
590
- // 250-aligned; switching one fine-step later would leave the coarse walk
591
- // permanently off-grid — measured: every key beyond ±50 kyr missing).
592
- const hStepAt = (/** @type {number} */ t) => (Math.abs(t) < 50000 ? 5 : 250);
593
663
  if (!w) {
594
- w = { grid: new Map(), frontier: { [-1]: { s: S0, t: 0 }, [1]: { s: S0, t: 0 } } };
664
+ w = { grid: new Map(), segs: { [-1]: [], [1]: [] } };
595
665
  walks.set(stepYr, w);
596
666
  }
597
667
  const grid = w.grid;
598
- for (const dir of [-1, +1]) {
599
- const end = dir < 0 ? tMin : tMax;
600
- const front = w.frontier[dir];
601
- if (dir < 0 ? end >= front.t : end <= front.t) continue; // already walked this far
602
- let s = front.s, t = front.t;
603
- // Each stored node also carries the equinox-node RATE (deg/yr) from a
604
- // ±2.5-yr central difference on the integrator's own state — the C1
605
- // (Hermite) interpolation input. Linear interpolation of the node
606
- // longitude made the realized equinox rate PIECEWISE-CONSTANT per
607
- // grid cell — the report's per-year precession column showed flat
608
- // centuries with steps at the 1700/1800/1900/2000 cell edges
609
- // (measured; the levels were the real wobble at 100-yr resolution,
610
- // the staircase was this interpolation order).
611
- // The perihelion longitude of date gets the same C1 treatment (2026-09,
612
- // owner-found): linear interpolation of periOfDateDeg made the
613
- // movement's year-over-year apsidal rate — the anomalistic year, the
614
- // Prec. cell — a staircase of ±0.1 s across the 100-yr cells, reading
615
- // 365.2596375 d at 2000.0 and 365.2596390 d at 2000.5, and the panel's
616
- // apsidal beat 111,494 where the registry read 111,548.
617
- const storeWithRate = (/** @type {number} */ key, /** @type {number[]} */ sv, /** @type {number} */ tv) => {
618
- const smp = sampleAt(sv, tv);
619
- const hR = 2.5;
620
- const lp = eqLonsOnlyDeg(rk4(sv, tv, +hR), tv + hR);
621
- const lm = eqLonsOnlyDeg(rk4(sv, tv, -hR), tv - hR);
622
- smp.equinoxLonRateDegPerYr = (((lp.proj - lm.proj + 540) % 360) - 180) / (2 * hR);
623
- smp.generalPrecessionLonRateDegPerYr = (((lp.general - lm.general + 540) % 360) - 180) / (2 * hR);
624
- smp.periOfDateRateDegPerYr = (((lp.peri - lm.peri + 540) % 360) - 180) / (2 * hR);
625
- grid.set(key, smp);
626
- };
627
- if (t === 0 && !grid.has(0)) storeWithRate(0, s, 0);
668
+ // Each stored node also carries the equinox-node RATE (deg/yr) from a
669
+ // ±2.5-yr central difference on the integrator's own state — the C1
670
+ // (Hermite) interpolation input. Linear interpolation of the node
671
+ // longitude made the realized equinox rate PIECEWISE-CONSTANT per
672
+ // grid cell — the report's per-year precession column showed flat
673
+ // centuries with steps at the 1700/1800/1900/2000 cell edges
674
+ // (measured; the levels were the real wobble at 100-yr resolution,
675
+ // the staircase was this interpolation order).
676
+ // The perihelion longitude of date gets the same C1 treatment (2026-09,
677
+ // owner-found): linear interpolation of periOfDateDeg made the
678
+ // movement's year-over-year apsidal rate — the anomalistic year, the
679
+ // Prec. cell — a staircase of ±0.1 s across the 100-yr cells, reading
680
+ // 365.2596375 d at 2000.0 and 365.2596390 d at 2000.5, and the panel's
681
+ // apsidal beat 111,494 where the registry read 111,548.
682
+ const storeWithRate = (/** @type {number} */ key, /** @type {number[]} */ sv, /** @type {number} */ tv) => {
683
+ const smp = sampleAt(sv, tv);
684
+ const hR = 2.5;
685
+ const lp = eqLonsOnlyDeg(rk4(sv, tv, +hR), tv + hR);
686
+ const lm = eqLonsOnlyDeg(rk4(sv, tv, -hR), tv - hR);
687
+ smp.equinoxLonRateDegPerYr = (((lp.proj - lm.proj + 540) % 360) - 180) / (2 * hR);
688
+ smp.generalPrecessionLonRateDegPerYr = (((lp.general - lm.general + 540) % 360) - 180) / (2 * hR);
689
+ smp.periOfDateRateDegPerYr = (((lp.peri - lm.peri + 540) % 360) - 180) / (2 * hR);
690
+ grid.set(key, smp);
691
+ };
692
+ if (!grid.has(0)) storeWithRate(0, S0, 0);
693
+ /** Make the nodes up to |t| = need exist in direction dir: a covering segment, or a walk
694
+ * seated on the nearest start on the near side — an existing segment's frontier or a bank
695
+ * checkpoint, whichever is nearer — storing nodes at exact grid multiples on the way.
696
+ * @param {1|-1} dir @param {number} need */
697
+ const cover = (dir, need) => {
698
+ if (need === 0) return;
699
+ const segs = w.segs[dir];
700
+ for (const sg of segs) if (sg.from <= need && need <= sg.to) return;
701
+ /** @type {{ a: number, s: number[], t: number, seg: Seg | null }} */
702
+ let start = { a: 0, s: S0, t: 0, seg: null };
703
+ for (const sg of segs) if (sg.to <= need && sg.to > start.a) start = { a: sg.to, s: sg.s, t: sg.t, seg: sg };
704
+ if (bank) {
705
+ for (let a = Math.floor(need / bankSpacing) * bankSpacing; a > start.a; a -= bankSpacing) {
706
+ const cs = bank.get(dir * a);
707
+ if (cs) { start = { a, s: cs, t: dir * a, seg: null }; break; }
708
+ }
709
+ }
710
+ let s = start.s, t = start.t;
711
+ const end = dir * need;
712
+ // A seat on a bank checkpoint IS a walk state at an exact t: when that t is a grid
713
+ // multiple its node must be stored too — a query at the checkpoint itself (need ===
714
+ // the seat; the loop below then takes no step) found no node otherwise (measured:
715
+ // the fixture recorder at +250 kyr and the docs writer at −1 Myr threw).
716
+ if (start.seg === null && start.a > 0 && Math.abs(t - Math.round(t / stepYr) * stepYr) < 1e-6 && !grid.has(Math.round(t / stepYr) * stepYr)) storeWithRate(Math.round(t / stepYr) * stepYr, s, t);
628
717
  while (dir < 0 ? t > end : t < end) {
629
718
  const H_STEP = hStepAt(t);
630
719
  s = rk4(s, t, dir * H_STEP);
@@ -632,19 +721,40 @@ function createDeepOrbitalHistory({
632
721
  // Store ONLY at EXACT step multiples: an off-grid sample under a
633
722
  // ROUNDED key collides with (or shifts) a real grid node (measured
634
723
  // during C-3: build(+200, …, 1000) stored ε(+200) under key 0,
635
- // clobbering the t = 0 sample by 94″; and the D1 variable step made
636
- // the old |t % stepYr| < H_STEP/2 window store 250-yr samples under
637
- // 100-yr keys, 50 yr off). Exact alignment is guaranteed by the
638
- // guard below (coarse builds use 250-aligned grids; the 50,000-yr
639
- // zone boundary is itself 250-aligned, so the walk stays on-grid).
724
+ // clobbering the t = 0 sample by 94″). Exact alignment is guaranteed
725
+ // by the schedule (integer divisors of 100 beyond the 50,000-yr zone
726
+ // boundary, itself a grid node) and the guard above.
640
727
  if (Math.abs(t - Math.round(t / stepYr) * stepYr) < 1e-6) storeWithRate(Math.round(t / stepYr) * stepYr, s, t);
641
728
  }
642
- w.frontier[dir] = { s, t };
729
+ const to = Math.abs(t);
730
+ let seg = start.seg;
731
+ if (seg) { seg.to = to; seg.s = s; seg.t = t; } else { seg = { from: start.a, to, s, t }; segs.push(seg); }
732
+ // merge the segments this walk reached (their nodes are the same nodes)
733
+ for (let i = segs.length - 1; i >= 0; i--) {
734
+ const o = segs[i];
735
+ if (o === seg || o.from > seg.to || o.to < seg.from) continue;
736
+ if (o.to > seg.to) { seg.to = o.to; seg.s = o.s; seg.t = o.t; }
737
+ if (o.from < seg.from) seg.from = o.from;
738
+ segs.splice(i, 1);
739
+ }
740
+ };
741
+ for (const dir of /** @type {Array<1|-1>} */ ([-1, 1])) {
742
+ const end = dir < 0 ? tMin : tMax;
743
+ if (end !== 0) cover(dir, Math.abs(end));
643
744
  }
745
+ /** The two grid nodes around tYr, built on demand. @param {number} k0 @param {number} k1 */
746
+ const ensureNodes = (k0, k1) => {
747
+ for (const k of [k0, k1]) {
748
+ if (k === 0 || grid.has(k)) continue;
749
+ if (Math.abs(k) > Math.max(Math.abs(tMin), Math.abs(tMax)) + stepYr) continue; // beyond the built range: the throw below says so
750
+ cover(k < 0 ? -1 : 1, Math.abs(k));
751
+ }
752
+ };
644
753
  return {
645
754
  /** @param {number} tYr */
646
755
  at(tYr) {
647
756
  const k0 = Math.floor(tYr / stepYr) * stepYr, k1 = k0 + stepYr;
757
+ ensureNodes(k0, k1);
648
758
  const a = grid.get(k0), b = grid.get(k1) ?? a;
649
759
  if (!a) throw new Error(`deep-orbital-history: ${tYr} outside the built range`);
650
760
  const f = (tYr - k0) / stepYr;
@@ -685,6 +795,14 @@ function createDeepOrbitalHistory({
685
795
 
686
796
  return {
687
797
  build,
798
+ // PLAN 24 — the bank generator's instruments: the continuous walk's states at a spacing,
799
+ // a pure walk from a given state (the seat-and-resume self-check; a fixed step for the
800
+ // convergence row), the step the schedule takes at t, and the state the walk starts from.
801
+ recordStates,
802
+ walkFrom,
803
+ stepYearsAt: hStepAt,
804
+ stateJ2000: S0A,
805
+ bankLoaded: bank !== null,
688
806
  alphaArcsecPerYr: ALPHA * R2D * 3600, // the injected GENERAL-anchor form (input echo, unchanged semantics)
689
807
  // D4e diagnostics: the self-anchored lunisolar rate actually integrated.
690
808
  alphaLunisolarArcsecPerYr: ALPHA * K_LUNI * R2D * 3600,
package/src/index.js CHANGED
@@ -200,7 +200,7 @@ export { createEclipseFinders } from './eclipse/finders.cjs';
200
200
  * even though the body is empty.
201
201
  *
202
202
  * @param {Constants} [constants]
203
- * @param {{ laws?: { eccentricityAt?: (year: number) => number, eccentricityRateAt?: (year: number) => number, perihelionLongitudeDegAt?: (year: number) => number }, secularSeriesArtifact?: any, giaEllipticityOfDate?: boolean }} [opts]
203
+ * @param {{ laws?: { eccentricityAt?: (year: number) => number, eccentricityRateAt?: (year: number) => number, perihelionLongitudeDegAt?: (year: number) => number }, secularSeriesArtifact?: any, giaEllipticityOfDate?: boolean, spinCheckpointsArtifact?: any }} [opts]
204
204
  * `laws` — research overrides for Earth's orbit laws (doc 109 §7); absent = the shipped laws, bit-identical. Not part of the hash.
205
205
  * @returns {Model}
206
206
  */
@@ -251,8 +251,18 @@ export const createModel = (constants = GENERATED, opts = {}) => {
251
251
  // opts.giaEllipticityOfDate — false builds the one-source history on the
252
252
  // orbital forcing alone (no ice-driven J₂(t) factor): the T1 line derivation
253
253
  // (see assembleModel). Default true = the shipped physics. Never part of the hash.
254
+ // opts.spinCheckpointsArtifact — plan 24: the spin-axis checkpoint bank
255
+ // (data/spin-axis-checkpoints.json, parsed), the walk's exact state every
256
+ // 250 kyr; a deep POINT read then walks at most one spacing (a cumulative
257
+ // lunar table still integrates from J2000). Never part of the
258
+ // hash: it is the governed artifact of the walk this context runs, and the
259
+ // nodes it yields are bit-identical to the full walk's (the purity gate).
260
+ // The bank is the SHIPPED context's walk: under altered constants (a counterfactual) or
261
+ // research law overrides α(t) differs and the walk must be its own — the bank is ignored
262
+ // there by construction, never trusted to the caller.
263
+ const bankAllowed = hash === CONSTANTS_HASH && !(opts.laws && Object.keys(opts.laws).length) && opts.giaEllipticityOfDate !== false;
254
264
  const surfaces = assembleModel(ctx, FITTED, opts.laws ?? {}, opts.secularSeriesArtifact ?? null,
255
- { giaEllipticityOfDate: opts.giaEllipticityOfDate !== false });
265
+ { giaEllipticityOfDate: opts.giaEllipticityOfDate !== false, spinCheckpointsArtifact: bankAllowed ? (opts.spinCheckpointsArtifact ?? null) : null });
256
266
 
257
267
  return {
258
268
  constants: ctx,
@@ -24,7 +24,10 @@
24
24
  * FORCING alone. The T1 exporter derives the climate lines' obliquity rate on it, so the lines
25
25
  * cannot depend on their own fit (v23.0; measured 3e-5 of the rate, 2–3 yr of period). Default true =
26
26
  * the shipped physics.
27
- * @typedef {{ giaEllipticityOfDate?: boolean }} Options
27
+ * `spinCheckpointsArtifact` (plan 24): the parsed spin-axis checkpoint bank — the walk's exact state
28
+ * every 250 kyr; a deep read then walks at most one spacing, bit-identical to the full walk. Null =
29
+ * the full walk from J2000.
30
+ * @typedef {{ giaEllipticityOfDate?: boolean, spinCheckpointsArtifact?: { spacingYr: number, checkpoints: ReadonlyArray<{t: number, s: number[]}> } | null }} Options
28
31
  */
29
32
 
30
33
  /**
@@ -12,7 +12,7 @@ import { CHAIN_ARTIFACT } from '../planets/chain-artifact.js';
12
12
  export function assembleOneSourceMovement(ctx) {
13
13
  const {
14
14
  C, options, secularSeriesArtifact, EPOCH_PARAMS, alphaGia, certifiedAxialPrecessionJ2000Years, dayLengthSeconds,
15
- deepLod, dtCycleLodCorrectionSum, meanSolarYearDays, startmodelYear, yearToTMa,
15
+ deepLod, dtCycleLodCorrectionSum, meanSolarYearDays, yearToTMa,
16
16
  } = ctx;
17
17
  // The cardinal INSTANTS are the crossings of the one Sun the scene renders
18
18
  // and the eclipse chain certifies (cardinal-instants.js); the cardinal
@@ -74,7 +74,12 @@ export function assembleOneSourceMovement(ctx) {
74
74
  // The CONSTANT's scaling (the torque period), not the published rate of date: the
75
75
  // integration's own ŝ·n̂ carries the obliquity's cosine, so the cited mean obliquity's
76
76
  // factor must not enter twice.
77
- axialPrecessionYearsAtYearFn: (yr) => deepLod.lunisolarTorquePeriodYearsAtAge((startmodelYear - yr) / 1e6) ?? axial0,
77
+ // The age is yearToTMa(yr) — the ONE mapping (J2000 = 2000.0 on the engine year axis,
78
+ // as the factory's own t and the browser's and tools/lib's twins read it). Plan 24
79
+ // measured the former (startmodelYear − yr)/1e6, a 0.5-yr offset, as a twin split of
80
+ // 1e-6″ at −100 kyr / 7e-6″ at −1 Myr in ε — invisible to every gate until the bank,
81
+ // walked by the tools/lib twin, had to be bit-identical to this walk.
82
+ axialPrecessionYearsAtYearFn: (yr) => deepLod.lunisolarTorquePeriodYearsAtAge(yearToTMa(yr)) ?? axial0,
78
83
  // THE PRECESSION OF DATE: on top of the secular law above, the solar
79
84
  // torque at the eccentricity of date and the oblateness of date from
80
85
  // the GIA channel — both exactly 1 at J2000, so the J2000 anchor is
@@ -84,6 +89,10 @@ export function assembleOneSourceMovement(ctx) {
84
89
  solarTorqueShareJ2000: EPOCH_PARAMS.precessionSolarShareJ2000,
85
90
  // options.giaEllipticityOfDate === false: the orbital forcing alone (the T1 line derivation).
86
91
  dynamicalEllipticityRatioAtYearFn: options.giaEllipticityOfDate === false ? undefined : alphaGia.j2RatioAt,
92
+ // PLAN 24 — the spin-axis checkpoint bank (data/spin-axis-checkpoints.json, loaded by the
93
+ // API and the Node scene beside the series; never part of the hash): a deep jump walks at
94
+ // most one spacing from the nearest banked state, bit-identical to the continuous walk.
95
+ spinCheckpoints: options.spinCheckpointsArtifact ?? undefined,
87
96
  });
88
97
  // PER-TIER ROUTING (the anomalistic-contamination fix): one sampler PER
89
98
  // grid tier, built on first entry and KEPT — a query always reads the
@@ -163,59 +163,63 @@ function createMoonArguments({ constants, fns }) {
163
163
  return kPl;
164
164
  }
165
165
  // ── Deep-time carrier tables ────────────────────────────────────────────────
166
- // In the era (|T| ≤ CARRIER_DENSE_CY = 250 kyr) each carrier is the Simpson
167
- // sum below, untouched — the certified numbers. Beyond, the integral
168
- // continues from the dense edge on a cumulative table of CARRIER_CELL_CY
169
- // cells (1 kyr; per-cell 3-point Simpson, a 3-point Simpson over the
170
- // partial last cell), grown in CARRIER_CHUNK cells in the direction asked
171
- // for. The former form re-integrated the whole span from J2000 on EVERY
172
- // call with N ∝ |T| nodes — 77 evaluations of the e channel at 300 kyr,
173
- // 2,500 at 10 Myr, per lunar argument set and frame — the deep-time
174
- // playback cost the owner measured (the loop's JS at 190 ms a frame).
175
- const CARRIER_DENSE_CY = 2500, CARRIER_CELL_CY = 10, CARRIER_CHUNK = 2500;
166
+ // Every carrier is ∫₀ᵀ f dt on ONE cumulative table per direction: fine
167
+ // cells of CARRIER_FINE_CY (100 yr) to ±CARRIER_FINE_RANGE_CY (250 kyr),
168
+ // grown in CARRIER_FINE_CHUNK cells (10 kyr — an in-window call never
169
+ // samples deeper than it must), then CARRIER_CELL_CY cells (1 kyr) grown in
170
+ // CARRIER_CHUNK (the former deep tier, unchanged); per-cell 3-point Simpson
171
+ // and a 3-point Simpson over the partial last cell. Continuous in value AND
172
+ // in rate: the per-cell error is fixed by the cell, so nothing jumps when T
173
+ // grows. (Plan 23 follow-up, measured on the Node Regression panel: the
174
+ // in-era form was one Simpson from J2000 to T whose node count stepped every
175
+ // 2 kyr (obliquity) / 8 kyr (planetary), so the accumulated error jumped
176
+ // there — 0.3–6″ on the obliquity carrier at 20–250 kyr, 10–15″ on the
177
+ // planetary one at ±6/22 kyr — invisible on L′'s rate, a notch of 0.5 d on
178
+ // the node period once the remainder rode Ω. The earlier form that
179
+ // re-integrated the whole span on every call cost the deep-time playback
180
+ // 190 ms a frame — the owner's measurement behind the tables.)
181
+ const CARRIER_FINE_CY = 1, CARRIER_FINE_RANGE_CY = 2500, CARRIER_FINE_CHUNK = 100;
182
+ const CARRIER_CELL_CY = 10, CARRIER_CHUNK = 2500;
176
183
  /** @param {(t: number) => number} f the SCALED integrand per century
177
- * @param {(T: number) => number} dense the in-era Simpson (its value at ±CARRIER_DENSE_CY seeds the table)
178
- * @returns {(T: number) => number} */
179
- function makeDeepCarrier(f, dense) {
180
- /** @type {{ fwd: number[] | null, bwd: number[] | null }} */
184
+ * @returns {(T: number) => number} ∫₀ᵀ f dt, T in Julian centuries (signed) */
185
+ function makeDeepCarrier(f) {
186
+ /** @type {{ fwd: {fine: number[], coarse: number[] | null} | null, bwd: {fine: number[], coarse: number[] | null} | null }} */
181
187
  const sides = { fwd: null, bwd: null };
188
+ const NF = CARRIER_FINE_RANGE_CY / CARRIER_FINE_CY;
189
+ /** The signed cell integral from t0 (nearer J2000) to t1. @param {number} t0 @param {number} t1 */
190
+ const cell = (t0, t1) => (f(t0) + 4 * f((t0 + t1) / 2) + f(t1)) * ((t1 - t0) / 6);
191
+ /** @param {{fine: number[]}} s @param {number} dir @param {number} upTo grow the fine table to this many cells */
192
+ const growFine = (s, dir, upTo) => {
193
+ for (let i = s.fine.length; i <= upTo; i++) s.fine.push(s.fine[i - 1] + cell(dir * (i - 1) * CARRIER_FINE_CY, dir * i * CARRIER_FINE_CY));
194
+ };
182
195
  return (T) => {
183
- if (Math.abs(T) <= CARRIER_DENSE_CY) return dense(T);
184
- const dir = T > 0 ? 1 : -1;
185
- let cum = dir === 1 ? sides.fwd : sides.bwd;
186
- if (!cum) { cum = [dense(dir * CARRIER_DENSE_CY)]; if (dir === 1) sides.fwd = cum; else sides.bwd = cum; }
187
- const dist = Math.abs(T) - CARRIER_DENSE_CY;
196
+ if (T === 0) return 0;
197
+ const dir = T > 0 ? 1 : -1, a = Math.abs(T);
198
+ let s = dir === 1 ? sides.fwd : sides.bwd;
199
+ if (!s) { s = { fine: [0], coarse: null }; if (dir === 1) sides.fwd = s; else sides.bwd = s; }
200
+ if (a <= CARRIER_FINE_RANGE_CY) {
201
+ const k = Math.floor(a / CARRIER_FINE_CY);
202
+ if (s.fine.length < k + 2) growFine(s, dir, Math.min(NF, Math.ceil((k + 1) / CARRIER_FINE_CHUNK) * CARRIER_FINE_CHUNK));
203
+ return s.fine[k] + cell(dir * k * CARRIER_FINE_CY, T);
204
+ }
205
+ if (!s.coarse) { growFine(s, dir, NF); s.coarse = [s.fine[NF]]; }
206
+ const dist = a - CARRIER_FINE_RANGE_CY;
188
207
  const k = Math.floor(dist / CARRIER_CELL_CY);
189
- let target = cum.length;
208
+ let target = s.coarse.length;
190
209
  while (target < k + 2) target += CARRIER_CHUNK;
191
- for (let i = cum.length; i < target; i++) {
192
- const t0 = dir * (CARRIER_DENSE_CY + (i - 1) * CARRIER_CELL_CY), t1 = t0 + dir * CARRIER_CELL_CY;
193
- cum.push(cum[i - 1] + dir * (f(t0) + 4 * f((t0 + t1) / 2) + f(t1)) * (CARRIER_CELL_CY / 6));
210
+ for (let i = s.coarse.length; i < target; i++) {
211
+ const t0 = dir * (CARRIER_FINE_RANGE_CY + (i - 1) * CARRIER_CELL_CY);
212
+ s.coarse.push(s.coarse[i - 1] + cell(t0, t0 + dir * CARRIER_CELL_CY));
194
213
  }
195
- const ta = dir * (CARRIER_DENSE_CY + k * CARRIER_CELL_CY);
196
- const hp = T - ta;
197
- return cum[k] + (f(ta) + 4 * f(ta + hp / 2) + f(T)) * (hp / 6);
214
+ return s.coarse[k] + cell(dir * (CARRIER_FINE_RANGE_CY + k * CARRIER_CELL_CY), T);
198
215
  };
199
216
  }
200
217
 
201
- /** The planetary carrier's SCALED integrand, k_PL · (e² − e0²), per century. @param {number} t */
218
+ /** The planetary carrier's SCALED integrand, k_PL · (e² − e0²), per century
219
+ * (e0 the channel's anchor CONST — not eccAt(0), which under integrated
220
+ * phase carries the R3 drift correction, the 8.2-2 convention). @param {number} t */
202
221
  const planetaryIntegrand = (t) => { const e = eccAt(t * 100); return kPlValue() * (e * e - eccE0 * eccE0); };
203
- /** @param {number} T @returns {number} */
204
- function planetaryCarrierDense(T) {
205
- if (T === 0) return 0;
206
- const k = kPlValue();
207
- // The channel's e0 anchor CONST — not eccAt(0), which under integrated
208
- // phase carries the R3 drift correction (the 8.2-2 convention).
209
- const e0sq = eccE0 * eccE0;
210
- /** @param {number} t */
211
- const f = (t) => { const e = eccAt(t * 100); return e * e - e0sq; };
212
- const N = Math.max(2, 2 * Math.ceil(Math.abs(T) * 100 / 8000));
213
- const h = T / N;
214
- let sum = f(0) + f(T);
215
- for (let i = 1; i < N; i++) sum += f(i * h) * (i % 2 ? 4 : 2);
216
- return k * sum * h / 3;
217
- }
218
- const planetaryCarrier = makeDeepCarrier(planetaryIntegrand, planetaryCarrierDense);
222
+ const planetaryCarrier = makeDeepCarrier(planetaryIntegrand);
219
223
 
220
224
  /** @type {{eps0: number, C: number} | null} */
221
225
  let obl = null;
@@ -238,19 +242,7 @@ function createMoonArguments({ constants, fns }) {
238
242
  }
239
243
  /** The obliquity carrier's SCALED integrand, C · (ε − ε0), per century. @param {number} t */
240
244
  const obliquityIntegrand = (t) => { const O = oblInit(); return O.C * (computeObliquityEarth(2000 + t * 100) - O.eps0); };
241
- /** @param {number} T @returns {number} */
242
- function obliquityCarrierDense(T) {
243
- if (T === 0) return 0;
244
- const O = oblInit();
245
- /** @param {number} t */
246
- const f = (t) => computeObliquityEarth(2000 + t * 100) - O.eps0;
247
- const N = Math.max(2, 2 * Math.ceil(Math.abs(T) * 100 / 2000));
248
- const h = T / N;
249
- let sum = f(0) + f(T);
250
- for (let i = 1; i < N; i++) sum += f(i * h) * (i % 2 ? 4 : 2);
251
- return O.C * sum * h / 3;
252
- }
253
- const obliquityCarrier = makeDeepCarrier(obliquityIntegrand, obliquityCarrierDense);
245
+ const obliquityCarrier = makeDeepCarrier(obliquityIntegrand);
254
246
 
255
247
  /** The frame share's REMAINDER for ϖ and Ω (plan 23). The physical exponents gave
256
248
  * up the frame's T² the Meeus-effective pair carried (T2F, Lieske's); pFix
@@ -307,24 +299,20 @@ function createMoonArguments({ constants, fns }) {
307
299
  const d2Ch = (e2(10) - 2 * e2(0) + e2(-10)) / 100;
308
300
  secComp = { dd2: d2Sec - d2Ch, d3Sec, Tq: SECULAR_COMPLETION_TAPER_YEARS / 100 };
309
301
  }
310
- const S = secComp;
311
- /** @param {number} t */
312
- const f = (t) => {
313
- const q = Math.abs(t) / S.Tq;
314
- if (q >= 1) return 0;
315
- const env = Math.cos(Math.PI / 2 * q) ** 2;
316
- return (0.5 * S.dd2 * t * t + S.d3Sec * t * t * t / 6) * env;
317
- };
318
- // Beyond the era the envelope has long closed (|t| ≥ Tq ≈ 279 cy → 0): the
319
- // integral is the constant to ±Tq, so integrate exactly that span instead of
320
- // N ∝ |T| nodes of zeros (in-era calls untouched).
321
- if (Math.abs(T) > CARRIER_DENSE_CY) T = Math.sign(T) * S.Tq;
322
- const N = Math.max(2, 2 * Math.ceil(Math.abs(T) * 100 / 2000));
323
- const h = T / N;
324
- let sum = f(0) + f(T);
325
- for (let i = 1; i < N; i++) sum += f(i * h) * (i % 2 ? 4 : 2);
326
- return kPlValue() * sum * h / 3;
302
+ // Beyond the taper the envelope has closed (|t| ≥ Tq ≈ 279 cy → 0): the
303
+ // integral is the constant to ±Tq, so the table is read at ±Tq there.
304
+ const Tq = secComp.Tq;
305
+ return secCarrier(Math.abs(T) > Tq ? Math.sign(T) * Tq : T);
327
306
  }
307
+ /** The completion's SCALED integrand, k_PL · the tapered curvature difference, per century. @param {number} t */
308
+ const secIntegrand = (t) => {
309
+ const S = /** @type {{dd2: number, d3Sec: number, Tq: number}} */ (secComp);
310
+ const q = Math.abs(t) / S.Tq;
311
+ if (q >= 1) return 0;
312
+ const env = Math.cos(Math.PI / 2 * q) ** 2;
313
+ return kPlValue() * (0.5 * S.dd2 * t * t + S.d3Sec * t * t * t / 6) * env;
314
+ };
315
+ const secCarrier = makeDeepCarrier(secIntegrand);
328
316
 
329
317
  // ── Deep-time branch: always-chains (Stage B) ────────────────────────────
330
318
  /** @type {number | null} */
@@ -2,7 +2,7 @@
2
2
  // The fitted coefficients' shapes for TypeScript consumers (§2g); values live
3
3
  // in coefficients.js, emitted VERBATIM from the fit artifacts under data/.
4
4
 
5
- export declare const COEFFICIENTS_HASH: "1d7ef7b022b91f6c";
5
+ export declare const COEFFICIENTS_HASH: "a1e5567e03d1936e";
6
6
 
7
7
  export declare const FITTED_COEFFICIENTS: {
8
8
  readonly BALANCE_PRESETS: Array<Array<number | string>>;
@@ -310,7 +310,7 @@ export declare const FITTED_COEFFICIENTS: {
310
310
  "ratio": number;
311
311
  "label": string;
312
312
  };
313
- "39.5560": {
313
+ "39.5561": {
314
314
  "period_kyr": number;
315
315
  "lr04_post_mpt_amp": number;
316
316
  "epica_amp": number;
@@ -324,7 +324,7 @@ export declare const FITTED_COEFFICIENTS: {
324
324
  "ratio": number;
325
325
  "label": string;
326
326
  };
327
- "40.9239": {
327
+ "40.9240": {
328
328
  "period_kyr": number;
329
329
  "lr04_post_mpt_amp": number;
330
330
  "epica_amp": number;
@@ -15,6 +15,7 @@
15
15
  * axialPrecessionYearsAtYearFn?: (year: number) => number,
16
16
  * solarTorqueShareJ2000?: number,
17
17
  * dynamicalEllipticityRatioAtYearFn?: (year: number) => number,
18
+ * spinCheckpoints?: { spacingYr: number, checkpoints: ReadonlyArray<{t: number, s: number[]}> },
18
19
  * }} deps — mode tables from the governed deep artifact (choose the ζ tier
19
20
  * per consumer: era = its own 8-term extraction, deep = the 16-term
20
21
  * table; NEVER a slice); anchors from the chain artifact's one home; the
@@ -34,7 +35,7 @@
34
35
  * factors on the precession constant (see alphaAtGeneral below); absent,
35
36
  * the constant is the secular law alone, bit-identical.
36
37
  */
37
- export function createDeepOrbitalHistory({ zModes, zetaModes, zetaSeries, zSeries, anchorE, anchorPeriEclipticDeg, anchorInclEclipticDeg, anchorAscNodeEclipticDeg, axialPrecessionYearsJ2000, obliquityJ2000Deg, axialPrecessionYearsAtYearFn, solarTorqueShareJ2000, dynamicalEllipticityRatioAtYearFn, }: {
38
+ export function createDeepOrbitalHistory({ zModes, zetaModes, zetaSeries, zSeries, anchorE, anchorPeriEclipticDeg, anchorInclEclipticDeg, anchorAscNodeEclipticDeg, axialPrecessionYearsJ2000, obliquityJ2000Deg, axialPrecessionYearsAtYearFn, solarTorqueShareJ2000, dynamicalEllipticityRatioAtYearFn, spinCheckpoints, }: {
38
39
  zModes: ReadonlyArray<{
39
40
  omegaRadPerYr: number;
40
41
  re: number;
@@ -66,6 +67,13 @@ export function createDeepOrbitalHistory({ zModes, zetaModes, zetaSeries, zSerie
66
67
  axialPrecessionYearsAtYearFn?: (year: number) => number;
67
68
  solarTorqueShareJ2000?: number;
68
69
  dynamicalEllipticityRatioAtYearFn?: (year: number) => number;
70
+ spinCheckpoints?: {
71
+ spacingYr: number;
72
+ checkpoints: ReadonlyArray<{
73
+ t: number;
74
+ s: number[];
75
+ }>;
76
+ };
69
77
  }): {
70
78
  build: (t0Yr: number, t1Yr: number, stepYr: number) => {
71
79
  /** @param {number} tYr */
@@ -85,6 +93,17 @@ export function createDeepOrbitalHistory({ zModes, zetaModes, zetaSeries, zSerie
85
93
  generalPrecessionLonRateDegPerYr: number;
86
94
  };
87
95
  };
96
+ recordStates: (tEndYr: number, spacingYr: number) => Array<{
97
+ t: number;
98
+ s: number[];
99
+ }>;
100
+ walkFrom: (s: number[], t: number, tEnd: number, fixedStepYr?: number) => {
101
+ s: number[];
102
+ t: number;
103
+ };
104
+ stepYearsAt: (t: number) => number;
105
+ stateJ2000: number[];
106
+ bankLoaded: boolean;
88
107
  alphaArcsecPerYr: number;
89
108
  alphaLunisolarArcsecPerYr: number;
90
109
  axialPrecessionYearsLunisolarJ2000: number;
package/types/index.d.ts CHANGED
@@ -31,6 +31,7 @@ export function createModel(constants?: Constants, opts?: {
31
31
  };
32
32
  secularSeriesArtifact?: any;
33
33
  giaEllipticityOfDate?: boolean;
34
+ spinCheckpointsArtifact?: any;
34
35
  }): Model;
35
36
  export type Constants = Record<string, unknown> & {
36
37
  hash?: string;
@@ -16,9 +16,19 @@ export type Laws = {
16
16
  * FORCING alone. The T1 exporter derives the climate lines' obliquity rate on it, so the lines
17
17
  * cannot depend on their own fit (v23.0; measured 3e-5 of the rate, 2–3 yr of period). Default true =
18
18
  * the shipped physics.
19
+ * `spinCheckpointsArtifact` (plan 24): the parsed spin-axis checkpoint bank — the walk's exact state
20
+ * every 250 kyr; a deep read then walks at most one spacing, bit-identical to the full walk. Null =
21
+ * the full walk from J2000.
19
22
  */
20
23
  export type Options = {
21
24
  giaEllipticityOfDate?: boolean;
25
+ spinCheckpointsArtifact?: {
26
+ spacingYr: number;
27
+ checkpoints: ReadonlyArray<{
28
+ t: number;
29
+ s: number[];
30
+ }>;
31
+ } | null;
22
32
  };
23
33
  /**
24
34
  * The forward bindings — what an early slice reads at call time from a later one. Typed by the