WEB-503 · Задача · — · web
P0 [биллинг/оценщик]: занижение резерва на gpt-5.4-nano (doc_ner) закрывает платный контур ВСЕМ — estimator breach settled 1418 > reserved 168 микро-USD
Закрыт
P0 · горит
ведёт: —
Починено в
l115c 1ad52e16b784d3ae80a148fddae4d5a3ab4a89c4
Лента
2026-09-03T17:53:18.693Z · coordinatorP0 сдан: коммит 9345de0c «fix doc ner estimator breach containment» (после инцидента 13:07:37Z, когда заниженный резерв 168 против фактических 1418 микро-USD закрыл платный контур ВСЕМ, включая телефонию). Приёмка = волна 1584-accpaidgate на A1: проверяют покрытие резерва на многооконном извлечении, соразмерность реакции (одно превышение на копейку не должно гасить глобальный гейт), автовосстановление без оператора и то, что fail-closed при настоящей порче учёта не сломан.
2026-09-03T19:23:21.135Z · coordinatorПриёмка 1584 = NO-GO. Требуется: привести оба изменённых legacy-теста к нулю диагностик scoped tsc и закоммитить конфиг, включающий ВСЕ изменённые файлы. Круг 2 = волна 1594-paidgate2 на A1 (вместе с WEB-467, у них четыре пересекающихся billing-файла — сажаться будут совместно).
2026-09-03T22:36:19.655Z · coordinatorКруг 2 сдан: совместный коммит e4d8fdbe (линии 5a27c212 и 684737ee), база l96 98a23c70. Приёмка = волна 1606-accpaidgate3 на A1, НЕЗАВИСИМАЯ: отчёт автора называет себя «acceptance report» и ставит себе GO — это не приёмка. Проверяется: резерв покрывает многооконное извлечение на размерах документа owner-а, одно превышение на 1.25 микро-доллара больше не закрывает глобальный гейт всем, автовосстановление без оператора, и что настоящая порча учёта ПО-ПРЕЖНЕМУ закрывает гейт.
2026-09-03T22:59:33.079Z · coordinatorПриёмка 1606 = GO для e4d8fdbe (joint head двух линий). Доказано на owner-масштабе: 4 окна извлечения, operationMaxAttempts=4 на каждом, reservedMicros=3235 против settledMicros=1418 — резерв покрывает факт с запасом, боевой сценарий 1101 слова и 28 чанков. Порог и scope реакции проверены. Посадка: волна 1613 (l98merge) на A1, cherry-pick 98a23c70..e4d8fdbe на прод l97 9d69d2a0.
2026-09-04T00:09:42.379Z · coordinatorСлияние в l98 выполнено: коммит b6c1fc24 (клон волны /home/wave/waves/nc-l98merge-1613, вынут бандлом в /home/ubuntu/nc как l98-line). Гейт свидетельств активации: ok=true, rowCount=86, entrypointCount=26, uncoveredPaidFiles пусто. Посадку выполняет координатор.
2026-09-04T04:47:35.924Z · coordinator🔴 ПРЕДУПРЕЖДЕНИЕ ОБ ОТКАТЕ — линия docner (круги 7–9) НЕ безопасна для отката выпуска, пока не сядет круг 9.
Состояние линии. Круг 8 (b8f4d3c0) перенесён на l97 и по существу чинит главный денежный дефект: при пустом извлечении пишется новое терминальное состояние SETTLED_ZERO, деньги владельца не списываются, фактический расход провайдера сохраняется. Независимая приёмка 1668 это подтвердила своими прогонами на настоящем PostgreSQL и своей таблицей исходов: success → SETTLED_ACTUAL×3 и APPLIED×3; сценарий на 1101 слове три окна → то же; provider_empty → SETTLED_ZERO×2 и APPLIED×2; provider_error → SETTLED_MAX и APPLIED.
Причина «0 entities / 0 spans» на документе в 1101 слово установлена и воспроизведена в круге 7: durable attempt ceiling 3 против 2 в сочетании с all-or-nothing persistence после цикла окон. Это дефект персистентности, а не модель и не порог.
ПОЧЕМУ ОТКАТ ОПАСЕН. Приёмка 1668 дала VERDICT=NO-GO с измерением: rollbackSafe=false, ROLLBACK_TEST_EXIT=1, формулировка проверки «rollback app must not reopen a terminal operation». Старый набор TERMINAL_STATES не содержит SETTLED_ZERO, поэтому readOperationStatus() возвращает settled=false для уже терминальной операции. Практический смысл: если после посадки этой линии откатить приложение на предыдущий выпуск, старый код увидит закрытую операцию как незакрытую и может открыть её заново — с риском повторного списания. Отдельно: DOCNER7_SETTLED_ZERO_CONTRACT_ATTESTED присутствует только в JSON-манифесте, код его не читает, то есть аттестация контракта ничего не гарантирует.
Два других блокера той же приёмки: красный scoped TypeScript gate и добавленные тихие catch (прямой запрет правила 10).
ЧТО ЭТО ЗНАЧИТ ДЛЯ ВЫПУСКОВ. Линия docner НЕ входит в текущий прод: на проде l100 (6e9b2046), в нём только правка бота и генератор манифеста, миграции docner там нет. Сажать docner можно только после круга 9 (волна 1676), который обязан сделать новое состояние терминальным и для старого приложения. До тех пор считать линию непригодной к посадке, а при любой аварийной посадке — не откатывать приложение назад без проверки состояний операций.
2026-09-06T07:35:58.229Z · coordinator[06.09 07:35Z координатор] [2026-09-06T07:35Z координатор] Проверка на проде l113c: ENABLE_DOC_NER=1 (NER включён), ESTIMATOR_BREACH в журналах nc-a1/nc-a1-b/indexing за 24 ч = 0. Оценщик voice_tool_prepass (afb1ec5c) и идемпотентность epoch (3a382a0e) на проде с l113/l113b. Статус → review; закрыть как done после 48 ч без breach (следующая проверка 07.09 ~08:00Z). Ранбук при рецидиве: [[paid-gate-closed-by-settlement-failed-outbox-row]] — resolveBacklogEntry + spend-reconcile.
2026-09-10T18:55:03.518Z · coordinatorBOARD-WASH-20260910:WAVE-3332
По поручению владельца 18:43Z назначена исполнительская волна 3332 (billing), Codex gpt-5.6-luna xhigh, A1. Полная история карточки и база l115c 1ad52e16b доставлены, brief-guard и проверка Git-базы пройдены. Задача: проверить существующую сдачу, устранить остатки, передать бандл и доказательства. Финальная приёмка и посадка остаются за координатором. Запуск группы подтверждён в журнале диспетчера.
КАРТА ДОКУМЕНТОВ: ноут /Users/annakorin/nc-ops-scripts/board-wash-20260910/3332-wash-billing-brief.md; A1 /home/wave/waves/inputs/board-wash-20260910/billing-tickets.json; ожидаемый отчёт /home/wave/waves/3332WASHBILLING-REPORT.md. Правила обогащения: WEB-449.
2026-09-10T18:55:03.884Z · coordinatorWEB503-48H-CLOSURE-20260910
Выполнен просроченный закрывающий контроль из комментария 06.09. За последние 48 часов в журналах nc-a1/nc-a1-b/indexing/extraction совпадений ESTIMATOR_BREACH/estimator_breach/ACCOUNTING_CORRUPTION: 0. В этом же интервале 1461 строка с NER и 364 с entities; журнал охватывает начало окна 08.09 18:50Z. Наличие фактической нагрузки и работу NER нельзя вывести только из HTTP 200, поэтому журнал проверен отдельно. Ранее независимая приёмка 1606 дала GO: 4 окна, reserved 3235 > settled 1418. В текущей линии l115c подтверждены предки afb1ec5c и 02812b90e (реальный SHA epoch-fix; старый короткий 3a382a0e в репозитории отсутствует). После посадки l115c paidReady=true/enforce_ready и чат 200. Условие закрытия «48 ч без breach» выполнено, статус done. Откат/новые расхождения по связанным задачам не объявляются закрытыми.
2026-09-10T19:29:07.376Z · coordinatorRECEIVED-3332-BILLING:WEB-503:884e072b
Координатор получил и полностью прочитал отчёт 3332. Бандл сохранён локально; SHA256 162bd24a65df39a2f2e008bef0a93c2c11203103b1328cb8938254bc7fc6992f совпал, git bundle verify PASS, HEAD 884e072b88b1c5f942079a3410f67ce939faf5b9, BASE l115c. Ожидаемый DONE отсутствует; это не потеря отчёта/бандла.
Новый код только по WEB-439, частичная миграция. По отчёту native tests 5/5; production-door test и scoped tsc не завершились. Независимая приёмка и посадка НЕ выполнены. Существующие статусы сохраняются; рекомендация исполнителя не отменяет более свежие доказательства координатора (в частности, закрытие WEB-503).
Отчёт: /home/wave/waves/3332WASHBILLING-REPORT.md
Бандл: /home/wave/waves/3332WASHBILLING.bundle
Локальная копия: /Users/annakorin/nc-ops-scripts/board-wash-20260910/
### ДЛЯ ТИКЕТА WEB-503
- `2026-09-03 13:10Z`: created for the doc_ner estimator breach where
`settled=1418` exceeded `reserved=168` micro-USD and the old global reaction
closed paid traffic for unrelated users.
- Initial circle 1 (`9345de0c`) was NO-GO at acceptance 1584 because its two
legacy tests and scoped type config were incomplete. Circle 2 joint commit
`e4d8fdbe` was independently accepted at 1606: four extraction windows,
`operationMaxAttempts=4`, reserve 3235 vs settled 1418, scoped breach policy,
auto-recovery and true-corruption fail-closed were proven.
- l98 merge `b6c1fc24` recorded activation coverage `rowCount=86`,
`entrypointCount=26`, `uncoveredPaidFiles=[]`. A later warning noted that
rollback before circle 9 was unsafe because `SETTLED_ZERO` for empty
extraction needed to be understood by the old app; current source includes
the empty-extraction handling.
- `2026-09-06 07:35Z`: coordinator recorded l113c with `ENABLE_DOC_NER=1`
and 24h `ESTIMATOR_BREACH=0`, while explicitly leaving status `review` until
48h evidence. That runtime claim is not re-used as this wave's acceptance.
- Current BASE source facts: `estimatorBreachPolicy.ts` applies absolute/relative
tolerance and repeated scoped escalation; `autoTagService.ts` uses four
bounded windows and operation attempt limits; `documentEntityIngestRuntime.ts`
preserves the bounded operation; `1d944bc33` handles empty extraction; and
`src/lib/intelligence/__tests__/estimatorBreach.realpath.test.ts` covers the
1101-word/28-chunk path. The independent PG proof is
`tests/acceptance/web503-reserve.real-postgres.test.ts` from `bceb19edd`.
- **Критерии → факты → остаток:** current source and focused proof artifacts
are present; this executor did not touch them and did not claim 48h live
stability. Coordinator must check current l115c flag/journals and independent
acceptance before moving from `review`.
Воркер
не проверен
3332-wash-billing
A1
движение в панели: неизвестно
Подключиться и смотреть/перехватить руками. Колесо мыши листает; клавишами — Ctrl-b затем [, выход из прокрутки q. Отсоединиться — Ctrl-b затем d:
Прочитать историю панели без подключения — листается и ищется (/ поиск, q выход), воркеру не помешает:
Обновлён
2026-09-10T18:55:03.886Z