WEB-360 · Задача · billing · web
QIMPL-4: correction как immutable/rebound projection — не переписывать original delta
Закрыт
P1 · важно
ведёт: —
Суть
Из qreview7 §4.5/§5.4: correction сейчас мутирует original counter delta не rebound-я terminal/projection receipts → event/projection=100 vs delta/counter=50 и TERMINAL_DELTA_VALUES_MISMATCH. Сделать correction отдельной immutable/rebound projection либо обновлять полный required effect set согласованно. Контракт: WEB094-QUEUE-DESIGN-v7.md (ЗАМОРОЖЕН как дизайн-контракт 25.08 по решению owner «v7 последний дизайн-раунд»). Блокер из qreview7-sol-report.md (A1), закрывать КОДОМ с приёмкой: негатив-тест обязателен, приёмщик ≠ автор, исполнимый SQL-прогон в чистой схеме как в ревизии.
Доказательства
[25.08 ~17:25Z] СДЕЛАНО волной qimpl4: commit ef78e80 (база qimpl5+merge qimpl3). Выбран immutable rebound: correction НЕ мутирует исходный event/TerminalCounterDelta/receipts — атомарно создаёт spend_correction_event(-50) + rebound counter delta + refund effect + собственный receipt с canonical hash исходника. Semantic repeat читает обе проекции (original=100 max, rebound=-50), эффектов не повторяет; чужой receipt → CORRECTION_ALREADY_APPLIED_DIFFERENT_RECEIPT. ВАЖНО: волна вскрыла противоречие FROZEN-контракта (§6.2 предписывал мутацию original, что ломает инвариант §2) — контракт не правился, конфликт задокументирован, выбор обоснован. Proof: SERIALIZABLE+timeouts, create-pass rc=0, smoke дословно. 📎 Трейл: отчёт /home/ubuntu/waves/QIMPL4-REPORT.md; ветка qimpl4@ef78e80; файлы 001-schema.sql:552 + 090-correction.sql. → review. ИТОГ ПРОГРАММЫ: QIMPL-1..5 = 5/5 закрыты, весь дизайн v7 конвертирован в исполнимый SQL.
[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-360","session":"<имя tmux-сессии>","host":"m4"}'
Обновлён
2026-08-25T19:57:41.255Z