WEB board

всеканоны и докиворкеры↗ iOS↗ Легаси
WEB-334 · Дефект · — · web

Ручной текстовый источник не добавляется: document-processing вход не обёрнут в runWithBillingRequestContext → request_identity_missing

Закрыт P1 · важно ведёт: fable-coordinator
Суть
# «Джерело не додано»: обработка ручного источника отвергается биллинг-гардом

## 2026-08-23 22:40 UTC — owner-репро + диагноз (координатор)
Owner (v4-b21dea6a0): вписал текст источника вручную → «Джерело не додано: This request could not be given a stable identity, so it was refused to protect against duplicate charges» (скрин). Журнал Pi 14:28: [billing][request_identity_missing] note='no request-scoped identity: wrap the entry point in runWithBillingRequestContext()' → VendorCallRejectedError в «Error processing document» (×3 попытки owner).
ДИАГНОЗ: entry point обработки документа (ingest/индексация ручного текста — платный вендор-вызов: эмбеддинги) НЕ обёрнут в runWithBillingRequestContext(), в отличие от chat-путей. Гард (линия WEB-308) корректно fail-closed. Вероятно ЛАТЕНТНО с включения enforce (не регресс 34) — owner впервые добавил ручной источник; проверить историю по журналу при фиксе.
ФИКС: обернуть входы document-processing (route + воркер очереди индексации) в runWithBillingRequestContext с детерминированной идентичностью (sourceId+contentHash), НЕГАТИВ: повторная отправка того же текста не создаёт второго списания (идемпотентность — ради неё гард и существует); вход без идентичности обязан отказывать как сейчас.
Связки: [[WEB-308]] (spend-enforcement), [[WEB-322]] (admission), [[WEB-320]].


## 2026-08-23 23:55 UTC — расширение скоупа: в PDF-прогоне owner «Ваші документи — завершився помилкою» — приватный документный поиск, вероятно, падает на том же необёрнутом биллинг-входе (эмбеддинг запроса). Волне web334: включить этот путь в карту и негативы.


## 2026-08-24 00:40 UTC — ФИКС ГОТОВ (web334, коммит b70738e78)
Хелпер entrypointContext: identity = document-processing:<sourceId>:<sha256(content)>, БЕЗ fallback (нет данных → null → gateway остаётся fail-closed). Обёрнуты ВСЕ 5 границ: server action processDocument (paste/manual/voice/URL/upload), core для HTTP/integration, runtime boundary (worker/CLI), очередь индексации (durable_job), cloud video finalizer. Вложенный доверенный контекст сохраняется. БОНУС: аудит-таблица ДРУГИХ платных входов без обёртки — фоллоу-ап список в отчёте (создать тикет после посадки). Патч спасён (ed7064b0…). Кандидат посадки 35 (закроет «Джерело не додано» и «Ваші документи — завершився помилкою»).


## 2026-08-24 02:55 UTC — 🎉 ЗАДЕПЛОЕНО: посадка 35 (v4-8a29afa79, 1-я попытка, ПЯТАЯ за день)
7 грузов; prisma migrate deploy ДО флипа (применены 3 additive: web094 + догнавшие web097/web300); пин-гейт 7/7 с НОВЫМ SPEND_MIGRATION_SET_SHA256=ae1bf466…; paidReady=true; канон проштампован. ЖИВОЙ ПРУФ ГОЛОС-ЗАБОРА: GET /api/realtime unauth → 401 (был 404), /api/telephony → 404 (закрыт как задумано).


## 2026-08-24 04:45 UTC — ✅ OWNER ПОДТВЕРДИЛ живьём: «создать документ из окна импорта — получилось». ЗАКРЫТ.


## 2026-08-23 PDFPOSTQA: NEEDS-PAID — manual-source submission enters processing; not submitted.

PDFPOSTQA: бесплатные сценарии только; новые paid generation/export/import не запускались. Полный реестр и evidence: /Users/milamarty/work/PDFPOSTQA-REPORT.md; screenshots: /Users/milamarty/work/PDFPOSTQA-SHOTS/.
Воркер
не привязан — привязать: curl -X POST https://bugs.wool2.online/api/web/assign -H 'content-type: application/json' \ -d '{"issueId":"WEB-334","session":"<имя tmux-сессии>","host":"m4"}'
Обновлён
2026-08-23T17:35:57.231Z