числа лендинга: покрытие 88 % было выше всего диапазона представительных пересборок #3295

Merged
bot-backend merged 3 commits from fix/mera-honest-coverage-number into main 2026-08-31 09:26:29 +00:00
Collaborator

Замер

Прогон бэктеста на проде, engine=full, Екатеринбург, выборка 400, представительный отбор (--spread scattered, три соли):

соль n MAPE покрытие
mera 325 15,28 % 84,31 %
alpha 329 15,66 % 86,02 %
bravo 325 14,66 % 82,77 %

Опубликовано было: расхождение 14,5 %, покрытие 88 %.

Покрытие 88 % лежит выше всего диапазона 82,8–86,0. Это не «чуть оптимистично» — на представительной выборке такое значение не достигается. Оно получалось только на кластеризованной ORDER BY id DESC, где 20 строк витрины приходились на четыре улицы.

Заменено на медианы трёх пересборок: покрытие 84,3 %, расхождение 15,3 %. В оговорки добавлен сам диапазон — величина разового замера гуляет, и точечное значение без него обещает точность, которой у замера нет.

Три блокера ревью, снятые замером

1. Подпись окна. Числа перевели на новую выборку, а подпись осталась прежней — «сделки II квартала 2026 года». Автор честно записал, что квартальный состав пересборки не смотрел, и оставил критерий снятия. Выполнил:

квартал сделок доля
III кв 2025 106 26,5 %
IV кв 2025 110 27,5 %
I кв 2026 88 22,0 %
II кв 2026 96 24,0 %

Пересборка покрывает четыре квартала, II квартал 2026 — четверть её. Прежняя подпись была бы прямым враньём.

2. Знаменатель. Был 5 954 — сделки только II квартала. Для выборки по четырём кварталам это завышало долю вчетверо: 5,5 % вместо 1,3 %. Замер тем же фильтром, что у выборки: в окне 24 333, из них II квартал 2026 — 5 954. Оба числа одним запросом.

3. Уверенность. Плитка «325 из 327» была из прогона 29.08, а лид секции печатал «замер 31.08» — старому числу приписывалась новая дата. Хуже: 325 в лиде совпало с 325 в плитке и читалось как одна выборка, хотя это разные прогоны. Заменено на «400 из 400» из той же пересборки.

4. Оговорка уверенности не выводилась вовсе — блок собирал оговорки двух величин из трёх. Плитка «уверенность низкая» стояла без единого слова о том, почему. Теперь выводится, и говорит суть: порог требует разброса цен среди сопоставимых объявлений не выше 24 %, а замер по 60 случайным адресам даёт медиану 29 %. «Высокая» недостижима не из скромности, а арифметически.

Проверки

157 тестов. Фальсификация каждого утверждения:

  • вернуть знаменатель одного квартала → expected 5954 to be 24333 и expected 5.458 to be less than 2 (второй ассерт ловит само завышение доли);
  • убрать диапазон из оговорок → 2 failed;
  • вписать «15,3 %» прямо в компонент → 1 failed;
  • снять оговорку уверенности из вывода → «оговорка не выводится».

tsc rc=0 · eslint --max-warnings 0 rc=0.

## Замер Прогон бэктеста на проде, `engine=full`, Екатеринбург, выборка 400, представительный отбор (`--spread scattered`, три соли): | соль | n | MAPE | покрытие | |---|---|---|---| | mera | 325 | 15,28 % | 84,31 % | | alpha | 329 | 15,66 % | 86,02 % | | bravo | 325 | 14,66 % | 82,77 % | Опубликовано было: расхождение **14,5 %**, покрытие **88 %**. **Покрытие 88 % лежит выше всего диапазона** 82,8–86,0. Это не «чуть оптимистично» — на представительной выборке такое значение не достигается. Оно получалось только на кластеризованной `ORDER BY id DESC`, где 20 строк витрины приходились на четыре улицы. Заменено на медианы трёх пересборок: покрытие **84,3 %**, расхождение **15,3 %**. В оговорки добавлен сам диапазон — величина разового замера гуляет, и точечное значение без него обещает точность, которой у замера нет. ## Три блокера ревью, снятые замером **1. Подпись окна.** Числа перевели на новую выборку, а подпись осталась прежней — «сделки II квартала 2026 года». Автор честно записал, что квартальный состав пересборки не смотрел, и оставил критерий снятия. Выполнил: | квартал | сделок | доля | |---|---|---| | III кв 2025 | 106 | 26,5 % | | IV кв 2025 | 110 | 27,5 % | | I кв 2026 | 88 | 22,0 % | | II кв 2026 | 96 | **24,0 %** | Пересборка покрывает **четыре квартала**, II квартал 2026 — четверть её. Прежняя подпись была бы прямым враньём. **2. Знаменатель.** Был 5 954 — сделки только II квартала. Для выборки по четырём кварталам это завышало долю **вчетверо**: 5,5 % вместо 1,3 %. Замер тем же фильтром, что у выборки: в окне **24 333**, из них II квартал 2026 — 5 954. Оба числа одним запросом. **3. Уверенность.** Плитка «325 из 327» была из прогона 29.08, а лид секции печатал «замер 31.08» — старому числу приписывалась новая дата. Хуже: 325 в лиде совпало с 325 в плитке и читалось как одна выборка, хотя это разные прогоны. Заменено на «400 из 400» из **той же** пересборки. **4. Оговорка уверенности не выводилась вовсе** — блок собирал оговорки двух величин из трёх. Плитка «уверенность низкая» стояла без единого слова о том, почему. Теперь выводится, и говорит суть: порог требует разброса цен среди сопоставимых объявлений не выше 24 %, а замер по 60 случайным адресам даёт медиану **29 %**. «Высокая» недостижима не из скромности, а арифметически. ## Проверки 157 тестов. Фальсификация каждого утверждения: - вернуть знаменатель одного квартала → `expected 5954 to be 24333` **и** `expected 5.458 to be less than 2` (второй ассерт ловит само завышение доли); - убрать диапазон из оговорок → 2 failed; - вписать «15,3 %» прямо в компонент → 1 failed; - снять оговорку уверенности из вывода → «оговорка не выводится». `tsc` rc=0 · `eslint --max-warnings 0` rc=0.
bot-backend added 2 commits 2026-08-31 09:10:35 +00:00
Покрытие 88 % и расхождение 14,5 % получались только на кластеризованной
выборке (ORDER BY id DESC: 20 строк на четыре улицы). Замер 31.08.2026 тремя
представительными пересборками (engine=full, ЕКБ, три соли) дал покрытие
82,77/84,31/86,02 % и MAPE 14,66/15,28/15,66 %: опубликованные 88 % лежат ВЫШЕ
всего диапазона, то есть недостижимы, а 14,5 % — чуть ниже, тот же
благоприятный край.

- BACKTEST.coverage 88 % -> 84,3 %, priceError 14,5 % -> 15,3 % (медианы),
  sampleN 327 -> 325 (медианная пересборка);
- в оговорки добавлен сам диапазон пересборок (82,8-86,0 % и 14,7-15,7 %):
  точечное значение без него обещает точность, которой у замера нет;
- BACKTEST_SOURCE переписан — представительная выборка, а не последние
  загруженные строки; дата замера 29.08 -> 31.08.2026;
- confidenceLow («325 из 327») на пересборках НЕ пересчитывался: у него
  отдельный источник с прежней датой и оговорка про свой знаменатель;
- квартальный состав представительной выборки не проверен — записан
  дословно, с критерием снятия, рядом с BACKTEST_PERIOD_LABEL.

Тест: backtest-freshness проверяет наличие диапазона в оговорках (+контроль на
инструмент) и что AccuracyV3/HeroV3 не содержат самих величин; render-тест
перестал сверяться с вписанным «14,5 %» и берёт значение из landing-facts.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
бэктест: подписи окна приведены к замеру, уверенность — к тому же прогону
All checks were successful
CI Trade-In / changes (pull_request) Successful in 12s
CI Trade-In / backend-tests (pull_request) Has been skipped
CI / changes (pull_request) Successful in 14s
CI Trade-In / browser-tests (pull_request) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Successful in 1m21s
79ae87019a
Снимает три блокера ревью на этой же ветке.

1. ПОДПИСЬ ОКНА. Числа перевели на представительную выборку, а подпись
осталась от прежнего прогона: «сделки II квартала 2026 года». Автор честно
записал, что квартальный состав пересборки не смотрел, и оставил критерий
снятия — посчитать deal_date по выборке. Посчитал:

    III кв 2025 — 106 (26,5 %)      I кв 2026 — 88 (22,0 %)
    IV кв 2025  — 110 (27,5 %)     II кв 2026 — 96 (24,0 %)

Пересборка покрывает ЧЕТЫРЕ квартала, II квартал 2026 — четверть её. Прежняя
подпись для этих чисел была бы прямым враньём.

2. ЗНАМЕНАТЕЛЬ. Был 5 954 — сделки только II квартала. Для выборки по четырём
кварталам это завышало долю вчетверо: 5,5 % вместо 1,3 %. Замер тем же
фильтром, что у выборки: в окне 24 333, из них II квартал 2026 — 5 954. Оба
числа одним запросом.

3. УВЕРЕННОСТЬ. Плитка «325 из 327» была из прогона 29.08, а лид секции печатал
«замер 31.08» — старому числу приписывалась новая дата, и 325 в лиде совпадало
с 325 в плитке, читаясь как одна выборка. Заменено на «400 из 400» из ТОЙ ЖЕ
пересборки. Знаменатель 400 — запрошенные сделки, а не 325 сматчившихся:
уверенность считается на каждой оценке.

4. Оговорка уверенности не выводилась вовсе: AccuracyV3 собирал оговорки двух
величин из трёх. Плитка стояла без единого слова о том, почему уверенность
низкая. Добавлена третья.

Тесты проверены фальсификацией: возврат знаменатели одного квартала даёт
«expected 5954 to be 24333» и «expected 5.458 to be less than 2»; снятие
оговорки из вывода — «оговорка не выводится». 157 passed.
bot-backend added 1 commit 2026-08-31 09:15:12 +00:00
Merge branch 'main' into fix/mera-honest-coverage-number
All checks were successful
CI Trade-In / changes (pull_request) Successful in 17s
CI / changes (pull_request) Successful in 16s
CI Trade-In / backend-tests (pull_request) Has been skipped
CI Trade-In / browser-tests (pull_request) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Successful in 1m26s
44e7d4b63a
bot-backend merged commit 98a1944a86 into main 2026-08-31 09:26:29 +00:00
bot-backend deleted branch fix/mera-honest-coverage-number 2026-08-31 09:26:30 +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#3295
No description provided.