Мотивация (замер по истории проекта)
Гонки/локи/lease — 18 фиксов за 4 месяца, самый дорогой класс багов: дизайн-уровень, линтером не ловится, сейчас единственная защита — dual-review (причём Codex стабильно ловит глубже: #1188 use-after-disconnect в pool, #1189 race-окно в acquire-пути / late reservation, #1145 TOCTOU phone+session из разных await). Каждый такой баг находится только на ревью или в проде — направленных тестов на конкурентность нет.
Что сделать
- Направленный конкурентный стресс-гарнесс для ClientPool/lease и DB write-lock:
- Контракт lease lifecycle: зафиксировать инварианты (кто владеет клиентом между await-точками; что запрещено после disconnect; когда phone и session обязаны читаться атомарно) в докстрингах pool/lease + контракт-тест, чтобы новые правки сверялись с контрактом, а не с интуицией.
- Закрепить процесс в CLAUDE.md: pool/lease/security PR → обязательно оба ревьюера (Claude + Codex); при расхождении вердиктов — своя сверка, верить более глубокому.
Ограничения
- Тесты fake/harness-first, без реального Telegram (политика real-TG не меняется).
- Гарнесс не должен быть флейковым под
-n auto: детерминированные барьеры вместо sleep-таймингов.
Verification
- Каждый регресс-гард мутационно проверен (красный на до-фиксном коде).
- Полный прогон (parallel + serial) зелёный, без новых флейков.
- Контракт-тест lease lifecycle существует и падает при нарушении инварианта.
Связано
Мотивация (замер по истории проекта)
Гонки/локи/lease — 18 фиксов за 4 месяца, самый дорогой класс багов: дизайн-уровень, линтером не ловится, сейчас единственная защита — dual-review (причём Codex стабильно ловит глубже: #1188 use-after-disconnect в pool, #1189 race-окно в acquire-пути / late reservation, #1145 TOCTOU phone+session из разных await). Каждый такой баг находится только на ревью или в проде — направленных тестов на конкурентность нет.
Что сделать
asyncio.gatherс барьерами (asyncio.Event/asyncio.Barrier) на критических путях: acquire/release lease, disconnect во время использования, ротация flood_wait, параллельные записи черезdb.transaction()/execute_write.Ограничения
-n auto: детерминированные барьеры вместо sleep-таймингов.Verification
Связано