From 5f2b54e07313ad4021ef949beb1c66916c40fd3a Mon Sep 17 00:00:00 2001 From: vahid-ahmadi Date: Wed, 12 Aug 2026 14:42:55 +0100 Subject: [PATCH] Source the numbers that had no artifact, and put the units back MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Three claims with nothing committed behind them, and one regression I introduced. svar/index published four shock probabilities and a two-figure revision decomposition that appeared on that page and nowhere else in the repository, while every other number on it cites current_forecast.json. Running latest_shocks at production draws confirms the four probabilities exactly — world demand 0.713, world energy 0.895, UK demand 0.809, monetary policy 0.840 — so they were right, just untraceable. The response is committed as papers/boe-svar/figures/latest_shocks.json and the page now cites it with its draw counts. The revision figures do not survive. The page claimed +0.27pp on GDP and +0.22pp on CPI for the 2026Q1 round; the paper reports +0.40pp and −0.22pp for 2024Q2 — a different quarter, different values, and the opposite sign on CPI. No artifact holds them, no exposed tool produces them, and their resemblance to the paper's numbers with a flipped sign is the profile of a figure that was transcribed loosely. Removed rather than reworded. obr/validation explained a six-fold gap with a fact that is not true. Its held-add-factor scorecard reports GDP 0.37% against the working paper's 2.2%, reconciled as the paper covering "its own longer window". The paper says "held constant, projected over 2026Q1–2027Q4" — the same window. The difference is the EFO vintage, November 2025 against March 2026, and the page now says so. The regression is mine. Moving the readings onto the topic pages took stored() with them, so the public-finances headline read "-15,989.0" where the page it replaced said "£16.0bn borrowed", and "£77.1bn" and "£749/week" stopped appearing on the site at all. Stored-exactly-as-published is the right principle for the method note and the fidelity claim, not for the first number a reader meets. display() renders scale and unit in the headline and keeps the exact stored value on the line beneath — and preserves the publisher's precision, so a stored 5.0 is 5.0% and not 5%. Twelve gates, 1107 tests. Co-Authored-By: Claude Opus 5 (1M context) --- economy/topics.py | 30 ++++++++++- economy/topics/growth/index.html | 10 ++-- economy/topics/inflation/index.html | 4 +- economy/topics/jobs/index.html | 10 ++-- economy/topics/public-finances/index.html | 6 +-- economy/topics/rates/index.html | 8 +-- obr/validation/index.html | 2 +- papers/boe-svar/figures/latest_shocks.json | 60 ++++++++++++++++++++++ svar/index.html | 9 ++-- 9 files changed, 112 insertions(+), 27 deletions(-) create mode 100644 papers/boe-svar/figures/latest_shocks.json diff --git a/economy/topics.py b/economy/topics.py index 63901b62..ba2b3120 100644 --- a/economy/topics.py +++ b/economy/topics.py @@ -141,6 +141,32 @@ def stored(value: float) -> str: return f"{value:,}" +def display(series: dict, value: float) -> str: + """The reading a person would say out loud. + + stored() is right for the method note and for anything asserting fidelity + to the snapshot, but it is wrong for the number a reader meets first: the + restructure made the public-finances headline read "-15,989.0" where the + page it replaced said "£16.0bn borrowed", and dropped "£77.1bn" and + "£749/week" from the site entirely. Scale and unit here; exact stored + value stays one line below and in the method note. + """ + units = series["units"].lower() + if "£m" in units or "\u00a3m" in units: + billions = abs(value) / 1000 + borrowed = " borrowed" if value < 0 and "borrowing" in series["title"].lower() else "" + return f"\u00a3{billions:,.1f}bn{borrowed}" + if "per week" in units: + return f"\u00a3{value:,.0f}/week" + if "thousand" in units: + return f"{value:,.0f}k" + if "percent" in units or units.startswith("%"): + # Keep the publisher's precision: a stored 5.0 is 5.0%, not 5%. The + # trailing zero is information about how the figure was published. + return f"{stored(value)}%" + return stored(value) + + def listed(items: list[str]) -> str: """Join a registry list the way a sentence needs it.""" if len(items) < 2: @@ -265,8 +291,8 @@ def stat_card(series: dict) -> str: now = latest(series) return f"""

{esc(label(series).upper())}

-

{esc(stored(now["value"]))}{suffix(series)}

-

{esc(series["units"])}

+

{esc(display(series, now["value"]))}

+

stored as {esc(stored(now["value"]))} · {esc(series["units"])}

Observation
{esc(now["period"])}
Vintage
{esc(series["vintage"])}
diff --git a/economy/topics/growth/index.html b/economy/topics/growth/index.html index ce04abbd..d0df3b81 100644 --- a/economy/topics/growth/index.html +++ b/economy/topics/growth/index.html @@ -80,8 +80,8 @@

The numbers, as the snapshot stores them.

REAL GROSS DOMESTIC PRODUCT

-

709,598.0

-

£m, chained volume measure

+

£709.6bn

+

stored as 709,598.0 · £m, chained volume measure

Observation
2026Q1
Vintage
2026-07-26
@@ -91,7 +91,7 @@

The numbers, as the snapshot stores them.

MONTHLY GROSS VALUE ADDED INDEX

103.2

-

index, chained volume measure, seasonally adjusted

+

stored as 103.2 · index, chained volume measure, seasonally adjusted

Observation
2026-05
Vintage
2026-07-26
@@ -100,8 +100,8 @@

The numbers, as the snapshot stores them.

REAL BUSINESS INVESTMENT

-

77,134.0

-

£m, chained volume measure, seasonally adjusted

+

£77.1bn

+

stored as 77,134.0 · £m, chained volume measure, seasonally adjusted

Observation
2026Q1
Vintage
2026-07-26
diff --git a/economy/topics/inflation/index.html b/economy/topics/inflation/index.html index 99167d2f..6d772884 100644 --- a/economy/topics/inflation/index.html +++ b/economy/topics/inflation/index.html @@ -81,7 +81,7 @@

The numbers, as the snapshot stores them.

CPI INFLATION

2.8%

-

percent, year-on-year

+

stored as 2.8 · percent, year-on-year

Observation
2026Q2
Vintage
2026-07-26
@@ -91,7 +91,7 @@

The numbers, as the snapshot stores them.

CORE CPI INFLATION

2.6%

-

percent, year-on-year

+

stored as 2.6 · percent, year-on-year

Observation
2026-06
Vintage
2026-07-26
diff --git a/economy/topics/jobs/index.html b/economy/topics/jobs/index.html index c76423db..f0d4e95a 100644 --- a/economy/topics/jobs/index.html +++ b/economy/topics/jobs/index.html @@ -81,7 +81,7 @@

The numbers, as the snapshot stores them.

UNEMPLOYMENT RATE

5.0%

-

percent

+

stored as 5.0 · percent

Observation
2026Q1
Vintage
2026-07-26
@@ -90,8 +90,8 @@

The numbers, as the snapshot stores them.

UK VACANCIES

-

712.0

-

thousands, seasonally adjusted three-month average

+

712k

+

stored as 712.0 · thousands, seasonally adjusted three-month average

Observation
2026-05
Vintage
2026-07-26
@@ -100,8 +100,8 @@

The numbers, as the snapshot stores them.

AVERAGE WEEKLY EARNINGS

-

749.0

-

£ per week, seasonally adjusted

+

£749/week

+

stored as 749.0 · £ per week, seasonally adjusted

Observation
2026-05
Vintage
2026-07-26
diff --git a/economy/topics/public-finances/index.html b/economy/topics/public-finances/index.html index c0ccd035..a599f4cb 100644 --- a/economy/topics/public-finances/index.html +++ b/economy/topics/public-finances/index.html @@ -80,8 +80,8 @@

The numbers, as the snapshot stores them.

PUBLIC-SECTOR NET BORROWING

-

-15,989.0

-

£m, current prices, not seasonally adjusted

+

£16.0bn borrowed

+

stored as -15,989.0 · £m, current prices, not seasonally adjusted

Observation
2026-06
Vintage
2026-07-26
@@ -91,7 +91,7 @@

The numbers, as the snapshot stores them.

PUBLIC-SECTOR NET DEBT

94.9%

-

percent of GDP, not seasonally adjusted

+

stored as 94.9 · percent of GDP, not seasonally adjusted

Observation
2026-06
Vintage
2026-07-26
diff --git a/economy/topics/rates/index.html b/economy/topics/rates/index.html index d3a8e7e3..f28b202f 100644 --- a/economy/topics/rates/index.html +++ b/economy/topics/rates/index.html @@ -81,7 +81,7 @@

The numbers, as the snapshot stores them.

OFFICIAL BANK RATE

3.75%

-

percent

+

stored as 3.75 · percent

Observation
2026-08-10
Vintage
2026-08-12
@@ -91,7 +91,7 @@

The numbers, as the snapshot stores them.

UK NOMINAL PAR YIELD, 5 YEAR

4.4356%

-

percent

+

stored as 4.4356 · percent

Observation
2026-08-07
Vintage
2026-08-12
@@ -101,7 +101,7 @@

The numbers, as the snapshot stores them.

UK NOMINAL PAR YIELD, 10 YEAR

4.9118%

-

percent

+

stored as 4.9118 · percent

Observation
2026-08-07
Vintage
2026-08-12
@@ -111,7 +111,7 @@

The numbers, as the snapshot stores them.

UK NOMINAL PAR YIELD, 20 YEAR

5.4311%

-

percent

+

stored as 5.4311 · percent

Observation
2026-08-07
Vintage
2026-08-12
diff --git a/obr/validation/index.html b/obr/validation/index.html index e9d138bc..4a06690d 100644 --- a/obr/validation/index.html +++ b/obr/validation/index.html @@ -121,7 +121,7 @@

Excellent anchored. Weak free-running. Both published.

Held add-factors Add-factors fitted 2024Q1–2025Q4, held flat, projected to 2027Q4. Scored over 2026Q1–2027Q4 on the March 2026 baseline (caveats in the notes below). - GDP 0.37%, consumption 0.33%; 6 of 8 computed variables within band. (The working paper's November-2025-vintage scorecard, over its own longer window, reports GDP 2.2% and consumption 3.6%.) + GDP 0.37%, consumption 0.33%; 6 of 8 computed variables within band. (The working paper reports GDP 2.2% and consumption 3.6% for the same 2026Q1–2027Q4 window — the difference is the EFO vintage it was anchored to, November 2025 against March 2026 here, not the window.) Free-running diff --git a/papers/boe-svar/figures/latest_shocks.json b/papers/boe-svar/figures/latest_shocks.json new file mode 100644 index 00000000..f08a1411 --- /dev/null +++ b/papers/boe-svar/figures/latest_shocks.json @@ -0,0 +1,60 @@ +{ + "quarter": "2026Q1", + "provenance": { + "model_id": "boe-svar", + "package": "boe_var", + "package_version": "0.1.0", + "model_version": "0.1.0", + "adapter_version": "0.2.0", + "source_url": "https://github.com/PolicyEngine/boe-var-model", + "source_revision": "3ab56259224c20a0bf65caa523e6e7440e56b37e", + "data_vintage": "conditioned through 2026Q1", + "baseline_vintage": "identified structural shocks", + "baseline": "identified structural shocks", + "estimation_sample": "1992Q1-2025Q1", + "run_at": "2026-08-12T13:41:15.541729+00:00", + "reproducibility": "Check out the recorded source URL at the recorded source revision, install the recorded adapter version, and rerun the serialized request against the recorded baseline and data vintage." + }, + "draws": 6000, + "accepted_draws": 430, + "ess": 197.9, + "warnings": [], + "shocks": [ + { + "shock": "World demand", + "p_positive": 0.287, + "p_negative": 0.713, + "reading": "World demand shock was probably negative in 2026Q1 (P(\u2212) = 0.71)." + }, + { + "shock": "World energy", + "p_positive": 0.105, + "p_negative": 0.895, + "reading": "World energy shock was clearly negative in 2026Q1 (P(\u2212) = 0.90)." + }, + { + "shock": "World supply", + "p_positive": 0.873, + "p_negative": 0.127, + "reading": "World supply shock was clearly positive in 2026Q1 (P(+) = 0.87)." + }, + { + "shock": "UK demand", + "p_positive": 0.809, + "p_negative": 0.191, + "reading": "UK demand shock was clearly positive in 2026Q1 (P(+) = 0.81)." + }, + { + "shock": "UK supply", + "p_positive": 0.715, + "p_negative": 0.285, + "reading": "UK supply shock was probably positive in 2026Q1 (P(+) = 0.71)." + }, + { + "shock": "UK mon. pol.", + "p_positive": 0.16, + "p_negative": 0.84, + "reading": "UK mon. pol. shock was clearly negative in 2026Q1 (P(\u2212) = 0.84)." + } + ] +} diff --git a/svar/index.html b/svar/index.html index 2680c1d7..7f0d873c 100644 --- a/svar/index.html +++ b/svar/index.html @@ -187,11 +187,10 @@

What's happening now, and why.

by negative world-demand (probability 0.71) and world-energy (0.90) shocks, against positive UK demand (0.81) and expansionary monetary policy - (0.84); the composite effect revises the - year-on-year path by +0.27pp on GDP growth at impact - and +0.22pp on CPI inflation at its peak three - quarters out. -

+ (0.84). Source and provenance: + latest_shocks.json, + 6,000 draws, 430 accepted, ESS 198. +

It does not score reforms. Mapping a policy reform into identified structural innovations is conceptually dubious, not