Сборник аудита 02.09 — средние/низкие подтверждённые находки (7 шт., каждая с уликой скептика) #3323

Open
opened 2026-09-02 06:57:31 +00:00 by bot-backend · 1 comment
Collaborator

Армейский аудит 01-02.09 (12 линз + скептик на каждую находку). Здесь — подтверждённые medium/low, не тянущие на отдельный issue. Каждая проверена независимым агентом по коду и/или проду.

МЕРА

1. [medium] Thin-market гейт Avito IMV — витринный флаг. estimator.py:3394-3433: avito_imv_thin_market_threshold=10 рождает только warning; IMV с market_count=1 всё равно двигает headline (blend w=0.5 при A>median×1.15) и растягивает range_highmarket_count не проверяется нигде в денежном пути. Комментарий config:702 сам называет порог «флаг+warning». → Гейтить blend и range_high по market_count.

2. [medium] Отказ банка на Init блокирует покупку на 30 минут. payments.py:391-408: Init-fail оставляет строку NEW с payment_url=NULL; она попадает в предикат uidx 279, _find_live_payment её не видит (фильтр payment_url IS NOT NULL), повторный INSERT ловит конфликт → ложный 409 «retry shortly» до истечения окна. Чинить до включения payments_enabled.

3. [medium] Purge истёкших PII (152-ФЗ) выключен с посева. purge_expired_trade_in_data: enabled=false с миграции 231, last_run_at IS NULL, 0 прогонов вообще; на проде 129 из 1124 B2C-оценок просрочены и лежат (столько же, сколько 06.08 — чистки нет). expires_at работает только как read-фильтр. → Решение владельца: включить (supervised первый прогон) — compliance-обещание из privacy.

4. [medium] coverage-copy: «в остальных N расчёт всё равно сделаем» — неправда для emptyPct. coverage-copy.ts:107-113: в rest=100−confidentPct входят и пробы с пустой когортой, а для них ветка not_covered отдаёт «не считаем». Плюс :77-79 — median_listing_age_days подписан «в среднем» (бэкенд считает percentile_cont(0.5), trade_in.py:2923). Плюс игра: page.tsx:87 slice(0,3) без разнообразия — на проде раунды 2-3 почти одна студия на одной улице.

ПТИЦА

5. [medium] saturation score_multiplier объявлен и не применяется. saturation.py:290 вычисляет, parcels.py:3851 строит score_final ДО расчёта блока (:3938) — влиять структурно не может, потребителей нет. Мёртвая ручка, читающаяся как работающая. → применить или удалить с комментарием.

6. [medium] Freshness-реестр слеп к половине лоадеров. _FRESHNESS_SOURCES (admin_scrape.py:1447-1553) — ровно 7 источников; вне надзора ВСЕ connection-capacity (Россети/газ-ГРС/ЕЭСК/вода — ЕЭСК две недели молча падал, см. PR #3317), ekb_krt, riasurt — при живых beat-строках. Плюс velocity_alerts: детектор аномалий существует только как GET-ручка — ни beat, ни notify, ни потребителя во фронте.

7. [medium] premium_buildings_curated мёртв на 75%. Проверено лично (скептик этой находки упал): 66 из 88 house_id не существуют в houses — кураторские классы premium/deluxe не находят свои дома (вероятно, id протухли при пересборках houses). → Перепривязать по адресу/кадастру, ключ хранить стабильный (не surrogate id).

Приёмка

По пунктам — в комментариях при разборе; сборник дробить по мере взятия в работу.

Refs: #3316 (security — отдельно), #3319-#3322 (high — отдельно), PR #3317/#3318 (уже починено).

Армейский аудит 01-02.09 (12 линз + скептик на каждую находку). Здесь — подтверждённые medium/low, не тянущие на отдельный issue. Каждая проверена независимым агентом по коду и/или проду. ## МЕРА **1. [medium] Thin-market гейт Avito IMV — витринный флаг.** `estimator.py:3394-3433`: `avito_imv_thin_market_threshold=10` рождает только warning; IMV с `market_count=1` всё равно двигает headline (blend w=0.5 при A>median×1.15) и растягивает `range_high` — `market_count` не проверяется нигде в денежном пути. Комментарий config:702 сам называет порог «флаг+warning». → Гейтить blend и range_high по market_count. **2. [medium] Отказ банка на Init блокирует покупку на 30 минут.** `payments.py:391-408`: Init-fail оставляет строку NEW с `payment_url=NULL`; она попадает в предикат uidx 279, `_find_live_payment` её не видит (фильтр `payment_url IS NOT NULL`), повторный INSERT ловит конфликт → ложный 409 «retry shortly» до истечения окна. Чинить до включения `payments_enabled`. **3. [medium] Purge истёкших PII (152-ФЗ) выключен с посева.** `purge_expired_trade_in_data`: enabled=false с миграции 231, `last_run_at IS NULL`, 0 прогонов вообще; на проде **129 из 1124** B2C-оценок просрочены и лежат (столько же, сколько 06.08 — чистки нет). `expires_at` работает только как read-фильтр. → Решение владельца: включить (supervised первый прогон) — compliance-обещание из privacy. **4. [medium] coverage-copy: «в остальных N расчёт всё равно сделаем» — неправда для emptyPct.** `coverage-copy.ts:107-113`: в rest=100−confidentPct входят и пробы с пустой когортой, а для них ветка not_covered отдаёт «не считаем». Плюс `:77-79` — median_listing_age_days подписан «в среднем» (бэкенд считает percentile_cont(0.5), trade_in.py:2923). Плюс игра: `page.tsx:87` slice(0,3) без разнообразия — на проде раунды 2-3 почти одна студия на одной улице. ## ПТИЦА **5. [medium] saturation score_multiplier объявлен и не применяется.** `saturation.py:290` вычисляет, `parcels.py:3851` строит score_final ДО расчёта блока (`:3938`) — влиять структурно не может, потребителей нет. Мёртвая ручка, читающаяся как работающая. → применить или удалить с комментарием. **6. [medium] Freshness-реестр слеп к половине лоадеров.** `_FRESHNESS_SOURCES` (admin_scrape.py:1447-1553) — ровно 7 источников; вне надзора ВСЕ connection-capacity (Россети/газ-ГРС/ЕЭСК/вода — ЕЭСК две недели молча падал, см. PR #3317), ekb_krt, riasurt — при живых beat-строках. Плюс velocity_alerts: детектор аномалий существует только как GET-ручка — ни beat, ни notify, ни потребителя во фронте. **7. [medium] premium_buildings_curated мёртв на 75%.** Проверено лично (скептик этой находки упал): **66 из 88 house_id не существуют в houses** — кураторские классы premium/deluxe не находят свои дома (вероятно, id протухли при пересборках houses). → Перепривязать по адресу/кадастру, ключ хранить стабильный (не surrogate id). ## Приёмка По пунктам — в комментариях при разборе; сборник дробить по мере взятия в работу. Refs: #3316 (security — отдельно), #3319-#3322 (high — отдельно), PR #3317/#3318 (уже починено).
Author
Collaborator

Статус сборника на 05.09 (фокус владельца — только МЕРА, пп. 5-7 ПТИЦЫ заморожены):

  • п.1 thin-market гейт IMV — закрыт PR #3336 (гейт в _apply_imv_blend, квартальная поправка при тонком рынке применяется, market_count=0 больше не глушит флаг; GET/PDF-путь выровнен). Прод-радиус на момент мержа — 0 строк с market_count < 10 (профилактика для малых городов). Follow-up на витрину: #3339 → PR #3349 (подпись «рынок из N объявлений — в расчёт не входит»).
  • п.4 coverage-copy — закрыт PR #3337 (три доли, медиана вместо «в среднем», разные квартиры в раундах; приёмка глазами: «83 / 14 / 3»).
  • п.2 отказ банка на Init блокирует покупку на 30 мин — не взят (до включения payments_enabled; следующая очередь).
  • п.3 purge 152-ФЗ — решение владельца (включить supervised первый прогон).
  • пп. 5-7 (ПТИЦА) — вне текущего фокуса.
Статус сборника на 05.09 (фокус владельца — только МЕРА, пп. 5-7 ПТИЦЫ заморожены): - **п.1 thin-market гейт IMV — закрыт** PR #3336 (гейт в `_apply_imv_blend`, квартальная поправка при тонком рынке применяется, `market_count=0` больше не глушит флаг; GET/PDF-путь выровнен). Прод-радиус на момент мержа — 0 строк с `market_count < 10` (профилактика для малых городов). Follow-up на витрину: #3339 → PR #3349 (подпись «рынок из N объявлений — в расчёт не входит»). - **п.4 coverage-copy — закрыт** PR #3337 (три доли, медиана вместо «в среднем», разные квартиры в раундах; приёмка глазами: «83 / 14 / 3»). - **п.2 отказ банка на Init блокирует покупку на 30 мин** — не взят (до включения `payments_enabled`; следующая очередь). - **п.3 purge 152-ФЗ** — решение владельца (включить supervised первый прогон). - пп. 5-7 (ПТИЦА) — вне текущего фокуса.
Sign in to join this conversation.
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#3323
No description provided.