fix(p3-batch): восстановление 13 Fable 5 P3-fixes из lost branches #1301
No reviewers
Labels
No labels
admin
analytics
auth
automation
bug
business
chore
ci
compliance
data
data-moat
docs
duplicate
dx
enhancement
Fable 5 ревью
feedback/max
generative
GG-форсайт
needs-discussion
needs-human
observability
pause-bots
performance
priority/p0
priority/p1
priority/p2
priority/p3
scope/backend
scope/db
scope/devops
scope/frontend
scope/qa
scrapers
security
site-finder
stage/1
stage/2
status/blocked
status/done
status/needs-analysis
status/needs-fix
status/qa
status/ready
status/review
status/wip
tech-debt
tradein
ux
week ревью 1
wontfix
вторичка
ИРД
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: lekss361/gendesign#1301
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "recover/fable5-p3-batch-2026-06-13"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
Восстановление 13 P3-fixes Fable 5, которые были утеряны при batch-push 2026-06-13: head SHA 13 веток оказались resetnuty к main-коммитам (#1220/#1230/#1233) — Forgejo показывал «уже в target», merge-button недоступен.
Работа cherry-pick'нута из локального reflog (8 коммитов) + 2 stash + 3 ручных восстановления тривиальных fix'ов. Все 13 issues адресованы.
Backend (11 fixes)
#1232poi_loader: timedelta(days=730) вместо replace(year=-2) (leap-year safe)#1226objective_sync_config: log seed failure (bare except → logger.exception)#1228izyatie_ocr: «6б:» → «66:» для кад-номеров МСК-66#1234parcel_snapshot.html: Unicode «—» вместо—в Jinja or-fallback#1231noise_loader: per-row SAVEPOINT#1221analytics: _district_market_saturation latest-snapshot filter#1229best_layouts: normalize supply room_bucket vocabulary#1222forecasting: propagate confounded flag → §15#1116gknspecial: per-prefix db.commit() для durability#1095ird_overlay_lookup: расширить except до DataError#1159okn: expand registry coverage + detail-card name/addressFrontend (2 fixes)
#1237UserMenu: отобразить роль analyst, расширить Role union#1240PilotRequestModal: mirror Pydantic schema validationTest plan
Closes #1232
Closes #1237
Closes #1231
Closes #1226
Closes #1228
Closes #1234
Closes #1221
Closes #1229
Closes #1240
Closes #1222
Closes #1116
Closes #1095
Closes #1159
best_layouts._SUPPLY_BATCH_SQL эмитил {studio,euro-1,euro-2,1,2,3,4+}, а _INLINE_VELOCITY_SQL читает {студия,1,2,3,4+} из objective_corpus_room_month (prod check: 'euro-*' rows отсутствуют). Эффект: rooms=2 + area<50 уходили в euro-1/euro-2 supply-стороной → выпадали из знаменателя bucket '2' → sold_pct_of_supply двушек завышен, is_oversold ложно True. (rb='euro-*') dead lookups в supply_map. Patch: убраны euro-* WHEN в supply CASE. SF-08 euro-биннинг отложен до момента когда velocity-сторона начнёт его отдавать. +2 regression теста (bucket match, string guard). 35 best_layouts тестов зелёные. Closes #1229Backend PilotRequestInput требует name min_length=2 и др., но modal проверял только !form.name.trim(). 1-char name ('Я') проходил, backend возвращал 422, apiFetch клал raw FastAPI JSON в Error.message, modal рендерил его буквально для public lead form. Patch: PILOT_LIMITS + PILOT_EMAIL_RE константы (синхр с backend), per-field onBlur+live валидация с RU-сообщениями, minLength/maxLength + aria-invalid/aria-describedby, submit disabled при ошибках, formatSubmitError → 4xx/5xx → human text. 26 vitest кейсов. Closes #1240okn_objects_sync собирал 428 ОКН из ~798 ЕГРОКН и сохранял raw_props={id} без названия/адреса — analyze показывал 'ОКН рядом' без указания КАКОГО. Coverage: расширил _ADDRESS_PASSES с 2 до 11 подстрок (Екатеринбург, г. Екатеринбург, 7 районов ЕКБ, 2 формы Свердловской обл.). _PASSES = декартово (address × category). first-wins дедуп сохраняет высшую категорию. Detail: fetch_okn_detail(source_id) — GET Show/Show?id=, BeautifulSoup парсит HTML (dl/dt/dd и tr/td), извлекает name, address, protection_category, object_kind, dating. _enrich_with_detail сливает в raw_props с graceful failover (cap=1500, exception per-object не валит прогон). Lookup: parcel_okn_objects возвращает name/address из raw_props->>'name'. Existing ird_analyze тесты не сломаны. 49 okn-related тестов passed, ruff clean. Closes #1159