Skip to content

Redesign the static site: Autumn Budget look, one fact per home, readable layouts - #200

Merged
vahid-ahmadi merged 264 commits into
mainfrom
vahid/redesign-r2-integrate
Nov 10, 2026
Merged

vahid-ahmadi merged 264 commits into
mainfrom
vahid/redesign-r2-integrate

Conversation

@vahid-ahmadi

@vahid-ahmadi vahid-ahmadi commented Nov 6, 2026 •

Copy link
Copy Markdown
Contributor

Summary

This PR redesigns the whole site in the style of the Autumn Budget 2026 and tourism dashboards: a dark teal header band with four views, a teal title band on every page, a sticky white sub-tab row, then white cards on a grey canvas. Each card has a short title, a one-line lede, the figure or table, and the long explanation behind an expander. The two-sided step panel (numbered steps on the left, sticky figures on the right) remains the main layout for model Overview, Methodology, Validation and Code tabs. DESIGN.md is the binding spec. URLs, numbers and data are unchanged; generated pages were changed through their generators and regenerated.

By page type

  • Shell (all 110 pages). The header band has Home, Models, Forecasts and Use, and the chosen view is shown by fill and underline. Every page except home has a pathway line and a title band with the h1, a one-line subtitle and a lede of at most 40 words. Below that is a sticky sub-tab row and a one-row footer (PolicyEngine, GitHub, Contact). Every sticky offset reads --nav-h. The stylesheet cache buster is now 10.
  • Home. An intro card with the hero fan, three entry cards (Models, Forecasts, Use), and the verdicts in words, each linking to its Validation tab. The model joins are a step panel, followed by the model map with evidence links and a start card.
  • Models hub. In-page sub-tabs: Models, Combine, Compare, Validation, Papers. The verdicts are in words with links. Combine is a step panel. On a phone the chip sits under the question.
  • Model pages (7 models × Overview, Methodology, Validation, Code, Paper). The sub-tab rows come from site_nav.SUBTABS.
    • Overview has a one-line verdict callout linking to Validation.
    • Validation has a stat row (the home of each headline number), a step panel of the tests, a limits card that keeps every failure statement, and an "On this page" rail.
    • Every tab ends with a "where next" row.
    • The shared /stepper.js replaces the inline copies.
  • Charts. Labels are HTML laid over the SVG (chartkit.py), so they render at 12 px at any width. Ours is solid, the official series is dashed, legends are in HTML, and zero lines are drawn.
  • Forecasts, data hubs and topic pages. These use the Forecasts sub-tab row (UK · US │ Overview · Data · topics) and an "On this page" rail. Each fact has one home: data readings live on topic pages only, and forecast rounds and scores live on /forecasts.
  • Release notes. One stat tile, a provenance card and a "where next" row. They are regenerable with --rebuild.
  • Connect and Contact. /connect is an MCP → CLI → Python step panel. /contact is a single card.

Phase 4 (QA) changes

  • Phone reading.
    • Word-heavy tables become labelled cards below 640 px instead of 720 px side-scrolls. Numeric grids and the 41-row series register keep their scroller.
    • Sub-tab rows, table scrollers and method diagrams fade on the edge that hides content, and the chosen sub-tab is scrolled into view.
    • The five-tab model rows now fit at 375 px. The three us-hank pages have a sixth tab, so their row still overflows (407 px at 375) and relies on the fade.
  • Method diagrams. On all seven Methodology tabs, labels rendered at about 5 px on a phone. Their smallest text is now 11 px, and below 640 px each diagram keeps its native width and scrolls inside its figure. Every diagram was checked at 1440 after the change, and the labels that clipped were fixed:
    • define: the multiplier diagram is now 640 units wide, so its two bar labels fit (they clipped before this PR too). The clean-room footnote is reworded to fit, with the same facts and numbers.
    • svar: the outputs box is wider, the "2 unidentified" line wraps, and the zero-restriction line is shortened.
    • obr and frb-us: the "converged" arrow label is now "done".
  • Long intros. The two engine paragraphs at the top of /forecasts moved, unchanged, into an About expander. Ledes over 40 words were cut to the limit with every caveat kept: /economy, /economy/us, /forecasts/us and the DEFINE-UK replication report. The /economy/us "no US forecast" note moved from the title band into an intro card. Topic ledes keep proper nouns ("official Bank Rate", "UK nominal par yield") instead of lower-casing them. On /economy and /economy/us, the meta paragraph at the top of the topics card ("The rest of this site is organised by model…") was replaced by one sentence. It held no caveat or number, so it was removed rather than hidden.
  • Bank Rate wording. /forecasts#limits said Bank Rate was "the only robust win". papers/boe-svar/figures/rolling_evaluation.json contradicts that. Against a drifting random walk, Bank Rate scores 0.793 at h=1 with DM p=0.018. Its Benjamini–Hochberg q is 0.362, and none of the 64 variable × horizon tests reaches q < 0.10 (minimum q is 0.362, or 0.401 on the production spec). The sentence now says Bank Rate comes closest and no gain survives correction for the number of tests run. It links to /svar/validation#forecasters and does not restate the figures.
  • Smaller fixes. /models and /connect mark their first sub-tab before the first section is reached. /notes/releases gained its "where next" row. The OBR paper lede names the March 2026 EFO baseline again.

Round 2 (tab-by-tab economist and designer review, five areas)

  • IA. Forecasts sits ahead of Models in the header. The home page tells the story in order. /models is a router.
  • Model pages. All seven models have one model card (what it is, access, vintage) and one trust card (what is tested, what is not). Verdict wording is neutral. Each fact has one home; repeats became links.
  • Charts. Strict colour roles (ours solid, official dashed), unit lines, label halos, outturn dots on fans, a log dot strip. The 2028–29 OBR reform bar is drawn as an outline because it is interpolated.
  • Forecasts. The scoreboard leads and carries round, archived band, outturn snapshot link, signed error, band verdict and the no-change and published benchmarks.
  • Release notes. 53 per-series notes are folded into 8 daily digests. Every retired URL has an explicit redirect in vercel.json to its digest anchor.

Round 3 (layout and density)

  • Model names as h1s; the old slogans became the one-line description. Human model names lead (OBR emulator, BoE SVAR, PolicyEngine microsimulation…); code ids are secondary text.
  • Prose longer than about 45 words moved behind "About this…" expanders. No caveat or number was deleted.
  • Step panels are used only where every step has a right-panel card; elsewhere sections are one full-width column. Charts span the card.
  • Section headers are an icon that means something, a short title and one grey line. Eyebrows dropped.
  • One card level; no nested cards. The /models comparison table is transposed to five columns.

Screenshots (before → after)

Full-page shots at 1440 and 375 px were taken for home, /obr, /obr/validation, /models, /forecasts, /economy, a release digest and /svar/validation, before (origin/main) and after (this branch). They were reviewed locally and are not attached. What changes, page by page:

  • Home. Before: long intro, verdict table. After: intro card with the hero fan, three entry cards, verdicts in words linking to Validation.
  • Model Overview (/obr). Before: slogan h1, 100–150-word paragraphs, a step panel whose right side was empty after step 1. After: model name h1, a model card, short steps with a figure per step, detail in expanders.
  • Validation (/obr/validation, /svar/validation). After: a stat row as the home of each headline number, the tests as rows, a limits card that keeps every failure statement.
  • /models. Before: an eight-column comparison table clipped at 1440. After: five columns, models as rows.
  • /forecasts. After: the scoreboard is the full-width lead card; limits are label/value rows.
  • Phone (375 px). No page-level horizontal scroll; word-heavy tables stack into labelled cards; chart labels at least 11 px.

Content flags (published record or wording that changed, beyond layout)

  1. Unemployment 2026Q2 outturn is now scored on /forecasts (it was never scored before). It falls outside the archived 90% band, with a smaller error than no change.
  2. BoE MPR and SEF benchmarks were added to the scoreboard. A false claim that the BoE/SEF paths were stored in the round files was removed.
  3. Bank Rate: "the only robust win" → comes closest; no gain survives multiple-testing correction (papers/boe-svar/figures/rolling_evaluation.json).
  4. FRB/US: the Validation claim that the GDP trough had the "right sign, size and timing vs the Board's documented properties" was corrected to papers/frb-us/sections/comparison.tex (no published GDP figure; core inflation −0.034pp vs ≈−0.08pp). The Methodology claim that both multipliers sit inside published ranges was removed (the pegged year-2 0.90 is below 1.1–1.2).
  5. OLG cohorts: Methodology "ages 21 to 100" fixed to 20–99 (S = 80; papers/psl-og/sections/calibration.tex).
  6. /models#score: "GDP −0.02% on impact building to −0.06%" deleted (see decision 1).
  7. Release notes: 53 per-series URLs now redirect to 8 digest anchors.
  8. Model-review corrections: see round 5 below.

Not in this PR, for Vahid: data PR #195 has been open since 27 Aug and adds 20 per-series notes from the old generator, which conflicts with the digests; fetch-vintages.yml never runs ingest or score, so the record stays stalled at 26 Aug.

Round 5: correctness pass from the 5 Nov model-repo reviews

Each change cites its repo source in the commit message. Numbers changed (old → new):

Page Old New Source
/frb-us/validation limits core PCE miss −1.7pp, "2.7% vs 4.4%" −1.65pp, 2.8% vs 4.4% (2026Q1); −0.65pp (2026Q2) us-frb-model backtests/longbase_vs_outturns.md, fix in PolicyEngine/us-frb-model#10 (LONGBASE now compounded like the outturn)
/frb-us/validation limits "GDP, unemployment, funds rate within ~0.3pp" unemployment and funds rate within 0.2pp; GDP within 0.3pp in 2026Q1, +0.9pp in 2026Q2 same file
/svar/validation coverage "no Covid dummies … depresses coverage" labelled as the no-dummy run; the dummy run (the fans) gives 69% (h1) and 56% (h8) boe-var-model results/coverage_evaluation.json production_spec
/olg showcase "Government consumption (% of GDP) 44.28%" "Total public spending (% of GDP) 44.28%" (number unchanged) baseline is the TME profile (52.3% in 2020); og-model-dashboard review; run dated 28 Apr 2026, pre-MTR-fix (og-model-dashboard#2)
/obr/validation tile "Weak, report-only" "Weak, regression-gated" obr tests/test_model_invariants.py:910-962

Wording withdrawn or corrected (no number changed):

  • DEFINE-UK 1.78: "social benefits fall → biased up → upper-leaning" is withdrawn on /define/validation, the replication report and the paper (calibration.tex, limitations.tex, PDF rebuilt). In the cached run social benefits rise (+8.0 of 118.2), so the bias direction is not established. The withdrawn IMF 1.1–1.5 band is gone from the methodology diagram and the kv rows, and the label "DEFINE-UK 1.78" now reads "1.78, to 2040 (our computation)". Source: Correct the multiplier caveat, state units, gate stock-flow consistency, and sweep every cached scenario define-uk-model#15.
  • OBR profits: the 82.77% error no longer "traces to the OSHH constant": the OSHH anchor applies in raw solves too. The identity-only floor is 23.9%, from mixing EFO and ONS vintages; the rest is open in obr-macroeconomic-model#42. The site and paper are updated (PDF rebuilt), and OAHHx is described as an asset stock, not "other income". Source: Fix lagged ONS formulas, employment seed units and out-of-window shocks; correct the profits explanation obr-macroeconomic-model#48.
  • OBR reform chart: £6.46bn and £7.38bn are microsimulation figures, not an "emulator figure" (make_charts.py, regenerated).
  • US HANK: the "Open models" tab is now "HANK survey". The Status line (and the registry, README, hank_summary framing and MCP docstrings) says that only the steady state is validated and IRF magnitudes are not. "Realistic distribution" and "response concentrating among high-MPC households" now say the distribution is calibrated (about 54% hand-to-mouth vs about one third in US data) and that the by-wealth split is an MPC-proportional allocation. Source: Review fixes, scenario sweep tests, pinned G-shock and MPC figures us-hank-model#4 README.
  • Each fact once: the frb-us 100bp block (the table with the reference column is kept), the frb-us wage bill −0.65% and the DEFINE 4.66%/1.31% tile (the table carries the source) now have one home each.

Backend: obr_shock passes end = max(2027Q4, last shocked quarter) to run_reform, and the periods cap goes 40 → 25 (the databank ends 2031Q1). Before this, periods=20 reported a 12-quarter cumulative as a 20-quarter one. The new tests fail on the old core.py. No real solve past 2027Q4 was run locally.

Decisions for Vahid

  1. /models#score. We deleted "GDP −0.02% on impact building to −0.06%". It is a per-quarter percentage and conflicts with the ratio framing on /obr/validation. Restore it with a units note, or leave it out?

  2. Kept duplicates.

    • £6.46bn appears on /obr#answers, /obr/validation, /pe/validation and the pe chart.
    • (frb-us 100bp and DEFINE 4.66%/1.31% were resolved in round 5.)

    Keep these, or reduce each to one home?

  3. Word-valued stat tiles. The olg, us-hank and define tiles hold words ("none", "anchors", "1 row"). Keep them as tiles, or turn them into callouts?

  4. Same forecast twice. The hero fan on the home page and the boe-svar Overview outlook chart plot the same forecast. Keep both, or replace one with a link?

  5. /economy trend figures. They no longer show the latest value, which now lives on the topic pages. Is that acceptable?

  6. DEFINE diagram label. Resolved in round 5: the label now reads "1.78, to 2040 (our computation)" and the withdrawn IMF band is gone.

  7. Site-contract test change. In test_site_contract.py, the min-height: 112px assertion was replaced. It pinned the two-row mobile header from Fix platform audit findings #70, which the single --nav-h band replaces (DESIGN §2.4, §3.1). The test now checks the same intent on the new shell:

    • the header height and sticky offsets read --nav-h;
    • the tab row scrolls inside itself;
    • none of the old 112, 129 or 172 px offsets remain.

    Is that acceptable as the new contract?

  8. Method diagrams. On a phone they use a native-width scroller with a fade instead of the chartkit HTML-label overlay. Converting them to the overlay is a larger rewrite of 40 hand-drawn SVGs. Accept the scroller, or schedule the rewrite?

  9. Table stacking needs JS. reveal.js decides which tables become cards on a phone, using a word-heavy heuristic with a data-stack override. Without JS every table scrolls. Accept, or write data-label into the markup and generators instead?

  10. Paper and report landings restate Validation figures. The /papers/boe-svar result paragraph repeats 0.32pp and the smallest adjusted q of 0.36. /papers/define-uk and /reports/define-uk-replication repeat 4.66% and 1.78. These are each paper's own summary, so they were left alone. Keep them, or link to Validation?

  11. Step-panel spacing. Each step is at least 70vh tall so the sticky panel can follow along. This leaves a large blank stretch after short steps, for example after step 2 of "How the models connect" on the home page. Keep it, or lower it to around 55vh?

  12. Home lede. The home intro-card lede is 47 words and links all seven models. §7.1 treats it as an intro card rather than a title band, so the 40-word limit was not applied. Trim it?

  13. /contact. It has no "where next" row because §7.9 says "nothing else". Confirm.

Tests

  • PYTHONPATH=integration/src python3 -m pytest tests integration/tests -q: 1467 passed, 101 skipped (round 5). tests + test_site_contract.py alone: 1172 passed, 19 skipped (the count fell from 1564 when 53 release notes became 8 digests; tests/test_site_integrity.py is parametrized per page, 1000 → 595 cases). Its discovery floor test_the_suite_actually_found_the_site was lowered from 70 to 60 pages to match.
  • python3 site_contract.py and python3 site_nav.py pass.
  • Every generator --check passes: economy/build.py, economy/topics.py, notes/generate_release_notes.py, forecasts/{make_us_baseline,ingest_outturns,archive,make_open_fans,score}.py, data/build_page.py, data/fetch.py, assets/make_hero.py, assets/make_current_outlooks.py, olg/figures/make_showcase.py, validation/figures/make_charts.py.
  • Internal links: a stdlib crawl (rerun 6 Nov: 65 pages, 2,936 links, 0 broken) of the pages and hrefs and srcs, including vercel.json redirects, cleanUrls and #fragment ids, found no broken links.
  • Browser QA at 1440 and 375 on 42 pages:
    • no page-level horizontal scroll at 375;
    • no chart or diagram label below 11 px;
    • rail-link anchor targets land below the sticky rows;
    • focus rings show on the header and pathway (checked by screenshot); every sub-tab link has a computed 3 px solid outline;
    • dark theme checked on home, /obr/validation, /forecasts and a topic page;
    • no "poor" or "rich" wording and no tick glyphs;
    • for each fact once, every number in each model's Validation stat row was searched for on all other pages. Only the duplicates listed in decisions 2, 6 and 10 were found. The other §7.0 rows were not swept by script.

reveal.js keeps its ?v=2 query string, which is hard-coded on the pages. A cached copy only means tables scroll and rows don't fade.

🤖 Generated with Claude Code

vahid-ahmadi and others added 30 commits November 3, 2026 14:22
The generator template now follows DESIGN.md §7.7: title band without the
value, a single stat tile (observation and change on the prior one) linking to
the series' topic page, the provenance list with publisher and snapshot chips,
and a where-next row (topic page, data store, forecast record). No .grain, no
hard-coded nav, no ordinal eyebrows. --rebuild rewrites every committed note
from its own snapshot, and --check now also fails on a note that no longer
matches the template, so the 53 pages cannot drift. site_nav.where_next() is
the shared row. The hand-written CPI note gets the same where-next row.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ch fact once

/forecasts, /forecasts/us, /economy and /economy/us get an "On this page"
rail and a where-next row; eyebrows lose their ordinals and the title bands
their reveal hooks; the /forecasts lede is cut to the record's rule. The
record counts are a stat row from forecasts/score.py (the home of those
numbers; the duplicate 'next due' line is folded into the tile). Topic pages
(economy/topics.py): readings are stat tiles, the lede names the series
instead of restating them, the model prose points at the forecast table
rather than quoting its first row, the validation callout keeps the verdict
in words and links to the figures, and every page ends with where next. The
hub topic lists show each topic's question, not its reading, and the trend
note no longer restates the CPI print. No .grain. The /forecasts 375 px
overflow was the as-of recipe that data/build_page.py emitted outside a code
block; it is a .codeblock now. The coverage limit links to its numbers on
/svar/validation instead of restating them.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
chartkit.tick_plan picks about seven quarter labels on a wide fan and three
on a narrow one, so the 13-quarter CPI and the unemployment fans on
/forecasts no longer stack labels. site_nav.render() takes an optional
source, so generate_release_notes.py --check renders each note from its
template without writing to the committed page. The OG-UK runtime chart
sizes its viewBox to the content box (labels now exactly 12 px), the
hank-targets miss uses a true minus sign, and an unused literal-colour rule
is gone.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…nav-h header contract

The phase-2 tab lede dropped the current-vintage phrase the site contract
asks for; it is back in the lede (one sentence, within the §5 limit).

The 112px assertion pinned the two-row mobile header from #70. The redesign
replaced it with a single --nav-h band whose view tabs scroll inside
themselves (DESIGN.md §2.4, §3.1), so the literal no longer applies. The test
now checks the same intent against the new shell: the header height and
every sticky offset read --nav-h, the tab row contains its own overflow, and
none of the old hard-coded 112/129/172px offsets survive.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…esting

/forecasts#limits called Bank Rate 'the only robust win'. The boe-svar
evaluation (papers/boe-svar/figures/rolling_evaluation.json) says otherwise:
against the drifting random walk Bank Rate is 0.793 at h=1 with DM p=0.018,
but its Benjamini-Hochberg q is 0.362 and none of the 64 variable x horizon
tests clears q<0.10 (min q 0.362; production spec 0.401). The sentence now
matches that and links to its home on /svar/validation#forecasters without
restating the figures.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…, short ledes

- reveal.js labels each cell of a word-heavy table from its column head and
  marks it .t-stack; below 640px each row becomes a card instead of a 720px
  side-scroll. Numeric grids and long registers (>20 rows) keep the
  scroller. data-stack=yes/no overrides; without JS every table scrolls.
- Sub-tab rows, table scrollers and method diagrams fade on the edge that
  hides content; the chosen sub-tab is scrolled into view on load. Model
  tab rows fit at 375px (8px tab padding under 400px).
- The hand-drawn methodology diagrams on all seven models rendered labels at
  ~5px on a phone (§1.8). Their 10px text is now 11px and below 640px the
  diagram keeps its 580px width and scrolls inside its figure.
- /forecasts#run: one-line lead; the two engine paragraphs move into an
  About expander (generator: economy/topics.py), unchanged.
- Ledes cut to the §5 limit on /economy, /economy/us, /forecasts/us and the
  DEFINE-UK replication report (every caveat kept). The /economy/us forecast
  note moves from the title band into an intro card under the sub-tabs.
  Topic ledes keep proper nouns (Bank Rate, UK, CPI) instead of lower-casing
  them. The topics cards on both hubs lead with one sentence.
- /models and /connect mark their first sub-tab before the first section is
  reached; /notes/releases gains its where-next row.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…N.md §4.12)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Checked every methodology diagram at 1440 after the 10 to 11px bump.
- define: the multiplier diagram is 640 units wide so its two bar labels
  no longer run off the edge (they clipped before the bump too); the
  clean-room footnote is reworded to fit (same facts, same numbers).
- svar: the outputs box is wider; '+ 2 unidentified (residual volatility)'
  wraps to two lines; the zero-restriction line is shortened to fit.
- obr, frb-us: the 'converged' arrow label between two boxes is now 'done'.
- On phones a diagram uses its own width attribute, not a fixed 580px.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…epeated tabs

Overview gains a model card sourced from capabilities.py (pinned by a new
site-contract test). Methodology drops the panel-less fourth step that
restated the Overview join. Validation swaps two padding tiles for the
executable check and names the test behind it. Code drops the 'what it can
answer' table that duplicated the Overview, adds the missing step-1 panel
with runnable CLI commands and a reproduce step. Paper landing states the
claim in words and links the numbers instead of restating them.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… becomes a router

- Header views: Home, Forecasts, Models, Use (site_nav.DESTINATIONS); shell
  rewritten on all 110 pages with site_nav.py --write.
- Paper and replication-report crumbs run through their model
  (Home / Models / OBR emulator / Paper).
- Home: reader router replaces "Three ways in"; one trust card with all seven
  verdicts in words (the duplicate verdict list under the map is gone); a
  dedicated forecast-record card (method steps, the scored period in words,
  links to /forecasts, no restated counts); phone question list under the map;
  joins shrunk to pipeline strips linking /models#compose (the StepPanel
  restated it line for line); dead glance-tab script removed.
- /models: "Which model" router framing, no-model-answers callout and
  recommend_model; Compare moved before Combine and unclamped (it showed one
  row); comparison heads no longer break mid-word, ids at 12 px; a four-entry
  verification-class glossary (#classes).
- DESIGN.md 3.1, 3.2, 3.4, 4.9, 7.1, 7.2 updated to match.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…, fold release notes into daily digests

- ingest_outturns.py had no unemployment mapping, so the satellite's 2026Q2
  outturn (MGSX 4.9, vintage 2026-08-26) sat in data/latest unscored. Mapped,
  ingested, scored: outside its 90% band, smaller error than no change. Test
  added so every forecast variable must map to a series.
- score.py: scoreboard table is the home of every scored number, with the
  archived band, the outturn's immutable snapshot link, the no-change
  baseline and every stored published path (BoE Feb MPR, OBR Mar EFO,
  BoE SEF Apr) for that quarter. Fixes the 'Inside outside 90% band' label.
- Outturn dots on the open-round fans; status tile says when the store was
  last updated instead of 'lands when the ONS publishes it'.
- /forecasts: title is the record, not reform scoring; new 'How we score'
  card states the six rules and describes the hindsight test as the code
  runs it (by snapshot date, not release time). Order: record, scoreboard,
  rules, open rounds, archive, limits, data, platform, notes.
- Release notes: 53 per-series pages -> 8 per-date digests with a
  new-observation / revision / no-change column; Bank Rate printed 3.8%,
  now the stored 3.75%. Redirect /notes/releases/<date>-<series> ->
  /notes/releases/<date>#<series> needed (vercel.json, coordinator).
- test_site_integrity discovery floor 70 -> 60: the site has 65 pages now.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…nt home

Overview gains a registry-sourced model card; the bridge mechanics and the
direct-lever expander now live once (Methodology step 6, Code step 4), and
the worked example links the microsimulation's yield instead of restating
it. Validation promotes the forecast-vs-outturn backtest to a step of its
own (the only test against reality), moves the HMRC comparison of the
microsim's costing behind an expander that links its home on
/pe/validation, moves the anchored-horizon figures from Methodology into the
configuration table, adds the income-tax profile limit from the paper, and
drops a clause that attributed superseded 2.2%/3.6% figures to the paper.
Code flags LFSUR and IF as non-responding readouts and adds the
score_reform and compare routes. Paper landing gains status chips, a
one-line claim and the section list.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…e store missed

- /economy and /economy/us repeated the store's series list and release
  calendar (DESIGN.md §7.0 makes /forecasts#data their home). Both hubs
  now carry one provenance card linking to it; the old #indicators,
  #markets and #releases anchors land on that card.
- Store calendar: missing 'Store id' header fixed (rows had four cells,
  head three), plus a status column computed from the store's own last
  fetch: the 13 August GDP release has passed and is not in the store.
- Inflation topic said the round 'starts at 2026Q3' over a table that
  began at 2026Q2; both topic tables now start at the first quarter
  without an outturn.
- Growth topic said rounds are scored 'against the vintage it was made
  on'; scoring uses the outturn as published, with its snapshot recorded.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…unnable code

Overview gains a registry-sourced model card and shows all six 2026Q1
shock probabilities from latest_shocks.json (it showed four). The
incidence worked example keeps its mechanism but drops the 0.94pp and
£0.09bn figures, which have no committed artifact (only a commit message).
The sources table moves from the Overview expander to Methodology, replacing
a card that only pointed back at it. Validation keeps the satellite's skill
result and links its specification, and folds the cited OBR/external
forecaster table into the diagnostics expander. Code adds the missing
step-1 panel, the fourth hosted tool, draw/runtime guidance and a Python
route. Paper landing states the claim in words, keeps the current-forecast
window, and lists the sections.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Overview of frb-us, us-hank, olg and define opens on a model card
  (answers, horizon, inputs, outputs, join, cannot answer, access, runtime,
  vintage, uncertainty) copied from capabilities.py MODELS, with the verdict.
- Validation tabs gain a trust card: the six MODEL_QUALITY levels and what
  would change each, never shown on the site before.
- Each fact once: the FRB/US 100bp response and multipliers live on
  Validation; Methodology and the paper ledes link instead of restating.
- FRB/US worked-shock comparators corrected to the paper's comparison table
  (no published GDP figure; core inflation vs about -0.08pp); the two
  multiplier cells only the paper carried are added; duplicate id fixed;
  the core PCE miss moves into the limits table.
- OLG: cohort ages corrected to 20-99 (papers/psl-og); the five structural
  limits and the og+microsim overlay limits move into the limits table;
  showcase table emits U+2212.
- DEFINE: one h1 across tabs, a full limits table, duplicates trimmed.
- Eyebrows carry id, country, access and horizon; report kickers drop
  ordinals; HANK Code lists all three MCP tools.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…omes 'Track record'

- /forecasts/us: title and first card are why there is no US record,
  then what a record takes, the LONGBASE baseline, and the US routes.
  The 'what exists today' card only repeated the where-next row.
  Its pointer to the baseline now names the three topic pages that show it.
- economy/topics.py: the section strip's first tab is 'Track record',
  the name a forecaster's reader looks for. DESIGN.md §3.4, §7.5 and
  §7.7 updated to the scoreboard, the rules card and the release digests.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ted from its lede

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…RB/US vintage row no longer repeats the card

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…g dot strip; /connect as a developer page

- chartkit: unit= line above the plot, endlabel() direct labels
- make_charts: fix dashed-official misuse (anchored, freerun, coverage), ONS outturn as dots,
  interpolated bar as outline (flag in chart_data.json, no value changed), frb-us residuals as
  a dot strip on a log axis, units on every chart, phone tick crowding
- make_current_outlooks: OBR outlook roles, unit lines
- style.css r2:charts-use section: label halo, new chart classes
- DESIGN.md 6.1/6.2/7.8 updated for the above
- /connect: Tools and Limits cards sourced from integration/, hosted and local Python scripts,
  job pattern for slow tools; /contact headings simplified

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The /economy series index removed in dd73587 was the only place showing the
publisher's release date (release_updated) and the series-to-topic map. Both
are now rows in the store catalogue on /forecasts#data, their one home. The
scorecard status string counts forecasts and periods separately (it said
'2 forecast period(s)' for two variables in one period); README names the
stored published-path benchmarks.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…tegrate

# Conflicts:
#	obr/validation/index.html
#	style.css
… rounds

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…egrate

# Conflicts:
#	notes/releases/2026-07-29-uk_bank_rate/index.html
#	notes/releases/2026-07-29-uk_gilt_10y/index.html
#	notes/releases/2026-07-29-uk_gilt_20y/index.html
#	notes/releases/2026-07-29-uk_gilt_5y/index.html
#	notes/releases/2026-07-29-us_treasury_10y/index.html
#	notes/releases/2026-08-04-uk_bank_rate/index.html
#	notes/releases/2026-08-04-uk_gilt_10y/index.html
#	notes/releases/2026-08-04-uk_gilt_20y/index.html
#	notes/releases/2026-08-04-uk_gilt_5y/index.html
#	notes/releases/2026-08-04-us_federal_funds_rate/index.html
#	notes/releases/2026-08-04-us_real_gdp/index.html
#	notes/releases/2026-08-04-us_treasury_10y/index.html
#	notes/releases/2026-08-05-uk_bank_rate/index.html
#	notes/releases/2026-08-05-uk_gilt_10y/index.html
#	notes/releases/2026-08-05-uk_gilt_20y/index.html
#	notes/releases/2026-08-05-uk_gilt_5y/index.html
#	notes/releases/2026-08-05-us_treasury_10y/index.html
#	notes/releases/2026-08-06-uk_bank_rate/index.html
#	notes/releases/2026-08-06-uk_gilt_10y/index.html
#	notes/releases/2026-08-06-uk_gilt_20y/index.html
#	notes/releases/2026-08-06-uk_gilt_5y/index.html
#	notes/releases/2026-08-06-us_treasury_10y/index.html
#	notes/releases/2026-08-07-uk_bank_rate/index.html
#	notes/releases/2026-08-07-uk_gilt_10y/index.html
#	notes/releases/2026-08-07-uk_gilt_20y/index.html
#	notes/releases/2026-08-07-uk_gilt_5y/index.html
#	notes/releases/2026-08-07-us_treasury_10y/index.html
#	notes/releases/2026-08-10-uk_bank_rate/index.html
#	notes/releases/2026-08-10-uk_gilt_10y/index.html
#	notes/releases/2026-08-10-uk_gilt_20y/index.html
#	notes/releases/2026-08-10-uk_gilt_5y/index.html
#	notes/releases/2026-08-10-us_payroll_employment/index.html
#	notes/releases/2026-08-10-us_treasury_10y/index.html
#	notes/releases/2026-08-10-us_unemployment_rate/index.html
#	notes/releases/2026-08-12-uk_bank_rate/index.html
#	notes/releases/2026-08-12-uk_gilt_10y/index.html
#	notes/releases/2026-08-12-uk_gilt_20y/index.html
#	notes/releases/2026-08-12-uk_gilt_5y/index.html
#	notes/releases/2026-08-12-us_treasury_10y/index.html
#	notes/releases/2026-08-26-uk_average_weekly_earnings/index.html
#	notes/releases/2026-08-26-uk_bank_rate/index.html
#	notes/releases/2026-08-26-uk_core_cpi_yoy/index.html
#	notes/releases/2026-08-26-uk_cpi_yoy/index.html
#	notes/releases/2026-08-26-uk_gilt_10y/index.html
#	notes/releases/2026-08-26-uk_gilt_20y/index.html
#	notes/releases/2026-08-26-uk_gilt_5y/index.html
#	notes/releases/2026-08-26-uk_monthly_gva/index.html
#	notes/releases/2026-08-26-uk_public_sector_net_borrowing/index.html
#	notes/releases/2026-08-26-uk_public_sector_net_debt_gdp/index.html
#	notes/releases/2026-08-26-uk_unemployment_rate/index.html
#	notes/releases/2026-08-26-uk_vacancies/index.html
#	notes/releases/2026-08-26-us_cpi/index.html
#	notes/releases/2026-08-26-us_treasury_10y/index.html
#	style.css
…est anchors, bump the stylesheet

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…, neutral verdict tone, global CSS fixes

- Model card: the US two-column dl.model-card on all seven Overviews, in
  section#card under the verdict, one field order (DESIGN.md 4.13). UK
  Access/Runtime split at the existing middot; US cards gain the registry
  Status verbatim. Values unchanged. Test extended to all seven (order,
  Status verbatim, Horizon quoted).
- Trust card on pe, obr, svar Validation from MODEL_QUALITY (levels and
  next gates verbatim); new test checks all seven levels against the registry.
- Verdict callouts use the default brand tone; warn stays for caveats.
  Homepage .scored-verdict loses its rust rule.
- StepPanel steps lose the 70vh min-height (stepper.js activates the last
  step at page end); code tabs lose the 45vh tail.
- .vc-legend styled outside .vc-fig (sb-legend folded in); zero-specificity
  table baseline in cards; base 10px comparison-table id span removed;
  model map switches to the list below 1000px and its legend is 12px.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…--write

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
vahid-ahmadi and others added 7 commits November 6, 2026 03:52
The stacked PRs all edited the same [Unreleased] lines, so they conflicted
with each other once one merged. #200 now carries every redesign-stack
bullet, grouped by PR number.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The stacked PRs all edited the same [Unreleased] lines, so they conflicted
with each other once one merged. #200 now carries every redesign-stack
bullet, grouped by PR number.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Resolves the svar/methodology/index.html conflict: #206's layout (glossary
link on effective sample size) with #231's pinned results/summary.md link and
run label.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Brings in #206's layout via #231. Conflicts in svar/methodology and
svar/validation resolved by keeping #232's 2026Q2 numbers and adding #206's
three glossary links (ess, fevd, sign-restrictions) to those lines.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
#205 already contains #204's changelog commit; taking #204's revert of it
keeps CHANGELOG.md out of #205's diff in either merge order (#204 first or
#205 first).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@vahid-ahmadi

Copy link
Copy Markdown
Contributor Author

CHANGELOG.md conflicts across the stack: fixed.

The changelog pass had put an [Unreleased] edit on every stacked PR, so they conflicted with each other once one merged, and this PR and #221 both created the heading at the same spot on main.

Checked on scratch branches (merge commits):

  1. This PR + 204 → 206 → 205 → 219 → 216 → 226 → 229: no conflicts. Same tree with the UI order reversed and with the integration group first. Full PYTHONPATH=integration/src pytest tests integration/tests on tree (1) (24121b4e): 1691 passed, 103 skipped; site_contract.py, site_nav.py, verify_static() OK. CI green on all 12 PR heads.
  2. BoE SVAR: label replication figures with their run vintage (boe-var-model 845e2a4) — option (a) for boe-var-model #24 #231 → BoE SVAR: replication figures to 2026Q2 data — merge only if boe-var-model #24 merges (option b) #232 on top: clean.
  3. main + Data pipeline: fetch, ingest, score and open one checked PR; stop the nowcast's silent no-op #221 + Recover the 50 orphaned refresh snapshots with repeat days dropped (#222) #228 then this stack, and the reverse: no conflicts, identical final tree.

All 12 PRs show MERGEABLE, CI green. Nothing merged.

If #226/#229 (waiting on #218) or #231/#232 haven't merged here when this PR merges, delete their bullets from this PR's entry first.

Notes: r5/changelog-fix.md

vahid-ahmadi and others added 6 commits November 6, 2026 04:04
…refresh run

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Models: 'Same question, every model' comparison view (/models/compare)
Weekly drift check: hosted model output vs the numbers the site quotes
Decision needed (#218): bump the hosted OBR pin to obr-macroeconomic-model main (e4d7faa)
r5 UI: question router on /models, copy-paste /connect, glossary, home and contact
BoE SVAR: label replication figures with their run vintage (boe-var-model 845e2a4) — option (a) for boe-var-model #24
vahid-ahmadi and others added 2 commits November 10, 2026 16:44
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Model pages: one-column methodology, one overview order, names not ids
vahid-ahmadi and others added 2 commits November 10, 2026 16:46
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Round 5 ui-data: forecast-evaluation scoreboard with full-height rail, flat archive, chart units and sources
vahid-ahmadi and others added 4 commits November 10, 2026 16:50
…date

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
BoE SVAR: replication figures to 2026Q2 data — merge only if boe-var-model #24 merges (option b)
…arios

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Integration layer: scenario sweep fixes (fiscal-year OBR window, SVAR simple y/y, units, fail-fast validation)

This branch was successfully deployed

1 active deployment
Preview — 4e2b76fd Deployed Nov 10, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant