fix(schemas): expose per-bucket elasticity + velocity_source в RecommendBucket (#1204) #1250

Merged
bot-backend merged 1 commit from fix/recommend-bucket-elasticity-fields into main 2026-06-13 05:14:06 +00:00
Collaborator

Summary

Closes #1204 (P2 api-contract). 5 missing полей в RecommendBucket → фронт RecommendVelocityPanel.tsx всегда падал на глобальную эластичность вместо per-bucket.

Bug

recommend_mix (analytics_queries.py:2592-2606) кладёт в каждый bucket:

  • elasticity (per-bucket эластичность спроса по цене)
  • elasticity_r2, elasticity_n, elasticity_source (диагностика)
  • velocity_source (hedonic/deals/fallback)

Но RecommendBucket их не объявлял и не имел extra='allow' → Pydantic v2 молча выкидывает из response. Фронт ждёт их (RecommendVelocityPanel.tsx:68: r.elasticity ?? elasticity), но всегда получал undefined → fallback на глобальную. Live what-if при движении price-слайдера расходился с серверным months_to_sellout (тот считается per-bucket) и с UI-таблицей «Эластичность по сегментам».

Fix

Добавлены 5 опциональных полей в схему. Никаких изменений в recommend_mix producer'е или фронте — это restore broken contract.

Test plan

  • pytest tests/ -k recommend → 113 passed, 1 skipped, 0 failed.
  • ruff check → All checks passed.
  • Совместимость: фронт уже использует ?? globalFallback, новые поля = bonus enrichment.

Closes #1204

## Summary Closes #1204 (P2 api-contract). 5 missing полей в `RecommendBucket` → фронт `RecommendVelocityPanel.tsx` всегда падал на глобальную эластичность вместо per-bucket. ## Bug `recommend_mix` (`analytics_queries.py:2592-2606`) кладёт в каждый bucket: - `elasticity` (per-bucket эластичность спроса по цене) - `elasticity_r2`, `elasticity_n`, `elasticity_source` (диагностика) - `velocity_source` (`hedonic`/`deals`/`fallback`) Но `RecommendBucket` их не объявлял и не имел `extra='allow'` → Pydantic v2 молча выкидывает из response. Фронт ждёт их (`RecommendVelocityPanel.tsx:68: r.elasticity ?? elasticity`), но всегда получал `undefined` → fallback на глобальную. **Live what-if при движении price-слайдера расходился** с серверным `months_to_sellout` (тот считается per-bucket) и с UI-таблицей «Эластичность по сегментам». ## Fix Добавлены 5 опциональных полей в схему. Никаких изменений в `recommend_mix` producer'е или фронте — это restore broken contract. ## Test plan - [x] `pytest tests/ -k recommend` → 113 passed, 1 skipped, 0 failed. - [x] `ruff check` → All checks passed. - [x] Совместимость: фронт уже использует `?? globalFallback`, новые поля = bonus enrichment. Closes #1204
bot-backend added 1 commit 2026-06-13 05:06:19 +00:00
fix(schemas): expose per-bucket elasticity + velocity_source в RecommendBucket (#1204)
All checks were successful
CI / backend-tests (push) Successful in 6m30s
CI / changes (pull_request) Successful in 8s
CI / changes (push) Successful in 8s
CI / frontend-tests (push) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / backend-tests (pull_request) Successful in 6m28s
441f761a89
recommend_mix кладёт в bucket поля elasticity / elasticity_r2 / elasticity_n /
elasticity_source / velocity_source (analytics_queries.py:2592-2606), но
RecommendBucket их не объявляет и не имеет extra='allow' → Pydantic v2 молча
выкидывает их из response. Фронт (RecommendVelocityPanel.tsx:68
`r.elasticity ?? elasticity`) при движении price-слайдера всегда падает на
ГЛОБАЛЬНУЮ эластичность — live what-if расходится и с серверным
months_to_sellout (тот считается per-bucket), и с UI-таблицей «Эластичность
по сегментам».

Patch: добавлены 5 опциональных полей в схему. Совместимость: фронт уже
читает их с `?? globalFallback`, поэтому non-breaking. Producer/consumer-
контракт восстановлен. 113/113 recommend-тестов зелёные.

Closes #1204
bot-backend merged commit 4648e1aee7 into main 2026-06-13 05:14:06 +00:00
bot-backend deleted branch fix/recommend-bucket-elasticity-fields 2026-06-13 05:14:06 +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#1250
No description provided.