Skip to content

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

Draft
vahid-ahmadi wants to merge 74 commits into
mainfrom
vahid/redesign-r2-integrate
Draft

vahid-ahmadi wants to merge 74 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 13:08
…bs, cards on a canvas

- style.css: new token layer (brand/neutral scales, semantic roles, chart
  series roles, type/spacing/elevation, shell geometry) with the legacy
  aliases repointed onto it; shell sections rewritten in place (sticky
  header band with icon view tabs, pathway + title band, white sticky
  sub-tab row for .model-tabs and .economy-subnav, StepPanel, footer);
  every .band is now a white card on a grey canvas; components appended
  (card, stat tile, chip, callout tones, expander, on-this-page rail,
  entry cards, numbered steps, intro card) and the chart house style.
- site_nav.py: view-tab icons, brand label, footer row gains Models,
  Forecasts and Use (still one row, #133), release notes highlight the
  Forecasts tab, and one STYLE_HREF cache buster (v=8) written into every
  page and read by economy/topics.py and notes/generate_release_notes.py.
- All 110 pages rebuilt with python3 site_nav.py --write.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
DESIGN.md is the binding spec for the redesign: content rules, tokens
and contrast, the shell, the component classes (including the two-sided
StepPanel and where it is required), text budget, chart house style with
a class-to-token map for the generators, per-page-type layouts, the
homes table for each-fact-once, the flow and cross-link map, the QA
checklist and the phase plan.

style.css: /connect's hero becomes a title band, paper viewers no longer
clear a fixed header, the footer sits at the viewport bottom on short
pages, the in-card chart switch on /forecasts scrolls inside itself,
release-note provenance lists render as key/value grids, and the last
hard-coded sticky offsets read the shell geometry tokens.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Reference implementation of DESIGN.md §7.3 for the model tabs.

- Overview: one-line verdict callout linking to Validation; the 0.34
  multiplier now lives only in the worked example (step 3) and its panel;
  the step-1 caveat and the step-3 multiplier callout no longer restate
  it, and the Validation figures (HMRC gap, anchored/free-running MAPE)
  leave the step-3 panel for a link. Direct shocks move into an expander.
- Validation: "On this page" rail; a stat row is now the single home of
  the four headline MAPEs (the configuration table and the step panels no
  longer restate them); StepPanel of the three tests; a separate limits
  card (#caveats, with #multiplier) keeps every limit in full.
- Methodology, Code, Paper: tab-specific one-line lede instead of the
  Overview lede; methodology step 6 links to the worked example instead of
  restating it.
- Every tab ends with a "where next" row (style.css §5.14).
- Inline hero-padding blocks and .grain divs removed.

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

Overview: verdict callout (words only, linking to Validation) above a
StepPanel of the join, what it is, and what it can answer; the SVAR
sources table moves into an expander, the FRB/US wage-bill figure is
stated once.

Validation: "On this page" rail, a stat row as the home of the headline
numbers (prose, figcaptions and tables now refer to the tiles instead of
restating them), a StepPanel of the tests, and the limits card in full.

Methodology, Code, Paper: tab-specific one-line lede, where-next row,
inline hero padding and .grain removed. style.css: StepPanel body rhythm,
in-step tables fit their column at >=900px, row headers read as text,
two-up stat tiles on phones. Also drops a restated 4.32% in the OBR
free-running expander.

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

us-hank: the verdict keeps "inputs, not results"; Validation tiles hold
the solved-parameter score, the vphi miss and goods-market clearing, with
steps for the solved parameters and for what is and is not gated.

olg: Overview steps carry the two-way join, the model, and the worked
reform (the generated olg-stats table is moved unchanged); Validation
puts the calibration targets, the WP22 benchmark and the OBR OLG
comparison (seven dimensions as expanders, ids kept) in one StepPanel.

Sub-pages: one-line ledes, where-next rows, inline hero padding and
.grain removed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
pe: Overview follows the §7.3 order (joins, what it is, what it can
answer); the generated pe-costing chart moves unchanged into step 3.
Validation tiles hold the HMRC gap and the scope counts.

define: the pe-bridge section moves below the sub-tab row as step 1; the
baseline-vs-outturn and multiplier figures leave the Overview for links
to their Validation homes; Validation gets tiles, a StepPanel of gates,
calibration, multiplier and emissions, and the ceiling as its limits
card. The methodology tab links to the multiplier instead of restating
it.

Sub-pages: one-line ledes, where-next rows, inline hero padding and
.grain removed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Models: each row's facts state the verdict in words and link to the
  model's Validation tab; the validation figures (MAPEs, q-value,
  pyfrbus residual, OG-UK worked example, £50,000 case) are no longer
  restated here.
- Combine (#compose): the three join types as a StepPanel (score a
  reform, og+microsim, the four incidence joins); #score keeps its id.
- Validation: "By model" table now carries a verdict column in words;
  "Vs other institutions" names the comparison and how comparable it is,
  and links to the tab that holds the figures. The two external errors
  that lived only here (BoE MPR Aug 2024 CPI episode, OBR FER GDP bias)
  move to /svar/validation#forecasters, which used to point back here.
- Where-next row; style.css §5.16 stacks the model chip under the
  question below 620px instead of squeezing it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- "Three ways in": Autumn-Budget-style entry cards (icon badge,
  "Explore →") for Models, Forecasts and Use, compact rows on phones.
- Verdicts: each grade names its model in words and links to the
  Validation tab; no multiplier figures restated. The scored period
  keeps its subject and verdict sentence and links to /forecasts#scored
  instead of restating the forecast, band and outturn.
- How the models connect (#joins kept): one StepPanel step per join; the
  panel shows the pipeline and its entry point; the OBR join result links
  to the worked example on /obr instead of restating the ratio.
- Model map evidence lines: verdict in words + "Evidence →" to each
  Validation tab; no MAPEs, FEVD shares, residuals or OG-UK results.
- Hero h1: the two spans run inline so text-wrap: balance sets the
  breaks. Hero fan region untouched (assets/make_hero.py --check passes).
- Ordinal eyebrows ("01 —") dropped from new copy per DESIGN.md §4.1.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
/connect: one StepPanel, a step per route (#connect, #cli, #code keep
their ids so the sub-tabs still land); the panel shows the endpoint, the
install and the commands for the route in view. Lede trimmed to the
§5 budget; the "some clients gate custom connectors by plan" caveat
moves to the access note rather than being dropped. Python pane titles
become h4 under the step heading. Legacy colour aliases in the page CSS
replaced with role tokens; the inline hero padding rule and .grain go.

/contact: the email is the one primary button, serif card title,
lower-case eyebrows (CSS uppercases them), the X link names its target.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The div is display: none since phase 1 (DESIGN.md §9). Removed from the
forecasts hubs, the two economy hubs and the CPI note; each sits outside
the generated regions, and every generator's --check still passes. The
topic pages and release notes keep theirs until phase 3, because
economy/topics.py and notes/generate_release_notes.py emit it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Phase 1 added Models, Forecasts and Use to the one-row footer. Vahid
removed the footer directory himself in #133 and kept only PolicyEngine,
GitHub and Contact; the views are the header tabs' job. FOOTER_LINKS
reverted (the phase-1 footer styling stays), every page re-rendered with
python3 site_nav.py --write, and DESIGN.md §3.5 reconciled to that
decision.

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

The olg Code tab's sticky panel is aria-hidden, so its six script links
take tabindex="-1" (the same links stay reachable in the step bodies).
The homepage score column closes the gap the removed rail left.

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

One /stepper.js replaces the four inline StepPanel/rail script variants on
31 pages: per .scrolly-wrap, panels chosen by data-step with the nearest
earlier panel pinned, hashchange and in-card tab clicks re-run it. site_nav.py
now writes the model sub-tab rows from a SUBTABS table, adds the stepper tag
where a page has a StepPanel or rail, and fails on an inline copy. The
methodology diagram SVGs use role tokens instead of --accent/--text-light.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
chartkit.py lifts every <text> a generator writes into a percent-positioned
HTML span, so tick and value labels keep 12 px at any width (they rendered at
4-7 px on a phone and in StepPanel columns). The plot stretches to a usable
height on a phone with non-scaling strokes and round-capped path dots; y labels
sit inside the plot above their gridline, first/last x ticks align to the
edges, legends and in-chart notes are HTML, zero lines are vc-zero, inline
fills/strokes are classes. Applied in make_charts.py, score.py,
make_open_fans.py, make_hero.py (value ticks moved to a right gutter, off the
median), make_current_outlooks.py and economy/build.py; the OG-UK showcase
draws at its container's pixel width. hank-targets is an HTML table now; the
obr-outturn values move to a small table below 520 px. The computed-share
grade 'poor' reads 'fit badly' (same counts). No plotted number changed.
STYLE_VERSION 9; DESIGN.md §6.3 documents the approach.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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>
vahid-ahmadi and others added 2 commits November 6, 2026 00:49
The page carried the pre-12-Aug run (751, 7.5%, ESS 355.9). boe-var-model
results/summary.md on main (845e2a4, seed 20260812, since 42cbcbb) and this
repo's own papers/boe-svar implementation.tex and appendix.tex give 744 of
10,000, 7.4%, ESS 356.1. The prose now links the summary.

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

validation/check_obr_tables.py recomputes the anchored levels table, the
fit ranges, both mean absolute deviations (0.30%, 0.49%), the free-running
694.4 -> 679.0 path, its 4.32% MAD and the ~50bn gap from
papers/obr-macro/figures/fig_anchored_data.csv and fig_free_running_data.csv.
All match; no number changes. tests/test_obr_tables.py runs it; the figure
caption cites it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
vahid-ahmadi added a commit that referenced this pull request Nov 6, 2026
canaries.json pinned quoted_at to page:line. Merging the stack (#204, #206,
#205, #219 into #200 before or after this PR) moves those lines, so seven
test_quoted_at_points_at_a_real_line cases failed on the merged tree though
every quote was still on its page. quoted_at now names the page; the line is
located from quoted_anchor at report time, and the test requires the anchor
exactly once on the page, so editing the quoted number still forces the
canary to be revisited. No expected values changed.

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

Copy link
Copy Markdown
Contributor Author

Merge plan for the round 5 stack into #200 (checked 6 Nov 2026)

Tips tested: #200 e4f7500e · #204 83649b0f · #206 baf999a9 · #205 6e6f2027 · #219 7cd00930 · #216 6ca535de · #226 2cdff6bd · #229 a7ad367a · main 153cf419. If any tip moves, re-run the simulation before merging:

git fetch origin && git worktree add --detach /tmp/r5sim origin/vahid/redesign-r2-integrate && cd /tmp/r5sim
for b in r5-ui-home r5-ui-models r5-ui-data r5-compare r5-api-scenarios r5-obr-pin r5-drift-check; do
  git merge --no-ff --no-edit origin/vahid/$b || { echo "conflict at $b"; break; }; done
PYTHONPATH=integration/src python3 -m pytest -q tests integration/tests && python3 site_contract.py && python3 site_nav.py
cd - && git worktree remove --force /tmp/r5sim

Rules

Order and commands

R=PolicyEngine/macro; B=vahid/redesign-r2-integrate
gh pr ready 204 -R $R && gh pr merge 204 -R $R --merge     # r5-ui-home
gh pr ready 206 -R $R && gh pr merge 206 -R $R --merge     # r5-ui-models
gh pr ready 205 -R $R && gh pr merge 205 -R $R --merge     # r5-ui-data
gh pr edit 219 -R $R --base $B                              # was vahid/r5-ui-home
gh pr ready 219 -R $R && gh pr merge 219 -R $R --merge     # r5-compare
gh pr ready 216 -R $R && gh pr merge 216 -R $R --merge     # r5-api-scenarios
# --- only if you choose option 1 on #218 (bump the OBR pin) ---
gh pr edit 226 -R $R --base $B                              # was vahid/r5-api-scenarios
gh pr ready 226 -R $R && gh pr merge 226 -R $R --merge     # r5-obr-pin
gh pr edit 229 -R $R --base $B                              # was vahid/r5-obr-pin
gh pr ready 229 -R $R && gh pr merge 229 -R $R --merge     # r5-drift-check
# --- then the redesign itself ---
gh pr ready 200 -R $R && gh pr merge 200 -R $R --merge     # into main

In the GitHub UI, the same steps are: "Ready for review", then "Create a merge commit", in this order. For #219, #226 and #229, first click "Edit" next to the title and change the base to vahid/redesign-r2-integrate.

The UI group (#204, #206, #205, #219) and the integration group (#216, #226, #229) do not touch each other's lines. I merged them in both orders (UI first, then integration first) and got byte-identical trees. #221 and #228 form a separate chain onto main. They still merge cleanly after #200 lands.

If you choose option 2 on #218 (wait): leave #226 and #229 unmerged. #229 is built on #226, so it carries the pin bump. You can merge #200 without them.

Checks on the final tree (base + 204 + 206 + 205 + 219 + 216 + 226 + 229, merge commits)

  • PYTHONPATH=integration/src pytest tests integration/tests: 1686 passed, 103 skipped.
  • python3 site_contract.py OK; python3 site_nav.py OK.
  • python3 <generator> --check passes for all 16 node-free generators: make_current_outlooks, make_hero, build_page, data/fetch, economy/build, economy/topics, forecasts/archive, ingest_outturns, make_open_fans, make_us_baseline, forecasts/score, release notes, make_showcase, make_charts, models/compare/build, run_battery.
  • tools/prerender_math.py --check needs node, which this Mac does not have. The node-free verify_static() returns no problems. The 6 methodology pages, vendor/mathjax/chtml.css and tools/ are byte-identical to Model pages: one-column methodology, one overview order, names not ids #206's tip, where CI's full check passed ("Site provenance" on baf999a).
  • Linkcheck over local href/src links and anchors: 71 pages, 3056 links, 0 broken.

Fixes made at the source (no hand resolution)

Follow-ups and decisions, by PR

@vahid-ahmadi

Copy link
Copy Markdown
Contributor Author

Combined merge order with the pipeline PRs (#221, #228, #195): simulated 6 Nov

Recommendation: merge this stack first if it can land by about 11 Nov. Then #221 → token/setting (#223) → #228 recovery → dispatch fetch-vintages (it rebuilds #195 from the new main) → close/reopen #195 for CI → merge #195 before the 12 Nov GDP release. If #200 can't land by then, keep the pipeline-first order and rebase this PR using the steps below.

What I simulated (local scratch worktrees; nothing pushed or merged): both orders, at tips #204 475867bd, #206 12f0a878, #205 862ec6cb, #219 fab6b2bd, #216 6ca535de, #226 2cdff6bd, #229 a7ad367a. Four of these tips have moved since the merge plan above. The stack still builds with merge commits and no conflicts.

  • No source file conflicts in either order. forecasts/score.py (the "Last scored" line), notes/generate_release_notes.py (digests), vercel.json and data/refresh.py all auto-merge. Every conflict is in generated output.
  • After the resolution below, both orders end at the same tree, byte for byte.
  • Final tree: all 18 node-free --check gates pass, refresh.py's gate run passes (1408 passed, 26 skipped), and the full suite gives 1883 passed, 109 skipped, after the anchor fix pushed to Weekly drift check: hosted model output vs the numbers the site quotes #229 (e1578302). Before it, 1 failed: test_quoted_anchor_is_on_the_page_once[define_green_public_investment]. Model pages: one-column methodology, one overview order, names not ids #206 a4b4fed2 added a second "peak +0.92%" to define/validation. The canary anchor is now "peak +0.92% vs". No expected value changed.

This stack first. #221 and #228 merge clean on top. refresh.py already calls this PR's generator (--vintage, --check). A dispatch with --carry-from data/vintage-refresh produced #195's content with no hand edits: CPI 2026Q3 3.10 and GDP 2026Q2 1.37 added, scorecard 2 → 6 forecasts over 2 periods, every gate passed including the append-only checks. Merging #195 as it is now would conflict on 14 pages, so don't. Let the bot rebuild it instead.

Pipeline first (fallback): rebase this PR. 16 conflicting files, all generated: economy/index.html, 5 UK topic pages, economy/us/index.html, 4 US topic pages, forecasts/index.html, notes/releases/index.html, sitemap.xml, forecasts/outturns.json, forecasts/scorecard.json.

  1. Take this PR's side for all of them except forecasts/outturns.json.
  2. For outturns.json, keep main's rows (gdp 2026Q2, cpi 2026Q3). Append this PR's unemployment row exactly as it stands (vintage 2026-08-26, release_updated 2026-08-17). Don't let ingest write that row: on the merged tree, ingest re-dates it to the 2026-11-05 vintage / 19 Oct release.
  3. Run score.py, then make_open_fans.py, generate_release_notes.py --rebuild, economy/topics.py, economy/build.py, data/build_page.py and assets/make_current_outlooks.py, then score.py again. All gates then pass, and the record shows "Last scored 5 November 2026".
  4. Add 20 explicit redirects to vercel.json, /notes/releases/2026-11-05-<series> → /notes/releases/2026-11-05#<series>, plus any later per-series dates. Those pages will have been live. The tests don't catch a missing one.

Pre-emptive commits: one, #229 e1578302 (the drift anchor; see above). None for the cross-stack conflicts. Every conflict depends on data the other branch doesn't have, so committing it ahead would change what either branch publishes.

Full notes: scratchpad/r5/stack-merge.md.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
vahid-ahmadi and others added 2 commits November 6, 2026 03:50
…stacks

Both stacks add entries; a shared heading with a separator line lets them
merge in either order without a CHANGELOG.md conflict.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Merges the shared [Unreleased] anchor (84e9539) and lists every
redesign-stack PR's bullets here, by PR number. The stacked PRs no longer
edit CHANGELOG.md, so they stop conflicting with each other, and the
pipeline stack (#221, #228) adds its entries below the separator line.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
vahid-ahmadi added a commit that referenced this pull request Nov 6, 2026
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>
vahid-ahmadi added a commit that referenced this pull request Nov 6, 2026
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>
vahid-ahmadi added a commit that referenced this pull request Nov 6, 2026
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>
vahid-ahmadi added a commit that referenced this pull request Nov 6, 2026
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>
vahid-ahmadi added a commit that referenced this pull request Nov 6, 2026
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>
vahid-ahmadi added a commit that referenced this pull request Nov 6, 2026
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>
vahid-ahmadi added a commit that referenced this pull request Nov 6, 2026
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>
vahid-ahmadi added a commit that referenced this pull request Nov 6, 2026
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
vahid-ahmadi added a commit that referenced this pull request Nov 6, 2026
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

This branch was successfully deployed

1 active deployment
Preview — f8e42eee Deployed Nov 6, 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