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

Published

October 17, 2026

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

Counted with testthat's ListReporter by tests/count_tests.R
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:

  1. 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.
  2. 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).
  3. 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).
  4. The site (test-site.R): the explorer’s grid.js and site/data/headlines.csv must 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

R pipeline (R/), Python twin (py/), and the runners
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.

10. The top 212’s share of bracket tax is printed as 39.0% and as 38.8% for one formula

Kind: documentation.

NBER chapter, PDF p.27, after eq. 10: “For the top 212 of 4,729 filers, this implies a 39.0% share of bracket tax liability, or approximately $4.3 billion in Tax Year 2023.” NBER chapter, PDF p.28: “the continuous Pareto share S(212, 4,729) = (212/4,729)^((α−1)/α) = 38.8% of bracket tax liability.” First-version paper: the same two sentences, p.15 (after eq. 16, 39.0%) and p.16 (38.8%). Code, NPV_data/monte_carlo_sim.R:68-70: computes the continuous share, (212 / 4729)^((alpha - 1) / alpha) = 38.85% at the fitted alpha of 1.4379, and the share of the top 212 in the rank-implied schedule before rescaling, 34.75%, then rescales the schedule so the top 212 hold the continuous share.

The text prints one formula with two values. The code’s continuous share rounds to 38.8%, and no step of the code gives 39.0% (the formula at the rounded alpha of 1.44 gives 38.7%). The $4.3 billion follows from 38.8% as well (0.3885 x 11.1 = 4.31). The income tax draws use the rescaled schedule, so no number downstream changes. tests/testthat/test-pareto.R holds the continuous share against the printed 38.8% and the unrescaled share against 34.75%; the printed 39.0% is recorded here, not tested.

Footnotes

  1. The export CSVs, headlines.csv and printed-tables.csv also 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 and headlines.csv they are marked ssrn in the version column. In printed-tables.csv they are the tables table9 and table10; the label table8 is the chapter’s Table 9. The report’s appendix uses them.↩︎

  2. The manifest also lists the PDF of the authors’ first version (March 2026), which the pipeline reproduces as well.↩︎