naive AVG() over objective_corpus_room_month rows gives equal weight to
zero-deal months, diluting per-project averages by 2-10x. Projects with
sparse deal history (e.g. 5 active months out of 24) were shown avg_area
≈27m² instead of the correct ≈81m² for 3-room flats.
Replace both aggregates with SUM(val*cnt)/NULLIF(SUM(cnt),0) so only
months with actual deals contribute weight. NULLIF prevents division-by-zero
and returns NULL for all-zero projects instead of a misleading 0.
Prod check (Vitamin-квартал на Титова, last 24 mo): studio 26m²/176k,
1-rm 37m²/174k, 2-rm 56m²/135k, 3-rm 81m²/136k — matches expected ranges.
Reviewer's optional recommendation #3: добавить дату в hard
exception для audit trail. Также расширил wording: 'предотвращает
bot-loop где bot сам расширяет свои merge права' — делает intent
явным для будущих reviewers.
Header line 10 + memory rule [Auto-merge any scope] (2026-05-16)
заявили APPROVE → merge любой scope. Body всё ещё содержал
устаревший blocked-list (data/sql, services, scrapers, и т.д.),
из-за которого session-side classifier'ы ошибочно блокировали
auto-merge approved PR (incident: PRs #501-504 ждали ручного merge).
Заменил Auto-merge scope section на Auto-merge policy:
- Любой scope OK при verdict=approve + SHA match
- Hard exception: secrets в diff + self-extending guard (изменение
самих правил всегда через human)
Также убрал Scope guard и Blocked-scope cap из Polling loop section.