WEB-359 · Задача · billing · web
QIMPL-3: USER settlement атомарно освобождает reservedBalanceMicros с exact read-back
Закрыт
P1 · важно
ведёт: —
Суть
Из qreview7 §4.4/§5.3: settled hold оставляет reservedBalanceMicros занятым (happy-path!); освобождать атомарно с before/after/effect read-back; repeat доказывает settled hold + released cache без сравнения mutable cash snapshot. Контракт: WEB094-QUEUE-DESIGN-v7.md (ЗАМОРОЖЕН как дизайн-контракт 25.08 по решению owner «v7 последний дизайн-раунд»). Блокер из qreview7-sol-report.md (A1), закрывать КОДОМ с приёмкой: негатив-тест обязателен, приёмщик ≠ автор, исполнимый SQL-прогон в чистой схеме как в ревизии.
Доказательства
[25.08 ~17:35Z] СДЕЛАНО волной qimpl3: commit d7156aa (от qimpl2). Только 080-projection.sql: USER immutable_ledger ветка в одной транзакции — FOR UPDATE на UserBalance, released ровно на reservedMicros, exact before/released/after read-back (after=before-released), hold=settled, immutable receipt в queue_projection_effect.source_readback (effect_hash=md5). Repeat сверяет settled hold + обе дельты + receipt БЕЗ чтения mutable cash snapshot (закрыт блокер qreview7 §4.4: hold=settled при reservedBalanceMicros=100). t3/fence не тронуты (t3_unchanged_rc=0). Proof в изолированной throwaway-БД. → review.
📎 Трейл: отчёт /home/ubuntu/waves/QIMPL3-REPORT.md; ветка qimpl3@d7156aa. Файл: prisma/queue-v7/080-projection.sql (коммент QIMPL-3).
[2026-08-25 19:11Z] Независимая приёмка запущена: волна accqimpl на A1 (sol xhigh, приёмщик≠автор), worktree от прод-коммита a453b16; обязательны негативные тесты новых классов; для не-влитых тикетов волна установит факт NOT-LANDED. Бриф /home/ubuntu/waves/accqimpl-brief.md, отчёт будет в ACCQIMPL-REPORT.md.
[2026-08-25 20:05Z] ПРИНЯТО (accqimpl, приёмщик≠автор, одноразовый Postgres, новые негатив-классы: гонка двух job за reservation / underflow-откат / повторный late receipt / повреждённый committed slot). GO → done. Отчёт A1:ACCQIMPL-REPORT.md.
Починено в
a453b16
Воркер
не привязан — привязать:
curl -X POST https://bugs.wool2.online/api/web/assign -H 'content-type: application/json' \
-d '{"issueId":"WEB-359","session":"<имя tmux-сессии>","host":"m4"}'
Обновлён
2026-08-25T19:57:41.191Z