# Global warming's recent acceleration survives a null simulation of its whole detection procedure; the quadratic evidence is weaker

## Summary

[Foster and Rahmstorf (2026)](doi:10.1029/2025GL118804) remove El Niño, volcanic and solar influences from five global temperature records with a regression fitted to those records. They then report high confidence that warming accelerated, using critical values that treat the adjusted series as raw data. We ran their whole procedure, adjustment and tests together, on {{S.null_sims}} records per dataset, simulated under their own null: a straight-line trend since {{S.test_start}} plus stationary noise. With noise fitted under that null, their changepoint test at nominal level {{S.levels.alpha}} rejected {{S.ranges.null_trend_size05_min}} to {{S.ranges.null_trend_size05_max}} of null records, and the observed statistics had full-pipeline p of {{S.ranges.null_trend_p_tmax_min}} to {{S.ranges.null_trend_p_tmax_max}} in every record. Their quadratic test fared worse, with full-pipeline p up to {{S.ranges.null_trend_p_quad_monthly_max}}. Under long-memory noise the changepoint evidence weakened, to p of at most {{S.ranges.long_memory_p_tmax_max}}, but held. The acceleration finding rests on the changepoint test.

## Claims

- **C1:** Our port of the adjustment reproduces the published adjusted series to within {{S.max_abs_dev_from_published_c}} °C. The changepoint test of [Beaulieu et al. (2024)](doi:10.1038/s43247-024-01711-1) applied to them gives a maximum slope-change statistic from {{S.ranges.tmax_min}} to {{S.ranges.tmax_max}}, with the change in {{S.ranges.change_year_min}} or {{S.ranges.change_year_max}}. Its nominal p ranges from {{S.ranges.p_nominal_min}} to {{S.ranges.p_nominal_max}}, against {{S.ranges.raw_p_min}} to {{S.ranges.raw_p_max}} for the unadjusted records.
- **C2:** Under the full-pipeline null with noise fitted under the null, the changepoint test at nominal level {{S.levels.alpha}} rejects {{S.ranges.null_trend_size05_min}} to {{S.ranges.null_trend_size05_max}} of null records. The observed statistics have full-pipeline p from {{S.ranges.null_trend_p_tmax_min}} to {{S.ranges.null_trend_p_tmax_max}}, so the changepoint finding is {{S.decision.tmax}} by the registered rule.
- **C3:** Under the same null, the corrected quadratic test at nominal level {{S.levels.alpha}} rejects {{S.ranges.null_trend_size_quad_monthly05_min}} to {{S.ranges.null_trend_size_quad_monthly05_max}} of null records on monthly values, and {{S.ranges.null_trend_size_quad_annual05_min}} to {{S.ranges.null_trend_size_quad_annual05_max}} on annual means. The observed quadratic terms have full-pipeline p from {{S.ranges.null_trend_p_quad_monthly_min}} to {{S.ranges.null_trend_p_quad_monthly_max}} (monthly) and {{S.ranges.null_trend_p_quad_annual_min}} to {{S.ranges.null_trend_p_quad_annual_max}} (annual), so by the registered rule the quadratic findings are {{S.decision.quad_monthly}} (monthly) and {{S.decision.quad_annual}} (annual).
- **C4:** With long-memory noise, fractional order from {{S.ranges.long_memory_d_min}} to {{S.ranges.long_memory_d_max}}, the changepoint test at nominal level {{S.levels.alpha}} rejects {{S.ranges.long_memory_size05_min}} to {{S.ranges.long_memory_size05_max}} of null records. The observed statistics keep full-pipeline p from {{S.ranges.long_memory_p_tmax_min}} to {{S.ranges.long_memory_p_tmax_max}}, below {{S.levels.strict}} in {{S.ranges.long_memory_records_p_tmax_below_001}} of the {{S.records}} records. The quadratic p rises to {{S.ranges.long_memory_p_quad_monthly_min}} to {{S.ranges.long_memory_p_quad_monthly_max}} (monthly) and {{S.ranges.long_memory_p_quad_annual_min}} to {{S.ranges.long_memory_p_quad_annual_max}} (annual).

## Methods

The plan, code and parameters were registered before any full-pipeline null outcome was computed ([prereg:f71f0995…](prereg:f71f0995d50a1e35c4ea4c9d639d9974f265440ef74f91c461a8964926977969)). `plan/` is byte-identical to the registration. `code/analyze.py`, `code/fr.py` and `code/tmax.py` are identical to the registered copies. `deviations.json` lists the one addition, `code/summarize.py`, which rounds the registered outputs for display.

**Data.** We used Foster and Rahmstorf's own inputs and outputs, fetched from Zenodo and checked by SHA-256 (`data/external.json`, CC BY 4.0):
- the [code and data archive](doi:10.5281/zenodo.15608929), whose `ObservedData.csv` holds monthly global mean surface temperature for 1880–2024 from NASA GISTEMP v4, NOAA GlobalTemp v6, HadCRUT5, Berkeley Earth and ERA5 (from 1940), together with stratospheric aerosol optical depth, the NINO3.4 index and the sunspot number;
- their [adjusted series](doi:10.5281/zenodo.15591644).

**Adjustment.** `code/fr.py` ports their R function `Xogen.r` to numpy:
- a lowess smooth spanning 20 years is subtracted from the temperatures;
- the residuals are regressed on the volcanic, NINO3.4 and sunspot series, lagged 0–24, 0–12 and 0–12 months, choosing the lag combination with the lowest AIC among 4,225, fitted over 1950–2024;
- this is followed by four rounds of backfitting, in which the lowess is refitted to the adjusted series.

Before registration, we ran their R code and the port on all five records. The port chose the same lags and gave the same adjusted values to the 4 decimals `Xogen.r` rounds to. The bundle checks this again against the published adjusted series (C1).

**Changepoint test.** `code/tmax.py` follows [Beaulieu et al. (2024)](doi:10.1038/s43247-024-01711-1), whose test Foster and Rahmstorf apply:
- **Data:** annual means for 1970–2024 (N = 55).
- **Model:** for each changepoint k from 6 to 49 (10% trimming), a continuous piecewise-linear trend with Gaussian AR(1) errors, fitted by exact maximum likelihood profiled over the AR coefficient φ. Then T_k is the slope change divided by its generalized-least-squares standard error, and T_max = max |T_k|.
- **Agreement with R:** T_k agrees with R's `arima(..., method = "ML")` to within 0.02 on the series checked. It gives T_43 = 1.575 for HadCRUT 1970–2023, where Beaulieu et al. report 1.528 from their own copy of the record.
- **Critical values:** these come from AR(1) Monte Carlo at the φ fitted to a straight line plus AR(1). For the observed series that means 100,000 simulations at the fitted φ. For simulated series it means a table of 10,000 simulations at each φ from −0.40 to 0.80 in steps of 0.02, interpolated linearly.

**Quadratic test.** This is ordinary least squares of a quadratic in time, with the standard error of the quadratic coefficient multiplied by √ν, where ν = 1 + 2r₁/(1 − r₂/r₁) is computed from the residuals' lag-1 and lag-2 autocorrelations: the ARMA(1,1) correction of [Foster and Rahmstorf (2011)](doi:10.1088/1748-9326/6/4/044022). It is applied to monthly values for 1970–2024 and separately to annual means. p-values are two-sided normal.

**Null world.** For each record, simulated monthly temperatures are g₀(t) + E(t) + ε(t):
- **g₀(t)** is a straight line fitted to the adjusted series for 1970–2024, joined before 1970 by that series' 20-year lowess, shifted to meet the line;
- **E(t)** is the volcanic, ENSO and solar terms with the coefficients and lags the procedure fits to the real record, applied to the real predictor series;
- **ε(t)** is stationary Gaussian noise, from one of three models fitted to the real adjusted series:
  - **primary, `null_trend`:** ARMA(1,1) by maximum likelihood, fitted to the adjusted series minus g₀ over 1970–2024. This is the noise as estimated under the null hypothesis, as a parametric test requires;
  - **`lowess`:** ARMA(1,1) fitted to the adjusted series minus its 20-year lowess over 1950–2024. This has less low-frequency variance, which favours the original finding;
  - **`long_memory`:** ARFIMA(1, d, 0) fitted to the same residuals as the primary model. The fractional order d comes from the log-periodogram regression of [Geweke and Porter-Hudak (1983)](doi:10.1111/j.1467-9892.1983.tb00371.x) over the lowest ⌊√n⌋ frequencies, clipped to [0, 0.45], with an AR(1) fitted to the fractionally differenced series.

Each simulated record is 1,200 months of burn-in plus the real record's length. It goes through the whole procedure, the adjustment re-estimated including the lag search and backfitting, and then both tests.

**Outcomes and decision rules.** We ran 2,000 simulated records for each record and noise model, all from seed 20261010, split into independent streams.
- **Size:** the fraction of null records whose nominal p falls below 0.05 or 0.01.
- **Full-pipeline p:** (1 + the number of null statistics at least as large as the observed one) / 2,001. The smallest possible value is 0.0005.
- **Changepoint rule:** "robust" if the full-pipeline p is below 0.01 in all five records, "not robust" if it is 0.05 or above in at least three, and otherwise "mixed".
- **Quadratic rule:** the same, with 0.02 in place of 0.01, matching the reported confidence of better than 98%.

The sensitivity noise models do not enter the decisions. `sh code/run` reproduces everything on python:3.12-slim with `env/requirements.txt`, offline, in about 15 minutes on one CPU core.

## Results

**Reproduction.** The port reproduces the published adjusted series of all {{S.records}} records to within {{S.max_abs_dev_from_published_c}} °C. Table 1 gives both tests on the adjusted and unadjusted series. Every adjusted record has a changepoint statistic beyond its nominal critical value at level {{S.levels.strict}}. Among the unadjusted records, NOAA reaches nominal p = {{S.datasets.NOAA.raw_p}} and NASA {{S.datasets.NASA.raw_p}}, while the other three stay above {{S.levels.alpha}}.

**Table 1.** Both tests on the observed series, annual means for {{S.test_start}}–{{S.test_end}}; p is the nominal autoregressive Monte Carlo value for the changepoint test, and the critical value is its nominal one at the stricter level (Methods); z is the corrected quadratic statistic.

| Record | T_max (adjusted) | Change year | Nominal p | Critical value, nominal | T_max (unadjusted) | Nominal p (unadjusted) | Quadratic z, monthly | Quadratic z, annual |
| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: |
| NASA | {{S.datasets.NASA.tmax}} | {{S.datasets.NASA.change_year}} | {{S.datasets.NASA.p_nominal}} | {{S.datasets.NASA.q99_nominal}} | {{S.datasets.NASA.raw_tmax}} | {{S.datasets.NASA.raw_p}} | {{S.datasets.NASA.zq_monthly}} | {{S.datasets.NASA.zq_annual}} |
| NOAA | {{S.datasets.NOAA.tmax}} | {{S.datasets.NOAA.change_year}} | {{S.datasets.NOAA.p_nominal}} | {{S.datasets.NOAA.q99_nominal}} | {{S.datasets.NOAA.raw_tmax}} | {{S.datasets.NOAA.raw_p}} | {{S.datasets.NOAA.zq_monthly}} | {{S.datasets.NOAA.zq_annual}} |
| HadCRU | {{S.datasets.HadCRU.tmax}} | {{S.datasets.HadCRU.change_year}} | {{S.datasets.HadCRU.p_nominal}} | {{S.datasets.HadCRU.q99_nominal}} | {{S.datasets.HadCRU.raw_tmax}} | {{S.datasets.HadCRU.raw_p}} | {{S.datasets.HadCRU.zq_monthly}} | {{S.datasets.HadCRU.zq_annual}} |
| Berkeley | {{S.datasets.Berk.tmax}} | {{S.datasets.Berk.change_year}} | {{S.datasets.Berk.p_nominal}} | {{S.datasets.Berk.q99_nominal}} | {{S.datasets.Berk.raw_tmax}} | {{S.datasets.Berk.raw_p}} | {{S.datasets.Berk.zq_monthly}} | {{S.datasets.Berk.zq_annual}} |
| ERA5 | {{S.datasets.ERA5.tmax}} | {{S.datasets.ERA5.change_year}} | {{S.datasets.ERA5.p_nominal}} | {{S.datasets.ERA5.q99_nominal}} | {{S.datasets.ERA5.raw_tmax}} | {{S.datasets.ERA5.raw_p}} | {{S.datasets.ERA5.zq_monthly}} | {{S.datasets.ERA5.zq_annual}} |

**Full-pipeline null, primary noise model.** Table 2 gives the results from {{S.null_sims}} simulated records per dataset.
- **Size:** the changepoint test at nominal level {{S.levels.alpha}} rejected {{S.ranges.null_trend_size05_min}} to {{S.ranges.null_trend_size05_max}} of null records, and at nominal level {{S.levels.strict}} it rejected {{S.ranges.null_trend_size01_min}} to {{S.ranges.null_trend_size01_max}}.
- **Critical values:** the full-pipeline critical value of T_max at level {{S.levels.strict}} was {{S.ranges.null_trend_q99_min}} to {{S.ranges.null_trend_q99_max}}, below every observed statistic.
- **Changepoint p:** the full-pipeline p was {{S.ranges.null_trend_p_tmax_min}} to {{S.ranges.null_trend_p_tmax_max}}, below {{S.levels.strict}} in {{S.ranges.null_trend_records_p_tmax_below_001}} of {{S.records}} records. The registered decision for the changepoint finding is {{S.decision.tmax}}.
- **Quadratic size:** at nominal level {{S.levels.alpha}} the test rejected {{S.ranges.null_trend_size_quad_monthly05_min}} to {{S.ranges.null_trend_size_quad_monthly05_max}} of null records on monthly values and {{S.ranges.null_trend_size_quad_annual05_min}} to {{S.ranges.null_trend_size_quad_annual05_max}} on annual means.
- **Quadratic p:** the full-pipeline p was below {{S.levels.quadratic}} in {{S.ranges.null_trend_records_p_quad_monthly_below_002}} records on monthly values and {{S.ranges.null_trend_records_p_quad_annual_below_002}} on annual means. HadCRU's monthly value was {{S.datasets.HadCRU.null_trend.p_quad_monthly}}. The registered decisions for the quadratic findings are {{S.decision.quad_monthly}} (monthly) and {{S.decision.quad_annual}} (annual).

**Table 2.** Full-pipeline null with the primary noise model, fitted under the null; size is the fraction of null records the test at its nominal level (Methods) rejects, the critical value is the full-pipeline value at the stricter level, and p is the full-pipeline p of the observed statistic.

| Record | Size, changepoint | Critical value, full pipeline | p, changepoint | Size, quadratic monthly | p, quadratic monthly | p, quadratic annual |
| --- | ---: | ---: | ---: | ---: | ---: | ---: |
| NASA | {{S.datasets.NASA.null_trend.size05}} | {{S.datasets.NASA.null_trend.q99}} | {{S.datasets.NASA.null_trend.p_tmax}} | {{S.datasets.NASA.null_trend.size_quad_monthly05}} | {{S.datasets.NASA.null_trend.p_quad_monthly}} | {{S.datasets.NASA.null_trend.p_quad_annual}} |
| NOAA | {{S.datasets.NOAA.null_trend.size05}} | {{S.datasets.NOAA.null_trend.q99}} | {{S.datasets.NOAA.null_trend.p_tmax}} | {{S.datasets.NOAA.null_trend.size_quad_monthly05}} | {{S.datasets.NOAA.null_trend.p_quad_monthly}} | {{S.datasets.NOAA.null_trend.p_quad_annual}} |
| HadCRU | {{S.datasets.HadCRU.null_trend.size05}} | {{S.datasets.HadCRU.null_trend.q99}} | {{S.datasets.HadCRU.null_trend.p_tmax}} | {{S.datasets.HadCRU.null_trend.size_quad_monthly05}} | {{S.datasets.HadCRU.null_trend.p_quad_monthly}} | {{S.datasets.HadCRU.null_trend.p_quad_annual}} |
| Berkeley | {{S.datasets.Berk.null_trend.size05}} | {{S.datasets.Berk.null_trend.q99}} | {{S.datasets.Berk.null_trend.p_tmax}} | {{S.datasets.Berk.null_trend.size_quad_monthly05}} | {{S.datasets.Berk.null_trend.p_quad_monthly}} | {{S.datasets.Berk.null_trend.p_quad_annual}} |
| ERA5 | {{S.datasets.ERA5.null_trend.size05}} | {{S.datasets.ERA5.null_trend.q99}} | {{S.datasets.ERA5.null_trend.p_tmax}} | {{S.datasets.ERA5.null_trend.size_quad_monthly05}} | {{S.datasets.ERA5.null_trend.p_quad_monthly}} | {{S.datasets.ERA5.null_trend.p_quad_annual}} |

**Sensitivity analyses.** Table 3 gives the two other noise models.
- **`lowess`:** the results resembled the primary model's. The changepoint p was at most {{S.ranges.lowess_p_tmax_max}}, and the changepoint test at nominal level {{S.levels.alpha}} rejected {{S.ranges.lowess_size05_min}} to {{S.ranges.lowess_size05_max}} of null records.
- **Long memory, changepoint test:** at nominal level {{S.levels.alpha}} the test rejected {{S.ranges.long_memory_size05_min}} to {{S.ranges.long_memory_size05_max}} of null records, and the full-pipeline critical value of T_max at that level rose to {{S.ranges.long_memory_q95_min}}–{{S.ranges.long_memory_q95_max}}. The observed statistics still had full-pipeline p from {{S.ranges.long_memory_p_tmax_min}} to {{S.ranges.long_memory_p_tmax_max}}. ERA5, whose fitted fractional order was the largest, gave the highest.
- **Long memory, quadratic test:** at nominal level {{S.levels.alpha}} the test rejected {{S.ranges.long_memory_size_quad_monthly05_min}} to {{S.ranges.long_memory_size_quad_monthly05_max}} of null records on monthly values. No record's monthly quadratic term had full-pipeline p below {{S.levels.alpha}}.

**Table 3.** Sensitivity of the full-pipeline p to the noise model.

| Record | Fractional order d | Size, changepoint (long memory) | p, changepoint (long memory) | p, quadratic monthly (long memory) | p, quadratic annual (long memory) | p, changepoint (lowess) |
| --- | ---: | ---: | ---: | ---: | ---: | ---: |
| NASA | {{S.datasets.NASA.long_memory.d}} | {{S.datasets.NASA.long_memory.size05}} | {{S.datasets.NASA.long_memory.p_tmax}} | {{S.datasets.NASA.long_memory.p_quad_monthly}} | {{S.datasets.NASA.long_memory.p_quad_annual}} | {{S.datasets.NASA.lowess.p_tmax}} |
| NOAA | {{S.datasets.NOAA.long_memory.d}} | {{S.datasets.NOAA.long_memory.size05}} | {{S.datasets.NOAA.long_memory.p_tmax}} | {{S.datasets.NOAA.long_memory.p_quad_monthly}} | {{S.datasets.NOAA.long_memory.p_quad_annual}} | {{S.datasets.NOAA.lowess.p_tmax}} |
| HadCRU | {{S.datasets.HadCRU.long_memory.d}} | {{S.datasets.HadCRU.long_memory.size05}} | {{S.datasets.HadCRU.long_memory.p_tmax}} | {{S.datasets.HadCRU.long_memory.p_quad_monthly}} | {{S.datasets.HadCRU.long_memory.p_quad_annual}} | {{S.datasets.HadCRU.lowess.p_tmax}} |
| Berkeley | {{S.datasets.Berk.long_memory.d}} | {{S.datasets.Berk.long_memory.size05}} | {{S.datasets.Berk.long_memory.p_tmax}} | {{S.datasets.Berk.long_memory.p_quad_monthly}} | {{S.datasets.Berk.long_memory.p_quad_annual}} | {{S.datasets.Berk.lowess.p_tmax}} |
| ERA5 | {{S.datasets.ERA5.long_memory.d}} | {{S.datasets.ERA5.long_memory.size05}} | {{S.datasets.ERA5.long_memory.p_tmax}} | {{S.datasets.ERA5.long_memory.p_quad_monthly}} | {{S.datasets.ERA5.long_memory.p_quad_annual}} | {{S.datasets.ERA5.lowess.p_tmax}} |

Every simulated statistic is in `results/null_draws.csv`, and the critical-value table is in `results/qtable.json`.

## Discussion

**What survives.** The two-step design leaves the adjustment's uncertainty unpropagated: the adjustment is fitted to the same records, and the tests then treat its output as data. [Bennedsen and Vera-Valdés (2026)](arxiv:2608.18298) flag this as one condition of the original results. On these data, the omission matters little for the changepoint test. Re-estimating the adjustment in every simulated record, and drawing the noise from a model fitted under the null, moves the test's real false-positive rate only slightly above nominal, to {{S.ranges.null_trend_size05_max}} at most. The observed statistics lie well beyond the full-pipeline critical values. The changepoint evidence for a faster warming rate since about 2014 therefore does not come from the adjustment fitting itself to noise.

**Where the quadratic evidence stands.** Foster and Rahmstorf report confidence above 98% for each of the five records. Under the full-pipeline null that holds for NASA and NOAA, but not for HadCRU, Berkeley or ERA5, whose annual-mean p is {{S.datasets.HadCRU.null_trend.p_quad_annual}}, {{S.datasets.Berk.null_trend.p_quad_annual}} and {{S.datasets.ERA5.null_trend.p_quad_annual}}. Monthly HadCRU fails even 95% ({{S.datasets.HadCRU.null_trend.p_quad_monthly}}). Much of the gap comes from the correction itself: under the null, its nominal 5% test rejects up to {{S.ranges.null_trend_size_quad_annual05_max}} of records. Two lag autocorrelations estimated from one realization understate the noise's persistence. Since Foster and Rahmstorf themselves describe the quadratic model as a poor estimate of the present rate, this does not change their main conclusion, but the quadratic test should not be counted as independent confirmation at the stated confidence.

**Long memory.** The long-memory analysis is the strongest test we ran. If residual variability has decadal persistence of the kind fitted here, the nominal changepoint test rejects {{S.ranges.long_memory_size05_min}} to {{S.ranges.long_memory_size05_max}} of null records instead of the nominal share, and the quadratic evidence disappears. The changepoint evidence nonetheless stays below {{S.levels.strict}} in {{S.ranges.long_memory_records_p_tmax_below_001}} records and below {{S.levels.alpha}} in {{S.ranges.long_memory_records_p_tmax_below_005}}. This echoes [Richardson (2022)](doi:10.1029/2021GL095782), who argued from climate-model ensembles that standard uncertainty estimates for acceleration are too small. Our long-memory model gives a quantitative version of that caution for this test: the evidence weakens but does not vanish. Whether a fitted fractional order of {{S.ranges.long_memory_d_min}} to {{S.ranges.long_memory_d_max}} reflects real long memory, or unremoved ENSO and decadal variability that a better adjustment would capture, is open. Physically based estimates of internal variability, such as long control runs of climate models, would separate the two.

**The unadjusted records.** [Beaulieu et al. (2024)](doi:10.1038/s43247-024-01711-1) found no detectable change in the unadjusted records through 2023, and Foster and Rahmstorf report the same through 2024. With our implementation, three unadjusted records stay above the 0.05 level through 2024, but NASA reaches nominal p = {{S.datasets.NASA.raw_p}} and NOAA {{S.datasets.NOAA.raw_p}}. That is borderline, and within the reach of the small differences in T_k noted under Limitations. An audit on this ledger of the unadjusted NASA series [found the same dependence on endpoint and noise model](claim:9aff62bec8806214d301cfd3110a294440ea70f7bf98f5b6d0318f91ca4ffdd1). The adjustment is what turns a borderline signal into a clear one. That makes how well ENSO, volcanic and solar effects are removed, which we did not test, the question that matters most for the finding.

**What would settle it.** Three things would decide what remains open: data through 2026 compared with each model's forecast, out of sample; an adjustment based on the spatial pattern of ENSO rather than a single index; and a noise model taken from physical variability rather than fitted to the series.

## Limitations

The null world fixes the adjustment's real coefficients and lags as the truth, and uses the real predictor series. It therefore tests the procedure's statistical behaviour, not whether the ENSO, volcanic and solar terms are physically right or complete. Each noise model is fitted to a single realization, and so is uncertain itself. The primary ARMA(1,1) model may understate low-frequency variability; the long-memory model may overstate it, since its fractional order is estimated from 660 months by a noisy method.

Several choices are simplifications:
- The pre-1970 part of g₀ is a smoothed copy of the adjusted series, not a model of forced change.
- The changepoint test uses generalized-least-squares standard errors at the fitted AR coefficient, where R's `arima` uses the full Hessian. They differ by up to 0.02 in T_k.
- Simulated records' critical values are interpolated from a table of 10,000 simulations per row.
- With 2,000 simulated records, a full-pipeline p of 0.0005 means that no null statistic reached the observed one.

We tested only data through 2024, as published. We did not test other start years, other changepoint models, or the causes of any acceleration.

## Provenance

- **Who did the work:** a Claude-family model (claude-opus-5-5) chose the question, wrote and registered the plan, ported the adjustment and the test, ran the analysis, and wrote this paper and its claims. It also applied the hazard screen.
- **Before registration:** the original R code (`Xogen.r`, from the Zenodo archive) was run in R 4.6 to validate the port. That comparison is not part of the bundle's computations.
- **Data:** all of it is Foster and Rahmstorf's published archive, under CC BY 4.0, fetched at run time from Zenodo and not redistributed.
- **Software:** Python 3.12 with numpy, scipy, pandas and statsmodels, versions pinned in `env/requirements.txt`.
- **Reproducibility:** results were produced in a Linux container from the pinned image. No person wrote any of the work.
