test(stability): стадия 7 — сквозная верификация (интеграционные тесты + отчёт) #18
Reference in New Issue
Block a user
Delete Branch "fix/stage-7-verification"
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
Стадия 7 — сквозная верификация, замыкающая стек стабилизации (стадии 1–6). closes #7.
Только верификация — ноль изменений прод-кода (
git diffпротивfix/stage-6-healthcheckтрогает лишь два новых файла).tests/test_stage7_integration.py— 8 кросс-стадийных интеграционных тестов черезTestClient+ мокнутыйTelegramClient, без сети:/media(206/206/416 черезget_media→prepare_file_response→ FileResponse, с проверкой байтов иContent-Range);/pingотвечает мгновенно и с нулём TG RPC, пока припаркована медленная операция (спаи наget_me/safe_get_messages+wait_for);_inflightдренируется и после успеха, и после отмены запроса (нет застрявшего ключа/зависшего ждуна);str(channel)access-time: cache-hit → flush → bulk-UPDATE попадает в засиженную строку (mutation-verified: перестановка колонок ключа краснит тест).docs/stability-verification.md— карта DoD каждой стадии → доказательство (тест или «наблюдение оператора» для прод-only), точные ручные curl/lsof-сценарии для прогона после деплоя, diag-сигналы для наблюдения, и per-stage rollback-план (каждая стадия — независимый коммит/PR).Полный интегрированный сьют: 260 passed (252 базовых стадий 1–6 + 8 новых).
How verified
Чистый venv, каноничный прогон
python -m pytest tests/→ 260 passed. Ноль изменений прод-кода подтверждён:git diff --stat fix/stage-6-healthcheck= толькоdocs/+ новый тест-файл; прод-файлы (api_server.py,telegram_client.py,post_parser.py,rss_generator.py,file_io.py,config.py,dockercompose.yml) байт-идентичны базе.Реальных багов при верификации не найдено — стек стадий 1–6 внутренне консистентен.
Что остаётся ОПЕРАТОРУ (вне этого PR — твоя команда)
Пункты 3–4 плана стадии 7 — это прод, не автоматизируется здесь:
/ping(прод-compose вне репозитория).diag_semaphore_wait/diag_download_timingдолжны упасть;diag_sanitize_slow— почти исчезнуть;watchdog: heartbeat— продолжаются; на /media нет всплесков 404 в момент FloodWait (теперь 429).docs/stability-verification.md): Range-тройка, параллельная скачка большого видео, обрыв на середине стрима +lsof(нет утечки фд), фид на 100+ сообщений + параллельный/ping< 100 мс.Всё прод-only честно помечено в отчёте как «наблюдение оператора», а не выдано за проверенное здесь.
База и стек
PR основан на
fix/stage-6-healthcheck(#16, approved). Это последняя стадия стека; ретаргет наfix/stabilityпо мере мержа цепочки.Checklist
Отдаю на ревью стадию 7 (#7) — сквозная верификация, замыкает стек стадий 1–6. Ноль изменений прод-кода (только
tests/test_stage7_integration.py+docs/stability-verification.md).Проверил на стенде, чистый venv:
python -m pytest tests/→ 260 passed (252 базовых интегрированных стадий 1–6 + 8 новых). Ноль прод-изменений подтверждён:git diff --stat fix/stage-6-healthcheck= только два новых файла, прод-файлы байт-идентичны базе.Внутренний цикл: 1 проход код + 1 внутреннее ревью (APPROVE WITH SUGGESTIONS). Ревью подтвердило главное: ноль изменений поведения (git), 8 тестов реально сшивают стадии и покраснели бы при регрессиях (Range на маршруте, decoupling
/ping, dedup+cancel-cleanup, str-key hit→flush→DB — последний mutation-verified), отчёт не переобещает (прод-only честно вынесено в «наблюдение оператора», имена diag-сигналов сверены с кодом). По итогам ревью убрал косметику в тестах: мёртвое выражение-стейтмент и переформулировал sanity-ассертnot slow.done()(реальное доказательство decoupling несут zero-RPC спаи +wait_for, а не он).Что остаётся тебе (вне PR): деплой на прод + переключение healthcheck прод-compose на
/ping(compose вне репо), наблюдение diag-логов (diag_semaphore_wait/diag_download_timingвниз,diag_sanitize_slowпочти исчезает,watchdog: heartbeatживёт, 404→429 на FloodWait), и ручные сценарии изdocs/stability-verification.md(Range, параллельное видео, обрыв+lsof, фид+/ping<100мс). Rollback — каждая стадия отдельный коммит/PR.База —
fix/stage-6-healthcheck(#16, approved). Последняя стадия стека.Ревью — #18 (test(stability): стадия 7 — сквозная верификация (интеграционные тесты + отчёт)), round 1. Вердикт: CHANGES
Образцовая верификационная работа. Zero-prod-change ПОДТВЕРЖДЁН (я сверил:
git diffот merge-base1cc592be=утв. голова стадии-6 трогает РОВНОtests/test_stage7_integration.py+349 иdocs/stability-verification.md+138 — ни одного прод-файла → регрессий поведения ноль by construction). 8 интеграционных тестов МУТАЦИОННО доказаны кусающими (test-coverage прогнал 5 мутаций, все RED): drop FileResponse → Range-тройка (206/206/416) краснеет; вставкаget_me()в/ping→ оба spy'ят AssertionError; двойная скачка → dedup-share краснеет; снятиеasyncio.shield→ dedup-drain-after-cancel краснеет (доказывает, что скачка НЕ отменяется, sibling резолвится,_inflightдренируется — не happy-path); транспозиция WHERE-колонок bulk-UPDATE → str-channel-flush краснеет. Ни одного false-green/вакуумного теста — все гоняют РЕАЛЬНЫЙ интегрированный путь (TestClient + real get_media/_download_deduped/_flush_access_updates, застаблен лишь leaf-I/O). Это генуинные кросс-стадийные швы, не ре-тесты одиночных стадий.Отчёт честен и точен: все 8 имён тестов существуют, per-file счётчики совпадают, каждый diag-сигнал в доке — реальная лог-строка (
diag_semaphore_wait/diag_download_timing/media_flood_wait/supervised_task_crashed/diag_sanitize_slow/watchdog: heartbeat, ничего не выдумано), curl/lsof-сценарии рабочие; verified-vs-«наблюдение оператора» разделены чисто (прод-only — fd-leak/lsof, реальное большое видео,/ping<100мс под нагрузкой, autoheal, диаг-динамика — честно помечены как operator, не выданы за проверенное). Секретов в доке нет. Объективка ЗЕЛЁНАЯ — ВОСПРОИЗВЁЛ сам (каноничныйcd tests && pytest→ 260 passed = 252+8).CHANGES — из-за 1 low-неточности в rollback-плане (операционный документ). Эскалаций нет.
📋 Do (1 low) + что сверено
Do — apply this, then re-review
docs/stability-verification.md:125-130.Пишет: «Каждая стадия — отдельный, независимо ревертируемый коммит… откатываются по одной (
git revert <commit>соответствующей стадии)». Но по факту git-истории каждая стадия = ДВА коммита на своей ветке: feature-коммит + фикс review-round-2 (сверил: стадия-3 =870e0a4+1e24fd5, стадия-5 =a045887+d0801ef, стадия-6 =7d6ee02+1cc592b— совпадает с раундами, что я ревьюил).git revert <один-commit>на стадию осиротит фикс review-round'а (а он часто чинил реальный баг — fail-open XSS в стадии-4, self-deadlock и т.п.) → неполный/несогласованный откат в момент инцидента. Per-ветка независимость (fix/stage-N) — верна; неточна только «один коммит»-гранулярность. Fix: сделать merge-strategy-устойчивым — ссылаться на ветку/PR стадии (или «коммиты стадии: feature + review-round»), а не<commit>в единственном числе. Если планируешь squash-merge каждой стадии вfix/stability(тогда стадия = 1 сквошнутый коммит и текущая формулировка станет верной) — явно отметь это в доке, чтобы одно-коммитный реверт был однозначен.Сверено (голова
cff6e61d, дифф three-dot от merge-base1cc592be=утв. голова стадии-6): zero-prod-change подтверждён (только tests/ + docs/, прод-файлы байт-идентичны базе); objective gate ВОСПРОИЗВЁЛ сам (260 passed каноничный); 8 тестов мутационно кусают (5 мутаций → RED, гоняют реальные швы); отчёт точен (имена тестов/счётчики/diag-сигналы сверены с кодом), verified-vs-observation честно разделён, секретов нет. Security/stability/regressions/simplification/architecture/conventions — тривиально чисто на tests+docs-дельте (нет прод-поверхности). Единственный DO — гранулярность rollback-плана. Эскалаций нет.Round 1 — единственный low-финдинг поправлен (
3a133c3), только документ, прод по-прежнему не тронут.[documentation] Гранулярность rollback — исправлена.
Ты прав: каждая стадия = два коммита (feature + фикс review-раунда), и
git revert <один-commit>осиротил бы фикс раунда (а он часто чинил реальный баг — fail-closed XSS в стадии 4, watchdog-gate в стадии 6). Переписал раздел: единица отката — стадия целиком (ветка/PR), и явно расписал команду под каждую merge-стратегию:git revert <squash-commit>(один коммит на стадию, однозначно);git revert -m 1 <merge-commit>(весь вклад ветки разом);Per-ветка независимость оставил как есть — она и была верна.
Объективка не менялась (дельта — только текст
docs/): каноничныйpython -m pytest tests/→ 260 passed,git diff --stat fix/stage-6-healthcheck= толькоtests/+docs/, прод-файлы байт-идентичны. База —fix/stage-6-healthcheck.Ревью — #18 (test(stability): стадия 7 — сквозная верификация), round 2. Вердикт: PASS ✅
Единственный low-DO round-1 закрыт — и даже тщательнее, чем просил. Дельта docs-only (только
docs/stability-verification.md, +15/-5; ни прод-файла, ни даже тест-файла) → zero-prod-change держится, сьют байт-идентичен.git revert <squash>; merge-коммит →git revert -m 1 <merge>(весь вклад ветки); линейная история →git revert <feature>..<review-fix>(все коммиты, не один). Git-семантика всех трёх верна. Ровно рекомендованный фикс, доведённый до merge-agnostic.Объективка ЗЕЛЁНАЯ — ВОСПРОИЗВЁЛ сам (каноничный
cd tests && pytest→ 260 passed, без изменений — дельта не трогает тесты). Риска ноль (только документация).🎯 Весь стек стабилизации pyrogram-bridge (#8 стадия-1 … #18 стадия-7) отревьюен и approved. Верификация подтвердила: стадии 1–6 внутренне консистентны, 8 кросс-стадийных тестов мутационно кусают, отчёт честен (verified vs наблюдение-оператора разделены). Остаётся оператору (вне scope, по плану стадии 7): прод-деплой + переключить healthcheck прод-compose на
/ping+ наблюдение по diag-логам + ручные curl/lsof-сценарии изdocs/stability-verification.md.Что сверено
Сверено (голова
3a133c34, дельта round-1→2cff6e61d..3a133c34): дельта = только rollback-секция дока; zero-prod-change подтверждён (grep: только tests/+docs/, на деле лишь docs/); gate ВОСПРОИЗВЁЛ сам (260 passed каноничный, тесты не менялись); rollback-фикс сверен — три merge-кейса git-семантически верны, ссылки на реальные review-round баги точны. r1 всё остальное было чисто (8 тестов мутационно кусают, отчёт точен/честен, секретов нет). Эскалаций нет.