Prop 40, JR analysis: the materials
Every script, test, data file and source behind the explorer, the report and the slides, and the notes kept along the way
JR analysis of California Proposition 40: Overview · Open Output: Explorer · Open Analysis: Report and Slides · Open Materials (this page is its guide)
Also in this project: Comparison overview · BSZ analysis overview
This page is a guide to the Open Materials layer (the repository) of the JR analysis (Jaros and Rauh, NBER chapter c15504, Tax Policy and the Economy vol. 41, September 2026; first version by Rauh, Jaros, Kearney, Doran and Cosso, March 2026): everything needed to rebuild every number on this site, in the repository github.com/fhoces/opa-prop40, folder rjkdc-analysis/. The analysis is an R {targets} pipeline with a Python twin. {targets} is an R package that runs the pipeline’s steps in order and records which outputs are current. The site’s explorer grid, report and deck read that pipeline’s store and exports, so none of them retypes a number.
Rebuild everything
git clone https://github.com/bjaros20/wealth_tax && git -C wealth_tax checkout 25e84dd # the authors' MIT repo
cd rjkdc-analysis
export RAUH_REPO_DIR=/absolute/path/to/wealth_tax
Rscript -e 'targets::tar_make()' # pipeline, export/r/*.csv, site/data/*.csv, site/explorer/grid.js
Rscript tests/testthat.R # the test suite (console summary)
Rscript tests/count_tests.R # the same suite, counted: site/data/test-summary.csv
python3 py/run_export.py # the Python twin: export/py/*.csv
quarto render site/repro.qmd && quarto render site/materials.qmd
Rscript -e 'rmarkdown::render("site/slides/slides.Rmd")'RAUH_REPO_DIR is the single place that knows where the authors’ repository lives (R/rauh_repo.R, py/rauh_repo.py). Tests that re-run the authors’ own scripts skip cleanly without it; everything else runs.
Tests
| file | tests | expectations | tests passed | tests failed | tests skipped |
|---|---|---|---|---|---|
| test-ai-badges.R | 2 | 18 | 2 | 0 | 0 |
| test-income-tax-mc.R | 2 | 25 | 2 | 0 | 0 |
| test-nber-final.R | 3 | 10 | 3 | 0 | 0 |
| test-npv-mc.R | 6 | 18 | 6 | 0 | 0 |
| test-npv-tables.R | 3 | 7 | 3 | 0 | 0 |
| test-pareto.R | 3 | 6 | 3 | 0 | 0 |
| test-parity.R | 3 | 39 | 3 | 0 | 0 |
| test-revenue-chain.R | 2 | 8 | 2 | 0 | 0 |
| test-site.R | 11 | 79 | 11 | 0 | 0 |
| total | 35 | 210 | 35 | 0 | 0 |
35 tests (210 expectations): 35 tests passed, 0 failed, 0 skipped, run on 2026-10-16 with R 4.4.0, with the authors’ repository available. They come in four kinds:
- Against the paper’s printed number: Table 9 at the printed rounding; the simulated figures within four Monte Carlo standard errors (plus the printed rounding for the share negative; for the SD, four standard errors of an SD); the baseline revenue and the ceiling, where the paper prints a typed or rounded value and the authors’ workbook and person-level file give a figure 0.1% or less away (notes 6 and 4), against those files.
- Against the authors’ own scripts, run unmodified from a scratch copy (plot and CSV paths redirected, no logic changed;
tests/testthat/helper-author-scripts.R). - Parity between the R and Python exports (
test-parity.R): deterministic steps to 1e-6, Monte Carlo steps within a documented tolerance (numpy cannot share R’s random stream). - The site (
test-site.R): the explorer’sgrid.jsandsite/data/headlines.csvmust be byte-identical to the exporter’s output; grid cells must equal the pipeline’s analytic means and brute-force Monte Carlo; the printed-value transcription must agree with the pipeline; every number typed into the landing page must still match its source.
A continuous-integration workflow for this folder is configured to rebuild the pipeline and run the suite on each push that touches it (.github/workflows/rjkdc-ci.yml, cloning the authors’ repository at the pinned commit).
Scripts
| file | what it does |
|---|---|
R/export.R |
export/{r,py}/inputs.csv + outputs.csv. |
R/income_tax_mc.R |
Income-tax Monte Carlo (first version numbering: Sec 5.1.2, Table 8, p.17; in the chapter Table 9, p.30). |
R/io.R |
Small shared helper for writing the export/ CSVs (both export/r and, indirectly via the schema it fixes, export/py). |
R/nber_final.R |
NBER bridge inputs, rebuilt from RAUH/NBER_2026_litigation_weighted/ NPV_data/final.csv (240 rows: 212 domestic + 28 international; see extract_nber_final()) rather than hard-coded, by design. |
R/npv_mc.R |
NPV Monte Carlo, both versions: Sec 5.5 (first version) / Sec 5.4 (chapter). |
R/npv_tables.R |
First version numbering: Sec 5.2-5.4, Table 9 (NPV by departure scenario, p.19) and Table 10 (break-even departure fraction, p.20; the chapter's break-even table is Table 10, p.34). |
R/pareto.R |
Sec 5.1.1 (first version) / 5.1 (chapter): Pareto tail fit to the FTB's cumulative AGI-bracket filer counts, and the rank-implied income tax schedule used as the input to the income-tax Monte Carlo (R/income_tax_mc.R). |
R/rauh_repo.R |
Single resolver for the authors' MIT-licensed repo (bjaros20/wealth_tax, pinned SHA 25e84ddbb67fe0293a64cd9108ed4d35d8ae37ab). |
R/revenue_chain.R |
First version numbering: Sec 4, the revenue chain 94.20 -> 67.51 -> 55.10, plus the 45.59 literature-calibrated figure (March 2026 version pp.10-14). |
R/site.R |
Exports for the public site (site/): the explorer grid, the NBER collectible-revenue figure, and the headline table the landing page and the prose-number test read. |
py/income_tax_mc.py |
Python twin of R/income_tax_mc.R (first version Table 8, p.17; chapter Table 9, PDF p.30). |
py/nber_final.py |
Python twin of R/nber_final.R. |
py/npv_mc.py |
Python twin of R/npv_mc.R. |
py/npv_tables.py |
Python twin of R/npv_tables.R (Table 9, Table 10). |
py/pareto.py |
Python twin of R/pareto.R. |
py/rauh_repo.py |
Single resolver for the authors' MIT-licensed repo. |
py/revenue_chain.py |
Python twin of R/revenue_chain.R. |
py/run_export.py |
Entry point for the Python twin: runs every step and writes export/py/inputs.csv + export/py/outputs.csv, matching the schema and row ids of export/r/{inputs,outputs}.csv exactly (same input_id/output_id values) so tests... |
_targets.R |
The pipeline definition: every target below, in one list. |
tests/testthat.R |
|
tests/count_tests.R |
Run the full suite with a ListReporter and write one row per test file to site/data/test-summary.csv, which the materials page reads. |
The pipeline’s targets (tar_manifest()):
| target | command (first 90 characters) |
|---|---|
| npv_table10 | compute_npv_table10() |
| npv_mc_nber_analytic_mean | npv_mc_analytic_mean(0, 72, 3.3, 5.8, 0.015, 0.045, f_mode = "nber", f_min = 0.3, f_max = |
| npv_mc_ssrn_analytic_mean | npv_mc_analytic_mean(35, 67.51, 3.3, 5.8, 0.015, 0.045, f_mode = "ssrn", baseline_revenue |
| pareto_fit | compute_pareto_fit() |
| nber_final_csv | rauh_nber_final_csv() |
| npv_table9 | compute_npv_table9() |
| rauh_workbook | rauh_workbook_path() |
| npv_mc_ssrn | compute_npv_mc_ssrn() |
| npv_mc_nber | compute_npv_mc_nber() |
| pareto_income_schedule | compute_pareto_income_schedule(pareto_fit) |
| nber_final | extract_nber_final(nber_final_csv) |
| calc_expanded | extract_calculations_expanded(rauh_workbook) |
| calc_preferred | extract_calculations_preferred(rauh_workbook) |
| npv_mc_ssrn_summary | npv_mc_ssrn$summary |
| npv_mc_nber_summary | npv_mc_nber$summary |
| income_tax_mc | compute_income_tax_mc(pareto_income_schedule$tax_by_rank) |
| nber_collectible | compute_nber_collectible(nber_final) |
| nber_ceiling | compute_nber_ceiling(nber_final) |
| revenue_chain | compute_revenue_chain(calc_preferred, calc_expanded) |
| income_tax_table8 | income_tax_mc_table8(income_tax_mc) |
| site_grid | compute_site_grid(revenue_chain) |
| export_inputs | compute_export_inputs(pareto_fit, revenue_chain, nber_ceiling) |
| export_outputs | compute_export_outputs(pareto_fit, income_tax_table8, revenue_chain, npv_table9, npv_mc_ss |
| site_headlines | compute_site_headlines(site_grid, npv_mc_ssrn_summary, npv_mc_nber_summary, npv_mc_ssrn_an |
| export_inputs_csv | { readr_write(export_inputs, "export/r/inputs.csv") "export/r/inputs.csv" } |
| export_outputs_csv | { readr_write(export_outputs, "export/r/outputs.csv") "export/r/outputs.csv" } |
| site_headlines_csv | { readr_write(site_headlines, "site/data/headlines.csv") "site/data/headlines.csv" } |
| site_grid_js | write_site_grid_js(site_grid, revenue_chain, site_headlines) |
Data files the site publishes
| file | rows | contents |
|---|---|---|
export/r/inputs.csv |
22 | every input: value, OPA label (data / research / guesswork / scenario / derived / guesswork on data), source, page |
export/r/outputs.csv |
19 | every headline figure: reproduced value, printed value, page, absolute difference |
export/py/inputs.csv |
22 | the Python twin's inputs (same schema) |
export/py/outputs.csv |
19 | the Python twin's outputs (same schema) |
site/data/headlines.csv |
19 | the main estimate: printed, reproduced, exact (target site_headlines) |
site/data/printed-tables.csv |
51 | hand transcription of the printed income tax table (Table 9) and Table 10, with PDF pages (checked by test-site.R) |
site/data/test-summary.csv |
9 | test counts per file (tests/count_tests.R) |
DATA-SOURCES.csv |
5 | the source manifest (below) |
The explorer’s grid, site/explorer/grid.js, is also generated (target site_grid_js): 2,187 cells, never edited by hand.1
Sources
None of these files is committed; each is listed with where it came from and its SHA-256 hash. The papers are not redistributed; the authors’ repository is MIT licensed and read from a local clone.2
| file | provider | obtained_via | date_obtained | url_or_contact | sha256 | terms | feeds |
|---|---|---|---|---|---|---|---|
| original-materials/ssrn-6340778.pdf | Hoover Institution (Rauh, Jaros, Kearney, Doran, Cosso) | public-download | 2026-09-22 | link | edb4ad1e9c165b34… |
do-not-redistribute | reference only (page citations in NOTES.md and export/{r,py}/inputs.csv, outputs.csv); not read programmatically - the pipeline reads the authors' own repo inst… |
| original-materials/additional-documentation/caltax-walczak-2026-04-22.pdf | Jared Walczak, California Tax Foundation, "Ongoing State Tax Revenue Implications of the 2026 California Billionaire Tax Act" | public-download | 2026-09-23 | link | 06fd06567974866e… |
do-not-redistribute | reference only: a third party's estimate (ongoing income tax losses incl. spillovers), transcribed in comparison/data/document-inputs.csv; no dial |
| original-materials/additional-documentation/hoover-california-decides-prop40-2026-08.pdf | Hoover Institution, "California Decides: Proposition 40" (Proposition Lab brief) | public-download | 2026-09-23 | link | 1281bed69488de02… |
do-not-redistribute | context: repeats the March 2026 numbers; the comparison uses the September 2026 chapter |
| original-materials/author-shared/2026-09-23_wealth_tax-repo/ | Jaros, Rauh (bjaros20/wealth_tax GitHub repo) | git-clone | 2026-09-23 | link | 25e84ddbb67fe029… |
MIT | rjkdc-analysis R+Python pipeline (_targets.R, R/*.R, py/*.py): NPV_data/monte_carlo_sim.R (Pareto fit + income-tax MC, Table 8), NPV_data/Raw_Data_Collection.xl… |
| original-materials/jaros-rauh-nber-c15504-2026-09.pdf | Jaros, Rauh (NBER) | public-download | 2026-09-23 | link | 2b427d6b205c84c4… |
do-not-redistribute | reference only; not read by the pipeline; headline: ~$30B wealth tax revenue (range $28-36B) and NPV -$38.9B, both stated on p.1 (abstract) and restated p.3; co… |
What the checks found
The pipeline reproduces the published results of both versions of the JR analysis from the authors’ own code, workbooks and data: the revenue chain, the income tax tables, the NPV and break-even tables and both Monte Carlo summaries. A deterministic figure counts as reproduced when it rounds to the printed digit, or when it differs only because the paper rounded or typed an intermediate figure (0.1% or less in every case below). A simulated figure counts as reproduced when it lies within four Monte Carlo standard errors of the printed value. Two runs of a Monte Carlo with different seeds never give identical figures.
The ten notes below are kept for transparency. Each records a place where the authors’ text, their READMEs and their code describe the same step in different words or numbers. None of them is a failure to reproduce a printed result. They are of three kinds, and each note states its kind under its heading:
- Rounded or typed inputs (notes 4, 6 and 8): the paper prints, or the code uses, a rounded or typed value where a more precise one exists or no derivation is given. Every printed result built on the value reproduces.
- Seed variation (note 9): the printed Monte Carlo summary comes from a different run of the same code than the shipped seed gives. It lies within Monte Carlo error.
- Documentation (notes 1, 2, 3, 5, 7 and 10): the text, a README and the code describe one calculation differently (a typo, a formula written two ways, a stale cell reference). The code as shipped gives the printed results.
An earlier version of these pages called all ten “mismatches”, one list on an equal footing, and counted the rounding and seed differences as results that did not match. That overstated them, and the notes were reclassified on 2026-10-16.
Notes 1, 2, 7, 8 and 9 concern only the authors’ first version (Rauh, Jaros, Kearney, Doran and Cosso, Hoover Institution, SSRN 6340778, March 2026), which the pipeline also reproduces. Notes 3 to 6 and 10 concern the NBER chapter (10 is in the first version too).
The notes come from reproducing Jaros and Rauh, The Net Present Value of the California Billionaire Tax Act (NBER chapter c15504, Tax Policy and the Economy vol. 41, September 2026; first version by Rauh, Jaros, Kearney, Doran and Cosso, March 2026). By design, we do not “fix” the authors: we reproduce their code as run, record the note, and where it matters expose the alternative reading as a parameter with both readings under test.
1. First version: eq. 22 prints the revenue ceiling as 67.1; the code and the rest of the text use 67.51
Kind: documentation.
First-version paper, p.20, eq. 22: WT ~ U[$35B, $67.1B]. Code, NPV_data/NPV_dist.R:31: wt_max <- 67.51.
$67.51B is the confirmed-6-departures revenue ceiling used everywhere else in that version (p.11, Table 9’s “Only 6 Confirmed Departures” column); $67.1B appears nowhere else. We treat 67.51 as the intended value (it is what the shipped, runnable code uses and what every other reference to the ceiling states) and reproduce the code, not the typo.
2. First version: the text derives a growing perpetuity (r-g); the Monte Carlo code divides by plain r
Kind: documentation.
First-version paper, p.18, eq. 20: NPV = WT - f * C / (r - g) (eq. 18 on the same page is the plain-r form, NPV = WT - f * C / r), introduced with an explicit growth-rate adjustment (Gordon Growth Model discussion, p.18-19). First-version paper, p.20, eq. 24 and surrounding prose: switches notation to plain r ~ U[0.015, 0.045] and states “NPV = WT - f * C / r” for the Sec 5.5 Monte Carlo. Code, NPV_data/NPV_dist.R:60: pv_lost <- annual_loss / r_discount (plain r, no growth term).
That version’s prose is internally inconsistent (Sec 5.2 derives a growing-perpetuity formula, Sec 5.5 silently drops the growth term); the code matches the later (Sec 5.5) plain-r reading. R/npv_mc.R:compute_npv_mc_ssrn() reproduces the code (plain r).
3. The sentence after eq. 19 writes C/r where the draw is (r - g)
Kind: documentation.
Code, NBER_2026_litigation_weighted/NPV_data/NPV_dist_v8.R:22,28: draws rg_discount <- runif(n_sims, 0.015, 0.045), labelled (r-g). Paper, PDF p.35, eq. 18 draws (r - g) ~ U[0.015, 0.045], after eqs. 13-14 (PDF p.31) derive the growing perpetuity f·C/(r − g) and PDF p.32 calibrates (r − g) ≈ 0.015 from the dividend yield; the sentence after eq. 19 then computes NPV = WT - f * C / r. NBER README (NBER_2026_litigation_weighted/README.md at 25e84dd): the row “Simulation draws (100,000)” gives (r − g) ~ U[1.5%, 4.5%] for both versions, and the row “NPV formula” gives NPV = WT − f·C / (r − g) for both. The repository’s root README writes r ~ U[1.5%, 4.5%] for the first version’s NPV_dist.R, whose code divides by plain r (note 2). For the September chapter the code, eq. 18 and the NBER README agree on (r − g); only the one sentence writes r.
4. NBER ceiling: one quantity at three roundings (72 in the script, 72.06 in the README and eq. 4, 72.05 in final.csv)
Kind: rounded or typed input.
Code, NBER_2026_litigation_weighted/NPV_data/NPV_dist_v8.R:19: wt_max <- 72 (a literal). NBER README assumptions table: “$72.06B” (text). NBER chapter, PDF pp.21-22 (eq. 4): the same 72.06 in the semi-elasticity formula; PDF pp.24, 33 and 34: “$72 billion” as the ceiling, and the central revenue of Table 10 as 0.5 x 72 = $36 billion. Our recomputation from final.csv (R/nber_final.R:compute_nber_ceiling(), py/nber_final.py:compute_nber_ceiling()): domestic total at 7% growth (sum(face_tax_5pct[panel=="domestic"]) = $100.9056B) minus the 7 removed_departed rows ($28.8541B) = $72.0515B.
The three numbers are one quantity at three roundings. The person-level data sum to 72.0515. The 72.06 is the difference of the two figures each rounded to two decimals first (100.91 - 28.85). The 72 is the chapter’s own round figure, and the script draws revenue up to it. The gaps are $0.01B (0.01%) and $0.05B (0.07%). Every printed result reproduces with the round 72, and two need it. Table 10 does: with 0.5 x 72.05 its 3% cell would print 23.8%, not the printed 23.7%. Eq. 4’s semi-elasticity does too: (100.9 - 72)/100.9/0.05 = 5.73, the printed value, while the 72.06 shown in the equation gives 5.72. The pipeline rebuilds the ceiling from final.csv for the record and uses the script’s 72 for every result, as the authors do.
5. The litigation weight q = 0.50 is carried by the revenue draw, not by a multiplier in the code
Kind: documentation.
NBER README assumptions table: “Litigation risk: Probability the Act survives constitutional challenge, q = 0.50 (ASC 740-10 ‘more likely than not’), applied to the recognized base” - listed as a defining feature of the litigation-weighted approach. Code, NPV_dist_v8.R:19: wt_min <- 0; wt_max <- 72 # wealth-tax revenue ($B), embeds litigation range. The script’s header, lines 5-6: WT ~ U[$0B, $72B] wealth tax revenue (0 = Act struck down; 72 = ceiling after confirmed departures). No q variable and no * 0.5 anywhere in the file.
The script’s comment says the draw “embeds litigation range”: E[U(0, 72)] = 36 = 0.5 * 72, i.e. drawing WT uniformly from 0 to the ceiling has the same expected value as multiplying the ceiling by 0.5. The README states q = 0.50 for the point estimate (0.50 × 59.15 = 29.6, eqs. 6-8) and a uniform draw from 0 (struck down) to 72 for the simulation; the draw and q applied to the 72 ceiling (the chapter’s central estimate, PDF p.33) share a mean, 36, but not a distribution. The code has no separate q. We reproduce the code as shipped (wt ~ U[0, 72]). The chapter also grounds the 0 floor in unreported departures (fn.32, PDF p.34).
6. Baseline revenue: the paper types 94.20 and builds on it; the workbook’s own sum is 94.30
Kind: rounded or typed input.
Workbook, CA_Billionaires_Revenues_and_Migration_final.xlsx!Summary_Preferred!C5 (=SUM(Calculations_Preferred!O3:O214)/$M$2) = 94.30426206. Workbook, Summary_Preferred!C8 = 94.2 (typed literal, feeds F8’s literature-calibrated formula, p.14 eq.13) and NPV_calculations_5.2.xlsx!B5 = 94.2 (typed literal, feeds every Table 9/10 scenario’s f = 1 - WT/baseline, p.19-20). First-version paper, p.10 (Sec 4.1): “the wealth tax would generate $94.20 billion in revenue.” NBER chapter, PDF pp.18-19 (Sec 4.1, eq. 2): the same $94.20B. It then grows the baseline 7% to “approximately $100.9 billion” (PDF p.13), which is 1.07 x 94.30 (100.91); 1.07 x 94.20 would be 100.79. Its person-level file at the grown vintage, final.csv, sums to $100.906B, exactly 1.07 x 94.304.
The printed 94.20 is not a rounding of the workbook’s sum, which rounds to 94.30. It is a value typed into two cells, and the first version builds every later number on it: the literature calibration, Table 9, Table 10 and the Monte Carlo’s f = 1 - WT/94.2. The pipeline reproduces every one of those printed numbers with the typed 94.2. The two baselines differ by $0.10B (0.1%). The shared materials do not show where 94.20 comes from: the workbook’s only committed version sums to 94.30. The NBER chapter’s ceiling and Monte Carlo come from final.csv, which agrees with 94.30; its Appendix B repeats the first version’s calculations on 94.20. R/revenue_chain.R:compute_revenue_chain() reports both baseline_precise (94.30, from the per-row sum) and baseline_literal (94.2, the value used downstream).
7. First version: two memo cells, Summary_Expanded!D23:D24, read from the wrong sheet (stale copy-paste)
Kind: documentation.
Workbook, Summary_Expanded!D23: =SUMIF(Calculations_Preferred!F3:F214,"N",Calculations_Preferred!D3:D214) - and D24 the same pattern with column L. Both reference Calculations_Preferred (the 6-departure scenario) even though every other formula on this sheet (including the revenue figure that actually matters, F5) correctly references Calculations_Expanded (the 10-departure scenario). This looks like a copy-paste artifact from building Summary_Expanded off a copy of Summary_Preferred. It does not affect any number this pipeline reproduces (F5 = $55.10B is correctly sourced), only the “Stayers” net-worth memo cells (C22:D25), which we do not use.
8. First version: the Table 9 central scenario (WT = $42.0B) is a typed input with no derivation
Kind: rounded or typed input.
Workbook, NPV_calculations_5.2.xlsx!B12: 42 (typed literal, no formula). First-version paper, p.19: “The Central Scenario uses a revenue estimate of $42.0 billion and a midpoint income tax estimate (C = $4.55 billion).”
Every other WT figure in that version traces to a computation (94.20 -> 67.51 -> 55.10 baseline chain, or 45.59 via the literature semi-elasticity). $42.0B does not: it is not the average of any two chain values (e.g. (67.51+35)/2 = 51.3, not 42), not the preferred-estimate midpoint stated on p.14 ((35+46)/2 = 40.5, close but not equal), and not linked to any semi-elasticity via the eq. 12-13 formula used elsewhere. We treat it as a freestanding scenario input (labelled scenario in export/{r,py}/inputs.csv, not data or research) and do not attempt to re-derive it.
9. First version: the printed Monte Carlo summary comes from a different run of the same code
Kind: seed variation.
First-version paper, p.20: mean -$24.7B, median -$19.1B, sd $38.4B, 71% negative. Running the authors’ own unmodified NPV_data/NPV_dist.R from a scratch copy (seed 2026, n=100,000, wt_max <- 67.51 as shipped) gives mean -$24.77B, median -$19.10B, sd $38.60B, 71.0% negative, matching our R port to 1e-9 (tests/testthat/test-npv-mc.R). The median and share negative round to the printed digits. The mean and sd are $0.07B and $0.2B away.
Both gaps are within Monte Carlo error. Over 100,000 draws the standard error of the mean is about $0.12B and that of the sd about $0.10B, so the gaps are about 0.6 and 1.9 standard errors, inside the four-standard-error tolerance the tests use. The draws are independent uniforms, so the model’s exact mean and sd have closed forms (npv_mc_analytic_mean(), npv_mc_analytic_sd() in R/npv_mc.R): -$24.707B and $38.423B. Both round to the printed digits. So the printed summary is what the same code gives on a run with a different seed or random-number state: across 400 seeds, about one in twenty gives all four printed values (feedback/006-2026-10-16-jr-author-mismatches/seed-spread.R). The shipped seed, 2026, gives the figures above. The eq. 22 typo (note 1, 67.1 vs 67.51) does not explain the gap: with wt_max <- 67.1 the mean moves to -$25.3B. The NBER version’s printed summary (mean -$38.9B, median -$35.3B, sd $37.6B, 85.2% negative) reproduces from NPV_dist_v8.R with the shipped seed.
Footnotes
The export CSVs,
headlines.csvandprinted-tables.csvalso carry rows for the authors’ first version (Rauh, Jaros, Kearney, Doran and Cosso, Hoover Institution, SSRN 6340778, March 2026), which the pipeline reproduces too. In the export CSVs andheadlines.csvthey are markedssrnin theversioncolumn. Inprinted-tables.csvthey are the tablestable9andtable10; the labeltable8is the chapter’s Table 9. The report’s appendix uses them.↩︎The manifest also lists the PDF of the authors’ first version (March 2026), which the pipeline reproduces as well.↩︎