fix(affordability): calibrate key_rate→market mortgage spread to 4.5pp #1052

Merged
bot-backend merged 1 commit from fix/affordability-market-spread into main 2026-06-04 12:22:04 +00:00
Collaborator

What

Calibrates the §7.9 affordability key_rate→market-mortgage spread from a 0.0 placeholder to 4.5 pp.

Why (ground-truthed on prod macro_indicator): payments were computed at the bare CBR key_rate (~14.5%), understating borrower cost and overstating affordability. The real market primary rate is mortgage_rate_primary_domrf = 19.125% (@ 2026-04-19) vs key_rate ~14.5% → observed spread ≈4.6 pp (inside the typical RF 3-5 pp band). So rate_used = key_rate + 4.5 ≈ 19% now matches the directly-observed market rate. (#981 had correctly moved off the subsidized mortgage_rate_weighted 7-11% but landed on key_rate+0 as a stopgap.)

Effect

Affordability / price_feasibility becomes less optimistic = more accurate (real ~19% borrower cost). rate_kind/graceful-fallback (market_unavailable when no key_rate) unchanged.

Tests

Docstrings + tests updated to the symbolic spread (not loosened) + a new regression anchor (_KEY_RATE_MARKET_SPREAD_PP == 4.5; mocked key_rate 14.5 → _current_market_rate ≈ 19.0). Whole forecasting suite 841 passed, ruff clean. No stale fixtures (product_scoring's afford stub sets payment directly, spread-independent).

## What Calibrates the §7.9 affordability key_rate→market-mortgage spread from a **0.0 placeholder** to **4.5 pp**. **Why (ground-truthed on prod `macro_indicator`):** payments were computed at the bare CBR key_rate (~14.5%), **understating borrower cost and overstating affordability**. The real market primary rate is **mortgage_rate_primary_domrf = 19.125%** (@ 2026-04-19) vs key_rate ~14.5% → observed spread **≈4.6 pp** (inside the typical RF 3-5 pp band). So `rate_used = key_rate + 4.5 ≈ 19%` now matches the directly-observed market rate. (#981 had correctly moved off the subsidized `mortgage_rate_weighted` 7-11% but landed on key_rate+0 as a stopgap.) ## Effect Affordability / `price_feasibility` becomes **less optimistic = more accurate** (real ~19% borrower cost). `rate_kind`/graceful-fallback (`market_unavailable` when no key_rate) unchanged. ## Tests Docstrings + tests updated to the **symbolic** spread (not loosened) + a new regression anchor (`_KEY_RATE_MARKET_SPREAD_PP == 4.5`; mocked key_rate 14.5 → `_current_market_rate` ≈ 19.0). Whole forecasting suite **841 passed**, ruff clean. No stale fixtures (product_scoring's afford stub sets payment directly, spread-independent).
bot-backend added 1 commit 2026-06-04 12:22:02 +00:00
fix(affordability): calibrate key_rate->market mortgage spread to 4.5pp
All checks were successful
Deploy / changes (push) Successful in 6s
Deploy / build-frontend (push) Has been skipped
Deploy / build-backend (push) Successful in 1m29s
Deploy / build-worker (push) Successful in 2m40s
Deploy / deploy (push) Successful in 1m13s
4844847cae
_KEY_RATE_MARKET_SPREAD_PP was a 0.0 placeholder, so §7.9 affordability payments
used the bare CBR key_rate (~14.5%), understating borrower cost and OVERSTATING
affordability. Calibrate to 4.5pp from the prod anchor (macro_indicator
mortgage_rate_primary_domrf 19.125% @ 2026-04-19 vs key_rate ~14.5% -> observed
~4.6pp, rounded conservatively; inside the typical RF 3-5pp band), so
rate_used = key_rate + 4.5 ~= 19% matches the directly-observed market primary
mortgage rate. Makes affordability LESS optimistic / more accurate. Docs + tests
updated to the symbolic spread (new regression anchor pins spread==4.5 and
key_rate 14.5 -> ~19.0); rate_kind/graceful-fallback semantics unchanged.
Forecasting suite 841 passed; ruff clean.
bot-backend merged commit 4844847cae into main 2026-06-04 12:22:04 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#1052
No description provided.