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.3
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 (migration v44):
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. All ten series arrive in one call, but the Employment Situation lands on the first Friday of the following month while CPI lands around the 10th–14th and PPI/import prices later still. A single “data through” date stated the truth about the fastest series while implying it of the slowest. The source-freshness view now shows bls_cpi, bls_ppi_import and bls_employment separately; between roughly the 5th and 18th 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. BLS publishes at 08:30 Eastern and the pipeline runs roughly four times a 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 release boundary 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 no database columns behind them, so 30% of the composite — Rhetorical Dilution and Scope Reduction — was arithmetically constant for every live event, and Framing Shift ran on one input instead of two. Each now has a column and a writer: dilution and framing are measured from 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, migration v43).
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.3, methodology v1.2.16):
Coverage beyond the trade courts. Automated court ingest watched three courts — the Court of International Trade, the Federal Circuit, and the Supreme Court. Two are trade-only specialist courts and the third 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. Over the CourtListener opinion corpus for opinions filed since 2025-01-20, those three courts hold 20 opinions mentioning an executive order — against 210 in the D.C. district court alone. Coverage now includes D.D.C. and the D.C., First, Fourth and Ninth Circuits.
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: matching “United States” admits 545 of D.D.C.’s 2,762 opinions. A narrower presidential-party marker cuts that to 98 high-signal captions, and was validated live at 69/69 recall on presidential captions across the five new courts.
Judicial sub-index now weighted by court tier.judicial_index counted every filing at weight 1. Because the CIT docket is admitted unfiltered (~203 opinions a year, 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 precedential reach and signal purity (CIT 0.25, Federal Circuit 0.6, district 0.5, regional circuit 1.0, Supreme Court 3.0; an unweighted court falls back to 1.0). 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, migration v39):
Sector market reaction (paid). Per event and per sector ETF (XLP/XLI/XLY/EEM): 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 (mean |threat-day move vs SPY|). 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: decay-weighted court filings / bill actions (weight 1) and branch-evidenced resolutions (weight 3), squashed to 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.
New table congress_bill_actions persists the Congress.gov bill actions the legislative reconciler already fetched (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 in the methodology whitepaper §7, and the data dictionary now documents the event_timeline and eCFR term/snapshot tables.
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 10%-weight 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 ×0.6 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 against measured USITC applied rates ((statutory − applied)/statutory) 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):
SCOTUS monitoring — court ingest now watches the Supreme Court alongside CIT/CAFC, resolving domestic executive-order outcomes (e.g. Trump v. CASA, June 2026); non-trade resolver throughput raised to 25 events/cycle with a 7-day attempt cooldown.
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 (migration v25):
Follow-through detection. The classifier now tags each statement as new_threat, action_claim, deescalation, or reiteration. 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 Gemini step reconciles overdue non-trade events the Federal Register / court / Congress resolvers can't reach — weighting independent reporting above the president's own posts. Claude remains the threat classifier.
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 deadline + 90 days, 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. Migration v24 makes calibration_locked consistent across both seed loaders.
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 NOTICE documents (not presidential documents) and were previously invisible to the index. The pipeline now ingests USTR notices (threat_source='ustr_notice'), 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.), PACER PCL as an automated court fallback, 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 (weights 30/20/15/15/10/10), added the rolling 30-day exponentially-weighted index (~23-day half-life), and published the REST API specification.