Splitrule

Account
Methods

Sources and calculations: missing economic data and prediction-market settlement

The claim and source map, reproducible tables, and calculation inputs, results, and script for the article on missing economic data and prediction-market settlement.

Supporting material for Matt's article and its methods companion. This page reproduces the claim and source map and the calculation packet prepared for article v3. Later editorial revisions changed the title, wording, punctuation, and the displayed precision of one formula result. They kept these sources, claims, and calculations.

File names and relative paths in the source map, the input file, and the provenance script identify retained research evidence. Those files are not published here. The public recalculation does not need them.

Article v3 claim and source map

Supporting material by Splitrule. October 9, 2026. It covers the claims in article v3 and its methods. PDF locators count the cover. Web locators use section names because extracted line numbers are tool-specific.

Primary source register

ID Source / version Retained evidence and exact locator
S01 BLS revised 2025 release calendar, observed October 9 Discovery sources/bls-web-extract.json; rows for September/October Employment Situation and October/November CPI
S02 Employment Situation, December 16, 2025 New sources/jobs-verification-web.json plus discovery excerpt; opening two-survey explanation and establishment/household shutdown boxes
S03 CPS shutdown account, observed October 9 Same new/retained excerpts; questions 1–2, no October estimates/no retroactive collection
S04 CPI shutdown FAQ, modified September 16, 2026, observed October 9 Discovery sources/bls-october-2026-web-extract.json, new sources/primary-verification-web.json; questions 1–8, 12 and 16; independent review BLS excerpts confirm the added sections
S05 BEA Q3 initial estimate, December 23, 2025 Discovery sources/bea-gdp-initial.html; opening shutdown/replacement note
S06 CPI release schedule and November calendar, observed October 9 New sources/primary-verification-web.json and sources/bls-november-calendar-web.json; October-reference row/November 10 cell and Eastern Time footnote
S07 BLS percent-change guide, modified February 9, 2023 New sources/cpi-calculation-web.json; one-month and twelve-month sections, consistent-base warning
S08 BLS missing-data approximation factsheet, modified December 17, 2025 New sources/primary-verification-web.json; agreement condition, geometric mean and unofficial-status note
P01 PM-US NFPC, April 3 filename/cover Discovery sources/pmus-nfpc.pdf; pp. 2–3
P02 PM-US URC, April 3 filename/cover Discovery sources/pmus-urc.pdf; pp. 2–4
P03 PM-US CPIC, April 6 filename/March 31 cover Discovery sources/pmus-cpic.pdf; pp. 2–4
P04 PM-US GDPC, April 6 filename/March 31 cover Discovery sources/pmus-gdpc.pdf; pp. 2–4
P05 PM-US rulebook, September 30 cover, downloaded October 9 New sources/pmus-rulebook-2026-10-09.pdf; rule 1.5 PDF p. 14 / printed p. 13; rules 10.3–10.4 PDF p. 81 / printed p. 80; Contract Outcome definition PDF p. 7; Modification definition PDF p. 9 / printed p. 8
S09 CPI release, December 18, 2025 Review sources/bls-verbatim-excerpts-2026-10-10.txt; opening, Table A All items monthly row and selected component rows, unadjusted index 324.122
S10 Employment Situation, January 9, 2026 Same review excerpt; Table A revision of November 4.6 to 4.5 and updated seasonal factors box
S11 FRED UNRATE, last updated October 2, 2026, read October 9 Eastern Same review excerpt; 2025-10 missing, 2025-11 4.5; later repository display, not an original release
S12 September 2025 CPI, October 24 release Same review excerpt; all-items unadjusted index 324.800, 1982–84=100; monthly seasonally adjusted change 0.3%
S13 September 2024 CPI, October 10 release Same review excerpt; all-items unadjusted index 315.301, same base
S14 November 2024 CPI, December 11 release Same review excerpt; all-items unadjusted index 315.493; diagnostic exclusion only
K01 Kalshi CPI terms, undated, retained October 9 Eastern Review sources/kalshi-cpi-terms-2026-10-09.pdf; p. 1 Underlying; p. 2 Payout Criterion formula, dates and Contingencies
K02 Kalshi U3 terms, undated, retained October 9 Eastern Review sources/kalshi-u3-terms-2026-10-09.pdf; p. 2 last-available-month criterion, dates and Contingencies
K03 October CPI event page, observed October 9, 2026, 9:46 p.m. Eastern Review sources/kalshi-public-market-pages-2026-10-10.txt, October block, and inspection/kalshi-kxcpi-25oct-rules-notice-2026-10-10.jpg; notice input month/rounding, displayed 0.2. Notice publication date unknown.
K04 Kalshi November 6, 2023 filing, dated cover Review sources/cftc-kalshi-shutdown-rule-2023-11-06.pdf; pp. 1–2 extension and scope. Historical evidence, not continuous applicability proof.

Discovery paths are relative to ../next-post-discovery-2026-10-09/. New paths are relative to this directory. Review paths are relative to ../missing-statistic-independent-review-2026-10-09/. Review filenames dated October 10 use UTC; their reads occurred October 9 Eastern. V3 reused those retained files without new venue acquisition. A web excerpt may be partial. The source URL and locator remain the authoritative audit route where a complete local capture is unavailable.

PDF SHA-256 identities

P01 NFPC 45554a22c43760574879220a662f4f9be069dd4c08af74071077428bc2d2a4d8
P02 URC  916127ab0b1d9bd874b0a184aebb925ad48c01f555cba4483e8fa61e856f88f0
P03 CPIC 585d331b60e1206ffd6cb9b1e039697e722fbbe87f8106d63054be33dd8ec414
P04 GDPC e822d0d8651292f254be6a53271a1e25f9b6be8c21d6383851fb7cfc681b46ce
P05 Rules 1635f93f6ee65f0daea036f816ec52ff2d85381692e4415c81efa3695c3d43bc
K01 CPI  2cdb3a94c1419e18d0652c47133dd82284a2c153366a7603c03ac0370daf57e6
K02 U3   bb568889c706fb070b0a977352260b545ca8ff9e7c1936a76a1edd77aba3ce2e
K04 2023 a1170b6aaba0ed3fa1fb735cf7825340fe0048962e602bdf237f8c1c8dcb6f61

Claims and boundaries

ID Article location / claim Evidence Evidence state and qualification
C01 Opening/jobs: October report cancelled, payroll data arrived December 16 S01 and S02 establishment-survey shutdown box Historical publication fact, not settlement
C02 Opening/jobs: October unemployment missing; separate surveys S02 opening/household box; S03 question 2 Historical collection/publication fact
C03 Eight-row table and separate report-date interval S01, S04 question 1, S05, S09, discovery observations plus November row; calculate_v3.py Selected slots; new monthly statistic null and report delay 8 kept separate; GDP replacement shared
C04 CPI: missing survey observations, carry-forward process, some nonsurvey recovery S04 questions 2–6 and 12 No inference that every series is missing or imputation is an official published observation
C05 Ratio mechanism and 0.325% / 3% examples S07; inputs_v3.json, arithmetic_v3.json Formula factual; all numeric inputs invented; monthly display rounded
C06 October 2026 missing annual comparison S04 question 16 Prospective agency guidance conditional on unavailable prior-year index
C07 November 10, 2026, 8:30 a.m. ET S06 exact reference-period row and Eastern footnote Schedule observed October 9, not actual publication
C08 GDP initial estimate replaces two named slots S05 opening note; P04 specified-release clause p. 3 Historical replacement fact; contract eligibility remains unresolved
C09 Payroll/unemployment default expiration and prior-period/review P01 p. 2 Expiration, p. 3 special circumstances; P02 p. 3 Conditional default; discretionary choice; no current listing bound
C10 CPI/GDP fair-price/review and delay P03 pp. 3–4; P04 p. 3 CPI equivalent-source condition preserved; GDP not assigned CPI's separate no-data clause
C11 Precise measure, vintage, comparison and precision P01 p. 2 and p. 3; P02 pp. 2–3; P03 pp. 2–3; P04 pp. 2–3 Template-specific definitions; no universal first-print rule asserted
C12 Review timing, modification and hierarchy P05 rules 1.5, 10.3–10.4, Modification definition; product settlement clauses Actual cash availability unobserved; no fixed review maximum established
C13a Earlier-period payroll input is a change P01 Underlying p. 2 read with fallback p. 3 Contextual interpretation; earlier value's original/revised vintage unspecified
C13b At least versus above 4.2% P02 operator definitions p. 2; input assumptions and Decimal calculations Hypothetical branch choice; review payout remains null
C13c Fair price differs from entry-cost refund P03/P04 permit route; stipulated example and Decimal calculations $0.62 not estimated or observed; $1 complementary payoff assumed; fees excluded
C14 Scope is four current public templates Discovery research product index, hashes, and review 2026 document versions; cover and filename dates distinguished; no exact current or historical listing binding
C15 Private approximation is not official CPI S08 agreement condition and unofficial-status note; P03 source/input clauses Does not decide any actual exchange review outcome
C16 Same economic headline/source insufficient for contract comparison C01–C15 and C17–C24 together Analytical conclusion about input/fallback identity; no arbitrage, hedge or performance claim
C17 November report arrived without monthly all-items statistic S09 Table A; S01 November CPI row Seasonally adjusted all-items CPI-U one-month value absent in December 18 release; some components present; report delay is eight days
C18 Actual 4.6-to-4.5 vintage change S02, S10 Table A, S11 Actual agency values; at-least-4.6% condition hypothetical; no observed payout
C19 Later CPI comparison and rent effects S04 questions 7–8 and 16, S09 Agency-described mechanisms; sixth root of 12-month relative for April rent versus usual six-month relative; no exhaustive final-effect claim
C20 Source-list differences P01 p. 2; P02 pp. 2–3; P03/P04 pp. 2–3; S11 Named aggregators distinct from official-agency default lists; no claim that only a new modification could establish an alternative
C21 Kalshi explicit defaults preserve review K01/K02 p. 2 Payout Criterion and Contingencies; K04 historical extension Full clauses read together; not wholly mandatory versus discretionary venues; no unchanged-rule inference from 2023
C22 October page notice names September and displays 0.2 K03 retained excerpt; partial screenshot for notice wording Later page observation only; publication and payment dates unknown; no claim notice existed at entry
C23 October formula 0.247655% rounds to 0.2% K01 formula; K03 named month/rounding; S12/S13 numeric inputs; script Reproduction matches display but exact executed series/values/version unproven; NSA inputs differ from normal SA monthly underlying
C24 Other page reads cannot identify four settlement paths Review public-page excerpts/log, S09/S14 diagnostic formula U3 month unknown; November route ambiguous; payroll threshold vector not unique. Companion exclusion, not article settlement cases.

Reproduction artifacts

Input assumptions, calculation source, machine-readable results, editable tables. The script binds the original seven rows to the discovery observations and the added row/formula/vintage inputs to retained review-source hashes. It keeps November report publication separate from the unavailable monthly statistic. Source and deliverable hashes are retained in the versioned packet manifest.

Reproducible tables for article v3

Supporting material by Splitrule.

Selected historical publication slots

Statistic / slot Scheduled Available Calendar days
CPI, September 2025 2025-10-15 2025-10-24 9
Payrolls, September 2025 2025-10-03 2025-11-20 48
Payrolls, October 2025 2025-11-07 2025-12-16 39
Unemployment rate, October 2025 2025-11-07 Unavailable Not applicable
Headline CPI, October 2025 2025-11-13 Unavailable Not applicable
All-items CPI-U, November 2025: seasonally adjusted one-month change 2025-12-10 Unavailable Not applicable
GDP, Q3 2025: original advance slot 2025-10-30 2025-12-23 54
GDP, Q3 2025: original second slot 2025-11-26 2025-12-23 27

GDP slots share one replacement report. Days measure publication availability, not settlement.

Invented CPI arithmetic

One-month change: 0.325% (display rounded). Twelve-month change if the denominator is 300: 3.00%. Twelve-month change when the denominator is missing: unavailable, retained as null.

Conditional unemployment example

Operator at 4.2% Substituted observation Yes gross No gross
at least 4.2% $1.00 $0.00
above 4.2% $0 $1.00

These rows assume the exchange chooses the earlier-period branch. Review has no assumed payout.

Stipulated fair-price example

100 Yes contracts bought at Purchase cost Gross settlement receipts Gain/loss before fees
$0.40 $40.00 $62.00 $22.00
$0.70 $70.00 $62.00 $-8.00

Assumes the exchange selects $0.62 for Yes. No price-estimation method, fee refund or observed trade is implied.

Report delay versus statistic availability

The November CPI report arrived 8 calendar days after its scheduled date. The all-items seasonally adjusted one-month statistic remains null.

Actual vintage values, hypothetical condition

November 2025 U-3 vintage Value At least 4.6%?
December 16 first publication 4.6% Yes
January 9 seasonal revision 4.5% No

Formula comparison, not execution verification

Case Later NSA index Year-earlier NSA index Formula percent Rounded percent Displayed outcome
october_case 324.800 315.301 0.247655 0.2 0.2
november_diagnostic_only 324.122 315.493 0.225115 0.2 0.2

October uses the period named in the retained notice. Exact execution inputs are unverified. November is a diagnostic exclusion: two candidate calculations round to the same number.

Calculation inputs

The complete retained inputs_v3.json, SHA-256 a97d0d3b7949e081027f4a5c30e9b3f9397b30f654171390de38fed267185728.

{
  "source_observations_path": "../next-post-discovery-2026-10-09/observations.json",
  "source_observations_sha256": "6449c16da75245c93c248258a5de88eaa4dffdcd5bc1252ec1f77a9ddd7882cd",
  "publication_rows": [
    {
      "id": "sep_cpi",
      "statistic": "CPI, September 2025",
      "scheduled": "2025-10-15",
      "published": "2025-10-24",
      "status": "delayed",
      "source": "https://www.bls.gov/cpi/additional-resources/2025-federal-government-shutdown-impact-cpi-faq.htm",
      "locator": "Question 1",
      "note": "September collection completed before shutdown."
    },
    {
      "id": "sep_payrolls",
      "statistic": "Payrolls, September 2025",
      "scheduled": "2025-10-03",
      "published": "2025-11-20",
      "status": "delayed",
      "source": "https://www.bls.gov/bls/2025-lapse-revised-release-dates.htm",
      "locator": "2025 table: Employment Situation, September 2025",
      "note": "Calendar delay, not a measured settlement delay."
    },
    {
      "id": "oct_payrolls",
      "statistic": "Payrolls, October 2025",
      "scheduled": "2025-11-07",
      "published": "2025-12-16",
      "status": "released_in_later_report",
      "source": "https://www.bls.gov/news.release/archives/empsit_12162025.htm",
      "locator": "Establishment Survey Estimates and the Federal Government Shutdown",
      "schedule_source": "https://www.bls.gov/bls/2025-lapse-revised-release-dates.htm",
      "note": "October Employment Situation release cancelled. Initial October establishment estimates appeared with November estimates."
    },
    {
      "id": "oct_unemployment",
      "statistic": "Unemployment rate, October 2025",
      "scheduled": "2025-11-07",
      "published": null,
      "status": "not_collected_no_estimate",
      "source": "https://www.bls.gov/cps/methods/2025-federal-government-shutdown-impact-cps.htm",
      "locator": "October 2025 data collection and missing estimates",
      "note": "No October household estimates; not collected retroactively. Missing is not zero."
    },
    {
      "id": "oct_cpi",
      "statistic": "Headline CPI, October 2025",
      "scheduled": "2025-11-13",
      "published": null,
      "status": "not_published",
      "source": "https://www.bls.gov/cpi/additional-resources/2025-federal-government-shutdown-impact-cpi-faq.htm",
      "locator": "Questions 2, 3, 10 and 16",
      "schedule_source": "https://www.bls.gov/bls/2025-lapse-revised-release-dates.htm",
      "note": "Scope is headline CPI. Some nonsurvey component indexes were published later; not all CPI series are missing."
    },
    {
      "id": "nov_cpi_monthly",
      "statistic": "All-items CPI-U, November 2025: seasonally adjusted one-month change",
      "scheduled": "2025-12-10",
      "published": null,
      "status": "statistic_unavailable_in_published_release",
      "source": "https://www.bls.gov/news.release/archives/cpi_12182025.htm",
      "locator": "Table A, All items row, November 2025 seasonally adjusted change from preceding month; opening two-month comparison",
      "schedule_source": "https://www.bls.gov/bls/2025-lapse-revised-release-dates.htm",
      "note": "The report arrived December 18, eight days late. Its monthly all-items statistic remains unavailable; some component monthly changes exist."
    },
    {
      "id": "q3_gdp_advance",
      "statistic": "GDP, Q3 2025: original advance slot",
      "scheduled": "2025-10-30",
      "published": "2025-12-23",
      "status": "replaced_by_initial_report",
      "source": "https://www.bea.gov/news/2025/gross-domestic-product-3rd-quarter-2025-initial-estimate-and-corporate-profits",
      "locator": "Opening shutdown note",
      "note": "December initial report replaced both advance and second releases. It is not silently classified as the named advance estimate."
    },
    {
      "id": "q3_gdp_second",
      "statistic": "GDP, Q3 2025: original second slot",
      "scheduled": "2025-11-26",
      "published": "2025-12-23",
      "status": "replaced_by_initial_report",
      "source": "https://www.bea.gov/news/2025/gross-domestic-product-3rd-quarter-2025-initial-estimate-and-corporate-profits",
      "locator": "Opening shutdown note",
      "note": "Same replacement report as previous row. These two rows are not independent events."
    }
  ],
  "cpi_hypothetical": {
    "current": "309",
    "previous_month": "308",
    "previous_year_if_available": "300",
    "previous_year_missing": null,
    "scope": "Invented values for one series, geography, adjustment status and index base. No rounding or settlement rule is inferred."
  },
  "unemployment_hypothetical": {
    "prior_available_rate_percent": "4.2",
    "threshold_percent": "4.2",
    "requested_rate": null,
    "max_payout": "1.00",
    "assumptions": [
      "Single-month contract follows reviewed URC template without conflicting override.",
      "No eligible requested-period rate by applicable expiration.",
      "Exchange chooses previous-period branch instead of review.",
      "Prior available rate has the exact required measure and precision.",
      "Binary payouts are gross; fees and entry prices excluded."
    ],
    "review_alternative_payout": null
  },
  "fair_price_hypothetical": {
    "contracts": "100",
    "max_payout": "1.00",
    "selected_yes_price": "0.62",
    "entry_prices": [
      "0.40",
      "0.70"
    ],
    "assumptions": [
      "A separate contract permits fair-price settlement.",
      "Exchange chooses that route and determines 0.62 for Yes.",
      "Complementary No payout is 1 minus Yes payout.",
      "Each scenario holds 100 Yes contracts bought at a single stated entry price.",
      "No fees, rebates, financing, exits or fee reversals included.",
      "Price is stipulated, not estimated from a market or the template."
    ],
    "review_alternative_payout": null
  },
  "additional_publication_row_ids": [
    "nov_cpi_monthly"
  ],
  "report_publication_events": [
    {
      "id": "nov_cpi_report",
      "scheduled": "2025-12-10",
      "published": "2025-12-18",
      "scope": "Report publication only, not availability of the all-items one-month statistic or exchange settlement."
    }
  ],
  "vintage_example": {
    "series": "Seasonally adjusted US unemployment rate (U-3), November 2025",
    "first_value": "4.6",
    "first_release": "2025-12-16",
    "revised_value": "4.5",
    "revision_release": "2026-01-09",
    "hypothetical_condition": "at least",
    "hypothetical_threshold": "4.6",
    "scope": "Observed values, invented contract condition; no actual contract outcome asserted."
  },
  "kalshi_cpi_comparison": {
    "formula": "100 * ((later_index / year_earlier_index) ** (1/12) - 1)",
    "input_series": "CPI-U all items, US city average, not seasonally adjusted, 1982-84=100",
    "october_case": {
      "later_period": "September 2025",
      "later_index": "324.800",
      "year_earlier_period": "September 2024",
      "year_earlier_index": "315.301",
      "displayed_outcome_percent": "0.2",
      "notice_specified_input_month": "September",
      "observation_date_eastern": "2026-10-09",
      "scope": "Reproduced formula using published index inputs agrees with displayed outcome. Exact execution inputs, notice publication time, governing PDF version and settlement date unverified."
    },
    "november_diagnostic_only": {
      "later_period": "November 2025",
      "later_index": "324.122",
      "year_earlier_period": "November 2024",
      "year_earlier_index": "315.493",
      "displayed_outcome_percent": "0.2",
      "published_two_month_sa_change_percent": "0.2",
      "scope": "Excluded from article reconstruction. Rounded formula and published two-month change coincide, so the outcome does not identify the route."
    }
  },
  "additional_source_bindings": [
    {
      "path": "../missing-statistic-independent-review-2026-10-09/manifest.json",
      "sha256": "8474d462da8d0503cf62e5c25dae4114483540aef3a82cf252357fcfe9fb3aaa"
    },
    {
      "path": "../missing-statistic-independent-review-2026-10-09/sources/bls-verbatim-excerpts-2026-10-10.txt",
      "sha256": "248a1b0466b9fdc6b6155c607fcccfe3a6e5f8cb806cc3f88f8fda844e632b75"
    },
    {
      "path": "../missing-statistic-independent-review-2026-10-09/sources/kalshi-cpi-terms-2026-10-09.pdf",
      "sha256": "2cdb3a94c1419e18d0652c47133dd82284a2c153366a7603c03ac0370daf57e6"
    },
    {
      "path": "../missing-statistic-independent-review-2026-10-09/sources/kalshi-cpi-terms-2026-10-09.txt",
      "sha256": "69abd725924a8c404445124a6454ede24e2b28ae295e682ddbdd9758ff6ee193"
    },
    {
      "path": "../missing-statistic-independent-review-2026-10-09/sources/kalshi-u3-terms-2026-10-09.pdf",
      "sha256": "bb568889c706fb070b0a977352260b545ca8ff9e7c1936a76a1edd77aba3ce2e"
    },
    {
      "path": "../missing-statistic-independent-review-2026-10-09/sources/kalshi-u3-terms-2026-10-09.txt",
      "sha256": "4b3ac7b334d3996f9496aaaab54c5fd51daa0ae89f7bd2a8c0daad2952c54a8b"
    },
    {
      "path": "../missing-statistic-independent-review-2026-10-09/sources/cftc-kalshi-shutdown-rule-2023-11-06.pdf",
      "sha256": "a1170b6aaba0ed3fa1fb735cf7825340fe0048962e602bdf237f8c1c8dcb6f61"
    },
    {
      "path": "../missing-statistic-independent-review-2026-10-09/sources/cftc-kalshi-shutdown-rule-2023-11-06.txt",
      "sha256": "c7aa09670e08cb9928293548b48136cb1388acf64956079bb12a8b0464d26fac"
    },
    {
      "path": "../missing-statistic-independent-review-2026-10-09/sources/kalshi-public-market-pages-2026-10-10.txt",
      "sha256": "6798f5997faa3c6464dd3f5e999737560637d815640fa4aa875ae98bd95a7623"
    },
    {
      "path": "../missing-statistic-independent-review-2026-10-09/inspection/kalshi-kxcpi-25oct-rules-notice-2026-10-10.jpg",
      "sha256": "0d3da2eadc44ac3f6f5a41810bea26b4be0aa316c42e0f2ccdddd61a3a34b7da"
    }
  ]
}

Calculation results

The complete retained arithmetic_v3.json, SHA-256 a2ba7fa36b1b79e0dd292c562ba1830cdd00aad5bd8cadf4b7aa8a0515338830. The provenance script wrote it, and the public recalculation reproduces it byte for byte.

{
  "publication_rows": [
    {
      "id": "sep_cpi",
      "statistic": "CPI, September 2025",
      "scheduled": "2025-10-15",
      "published": "2025-10-24",
      "status": "delayed",
      "source": "https://www.bls.gov/cpi/additional-resources/2025-federal-government-shutdown-impact-cpi-faq.htm",
      "locator": "Question 1",
      "note": "September collection completed before shutdown.",
      "calendar_days": 9
    },
    {
      "id": "sep_payrolls",
      "statistic": "Payrolls, September 2025",
      "scheduled": "2025-10-03",
      "published": "2025-11-20",
      "status": "delayed",
      "source": "https://www.bls.gov/bls/2025-lapse-revised-release-dates.htm",
      "locator": "2025 table: Employment Situation, September 2025",
      "note": "Calendar delay, not a measured settlement delay.",
      "calendar_days": 48
    },
    {
      "id": "oct_payrolls",
      "statistic": "Payrolls, October 2025",
      "scheduled": "2025-11-07",
      "published": "2025-12-16",
      "status": "released_in_later_report",
      "source": "https://www.bls.gov/news.release/archives/empsit_12162025.htm",
      "locator": "Establishment Survey Estimates and the Federal Government Shutdown",
      "schedule_source": "https://www.bls.gov/bls/2025-lapse-revised-release-dates.htm",
      "note": "October Employment Situation release cancelled. Initial October establishment estimates appeared with November estimates.",
      "calendar_days": 39
    },
    {
      "id": "oct_unemployment",
      "statistic": "Unemployment rate, October 2025",
      "scheduled": "2025-11-07",
      "published": null,
      "status": "not_collected_no_estimate",
      "source": "https://www.bls.gov/cps/methods/2025-federal-government-shutdown-impact-cps.htm",
      "locator": "October 2025 data collection and missing estimates",
      "note": "No October household estimates; not collected retroactively. Missing is not zero.",
      "calendar_days": null
    },
    {
      "id": "oct_cpi",
      "statistic": "Headline CPI, October 2025",
      "scheduled": "2025-11-13",
      "published": null,
      "status": "not_published",
      "source": "https://www.bls.gov/cpi/additional-resources/2025-federal-government-shutdown-impact-cpi-faq.htm",
      "locator": "Questions 2, 3, 10 and 16",
      "schedule_source": "https://www.bls.gov/bls/2025-lapse-revised-release-dates.htm",
      "note": "Scope is headline CPI. Some nonsurvey component indexes were published later; not all CPI series are missing.",
      "calendar_days": null
    },
    {
      "id": "nov_cpi_monthly",
      "statistic": "All-items CPI-U, November 2025: seasonally adjusted one-month change",
      "scheduled": "2025-12-10",
      "published": null,
      "status": "statistic_unavailable_in_published_release",
      "source": "https://www.bls.gov/news.release/archives/cpi_12182025.htm",
      "locator": "Table A, All items row, November 2025 seasonally adjusted change from preceding month; opening two-month comparison",
      "schedule_source": "https://www.bls.gov/bls/2025-lapse-revised-release-dates.htm",
      "note": "The report arrived December 18, eight days late. Its monthly all-items statistic remains unavailable; some component monthly changes exist.",
      "calendar_days": null
    },
    {
      "id": "q3_gdp_advance",
      "statistic": "GDP, Q3 2025: original advance slot",
      "scheduled": "2025-10-30",
      "published": "2025-12-23",
      "status": "replaced_by_initial_report",
      "source": "https://www.bea.gov/news/2025/gross-domestic-product-3rd-quarter-2025-initial-estimate-and-corporate-profits",
      "locator": "Opening shutdown note",
      "note": "December initial report replaced both advance and second releases. It is not silently classified as the named advance estimate.",
      "calendar_days": 54
    },
    {
      "id": "q3_gdp_second",
      "statistic": "GDP, Q3 2025: original second slot",
      "scheduled": "2025-11-26",
      "published": "2025-12-23",
      "status": "replaced_by_initial_report",
      "source": "https://www.bea.gov/news/2025/gross-domestic-product-3rd-quarter-2025-initial-estimate-and-corporate-profits",
      "locator": "Opening shutdown note",
      "note": "Same replacement report as previous row. These two rows are not independent events.",
      "calendar_days": 27
    }
  ],
  "report_publication_events": [
    {
      "id": "nov_cpi_report",
      "scheduled": "2025-12-10",
      "published": "2025-12-18",
      "scope": "Report publication only, not availability of the all-items one-month statistic or exchange settlement.",
      "calendar_days": 8
    }
  ],
  "vintage_example": {
    "series": "Seasonally adjusted US unemployment rate (U-3), November 2025",
    "first_value": "4.6",
    "first_release": "2025-12-16",
    "revised_value": "4.5",
    "revision_release": "2026-01-09",
    "hypothetical_condition": "at least",
    "hypothetical_threshold": "4.6",
    "scope": "Observed values, invented contract condition; no actual contract outcome asserted.",
    "first_meets_hypothetical_condition": true,
    "revised_meets_hypothetical_condition": false
  },
  "kalshi_cpi_comparison": {
    "october_case": {
      "later_period": "September 2025",
      "later_index": "324.800",
      "year_earlier_period": "September 2024",
      "year_earlier_index": "315.301",
      "displayed_outcome_percent": "0.2",
      "notice_specified_input_month": "September",
      "observation_date_eastern": "2026-10-09",
      "scope": "Reproduced formula using published index inputs agrees with displayed outcome. Exact execution inputs, notice publication time, governing PDF version and settlement date unverified.",
      "formula_percent": "0.24765507780275614976490596869489036827268794400",
      "formula_percent_six_decimals": "0.247655",
      "rounded_one_decimal": "0.2",
      "matches_displayed_number": true,
      "execution_route_verified": false
    },
    "november_diagnostic_only": {
      "later_period": "November 2025",
      "later_index": "324.122",
      "year_earlier_period": "November 2024",
      "year_earlier_index": "315.493",
      "displayed_outcome_percent": "0.2",
      "published_two_month_sa_change_percent": "0.2",
      "scope": "Excluded from article reconstruction. Rounded formula and published two-month change coincide, so the outcome does not identify the route.",
      "formula_percent": "0.22511545017502422629999958740519692640756096100",
      "formula_percent_six_decimals": "0.225115",
      "rounded_one_decimal": "0.2",
      "matches_displayed_number": true,
      "execution_route_verified": false,
      "matches_published_two_month_change": true
    }
  },
  "cpi_hypothetical": {
    "month_percent_unrounded": "0.32467532467532467532467532467532467532467532500",
    "year_percent_if_denominator_available": "3.00",
    "year_percent_with_missing_denominator": null,
    "article_month_percent_display": "0.325",
    "rounding_note": "Display rounding for invented arithmetic only; not an official CPI value or contract precision rule."
  },
  "unemployment_hypothetical": {
    "at_least": {
      "condition_met_if_prior_branch_chosen": true,
      "yes_gross": "1.00",
      "no_gross": "0.00"
    },
    "above": {
      "condition_met_if_prior_branch_chosen": false,
      "yes_gross": "0",
      "no_gross": "1.00"
    },
    "review_alternative": {
      "yes_gross": null,
      "no_gross": null,
      "reason": "No exchange determination assumed for review."
    }
  },
  "fair_price_hypothetical": {
    "yes_gross_per_contract": "0.62",
    "no_gross_per_contract": "0.38",
    "yes_receipts": "62.00",
    "entry_scenarios": [
      {
        "entry_price": "0.40",
        "cost": "40.00",
        "gain_loss_before_fees": "22.00"
      },
      {
        "entry_price": "0.70",
        "cost": "70.00",
        "gain_loss_before_fees": "-8.00"
      }
    ],
    "review_alternative_payout": null
  },
  "scope": "Observed agency values and retained public-page notice/outcome are distinguished from hypothetical payouts and reproduced formulas. No execution route, settlement date, cash-availability time or fee treatment is verified."
}

Recalculate from this page

Save the input file above as inputs_v3.json and the script below as recalculate.py in one folder. Then run python3 recalculate.py. The script needs Python 3.9 or later and its standard library. It reads only inputs_v3.json and makes no network request.

It writes arithmetic_recalculated.json. To compare, also save the results above as arithmetic_v3.json in the same folder. The script then reports whether the two files match byte for byte.

This recalculation checks the arithmetic, not the inputs. It does not show that the inputs match their sources. For that check, use the source links and locators in the source map.

recalculate.py, SHA-256 b7dfe76221c73d135dc1b56165e065078398dea55a9d3986de78ac2a507696d9, was added on October 10, 2026. Its calculation lines are lines 22 to 87 of the provenance script, unchanged.

"""Recalculate the v3 results from the published inputs only.

Public recalculation script for Splitrule's article "Missing economic data and
prediction-market settlement". Added October 10, 2026.

Save inputs_v3.json and this file in one folder, then run: python3 recalculate.py
The script uses only the Python standard library. It reads inputs_v3.json and makes
no network request. It writes arithmetic_recalculated.json. If arithmetic_v3.json
is also in the folder, the script compares the two files.

This checks the arithmetic, not the inputs. It does not show that the inputs match
their sources. The source map gives the source links and locators for that check.
The calculation lines below are copied unchanged from lines 22 to 87 of the
retained calculate_v3.py. That script also checks retained research files, which
are not published.
"""
from datetime import date
from decimal import Decimal, getcontext
import json
from pathlib import Path

ROOT = Path(__file__).resolve().parent
getcontext().prec = 48
data = json.loads((ROOT / 'inputs_v3.json').read_text(encoding='utf-8'))

def percent_change(current, earlier):
    if current is None or earlier is None:
        return None
    return (Decimal(current) / Decimal(earlier) - 1) * 100


def decimal_text(value):
    return None if value is None else str(value)


rows = []
for row in data['publication_rows']:
    days = None if row['published'] is None else (
        date.fromisoformat(row['published']) - date.fromisoformat(row['scheduled'])
    ).days
    rows.append({**row, 'calendar_days': days})

cpi = data['cpi_hypothetical']
cpi_results = {
    'month_percent_unrounded': decimal_text(percent_change(cpi['current'], cpi['previous_month'])),
    'year_percent_if_denominator_available': decimal_text(percent_change(cpi['current'], cpi['previous_year_if_available'])),
    'year_percent_with_missing_denominator': percent_change(cpi['current'], cpi['previous_year_missing']),
    'article_month_percent_display': str(percent_change(cpi['current'], cpi['previous_month']).quantize(Decimal('0.001'))),
    'rounding_note': 'Display rounding for invented arithmetic only; not an official CPI value or contract precision rule.'
}
u = data['unemployment_hypothetical']
rate, threshold, maximum = map(Decimal, [u['prior_available_rate_percent'], u['threshold_percent'], u['max_payout']])
unemployment = {}
for label, met in [('at_least', rate >= threshold), ('above', rate > threshold)]:
    yes = maximum if met else Decimal('0')
    unemployment[label] = {'condition_met_if_prior_branch_chosen': met,
                           'yes_gross': str(yes), 'no_gross': str(maximum - yes)}
unemployment['review_alternative'] = {'yes_gross': None, 'no_gross': None,
                                     'reason': 'No exchange determination assumed for review.'}

f = data['fair_price_hypothetical']
quantity, maximum, price = map(Decimal, [f['contracts'], f['max_payout'], f['selected_yes_price']])
fair = {'yes_gross_per_contract': str(price), 'no_gross_per_contract': str(maximum - price),
        'yes_receipts': str(quantity * price), 'entry_scenarios': []}
for entry in map(Decimal, f['entry_prices']):
    cost = quantity * entry
    fair['entry_scenarios'].append({'entry_price': str(entry), 'cost': str(cost),
                                   'gain_loss_before_fees': str(quantity * price - cost)})
fair['review_alternative_payout'] = None
report_events = [{**event, 'calendar_days': (date.fromisoformat(event['published']) - date.fromisoformat(event['scheduled'])).days}
                 for event in data['report_publication_events']]
v = data['vintage_example']
vintage = {**v, 'first_meets_hypothetical_condition': Decimal(v['first_value']) >= Decimal(v['hypothetical_threshold']),
           'revised_meets_hypothetical_condition': Decimal(v['revised_value']) >= Decimal(v['hypothetical_threshold'])}
formula_cases = {}
for label in ['october_case', 'november_diagnostic_only']:
    case = data['kalshi_cpi_comparison'][label]
    percent = 100 * ((Decimal(case['later_index']) / Decimal(case['year_earlier_index'])) ** (Decimal(1) / 12) - 1)
    rounded = percent.quantize(Decimal('0.1'))
    formula_cases[label] = {**case, 'formula_percent': str(percent),
                           'formula_percent_six_decimals': str(percent.quantize(Decimal('0.000001'))),
                           'rounded_one_decimal': str(rounded),
                           'matches_displayed_number': rounded == Decimal(case['displayed_outcome_percent']),
                           'execution_route_verified': False}
formula_cases['november_diagnostic_only']['matches_published_two_month_change'] = (
    Decimal(formula_cases['november_diagnostic_only']['rounded_one_decimal']) ==
    Decimal(formula_cases['november_diagnostic_only']['published_two_month_sa_change_percent']))
results = {'publication_rows': rows, 'report_publication_events': report_events,
           'vintage_example': vintage, 'kalshi_cpi_comparison': formula_cases, 'cpi_hypothetical': cpi_results,
           'unemployment_hypothetical': unemployment, 'fair_price_hypothetical': fair,
           'scope': 'Observed agency values and retained public-page notice/outcome are distinguished from hypothetical payouts and reproduced formulas. No execution route, settlement date, cash-availability time or fee treatment is verified.'}

text = json.dumps(results, indent=2) + '\n'
(ROOT / 'arithmetic_recalculated.json').write_text(text, encoding='utf-8')
published = ROOT / 'arithmetic_v3.json'
if not published.exists():
    print('Wrote arithmetic_recalculated.json. To compare, save the published results as arithmetic_v3.json in this folder.')
elif published.read_text(encoding='utf-8') == text:
    print('arithmetic_recalculated.json matches arithmetic_v3.json byte for byte.')
else:
    print('arithmetic_recalculated.json differs from arithmetic_v3.json. Compare the two files.')
    raise SystemExit(1)

Provenance script

The complete retained v3 script calculate_v3.py, SHA-256 83e02586e2fa2285021bef768e84dd5807f77017754ae3986627a5118c0c53ef. Before it calculates, it checks SHA-256 bindings to the retained research files named in the input file. Those files are not published, so this script runs only with the retained research packet. It is listed for audit. To recalculate, use recalculate.py above.

"""Reproduce the article's selected dates and explicitly hypothetical examples."""
from datetime import date
from decimal import Decimal, getcontext
import hashlib
import json
from pathlib import Path

ROOT = Path(__file__).resolve().parent
getcontext().prec = 48
data = json.loads((ROOT / 'inputs_v3.json').read_text())
original = ROOT / data['source_observations_path']
if hashlib.sha256(original.read_bytes()).hexdigest() != data['source_observations_sha256']:
    raise ValueError('Accepted discovery observations changed; review before recalculating.')
original_rows = [row for row in data['publication_rows'] if row['id'] not in data['additional_publication_row_ids']]
if original_rows != json.loads(original.read_text())['observations']:
    raise ValueError('Article publication rows differ from accepted discovery observations.')
for source in data['additional_source_bindings']:
    if hashlib.sha256((ROOT / source['path']).read_bytes()).hexdigest() != source['sha256']:
        raise ValueError(f"Additional source changed: {source['path']}")


def percent_change(current, earlier):
    if current is None or earlier is None:
        return None
    return (Decimal(current) / Decimal(earlier) - 1) * 100


def decimal_text(value):
    return None if value is None else str(value)


rows = []
for row in data['publication_rows']:
    days = None if row['published'] is None else (
        date.fromisoformat(row['published']) - date.fromisoformat(row['scheduled'])
    ).days
    rows.append({**row, 'calendar_days': days})

cpi = data['cpi_hypothetical']
cpi_results = {
    'month_percent_unrounded': decimal_text(percent_change(cpi['current'], cpi['previous_month'])),
    'year_percent_if_denominator_available': decimal_text(percent_change(cpi['current'], cpi['previous_year_if_available'])),
    'year_percent_with_missing_denominator': percent_change(cpi['current'], cpi['previous_year_missing']),
    'article_month_percent_display': str(percent_change(cpi['current'], cpi['previous_month']).quantize(Decimal('0.001'))),
    'rounding_note': 'Display rounding for invented arithmetic only; not an official CPI value or contract precision rule.'
}
u = data['unemployment_hypothetical']
rate, threshold, maximum = map(Decimal, [u['prior_available_rate_percent'], u['threshold_percent'], u['max_payout']])
unemployment = {}
for label, met in [('at_least', rate >= threshold), ('above', rate > threshold)]:
    yes = maximum if met else Decimal('0')
    unemployment[label] = {'condition_met_if_prior_branch_chosen': met,
                           'yes_gross': str(yes), 'no_gross': str(maximum - yes)}
unemployment['review_alternative'] = {'yes_gross': None, 'no_gross': None,
                                     'reason': 'No exchange determination assumed for review.'}

f = data['fair_price_hypothetical']
quantity, maximum, price = map(Decimal, [f['contracts'], f['max_payout'], f['selected_yes_price']])
fair = {'yes_gross_per_contract': str(price), 'no_gross_per_contract': str(maximum - price),
        'yes_receipts': str(quantity * price), 'entry_scenarios': []}
for entry in map(Decimal, f['entry_prices']):
    cost = quantity * entry
    fair['entry_scenarios'].append({'entry_price': str(entry), 'cost': str(cost),
                                   'gain_loss_before_fees': str(quantity * price - cost)})
fair['review_alternative_payout'] = None
report_events = [{**event, 'calendar_days': (date.fromisoformat(event['published']) - date.fromisoformat(event['scheduled'])).days}
                 for event in data['report_publication_events']]
v = data['vintage_example']
vintage = {**v, 'first_meets_hypothetical_condition': Decimal(v['first_value']) >= Decimal(v['hypothetical_threshold']),
           'revised_meets_hypothetical_condition': Decimal(v['revised_value']) >= Decimal(v['hypothetical_threshold'])}
formula_cases = {}
for label in ['october_case', 'november_diagnostic_only']:
    case = data['kalshi_cpi_comparison'][label]
    percent = 100 * ((Decimal(case['later_index']) / Decimal(case['year_earlier_index'])) ** (Decimal(1) / 12) - 1)
    rounded = percent.quantize(Decimal('0.1'))
    formula_cases[label] = {**case, 'formula_percent': str(percent),
                           'formula_percent_six_decimals': str(percent.quantize(Decimal('0.000001'))),
                           'rounded_one_decimal': str(rounded),
                           'matches_displayed_number': rounded == Decimal(case['displayed_outcome_percent']),
                           'execution_route_verified': False}
formula_cases['november_diagnostic_only']['matches_published_two_month_change'] = (
    Decimal(formula_cases['november_diagnostic_only']['rounded_one_decimal']) ==
    Decimal(formula_cases['november_diagnostic_only']['published_two_month_sa_change_percent']))
results = {'publication_rows': rows, 'report_publication_events': report_events,
           'vintage_example': vintage, 'kalshi_cpi_comparison': formula_cases, 'cpi_hypothetical': cpi_results,
           'unemployment_hypothetical': unemployment, 'fair_price_hypothetical': fair,
           'scope': 'Observed agency values and retained public-page notice/outcome are distinguished from hypothetical payouts and reproduced formulas. No execution route, settlement date, cash-availability time or fee treatment is verified.'}
(ROOT / 'arithmetic_v3.json').write_text(json.dumps(results, indent=2) + '\n')

lines = ['# Reproducible tables for article v3', '', 'Supporting material by Splitrule.', '',
         '## Selected historical publication slots', '',
         '| Statistic / slot | Scheduled | Available | Calendar days |',
         '| --- | --- | --- | ---: |']
for row in rows:
    days = 'Not applicable' if row['calendar_days'] is None else row['calendar_days']
    lines.append(f"| {row['statistic']} | {row['scheduled']} | {row['published'] or 'Unavailable'} | {days} |")
lines += ['', 'GDP slots share one replacement report. Days measure publication availability, not settlement.', '',
          '## Invented CPI arithmetic', '',
          f"One-month change: {cpi_results['article_month_percent_display']}% (display rounded).",
          f"Twelve-month change if the denominator is 300: {cpi_results['year_percent_if_denominator_available']}%.",
          'Twelve-month change when the denominator is missing: unavailable, retained as null.', '',
          '## Conditional unemployment example', '',
          '| Operator at 4.2% | Substituted observation | Yes gross | No gross |',
          '| --- | --- | ---: | ---: |']
for label in ['at_least', 'above']:
    outcome = unemployment[label]
    lines.append(f"| {label.replace('_', ' ')} | 4.2% | ${outcome['yes_gross']} | ${outcome['no_gross']} |")
lines += ['', 'These rows assume the exchange chooses the earlier-period branch. Review has no assumed payout.', '',
          '## Stipulated fair-price example', '',
          '| 100 Yes contracts bought at | Purchase cost | Gross settlement receipts | Gain/loss before fees |',
          '| --- | ---: | ---: | ---: |']
for scenario in fair['entry_scenarios']:
    lines.append(f"| ${scenario['entry_price']} | ${scenario['cost']} | ${fair['yes_receipts']} | ${scenario['gain_loss_before_fees']} |")
lines += ['', 'Assumes the exchange selects $0.62 for Yes. No price-estimation method, fee refund or observed trade is implied.', '']
lines += ['## Report delay versus statistic availability', '',
          'The November CPI report arrived 8 calendar days after its scheduled date. The all-items seasonally adjusted one-month statistic remains null.', '',
          '## Actual vintage values, hypothetical condition', '',
          '| November 2025 U-3 vintage | Value | At least 4.6%? |',
          '| --- | ---: | --- |',
          '| December 16 first publication | 4.6% | Yes |',
          '| January 9 seasonal revision | 4.5% | No |', '',
          '## Formula comparison, not execution verification', '',
          '| Case | Later NSA index | Year-earlier NSA index | Formula percent | Rounded percent | Displayed outcome |',
          '| --- | ---: | ---: | ---: | ---: | ---: |']
for label, case in formula_cases.items():
    lines.append(f"| {label} | {case['later_index']} | {case['year_earlier_index']} | {case['formula_percent_six_decimals']} | {case['rounded_one_decimal']} | {case['displayed_outcome_percent']} |")
lines += ['', 'October uses the period named in the retained notice. Exact execution inputs are unverified. November is a diagnostic exclusion: two candidate calculations round to the same number.', '']
(ROOT / 'TABLES_v3.md').write_text('\n'.join(lines))
print(json.dumps({'publication_days': [row['calendar_days'] for row in rows],
                  'report_delays': report_events, 'vintage': vintage, 'formula': formula_cases,
                  'cpi': cpi_results, 'unemployment': unemployment, 'fair_price': fair}, indent=2))