Skip to content

Pin obr-macroeconomic-model 6fbbe06, where every quarter converges - #262

Open
vahid-ahmadi wants to merge 2 commits into
mainfrom
vahid/obr-pin-94f08b9
Open

vahid-ahmadi wants to merge 2 commits into
mainfrom
vahid/obr-pin-94f08b9

Conversation

@vahid-ahmadi

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

Copy link
Copy Markdown
Contributor

Demo-critical, draft by decision (see the log below). The hosted OBR model is not demo-safe at its current pin.

Why

Hosted pin e4d7faa solves the published closure. Measured on the live server today:

  • obr_shock(CGG, +1250, 12): about 4.5 minutes, 12 of 12 quarters unconverged (Gauss-Seidel stall break), multiplier exactly 1.0000 and flat.
  • score_reform(model="obr"), default window: 20 of 20 quarters unconverged, with quarterly GDP deltas jumping (−2.09bn in 2030Q4, then −1.33bn).

obr main 94f08b9 (#54, #55, #57 and #58, merged 15 Nov) makes the nominal-GDP pin the default. I re-measured locally at 94f08b9 through core.obr_shock, one heavy job:

Lever (×12 quarters) Converged GDP £m, q1 / q4 / q8 / q12 Time
R +1.0 (Bank Rate +100bp) at 94f08b9 all quarters −129 / −405 / −480 / −522 78 s
HHDI_ADDFACTOR 1,615.75 (1p basic rate) all −150 / −311 / −449 / −533 → ratio q12 0.33 (year-1 mean 0.145) 76 s
CGG +1,250 all +1,267 / +1,283 / +1,300 / +1,311 → multiplier 1.01 → 1.05 71 s
TCPRO +0.05 all 0 / −77 / −239 / −382 78 s

The Bank Rate path matches the OBR session's independent Actions run (obr-for-macro-243.md).

Change

  • Pin e4d7faa → 94f08b9 in modal_app.py and pyproject.toml.
  • canaries.json, plus the drift and wiring tests: the Bank Rate expectations and the household ratio 0.33. The stale-pin test now rejects e4d7faa's path.
  • CGG caveat (served in every obr_shock payload) and the /obr/code example: "about 1.01 on impact, rising to about 1.05", still against the OBR's 0.6.
  • /obr/validation: the Bank Rate card has the new numbers (cut +134..+541, from the OBR session's run). The hosted card, which still described pin 1ed742c and "until Decision needed (#218): bump the hosted OBR pin to obr-macroeconomic-model main (e4d7faa) #226 is deployed" (stale since 6 Nov), now describes 94f08b9 and the score_reform runtime (Hosted score_reform (OBR, default window) has not finished within 10 minutes since the 30 Oct deploy #243). The three-configurations line says every quarter converges.
  • "No quarter converges" is removed from /obr, /obr/methodology, /obr/validation and /models/validation; the /obr verdict says every quarter converges.
  • capabilities.py OBR runtime: "about one to five minutes for a raw shock; over ten minutes for a translated reform scenario on the default window" (was "seconds"). The reform topic page is regenerated.

Decision log (Fable 5.2, asked because Vahid asked for no questions)

Re-pinned to 6fbbe06 (obr #65 and #66 merged)

The OBR session's final figures are in (obr-for-macro-243.md, "FINAL figures", Actions run 43720935064), and obr #65 (EU payments held at zero) and #66 (household ratio on both bases) are merged to main 6fbbe06. This PR now pins 6fbbe06. I re-measured locally at 6fbbe06 under the heavy-job lock:

6fbbe06 (mine) OBR session final
Bank Rate +100bp, GDP £m q1/q4/q8/q12 −128.7 / −405.4 / −480.6 / −522.2, every quarter converged identical; cut +133.9..+541.5
CGG +1,250 multiplier 1.014 → 1.049 1.01 → 1.05
Household 1p basic rate, q12 real 0.330, current-price 0.372 (df.attrs) 0.33 / 0.37
Corporation tax +5pp, FYCPR q12 site already says −£404m −403.9

The canary expectations are unchanged from 94f08b9. The worked example now quotes the like-for-like current-price ratio, 0.16 → 0.37×, against the OBR's 0.3. That is the basis obr #66 says matches the OBR. The real-GDP figures obr_shock returns (0.145 → 0.33×) sit beside it, and the canary still checks 0.33, since that is what the tool reports.

Still pending in obr, neither of which changes the hosted deltas (per the OBR session): #61 (IBUSX bracket) and #67 (demo and result labels). Fable's condition was "re-pin and regenerate inside this PR if #65/#66/#61 merge first". #65 and #66 are in. Marked ready for review.

Scope and what's still open

  • Correctness, not speed. The OBR solve is slightly slower at main (216 s vs 178 s cold, OBR session). score_reform's runtime is mostly the microsim; see Run each population simulation once, not twice, and say how long it takes #260 (the double run) and Report stage timings in the OBR score_reform result #253 (timings).
  • Not re-measured here, and left unchanged: the CGIPS sweep figures (/obr/validation, OBR session: now proportional, −1,387/−2,773/−5,547), the free-running MAPE in capabilities.py (4.32% / 7.22%; the OBR session's 4.12% / 6.90% needs Point canonical URLs at policyengine-macro.vercel.app #65), and the /models/compare OBR rows (hosted runs from 6 Nov at e4d7faa). The compare battery should be rerun against the hosted server after this deploys.
  • Free-running scorecard not refreshed here: the /obr/validation tile (4.32%), the consumption, household-income, profits (82.77%) and current-account figures, the free-running chart (papers/obr-macro/figures/fig_free_running_data.csv), and capabilities.py's "4.32% and 7.22%". The OBR session's final note gives the new default-pin scorecard (GDP 4.12%, consumption 6.90%, household income 4.50%, profits 12.45%, current account 1.19%, 8 of 11 in band), but not the chart series or business investment. Refreshing it properly needs the scorecard CSV copied from obr, as a follow-up.

Merging redeploys Modal

Tests

pytest tests 3257 passed; integration (excluding remote) 453 passed; site_contract.py and topics.py --check OK.

🤖 Generated with Claude Code

The hosted pin e4d7faa solves the published closure: every quarter of
every obr_shock and score_reform stops on the Gauss-Seidel stall break,
and the CGG multiplier is exactly 1.0000. obr main (94f08b9, #54-#58)
makes the nominal-GDP pin the default; re-measured locally today, all
four canary levers converge in every quarter.

- Pin e4d7faa -> 94f08b9 (modal_app.py, pyproject.toml).
- Canaries and site: Bank Rate +100bp GDP -129/-405/-480/-522 £m (was
  -121/-431/-482/-416), cut +134..+541; household ratio q12 0.33 (was
  0.34); CGG multiplier 1.01 rising to 1.05 (caveat, code example).
- "No quarter converges" statements on /obr, /obr/methodology,
  /obr/validation and /models/validation now say every quarter does.
- /obr/validation hosted card described pin 1ed742c and #226; it now
  describes 94f08b9 and the score_reform runtime (#243).
- capabilities OBR runtime: minutes, not seconds (topic page regenerated).

Co-Authored-By: Claude Opus 5.5 <[email protected]>
@vercel

vercel Bot commented Nov 15, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
macromod Ready Ready Preview Nov 15, 2026 2:21pm UTC

Request Review

…usehold ratio like for like

obr #65 (EU payments held at zero) and #66 (household ratio on both
bases) merged to main 6fbbe06. Re-measured locally at 6fbbe06: Bank Rate
+100bp -128.7/-405.4/-480.6/-522.2, CGG 1.01 -> 1.05, every quarter
converged, matching the OBR session's final figures (Actions run
43720935064); canary expectations unchanged.

The worked example now quotes current-price GDP per pound of revenue,
the OBR's like-for-like basis: 0.16 in year 1, 0.37 by quarter 12, with
the real-GDP figures obr_shock returns (0.145, 0.33) beside them.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
@vahid-ahmadi vahid-ahmadi changed the title Pin obr-macroeconomic-model 94f08b9, where every quarter converges Pin obr-macroeconomic-model 6fbbe06, where every quarter converges Nov 15, 2026
@vahid-ahmadi
vahid-ahmadi marked this pull request as ready for review November 15, 2026 14:21

This branch was successfully deployed

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