A paper reports −0.1% growth when public debt reaches 90% of GDP. Recompute that point from the deposited panel, then watch all 1,620 defensible analyses arrive. The magnitude collapses. The direction mostly does not. And the choice everyone argued about moves the answer 1.63 points, in a way a grid of independent toggles is built to miss.
First, reproduce the published corner
paper: −0.1%→loading rows
The NBER appendix prints −0.1%. Applying the spreadsheet range error, the selective-year rule, country weighting, and the separately recorded New Zealand value to the deposited rows recomputes −0.0621%, which rounds to the printed number. With all four corrections, the same top bin is loading, matching Herndon, Ash and Pollin's printed +2.2%.
Computing residual.
That is the anchor, not the conclusion. The question is what happens when reasonable choices move together: where the line goes, when debt is measured, which years enter, how observations count, and which summary sits in the middle.
The live specification
Move one choice. Watch the estimate move.
It opens at the historical 90% corner. The two red switches are errors, not defensible choices, so they remain outside the 1,620-cell grid. Every estimate carries the number of country-years and the number of countries behind it, and refuses to print at all when the high-debt side stops being a comparison between countries.
Loading the licensed panel.
Error, outside the grid
Drops Australia, Austria, Belgium, Canada and Denmark. Three of them have 90%+ rows: 35 top-bin country-years in the corrected panel, or 25 at the historical corner, where the selective-year rule has already removed Australia's five and Canada's five.
Error, outside the grid
The deposited 1951 growth value is −7.6351. This switch applies only at the historical country-weighted 90% corner.
Loading data/rr-panel.csv.
All choices crossed, errors off
The published magnitude occupies a thin tail
Computing the specification curve.
Preparing all curve columns.
Which sentence survives
Reinhart and Rogoff wrote several claims, not one
Each row is a reading of the published argument, checked against every cell of the grid with both errors switched off. The direction is robust, the size is not, and the two are routinely quoted as if they stood or fell together.
Reading
Specifications
Share
Second layer · the choice that looks inert
The exclusion everyone argued about swings 1.63 points
Reinhart and Rogoff dropped Australia and Canada's 1946 to 1950 years and New Zealand's 1946 to 1949, and kept the United States' four bad demobilisation years at the same debt levels. Herndon, Ash and Pollin's central complaint is that asymmetry. On the crossed grid its main effect is almost nothing, which is the wrong answer and an instructive one.
Read the table across, not down. Under country-year weighting the exclusion costs a quarter of a point. Under the country weighting Reinhart and Rogoff actually used, it costs 1.63. The exclusion is not a small choice that happened to matter; it is a choice whose whole effect lives inside another choice.
Including this page's own grid
A grid of independent toggles reports it harmless
This is the failure the section exists to expose, and this page is not exempt from it. The 1,620-cell grid also crosses the threshold, the debt timing and the sample window. Averaging the weighting-by-exclusion interaction over all of those flattens it almost to zero.
So the page runs the kit's inertFactors() guard rather than reading main effects off a bar chart. A factor may only be called inert if it is inert on the whole grid and inside every fixed threshold, timing and window slice. The early-year rule fails the second test, and the guard forbids the claim.
The general lesson is the uncomfortable one. A specification curve of independent toggles measures each choice with the others averaged away, and any choice whose effect is conditional will be reported as no choice at all. On this dataset that choice happens to be the mechanism of the original scandal.
The fairest thing on this page
The published headline needs no error at all
loading
Computing the error-free route.
Weighting each contiguous spell above the line once, rather than each country or each country-year, is a defensible answer to the objection that nineteen consecutive British years are not nineteen independent facts. Reinhart, Reinhart and Rogoff adopted an episode framing themselves in Public Debt Overhangs: Advanced-Economy Episodes since 1800, Journal of Economic Perspectives 26(3), 2012, 69 to 86.
Combine it with a symmetric early-year rule, dropping 1946 to 1950 for every country instead of for three, and the corrected data reaches the published headline with no spreadsheet error and no transcription error in it. That is a sharper and fairer statement than saying the number required the mistakes, and it moves the argument onto the weighting question, which was never a mistake and never disclosed.
Why it lands there
Nine episodes, and the smallest one carries it
Dropping 1946 to 1950 for everyone leaves New Zealand 1951 stranded as a one-year episode at −7.6%, and episode weighting promotes it to a full unit of weight beside twenty-two Belgian years.
That is the counterweight this route has to carry. Episode weighting reaches the published number only if a single year counts as an episode. Under the five-year definition its own authors later published, the same route gives a positive figure, and the page prints both.
No threshold can create a cliff
Look at the years before drawing the line
The dots are country-years, not a fitted causal model. Move the threshold above. The line slides over a cloud whose local means rise again after the 90–100 band.
Magnitude collapse, not a debunk
The direction survives more often than the number
91.0%
In 1,474 of 1,620 specifications, growth on the higher-debt side of the selected line is lower than growth on its lower-debt side. The median gap is −0.72 percentage points.
This is an association in this panel. It does not establish which direction causation runs. It does establish that “there is no relationship” would be a false summary.
The number 90 was asserted, not estimated
Move the line and nothing snaps
Reinhart and Rogoff's own footnote says the brackets come from “our interpretation of much of the literature” and parallel the World Bank income groupings, and adds that a different set of cutoffs “merits exploration”. Here is that exploration, on their data, with country-year weighting and no exclusions.
Line
Country-years
Countries
At or above
Below
Gap
60% to line
Three ways to make the comparison say nothing
Settings that still print a number
Every interactive instrument has corners where the arithmetic keeps working after the question has stopped meaning anything. These are this one's, found by looking for them.
One: a window that leaves one country
Narrow the sample period and raise the line and the average growth of advanced economies above 90% debt quietly becomes the average growth of Britain. Herndon, Ash and Pollin hit this themselves: their replication code carries the comment ## 1955-1980 has only Britain in the highest public debt category!!, and it never reached their paper. The sweep below crosses nine windows against six thresholds using the same estimator the controls use, and the same floor refuses the same cells.
Setting
Country-years
Countries
Verdict
Value if printed
Three of these windows are on the control above, grouped as narrow windows. They are offered so the refusal is reachable, and kept out of the crossing for two reasons: a decomposition needs a complete grid, and windows chosen because they degenerate would drag the whole curve with them.
Two: a control that absorbs the treatment
Add a linear debt/GDP term and ask whether debt above 90% still matters. The dummy and the level are nearly collinear over the range that matters, so the question answers itself and looks like evidence.
Specification
Coefficient on debt ≥ 90%
Standard error
p
Three: a normalisation that partly divides by itself
Debt/GDP in year t carries nominal GDP of year t in its denominator, while the outcome is real growth into year t. A bad year mechanically raises the ratio and can push a country over the line. That guarantees some negative contemporaneous association before any economics happens, and it is measurable: compare debt observed before the growth year against debt observed after it.
Debt measured
Country-years above 90%
Gap in growth
Variance anatomy, with its own caveat
What moves the answer, once each choice is averaged over the rest
The threshold carries 24.8% of the grid's variance and the debt timing 23.2%, both of them choices nobody argued about. Weighting carries 0.3% as a one-way effect and the early-year rule 0.7%, and the section above is the reason those two numbers must not be read as importance.
Interactions carry the remaining computing. The design is complete and balanced, so these shares partition the variance exactly. Exactly partitioned is not the same as correctly attributed.
Three moves into the published corner
The famous error is not the largest piece
Across the complete 2×2×2 anatomy of the range error and the two contested judgements, all seven effects are listed, main effects and interactions together, because separating them was how the interaction went missing in the first place.
Herndon, Ash and Pollin Table 3
All eight cells, from the same shipped rows
“Printed” is the paper's one-decimal table. “Live” is recomputed in this browser. The New Zealand transcription is a ninth, separate step used only to reach −0.0621 and its printed −0.1.
Combination
Live
Printed
Rounded
An open question, not a finding
Four countries share one growth history
Scan the shipped panel for countries whose annual growth series are identical to each other and something turns up that we have not seen reported. It changes no conclusion in this dispute. We are printing it because it is in the file that a decade of argument rests on, and because we cannot tell you how it got there.
What this is not
It is not an accusation against anyone. Reinhart and Rogoff's working spreadsheet reached the public as a file only as the simplified copy Herndon, Ash and Pollin published (its summary sheet was also shown as a screenshot, which carries bucket averages and none of the annual country series), and the processed panel this page ships descends from that same upload. We therefore cannot distinguish a copy error in the original workbook from one introduced when it was simplified for release, and we are not going to guess between two sets of authors on the strength of a file that passed through both.
What would settle it
Reinhart and Rogoff's own unmodified workbook, which we could not obtain. Short of that: our scan only catches series that match exactly across at least twenty overlapping years, so a partial or shifted copy would pass it unnoticed, and the number above is a floor rather than a count. The one route by which this could touch the headline runs through a shared denominator rather than a shared growth rate, and that route this page can only describe, not test, because the panel we ship carries the finished ratio and not the GDP series underneath it. The deposited file it is trimmed from does carry those series.
The verification venue
The check
Every result below is recomputed from the same shipped CSV that drives the controls. The verifier repeats these calculations under plain Node. Two of the checks are here because an earlier version of this page carried their weaker cousins: “no specification failed” was true only because nothing in the grid could fail, and “the early-year rule barely matters” was true only of a main effect.
Anchor ladder
Full grid, with its floor
Degeneracy sweep, which finds failures
The inert-claim guard
Within-country null
Counts
What the check does and does not know
Honest apparatus
The data
The page ships a four-column, 31,992-byte trim of RR-processed.dta from Zenodo record 4017423, a 2020 copy of Thomas Herndon, Michael Ash and Robert Pollin's replication archive that credits them as its creators. It retains country, year, real GDP growth and central-government gross debt/GDP, drops rows missing growth or debt, sorts by country and year, and rounds the two measures to four decimals.
Every cell above runs on one panel. An independent re-derivation that varied the panel found that choice moved the answer further than any analysis choice: the same corrected top bin is 2.17 on this data, 1.62 on Maddison per-capita growth, and 1.44 on either of two IMF debt series, against a spread of 0.33 for the next-largest factor. None of that is reachable from a control on this page, and no amount of crossing the choices we do offer would reveal it. Gross general government debt, the measure every actual austerity argument used, is not in this archive at all.
The comparison
Each grid cell compares growth at or above its selected line with growth below that same line. “Spell” means a maximal run of consecutive qualifying years within one country. Lagged debt comes from the same country and exact prior calendar year. A 10% trim removes floor(0.1n) values from each tail. The floor refuses any high-debt arm inside a single country or under five country-years, and flags any arm under ten.
The formula we do not assert
The spreadsheet error is usually quoted as an averaging range stopping five rows early. We do not assert that range. The summary worksheet containing it is in no publicly available copy of the workbook file we could find, where only the twenty country sheets were released. The range is stated in Herndon, Ash and Pollin's footnote, and on 16 April 2013 Mike Konczal published a screenshot of that summary worksheet, shown to him by one of the three, with the averaging formula visible. A picture of a worksheet is not one we can recompute. What reproduces here is the error's consequence: drop the five alphabetically first countries and the printed numbers appear. The range itself is a citation.
The counts that tie, and the ones that do not
The corrected panel has 110 observations at 90%+. The selective exclusion removes 14, leaving 96, exactly RR's printed top-bin count. Their own two counts of their own sample do not agree with each other: the body text says 1,186 annual observations and the note under Figure 2 says 1,180, with bucket counts of 443, 442, 199 and 96. This complete-case archive has 1,175. Neither gap is explained.
The bins that disagree
Our reconstruction of RR's choices gives 4.09 / 2.85 / 3.40 / −0.02. HAP print 4.1 / 2.9 / 3.4 / 0.0 for that reconstruction. RR's NBER appendix instead prints 4.1 / 2.8 / 2.8 / −0.1, so RR's own figure and RR's own appendix table disagree by about 0.6 points in the 60 to 90 cell, on Herndon, Ash and Pollin's approximate reading of the figure's bar. All three rows are named instead of blended.
Degrees of freedom and the choices excluded from the grid
The grid is 3 weighting rules × 3 early-year rules × 3 central statistics × 5 thresholds × 3 debt timings × 4 sample windows. The spreadsheet range error and the New Zealand transcription are labelled switches outside it because neither is a defensible analysis choice. The three narrow windows on the control are swept rather than crossed.
A net-debt option is absent because the archive contains no net-debt series. Only central-government gross debt is available. Weighting remains a live methodological dispute, which is why the page offers it as a control rather than deciding it in prose.
What nothing on this page bears on
Emerging markets and the 1790 to 2009 sample are separate claims with their own data and their own weighting, and neither is touched here. Neither is inflation, which shares the original figure. Population and GDP weighting are defensible and not implemented. No controls beyond the debt level and fixed effects are run: no investment, openness, initial income or banking-crisis terms, no instruments, no estimators that allow the relationship to differ by country. The endogenous threshold is a bootstrap of a point estimate and not Hansen's test of whether a threshold exists at all.
Most of all, the 1,620 point estimates carry no inference bands. A specification curve without them looks more decisive than it is, and this is one. The clustered regressions in the vacuous-settings section, the within-country permutation test and the bootstrap interval on the endogenous threshold are the only inference on the page, and the count of specifications agreeing with anything depends on how many variants we chose to enumerate, which is a decision and not a measurement.
Sources and publication precision
The digits −0.1 appear in Reinhart and Rogoff, Growth in a Time of Debt, NBER Working Paper 15639, Appendix Table 1. The published AER Papers & Proceedings article shows a bar; Herndon, Ash and Pollin describe their reading of it as approximate. We did not inspect that blocked publisher PDF.
The corrected +2.2 and eight-cell ladder appear in Herndon, Ash and Pollin, Does High Public Debt Consistently Stifle Economic Growth?, Table 3. The 2020 Zenodo copy of their archive carries the AGPL-3.0 licence linked above; their own code opens with a BSD 2-clause notice covering the code and the related data. We worked from the April 2013 working paper and not the revised Cambridge Journal of Economics version.
The episode framing is Reinhart, Reinhart and Rogoff, Public Debt Overhangs: Advanced-Economy Episodes since 1800, Journal of Economic Perspectives 26(3), 2012, 69 to 86. The reverse-causality comparison follows Arindrajit Dube's 2013 note on debt, growth and causality, re-derived here from the same rows.
The claims record81 claims re-read against their sources, 18 October 2026
Written 2026-08-10. Claims re-read against their sources on 2026-10-18: 81 checked, 37 confirmed, 12 wrong, 2 unverifiable, 30 first-hand observations checked against their record. By the assay line (research/assay-line/claude-1018c/), Claude fixer (claude-opus-5-5) directed by claude-assaying-boyle-1014; source record by a Claude agent (claude-sonnet-5-5), checked by a Claude agent (claude-opus-5-5).
This record is the assay line's re-reading of this layer, batch claude-1018c, at commit 0215ca4c20: a source record of the page's claims (N1, a Claude agent), a checker that took every entry to its source and added claims the record left out (N2, a Claude agent, research/assay-line/claude-1018c/debt-growth-threshold/N2-claude.md), and a fixer that re-read the evidence for the one WRONG item (Konczal's 16 April 2013 post and its screenshot of the summary worksheet) and for several MINOR ones (the Zenodo record's DataCite metadata and RR.R's licence line, the deposit's variable list) before deciding and editing. One WRONG claim was corrected with a dated line on the page; eleven MINOR wordings were fixed without one. The CONFIRMED, OBSERVED and UNVERIFIABLE lines are the checker's, unchanged.
Claims
CONFIRMED A paper reports −0.1% growth when public debt reaches 90% of GDP. https://www.nber.org/system/files/working_papers/w15639/w15639.pdf : Appendix Table 1 (PDF p. 26, printed 25), Advanced economies, Average 1946-2009: "4.1 2.8 2.8 -0.1", last column "90 percent and above".
MINOR so RR's own figure and RR's own appendix table disagree by 0.6 points in the 60 to 90 cell. https://peri.umass.edu/wp-content/uploads/joomla/images/WP322.pdf : HAP Table 3: "RR 2010a Figure 2 (approximated) 4.1 2.9 3.4 −0.1" against "RR 2010b Appendix Table 1 4.1 2.8 2.8 −0.1", with "Values from bar chart in RR 2010a Figure 2 are approximate." The 0.6 is HAP's approximate reading, stated flatly. The NBER version of the same Figure 2 (w15639 PDF p. 9, bars measured at 300 dpi against the axis) reads about 3.8 / 2.9 / 3.5 / −0.1 for the averages and 3.9 / 3.0 / 3.3 / 2.3 for the medians, so the figure and table also differ in the below-30 average (3.8 vs 4.1) and the top median (2.3 vs 1.6), and by about 0.7 in the 60 to 90 cell. Fixed 2026-10-18 by the assay line.
CONFIRMED matching Herndon, Ash and Pollin's printed +2.2% https://peri.umass.edu/wp-content/uploads/joomla/images/WP322.pdf : p. 10: "actual average real growth in the high public debt category is +2.2 percent per year compared to the −0.1 percent per year published in RR"; abstract says 2.2 too.
CONFIRMED The corrected +2.2 and eight-cell ladder appear in Herndon, Ash and Pollin, Does High Public Debt Consistently Stifle Economic Growth?, Table 3. https://peri.umass.edu/wp-content/uploads/joomla/images/WP322.pdf : Title page and Table 3 ("All permutations of Spreadsheet, Exclusion, and Weights are shown").
CONFIRMED The published AER Papers & Proceedings article shows a bar https://peri.umass.edu/wp-content/uploads/joomla/images/WP322.pdf : p. 2: "similar to average GDP growth bars in Figure 2 of RR 2010a"; HAP references: "(2010a). Growth in a Time of Debt. American Economic Review: Papers & Proceedings, 100."
CONFIRMED the revised Cambridge Journal of Economics version https://api.crossref.org/works/10.1093/cje/bet075 : Crossref: Herndon, Ash, Pollin, Cambridge Journal of Economics 38(2) 257-279, online 2013-12-24.
CONFIRMED The episode framing is Reinhart, Reinhart and Rogoff, Public Debt Overhangs: Advanced-Economy Episodes since 1800, Journal of Economic Perspectives 26(3), 2012, 69 to 86. https://api.crossref.org/works/10.1257/jep.26.3.69 : Crossref: Carmen M, Vincent R and Kenneth S Reinhart/Reinhart/Rogoff, JEP 26(3) 69-86, 2012. The tool's "DOI MISMATCH" on initials is a parsing artefact of "Carmen M." in the excerpt.
CONFIRMED Reinhart, Reinhart and Rogoff adopted an episode framing themselves in https://www.aeaweb.org/articles?id=10.1257/jep.26.3.69 : Abstract: "We identify the major public debt overhang episodes in the advanced economies since the early 1800s, characterized by public debt to GDP levels exceeding 90 percent for at least five years."
CONFIRMED a framing Reinhart, Reinhart and Rogoff adopted themselves two years later. https://www.aeaweb.org/articles?id=10.1257/jep.26.3.69 : JEP "Summer 2012"; NBER w15639 cover "January 2010". The page shows the framing (episodes), not that RRR weight each episode once; the abstract does not say how growth is averaged.
CONFIRMED Under the five-year definition its own authors later published, the same route gives a positive figure, and the page prints both. https://www.aeaweb.org/articles?id=10.1257/jep.26.3.69 : Definition as above; the figure recreated from public/strata/debt-growth-threshold/data/rr-panel.csv in Python: 6 episodes of 5+ years, 82 country-years, mean +2.1528.
CONFIRMED Reinhart and Rogoff's own footnote says the brackets come from "our interpretation of much of the literature" and parallel the World Bank income groupings https://www.nber.org/system/files/working_papers/w15639/w15639.pdf : Footnote 5 (PDF p. 8): "based on our interpretation of much of the literature and policy discussion ... It parallels the World Bank country groupings according to four income groups."
CONFIRMED and it never reached their paper. https://peri.umass.edu/wp-content/uploads/joomla/images/WP322.pdf : pdftotext of WP322: "1955" 0 hits, "Britain" 0 hits, "only the UK" 0; positive control "1980" 4 hits, "Selective exclusion" 1. The CJE version was not read; the page says it worked from the April 2013 paper.
CONFIRMED Herndon, Ash and Pollin's central complaint is that asymmetry. https://peri.umass.edu/wp-content/uploads/joomla/images/WP322.pdf : "Central" is the page's reading: HAP list three faults in the abstract, but call the exclusions "More significant" and "of particular significance" (p. 6) and put exclusion with weighting at "almost −2 percentage points" (p. 10). The US contrast itself is footnote 4.
CONFIRMED Reinhart and Rogoff dropped Australia and Canada's 1946 to 1950 years and New Zealand's 1946 to 1949, and kept the United States' four bad demobilisation years at the same debt levels. https://peri.umass.edu/wp-content/uploads/joomla/images/WP322.pdf : p. 6 and fn 4: "Australia (1946– 1950), New Zealand (1946–1949), and Canada (1946–1950) ... all of the data for the US ... are included ... Growth in these years was −10.9, −0.9, 4.4, and −0.5." One of the four "bad" years grew 4.4%; the set averages −2.0.
WRONG every published statement of the range traces to one footnote rather than to a file. https://web.archive.org/web/2013id_/http://www.nextnewdeal.net/rortybomb/researchers-finally-replicated-reinhart-rogoff-and-there-are-serious-problems : Mike Konczal, Next New Deal, Apr 16, 2013: "One of the authors was able to show me that, and here it is. You can see the Excel blue-box for formulas missing some data". The embedded screenshot (content_images/reinhart_rogoff_coding_error_0.png) is RR's summary sheet: countries in rows 30 to 49 (Denmark, Canada, Belgium, Austria, Australia in 45 to 49), row 51 "4.1 2.8 2.8" and the cell formula "=AVERAGE(L30:L44)". A published statement of the range taken from the file itself. Fixed 2026-10-18 by the assay line.
MINOR The summary worksheet containing it is in no publicly available copy of the workbook, only the twenty country sheets were released https://www.peri.umass.edu/images/WP322HAP-RR-GITD-code-2013-05-17.zip : True of this copy: xlrd lists RR.xls's 20 sheets (UK ... Australia), no summary sheet. But the summary worksheet itself has been public since 16 April 2013 as Konczal's screenshot (above), formula range visible; ExceLint (Barowy, Berger, Zorn, OOPSLA 2018, arXiv 1901.11100, sec. 5.7) also ran on "the Reinhart-Rogoff spreadsheet" and found the summary formulas. "No publicly available copy" survives only in the narrow sense of a file. Fixed 2026-10-18 by the assay line.
MINOR Reinhart and Rogoff's working spreadsheet reached the public only as the simplified copy Herndon, Ash and Pollin published https://peri.umass.edu/wp-content/uploads/joomla/images/WP322.pdf : p. 5 shows RR gave HAP "the working spreadsheet"; nothing shows "only" or "simplified". Its summary sheet reached the public as Konczal's screenshot (above). The duplicate-series argument that rests on this sentence concerns the country sheets, which the screenshot does not show, so the conclusion is untouched. Fixed 2026-10-18 by the assay line.
CONFIRMED the body text says 1,186 annual observations and the note under Figure 2 says 1,180, with bucket counts of 443, 442, 199 and 96. https://www.nber.org/system/files/working_papers/w15639/w15639.pdf : p. 7 "of the 1186 annual observations ... including 96 above 90 percent"; Figure 2 notes "443 ... 442 ... 199 ... 96 ... There are 1,180 observations." 443+442+199+96 = 1,180.
CONFIRMED The corrected panel has 110 observations at 90%+. The selective exclusion removes 14, leaving 96, exactly RR's printed top-bin count. https://peri.umass.edu/wp-content/uploads/joomla/images/WP322.pdf : p. 6 "RR reports 96 ... finds 110 ... 5 years for Australia; 5 years for Canada; and 4 years of New Zealand." Recounted from the shipped CSV: 110, 14, 96; none at exactly 90.00.
CONFIRMED nineteen consecutive British years are not nineteen independent facts https://peri.umass.edu/wp-content/uploads/joomla/images/WP322.pdf : p. 7 "the 19 years that the UK appeared in the highest public debt/GDP category"; Table 2 "UK 1946–64"; the shipped CSV has 19 UK years at 90%+, 1946 to 1964 unbroken.
CONFIRMED Dropping 1946 to 1950 for everyone leaves New Zealand 1951 stranded as a one-year episode at −7.6% https://peri.umass.edu/wp-content/uploads/joomla/images/WP322.pdf : p. 6 "New Zealand contributes only one year ... 1951, with a real GDP growth rate of −7.6 percent"; CSV: NZ 1950 at 87.65% debt, 1951 at 91.75%.
OBSERVED The deposited 1951 growth value is −7.6351. recreated: python csv read of public/strata/debt-growth-threshold/data/rr-panel.csv : "New Zealand,1951,-7.6351,91.7511"; also RR-processed.dta in the PERI zip.
MINOR from Zenodo record 4017423, deposited by Thomas Herndon, Michael Ash and Robert Pollin. https://api.datacite.org/dois/10.5281/zenodo.4017423 : DataCite lists them as creators, not depositors, issued 2020-09-07, and the description reads as a third party's re-upload: "The provided assets are the source code of the conducted experiments in the publication ... written by Thomas Herndon, Michael Ash and Robert Pollin. The assets were retrieved from following URL: https://www.peri.umass.edu/images/WP322HAP-RR-GITD-code-2013-05-17.zip Modifications to the original content: The provided zip file was unzipped and the internal folder structure was flattened". The zenodo.org page names no uploader. "Deposited by" is not shown. Fixed 2026-10-18 by the assay line.
OBSERVED The page ships a four-column, 31,992-byte trim of RR-processed.dta recreated: pandas read of RR-processed.dta from the PERI zip (SHA-256 e39db713..., matching research/debt-growth-threshold/README.md) trimmed per SOURCE.md : 1,175 rows, every key matched, max abs difference 0 in both columns.
OBSERVED 31,992-byte trim recreated: wc -c public/strata/debt-growth-threshold/data/rr-panel.csv : 31992; live copy has the same SHA-256 (4ae80c5b...).
OBSERVED This complete-case archive has 1,175. recreated: python count of public/strata/debt-growth-threshold/data/rr-panel.csv : 1,175 rows, 20 countries, 1946 to 2009.
OBSERVED Nine episodes, and the smallest one carries it recreated: python spell count on public/strata/debt-growth-threshold/data/rr-panel.csv, years from 1951 : 9 spells, mean −0.1078. Two are one year long (NZ 1951 −7.64, Italy 2009 −5.15), so "the smallest one" is a tie; dropping either alone turns the mean positive (+0.83 or +0.52).
OBSERVED Degeneracy sweep, which finds failures recreated: node research/debt-growth-threshold/verify-debt-growth-threshold.mjs in a scratch copy with the id count set to 91 : PASS 397; "sweep refused 10/54".
OBSERVED The large, precise, sign-stable effect in that table is the low-debt one. recreated: DG.analyse on the shipped CSV in node : Low-debt contrast +1.081 (p 0.0006), above-90 −0.924 (p 0.0116): the low-debt one is the larger and more precise; "sign-stable" is not tested by the verifier.
OBSERVED The early-year rule fails the second test, and the guard forbids the claim. recreated: verifier scratch run as above : Passes its guard assertions; README: classification survives in 30 of 60 slices.
OBSERVED It retains country, year, real GDP growth and central-government gross debt/GDP, drops rows missing growth or debt, sorts by country and year, and rounds the two measures to four decimals. recreated: pandas trim of RR-processed.dta as above : Exact match to the shipped CSV.
MINOR Their deposit carries the redistribution licence linked above. https://api.datacite.org/dois/10.5281/zenodo.4017423 : The Zenodo record does carry "GNU Affero General Public License v3.0" (rightsIdentifier agpl-3.0). But HAP's own licence, line 1 of RR.R inside the same files, is "This code and the related data are open-source under the BSD 2-clause license." The AGPL tag belongs to the 2020 record, and the page attributes it to the authors ("Their deposit"; "AGPL-3.0-only licence"). Fixed 2026-10-18 by the assay line.
CONFIRMED The endogenous threshold is a bootstrap of a point estimate and not Hansen's test of whether a threshold exists at all. https://api.crossref.org/works/10.2307/2171789 : Hansen (1996) Econometrica, "Inference When a Nuisance Parameter Is Not Identified Under the Null Hypothesis", the threshold-existence test (also Hansen 2000, 10.1111/1468-0262.00124). The page's code (public/strata/debt-growth-threshold/debt-growth-threshold.js lines 1160-1166) is a least-squares split plus a country-block bootstrap.
OBSERVED This is a bootstrap of a point estimate, not a hypothesis test. The right reading is that the data do not locate a break at 90%, not that there is no break. recreated: DG.analyse in node : Split lands at 28%, bootstrap 90% interval [20, 77]; README says the same.
UNVERIFIABLE Gross general government debt, the measure every actual austerity argument used, is not in this archive at all. RR-processed.dta variable list (Debt, Debt1, Debt2, Debtalt, GDP, GDP1, GDP2, debtgdp...), HAP RR.R lines 62-86, NBER and HAP text : The archive half holds: RR.R builds debtgdp from central-government Debt over GDP1/GDP2 and nothing is labelled general government. "Every actual austerity argument" is a universal no source here supports (the README says only "the measure the austerity argument used"), and arguments that cited RR's 90% leaned on RR's central-government figure.
CONFIRMED Emerging markets and the 1790 to 2009 sample are separate claims with their own data and their own weighting, and neither is touched here. https://www.nber.org/system/files/working_papers/w15639/w15639.pdf : Abstract (44 countries, two centuries), Table 1 (1790-2009), Figure 4 (24 emerging markets). "Their own weighting" is not shown; Table 1's Average row averages country rows as the post-war figure does.
OBSERVED The grid is 3 weighting rules × 3 early-year rules × 3 central statistics × 5 thresholds × 3 debt timings × 4 sample windows. recreated: arithmetic and verifier scratch run : 3×3×3×5×3×4 = 1,620; "1620/1620 crossed cells defined".
OBSERVED In 1,474 of 1,620 specifications, growth on the higher-debt side of the selected line is lower than growth on its lower-debt side. The median gap is −0.72 percentage points. recreated: verifier scratch run : Asserts 1474 and median rounding to −0.72; 1474/1620 = 90.99%.
OBSERVED Combine it with a symmetric early-year rule ... the corrected data reaches the published headline with no spreadsheet error and no transcription error in it. recreated: python on rr-panel.csv, spell weighting, years from 1951, 90% line : −0.10775.
MINOR by weighting each spell above the line once rather than each country, which is a framing Reinhart, Reinhart and Rogoff adopted themselves two years later. src/content/strata/debt-growth-threshold.md line 27 : The markdown body (served in /mcp/corpus.json) says the headline is "reachable from clean data with no error at all, by weighting each spell above the line once", leaving out the symmetric early-year rule the route also needs; with all years kept, episode weighting gives +1.69 (verifier line 171). Fixed 2026-10-18 by the assay line.
OBSERVED Apply their own definition to the same route and the one-year episodes leave: recreated: python as above : 6 episodes, 82 country-years, +2.1528.
OBSERVED Twelve of 1,620 specifications reach −0.1% or lower, and none of them applies either error, because neither error is in the grid. recreated: verifier scratch run : Asserts 12; errors are not grid dimensions in the code.
OBSERVED The full-grid median is +2.71%. recreated: verifier scratch run : curve median 2.7094.
OBSERVED Under country-year weighting the exclusion costs a quarter of a point. Under the country weighting Reinhart and Rogoff actually used, it costs 1.63 recreated: DG.analyse in node : Swings −0.2480, −1.6341, −0.6170.
OBSERVED The threshold carries 24.8% of the grid's variance and the debt timing 23.2% recreated: verifier scratch run : Asserts both roundings.
OBSERVED With all four corrections, the same top bin is 2.17 recreated: python mean of 110 top-bin rows in rr-panel.csv : 2.16797.
OBSERVED Applying the spreadsheet range error, the selective-year rule, country weighting, and the separately recorded New Zealand value to the deposited rows recomputes −0.0621% recreated: python on rr-panel.csv : 71 rows, 7 countries, −0.02422, then −0.06206 with NZ set to −7.9.
MINOR The printed −0.1% is reproducible, but only after three contested choices and two separately labelled errors meet in one corner. src/content/strata/debt-growth-threshold.md line 27 : The page partitions the same steps three ways: here 3 choices + 2 errors; the check box says "after the three contested choices" for range error + selective years + weights (debt-growth-threshold.js line 1282), counting the range error as a choice; the 2×2×2 section says "the two errors and the one contested judgement"; the switch panel calls the range error and the NZ value the two errors. Fixed 2026-10-18 by the assay line.
OBSERVED 35 top-bin country-years in the corrected panel, or 25 at the historical corner recreated: python on rr-panel.csv : 35 and 25.
OBSERVED The floor refuses any high-debt arm inside a single country or under five country-years, and flags any arm under ten. recreated: verifier scratch run : FLOOR_COUNTRIES 2, FLOOR_ROWS 5, THIN_ROWS 10 asserted.
OBSERVED The sweep below crosses nine windows against six thresholds recreated: verifier scratch run : s.total === 54 asserted.
OBSERVED Add a linear debt/GDP term and ask whether debt above 90% still matters. recreated: DG.analyse in node : −1.37 (p<0.001) to +0.23 (p 0.6945).
OBSERVED Scan the shipped panel for countries whose annual growth series are identical to each other recreated: pandas on RR-processed.dta : dRGDP identical (max abs diff 0) for France, Norway, Canada and Portugal, 1981 to 2009.
OBSERVED our scan only catches series that match exactly across at least twenty overlapping years research/debt-growth-threshold/README.md : Describes the page's own scan; the code matches.
UNVERIFIABLE something turns up that we have not seen reported. WebSearch "Reinhart Rogoff spreadsheet Norway France Canada Portugal same GDP growth series duplicated" : No report of the duplicated series found; positive control: the same search returned HAP, Konczal-era posts and ExceLint on the RR spreadsheet. Absence is not proven.
OBSERVED The one route by which this could touch the headline runs through a shared denominator rather than a shared growth rate recreated: pandas on RR-processed.dta from the PERI zip : GDP2 is identical for France, Norway and Canada in all 61 years 1949-2009, and RR.R line 70 builds Canada's ratio after 1948 as Debt/GDP2; Debt/GDP1 puts Canada 1950 at 79.0% against 110.97% shipped.
OBSERVED An independent re-derivation that varied the panel found that choice moved the answer further than any analysis choice: 2.17 ... 1.62 ... 1.44 ... against a spread of 0.33 not kept: the re-derivation's own output; README relays the four figures; git grep "Maddison" at 0215ca4c20 finds only the README and the page (research/assay-line not read) : README: "1.44 on IMF central-government debt with Maddison growth and 1.44 on IMF general-government debt with WEO growth".
OBSERVED an earlier version of this page carried their weaker cousins: "no specification failed" ... and "the early-year rule barely matters" git show d29496e9432:public/strata/debt-growth-threshold/index.html : Line 240: "No specification failed or vanished." The second phrase is not verbatim anywhere in history (git log -S "barely" finds only the commits adding the present sentence); the earlier page said "The quiet choices move the answer most" with weighting at 0.2%.
MINOR The verifier repeats these calculations under plain Node. recreated: node research/debt-growth-threshold/verify-debt-growth-threshold.mjs at 0215ca4c20 : Exit 1: "Assertion 383 failed: and the page declares 89 ids". Commit 19756884a84 (2026-09-26) added ids held-range and held-range-2; the verifier was last changed 2026-08-10. With 89 set to 91 in a scratch copy: PASS 397. Fixed 2026-10-18 by the assay line.
CONFIRMED (added) Gap of 3 points or more ("several percent lower") https://www.nber.org/system/files/working_papers/w15639/w15639.pdf : p. 2 printed (PDF p. 3): "average (mean) growth rates are several percent lower"; HAP p. 2 quotes the same words from RR 2010a p. 573.
CONFIRMED (added) Three of them have 90%+ rows ... where the selective-year rule has already removed Australia's five and Canada's five. https://peri.umass.edu/wp-content/uploads/joomla/images/WP322.pdf : Table 2: Australia 1946–50 (5), Belgium (25), Canada 1946–50 (5); Austria and Denmark absent; CSV agrees.
MINOR (added) Narrow the sample period and raise the line and the "average growth of advanced economies above 90% debt" quietly becomes the average growth of Britain. https://www.nber.org/system/files/working_papers/w15639/w15639.pdf : The phrase in quotation marks is in neither RR (NBER) nor HAP: 0 hits for "average growth of advanced" and "advanced economies above"; positive control "average growth" 3 and 11 hits, "above 90" 12 and 9. Unattributed, but a reader can take it as RR's words. Fixed 2026-10-18 by the assay line.
MINOR (added) that route we can only describe, not test, because the panel we ship carries the finished ratio and not the GDP series underneath it. public/strata/debt-growth-threshold/data/SOURCE.md, then recreated: pandas on RR-processed.dta (the deposit the page cites) : True of the four-column trim, but the deposit carries Debt, GDP1 and GDP2: the shared GDP2 and Canada 1950 at 79.0% under its own GDP1 take a minute to compute, so the test is one column away, not out of reach. Fixed 2026-10-18 by the assay line.
MINOR (added) The clustered regressions in the vacuous-settings section are the only inference on the page public/strata/debt-growth-threshold/debt-growth-threshold.js : The page also prints a permutation p-value ("one-sided p = 0.0005", check-permutation, line 1294) and a bootstrap "90% interval of [20, 77]" for the endogenous threshold (line 1160). Fixed 2026-10-18 by the assay line.
OBSERVED (added) the 1955-1979 window at 90% leaves the high-debt side to Britain alone and is refused recreated: verifier scratch run (assertion at line 439) : single.countries === 1 and n === 10, refused.
What was done
[fixed] MINOR (fig-appendix-gap-stated-exact): "disagree by 0.6 points" now reads "disagree by about 0.6 points in the 60 to 90 cell, on Herndon, Ash and Pollin's approximate reading of the figure's bar" (index.html line 427); the verifier's sourceHas string follows it (line 503).
[fixed] WRONG (range-only-in-footnote): the formula note said every published statement of the averaging range traced to one footnote rather than to a file; Mike Konczal's Next New Deal post of 16 April 2013 published a screenshot of RR's summary worksheet, shown to him by one of HAP, with =AVERAGE(L30:L44) visible. index.html line 419 and README item 6 now name the screenshot (the page still does not print the range itself), with a dated Corrected line in the page footer and the markdown body; the section heading above it now reads "The formula we do not assert" (was "The formula we did not see"; id unchanged).
[fixed] MINOR (summary-sheet-never-public): "in no publicly available copy of the workbook" narrowed to the workbook FILE we could find, beside the screenshot (index.html line 419, README item 6).
[fixed] MINOR (workbook-only-simplified-copy): "reached the public only as the simplified copy" now says "as a file only as", with a parenthesis on the screenshot, which carries bucket averages and no annual country series (index.html line 377, README provenance paragraph). The duplicate-series conclusion is unchanged.
[fixed] MINOR (zenodo-deposited-by-hap): "deposited by Thomas Herndon, Michael Ash and Robert Pollin" now reads "a 2020 copy of [their] replication archive that credits them as its creators" (index.html line 406), likewise SOURCE.md and README ("Creators credited").
[fixed] MINOR (licence-attributed-to-hap): "Their deposit carries the redistribution licence" now says the 2020 Zenodo copy carries AGPL-3.0 and their own code opens with a BSD 2-clause notice (index.html line 443); SOURCE.md and README licence lines say the same.
[fixed] MINOR (episode-route-missing-early-rule): the markdown body now names the symmetric early-year rule ("dropping 1946 to 1950 for every country alike") in the error-free route (md line 27).
[fixed] MINOR (partition-of-steps-inconsistent): one partition, the anchor's: md line 27 now says two contested choices (selective-year rule, country weighting) and two labelled errors (range, NZ value); the check card (js line 1282) says "after the range error, the selective-year rule and country weighting"; the 2x2x2 section (index.html line 348) says "the range error and the two contested judgements".
[fixed] MINOR (verifier-red-at-pin): verifier line 535 asserted 89 ids, the page has had 91 since 19756884a84; now 91, and the verifier passes (397 assertions). Its JSON-LD dateModified assertion follows the page to 2026-10-18.
[fixed] MINOR (scare-quotes-read-as-rr): quotation marks dropped from "average growth of advanced economies above 90% debt" (index.html line 304), since neither RR nor HAP print the phrase.
[fixed] MINOR (denominator-test-said-out-of-reach): index.html line 381 now says this page cannot test it from its trim and that the deposited file it is trimmed from does carry those series (RR-processed.dta has Debt, GDP1, GDP2).
[fixed] MINOR (only-inference-overclaim): "the only inference on the page" now names the clustered regressions, the within-country permutation test and the bootstrap interval on the endogenous threshold (index.html line 438, README line 282).
The assay office: what a record is, and every layer re-read so far.