refactor(render): этап 2 — футер merged-групп из настоящего Message (#29) #38
Reference in New Issue
Block a user
Delete Branch "refactor/render-stage2-footer"
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
Этап 2/6 (#34, closes #29): футер merged-групп рендерится прямо из настоящего Message; удалён обратный ход dict→мок-Message (
processed_message_to_tg_message, −84 строки). База — main (этапы 0+1 уже там).§3
Оракул-дисциплина
Golden обновлён строго по §3 (проверял независимо): net-теги — только span +2 (§3.6 сплит custom-реакции); reorder флагов ТОЛЬКО на merged-постах (§3.8); ведущий разделитель снят на одиночном poll-посте (§3.15). §3.7 в UTC-голдене не виден. Ничего незаявленного.
How verified
Полный
pytest tests/— 353 passed (+6). Оракул этапа 0 — 11 passed, детерминирован на PYTHONHASHSEED 0/1/42 (нормализатор сортировки убран → проверял, что порядок реально стабилен без него). Env (kurigram 2.2.23) — ок.Стекнутость: базой стоит main (этап 2 не зависит от неслитых веток). Следующие этапы (3/4/5/6) пойдут стеком на этот, мержить по порядку.
🤖 Авто-ревью · #38 (refactor(render): этап 2 — футер merged-групп из настоящего Message, #29), голова
d8af0aebВердикт: PASS ✅ (review/approved). Образцовый этап 2/6: каждое изменение golden объяснено §3-реестром, ноль потери контента, удаление reverse-mock (
processed_message_to_tg_message, −84) доказуемо эквивалентно (и даже строго ЛУЧШЕ — совпадает с рендером одиночного поста). Веер 9 аспектов — ни одного Do/ESCALATE.Проверено (реальный прогон, CI-fidelity)
❓ 6→❓ 4+❓ 2(§3.6, сумма сохранена, views/date/id вокруг не тронуты), убран ведущий | разделитель (§3.15), volatilelastBuildDate(стрипается). Ноль потери контента. §3.7 (naive-local дата) в UTC-корпусе невидим — корректно.PYTHONHASHSEED 0/1/42(я) + 123 (субагент). Эмиссия —list(dict.fromkeys(...))(insertion-order, НЕset()); удаление sort-нормализации из оракула делает контракт СТРОЖЕ (реальный реордер теперь дойдёт до byte-сравнения).msg['text']⟺raw.text or raw.caption); §3.6 root-cause подтверждён (старый_extract_reactionsсхлопывал customs в один❓и суммировал →❓ 6; реальный Message даёт span на каждую → теперь СОВПАДАЕТ с одиночным постом); id/views/chat/links резолвятся идентично; None-handling черезgetattr— не может регрессировать vs mock.post['html']→ санитайзится per-post черезsanitize_html(bleach strip=True, этап 1) → враждебный emoji нейтрализуется на границе; плюсreaction.emoji— нормализованный Telegram-глиф, custom → статичный❓, count — int. Defense-in-depth + не-враждебный источник. Инъекции нет. В футере нет forwarded-from/author (только reactions/views/date/id/channel-links).test_3_7_...non_utcпинитEurope/Moscow, naive-дату → ассертит merged==single=="17:21:14" (старый mock показал бы 14:21:14 — сдвиг +3ч;finallyвосстанавливает TZ=UTC, голдены не текут). Плюс §3.6/§3.8/§3.15 тесты. Robustness даже УЛУЧШЕН (реальный Message идёт в тот жеgenerate_html_footer, что одиночный пост в проде; удалённый mock был менее надёжным).pytest tests/— 353 passed. Стек чистый (1 коммит на main-базе).Веер 9 аспектов (3 субагента + conv/simpl/docs/arch напрямую); golden-аудит полный (0 несогласованных изменений, 0 потери контента), removal доказуемо эквивалентен, §3.8-детерминизм проверен на 4 hash-seed'ах, §3.7 non-UTC заперт тестом (golden не ловит). Этап 2/6 эпика #34 — чист, мержибельно.