Commit Graph

1 Commits

Author SHA1 Message Date
Дмитрий 050e271d51 feat(slepok): Task 2.6 — RouteSupplierLeadJob snapshot lock + is_active recheck (R-04/R-06/R-09)
createDealCopyForProject теперь:
1. После lockForUpdate(Project) проверяет live is_active — если paused между
   matchEligibleProjects и handle, return false (не доставляем под lock).
2. Читает snapshot.daily_limit под lockForUpdate(snapshot row) за активную
   дату слепка (до 21:00 МСК = today, после = today+1). delivered_today
   сравнивается с snapshot.daily_limit, не с live daily_limit_target.
3. После $project->increment('delivered_today') атомарно инкрементит
   snapshot.delivered_count — для CSV business-drift reconcile.

Closes R-04 (auto-pause каскад прерывается под lock'ом), R-06 (уменьшение
лимита после слепка не блокирует уже-зафиксированный поток), R-09 (race
recheck under lockForUpdate).

Plan: docs/superpowers/plans/2026-05-26-slepok-routing-protection.md §Task 2.6
Spec: docs/superpowers/specs/2026-05-26-slepok-routing-protection-design.md §4.2.4

Tests added:
- tests/Feature/Jobs/RouteSupplierLeadJobSnapshotTest.php (2 tests, GREEN locally).

Combined Task 2.5+2.6 targeted regression: 52/52 GREEN.
2026-05-28 06:32:55 +03:00