Version history for the PEPIndex (Presidential Economic Pressure Index)
PEPIndex publishes deliberately separate version numbers. The values below describe the current release:
Identifier
Current
Meaning
API path version
v1
URL contract — /api/v1/…
API implementation
2.0.0
App / OpenAPI version
Schema (data dictionary)
1.4.4
Output / table schema
Methodology
1.2.17
Scoring framework
Data build
generated_at
ISO timestamp on every snapshot
API changes & stability contract
The REST API publishes a machine-readable contract at
/openapi.json
(interactive docs at /docs), with versioned copies pinned per methodology release.
Stability promise: additive changes (new endpoints, new optional response fields) ship at any time
— clients should tolerate unknown fields. Breaking changes (removing or renaming a top-level
response field, removing an endpoint, changing an endpoint's access tier) are announced in this section at least
30 days before taking effect. The /api/v1 path prefix changes only with a v2.
Date
Change
Type
Aug 2026
Versioned OpenAPI contract published (pinned per methodology release; live at /openapi.json)
Additive
Jul 2026
New endpoints: GET /api/v1/index/branch/{judicial|congressional} (free), GET /api/v1/sector-reactions (Standard), GET /api/v1/events/{id}/sector-reaction (Premium)
Additive
Jul 2026
Free snapshot adds branch_reaction; index history adds branch columns and daily S&P 500 close
Additive
—
No breaking changes announced.
—
v1.2.17 (ops)August 2026 — Statistical revisions, and reporting BLS as the four release schedules it actually is
No scoring or methodology change — three data-integrity fixes on the economic input layer:
Revisions are absorbed automatically, and now recorded. Every BLS series PEPI reads is revisable after publication, on no schedule we can assume: benchmark and seasonal-factor revisions reach further back than the routine one, corrections land off-cycle, and the calendar itself slips (the 2025 appropriations lapse removed October 2025 from the annual import/export price review). PEPI therefore re-fetches the full history each run and compares every observation against the stored value, so a restatement is caught wherever it lands — and the economic layer tracks latest vintage, not point-in-time. What a revision moves is bounded and was verified rather than assumed: it updates the price-impact measures and the per-event economic columns derived from them, and it does not move any composite score or the daily index — the behavioural index is stable against statistical revision by construction. Each detected restatement is now written to a durable provenance ledger (what changed, when, by how much), readable by operators, so the automatic update stays auditable after the fact.
“BLS” is reported as three sources, because it publishes on three calendars. The employment, consumer-price and producer/import-price releases land on different days of the month, so a single “data through” date stated the truth about the fastest series while implying it of the slowest. The source-freshness view now shows three BLS rows, one per release cadence; in the first half of a month they legitimately read different reference months, and that is the release calendar, not staleness.
A release-day fetch could miss the release. The daily fetch skipped when it had already run that calendar day, so an early-hours run reliably claimed the day before the data existed — on exactly the days that carry new numbers. The skip now anchors on the agency's release time rather than the calendar day: same one fetch per day, on the correct side of publication. Caught live against the July employment release, which the fixed logic picked up the same morning.
v1.2.17August 2026 — The behavioural dimensions become measurements
Four scoring inputs existed only as function parameters, with nothing stored behind them, so two dimensions — Rhetorical Dilution and Scope Reduction — were arithmetically constant for every live event, and Framing Shift ran on one input instead of two. Each is now measured and stored: dilution and framing are measured from follow-up statements the classifier already processed and previously discarded, matched to their event deterministically; scope is judged by the resolvers on their existing calls and recorded as null rather than guessed when the evidence is silent. A separate defect is corrected in the same release: events minted from a Federal Register document were being “resolved” by that same document, producing an outcome on the threat date and a single repeated score. Published history is rebuilt in full so the whole series is computed under one formula (methodology v1.2.17).
Correction (August 2026): the dilution and framing half of that release did not initially take effect. Two independent defects had to be fixed in sequence — the writer’s branch condition was unsatisfiable, and the classifier’s output contract nulled the very fields the matcher reads — so those two inputs measured nothing until both were corrected. Scope Reduction, the other half, worked throughout. The two are now populated by the corrected live path and by a historical pass that attaches a follow-up statement to an already-resolved event only when it was contemporaneous with it (after the threat, no later than the outcome). Coverage is still thin and is stated as a limit on the validation page — an unmeasured input contributes nothing rather than assuming no softening.
v1.2.16July 2026 — Judicial coverage: the courts where executive orders actually get challenged
The index tracked executive orders on the way in, but not the litigation that decides them (schema v1.4.4, methodology v1.2.16):
Coverage beyond the trade courts. Automated court ingest watched the trade courts and the Supreme Court. The trade courts are specialist venues and the Supreme Court is the final appellate stop, so a challenge to an economically significant executive order produced no judicial signal until (and unless) it reached the Supreme Court — while the district and circuit courts where such challenges are filed and first enjoined hold an order of magnitude more executive-order opinions. Coverage now includes the courts hearing executive-order litigation.
A relevance rule that fits a district court. The per-court acceptance test sees only the case caption — party names — so neither existing rule transfers: subject keywords almost never appear in captions, and a generic government-party marker is the baseline in a district court rather than a signal. A narrower presidential-party marker isolates the high-signal captions, and was validated live at full recall on presidential captions across the newly added courts.
Judicial sub-index now activity-weighted by court.judicial_index counted every filing equally. Because the trade-court docket is admitted unfiltered and is mostly routine antidumping work, that made the series a measure of trade-court throughput — one landmark Supreme Court ruling moved it exactly as much as one unrelated duty opinion. Filings are now scaled by each court's precedential reach and the signal purity of what is admitted from it. Published judicial_index history was rebuilt; the congressional series is unchanged.
Market reaction now goes beyond the single economic lens (schema v1.4.2, methodology v1.2.15):
Sector market reaction (paid). Per event and per sector ETF (consumer, industrial and emerging-market exposure): threat-day move, threat→outcome move, and each relative to the S&P 500 — derived from the stored per-event market series. A cross-event rollup ranks the sectors by reactivity. New endpoints: GET /api/v1/events/{id}/sector-reaction (Premium), GET /api/v1/sector-reactions (Standard).
Government-branch reaction sub-indices (free). Two new daily series measure how actively the judicial branch and Congress are engaging with tracked threats between threat and conclusion: recency-weighted court filings / bill actions plus branch-evidenced resolutions, on a 0–100 saturating scale. Derived purely from public government records (court dockets, Congress.gov), so they are free: GET /api/v1/index/branch/{judicial|congressional} needs no key, and the free snapshot carries a branch_reaction summary plus the branch columns in index_history.
Bill actions persisted. The Congress.gov bill actions the legislative reconciler already fetched are now retained (no new external traffic), feeding the congressional series.
v1.4.1 (data)July 2026 — Index enrichment & the rhetorical sub-index
A full dataset audit populated four surfaces that were empty or NULL and fixed two bugs (schema v1.4.1, no methodology change):
Event timelines — every event now carries a chronological threat and outcome entry (previously only court-ruling events did), served at /events/{id}/timeline and in the Snowflake shares. Historical events backfilled.
Rhetorical sub-index — the fourth domain line (rhetorical_index) now populates, seeded with documented pure-signaling threats that were made and never acted upon (broadcast-license threats, “open up the libel laws,” and the subsidies/contracts feud threat). The full four-domain calibration catalogue is listed on the methodology page, and the data dictionary now documents the event timeline endpoint.
S&P 500 daily context — the daily index series now carries the day's S&P 500 close alongside each score (free public market data).
Regulatory term tracking — the eCFR step now records how often TACO-relevant terms (Section 232/301, IEEPA, reciprocal tariff, …) appear in the CFR over time, plus point-in-time title-structure snapshots.
v1.2.14 (ops)July 2026 — Alerts, distribution & verification backstop
Operational and product updates under the v1.2.14 methodology (schema v1.4.0):
Event alerts — free, double-opt-in email digests plus HMAC-signed webhooks when a new threat event is detected or a tracked event resolves; per-subscriber severity/domain filters, one digest per cycle, one-click unsubscribe. Sign up on the dashboard's API tab.
Snowflake Marketplace — PEPIndex is listed as a free live sample: 30-day event teaser, 90-day daily index, re-threat lineage, and the full economic stack on the documented 2018–2026 benchmark events. Full data stays on the REST API; enterprise data shares available privately.
Independent applied-rate backstop — a monthly Census Bureau duty/value cross-check now audits the live USITC applied rates per country and HS chapter (publication-lag-aware; discrepancies reviewed before affected gap numbers are trusted).
Live rate extraction backfill — pre-v35 trade events gain classifier-extracted announced rates via a one-click workflow, extending quantitative gap scoring across the historical event set.
Serial-bluffer lineage — a new pipeline pass links each threat to the resolved prior threat it re-makes; the Repetition dimension now counts prior reversals along that chain (it previously counted near-duplicate reposts).
Provenance-weighted outcomes — every resolved event publishes its evidence source (court / congress / federal_register / independent reporting / self-reported); outcomes resting only on the president's own posts are discounted on the reversal dimension.
Live quantitative gap scoring — the classifier now extracts the explicitly-stated headline tariff rate from threat text, so live trade threats are scored quantitatively against measured USITC applied rates instead of only calibration events.
Outcome-date integrity — all resolvers write through one canonical path that clamps outcome dates into [threat date, today], backed by a database constraint; historical impossible dates repaired.
Verification feedback — eCFR regulatory diffs and USITC applied-rate data are now compared against each recorded outcome; disagreements feed an operator review queue.
Operational updates under the v1.2.13 methodology (schema v1.3.7–v1.3.8):
Supreme Court monitoring — court ingest now watches the Supreme Court alongside the trade courts, resolving domestic executive-order outcomes (e.g. Trump v. CASA, June 2026); non-trade resolver throughput raised.
Stripe subscriptions live — Standard ($49.99/mo) and Premium ($199.99/mo) keys are purchased via Stripe Checkout with automatic issuance, cancellation deactivation, and dunning grace.
Per-operator admin accounts — named console logins with per-operator audit attribution replace the shared admin password (schema v1.3.8).
Pipeline reliability — silent step failures now fail the run and file an alert issue; classification consolidated onto the batch path; the public data.json fallback is baked fresh at deploy time instead of committed each cycle.
v1.2.13June 2026 — Realistic outcomes
Corrected an artifact where the index recorded a ~97% chicken-out rate with zero follow-throughs. Four fixes:
Follow-through detection. The classifier now distinguishes a new forward-looking threat from restatements, de-escalations and claims about an existing threat. Only a new threat mints a trackable event, so reposts and self-reported wins no longer inflate the pending count.
Foreign-policy / domestic outcome resolver. A grounded web-research step reconciles overdue non-trade events the Federal Register / court / Congress resolvers can't reach — weighting independent reporting above the president's own posts.
The indeterminate state. Non-trade events that lapse with no evidence now finalize to indeterminate (not scored, excluded from the chicken-out rate) instead of a fabricated abandoned. Trade lapses still slip to abandoned (the statutory↔applied gap is observable evidence).
Near-duplicate collapse. Near-duplicate reposts are grouped and counted once, feeding the repetition dimension.
Closed a limbo gap where deadline-after-threat events could drop out of both the live-pressure and settled index between their threat-aging and finalization anchors. Live pressure now runs from the stated deadline to the end of the monitoring window, the exact complement of finalization.
v1.2.11June 2026 — Event lifecycle finalization
Every event now terminates as a TACO or a facilitation rather than tracking indefinitely. Historical backfill finalizes immediately instead of parking in monitoring. The calibration lock is applied consistently across both seed catalogues.
v1.2.10June 2026 — Live deadline pressure
Overdue, unresolved threats now build a provisional live_pressure_score each cycle, so an unmet deadline visibly accrues pressure over time. The settled index value is unchanged; a new index.live_value folds overdue pressure in so the headline can move in real time.
Section 301 USTR actions publish as Federal Register notices (not presidential documents) and were previously invisible to the index. The pipeline now ingests USTR notices as a threat source of their own, with a notice-window backfill fix (v1.2.9) and a calibration-catalogue lock (v1.2.8) that freezes hand-curated benchmarks so their values never drift.
v1.2.4 – v1.2.6May–June 2026 — Live data + proclamation ingestion
The dashboard now reads live data from GET /api/v1/snapshot, decoupling published-data freshness from deployments. Presidential proclamations (Section 232 / reciprocal tariffs) are now classified into events. Academic-only replication datasets were removed in favor of freely-citable published constants.
Added the statutory_authority field (IEEPA, Section 301/232/122, etc.), a redundant fallback source for trade-court records, and BEA PCE pass-through series for cross-validation against the Yale Budget Lab Tariff Tracker.
v1.1.0May 2026 — Economic impact methodology
Integrated the four-group economic-impact methodology, formalized the six-dimension behavioral scoring framework, added the recency-weighted rolling index, and published the REST API specification.