WEB-465 · Дефект · — · web
P3 [индексация/spend]: повтор уже оплаченного вызова (duplicate_terminal) без сохранённого результата — источник навсегда «failed»
Закрыт
P3
ведёт: —
Суть
02.09 после WEB-461: первый embeddings-вызов воркера для источника cmrts7ntw (war-and-peace.txt №4) был оплачен (op_182f6b1d, SETTLED_ACTUAL, 457 micro-USD), но результат не сохранился (транзакция проекции откатилась). Повторная индексация того же источника → VendorCallRejectedError duplicate_terminal («This request was already completed»), потому что operationId детерминирован от источника/контента. Итог: источник нельзя проиндексировать без ручного вмешательства. Нужно: (а) при duplicate_terminal отдавать replay-квитанцию с результатом, если он сохранён, либо (б) в воркере при duplicate_terminal делать новый operationId (attempt-суффикс) с явным маркером повторной оплаты, либо (в) операторский путь «bump contentRevision». Источник запаркован (poisoned, reason ссылается сюда). Связано: WEB-461, WEB-438.
Лента
2026-09-02T09:55:26.180Z · Fable[02.09 10:45Z Фабл] Приёмка 1172-accweb465dup: REJECT — scripts/unpoison-source-indexing.ts требует явный source, но не принимает --operator и не пишет audit record; остальное (replay, повтор с attempt+маркер, лимит 2, идемпотентность) ок. Доработка 1185-web465dup2 → ре-приёмка → l90.
2026-09-02T10:07:40.562Z · Fable[02.09 11:15Z Фабл] 1185-web465dup2 сдан (5df4d3ed85): unpoison-source-indexing.ts с обязательными --operator/--reason, dry-run по умолчанию, --apply с audit record; ре-приёмка 1187 (codex, одноразовый PG без sudo) → l90.
2026-09-02T10:32:52.647Z · Fable[02.09 12:15Z Фабл] Ре-приёмка 1187-accweb465dup2: PASS (5df4d3ed85; unpoison с оператором/аудитом, replay без оплаты, ограниченный повтор, идемпотентность двух воркеров, денежные инварианты — на одноразовом PG без sudo). В l90-candidate (A2) вместе с a1f74a0a49; зеркало A1 обновлено. После посадки l90 — снять poison с 30 источников операторской командой и переиндексировать.
2026-09-02T11:03:00.244Z · Fable[A1 11:05Z Фабл] ПОСАЖЕН l90 на A1: commit 26da36faba, артефакт me2-standalone-linux-arm64-26da36fa-20260902T105621Z (sha dffb8a17…), run /home/ubuntu/prod/shared/run/l90-26da36fa, /api/ready TRUE (boot-env: 1 warning), paid true, воркер индексации на l90. Env: убраны BLUEBUBBLES_SERVER_PASSWORD и SOCIAL_ENCRYPTION_KEY_PREVIOUS, добавлен SYNC_PAGINATION_ENABLED=1 (P15 SAFE_NOW). Откат: nc-a1.service.bak-l89 + l89 целы.
2026-09-02T11:22:07.761Z · Fable[A1 11:14 Фабл] Операторский unpoison выполнен на проде l90: scripts/unpoison-source-indexing.ts (--operator fable --reason «WEB-465: unpoison after l90 landing (WEB-333 join fix)» --apply) по 30 источникам (28 retry-limit-exhausted, 2 без причины) — 30 ok / 0 bad, статус poisoned→pending с аудит-записью в metadata.processing.indexing.unpoison. Список id: /home/ubuntu/ops-backups/poisoned-sources-l90-20260902.txt, журнал: /home/ubuntu/ops-backups/unpoison-l90-20260902.log. Итог по Source: pending 33, running 1, done 563. Воркер индексации (таймер nc-a1-indexing, l90) доберёт очередь; повторное отравление = сигнал в WEB-333/WEB-465.
2026-09-02T14:48:42.712Z · Fable[A1 15:00 Фабл] Итог unpoison (30 источников, 11:14 A1) после воркера на l90/l91: Source.done 563 → 591 (+28 проиндексированы штатно), 2 skipped (cmt4e09wp00l…, cmt4e09lo00f… — класс stale-source-content, статус skipped с reason unpoison — ревизия чанков старее текущей, см. WEB-447 инструмент), 2 снова poisoned: cmrts7ntw00a… (source-time-budget-exceeded — тяжёлый источник, бюджет времени индексации) и 178216123951… (retry-limit-exhausted). Итого: join-фикс WEB-333 сработал для 28/30; 2 повторных отравления — предметные (бюджет/ретраи), не регресс — разбор в WEB-447/индексация. Очередь пуста (worker DONE total=0).
2026-09-06T00:24:52.600Z · coordinator[06.09 00:24Z координатор] [2026-09-06T00:24Z координатор] ПРИЁМКА 2130-accidempotencyepoch (A2, luna high): VERDICT=GO на 3a382a0e (база l113 87111a95). Принято: idempotency_conflict = отказ только конкретного запроса, accounting epoch остаётся OPEN, диагностическая строка TokenUsage.operation=idempotency_conflict пишется в той же транзакции; повторная оплата исторической reservation по тому же (operationId, attempt) невозможна. Revive/requeue/retry индексации получают новый durable attemptBase (resumable pause сохраняет base намеренно). Коммит уже в кандидате l113b (02812b90 = l113 + 14), сборка идёт на A2; после посадки — revive PDF cmtkm80jo01u8z8vgj446km1x и big-test 1782161239510l4gl4zzur как проверка на проде. Отчёт: A2 /home/ubuntu/waves/ACCIDEMPOTENCYEPOCH-REPORT.md.
2026-09-06T01:32:34.720Z · coordinator[06.09 01:32Z координатор] [2026-09-06T01:32Z координатор] После посадки l113b выполнен revive обоих источников инструментом WEB-495 (--apply → pending, attempts=0): большой QA PDF cmtkm80jo01u8z8vgj446km1x (сначала снят мой ручной paused) и big-test 1782161239510l4gl4zzur. Итог: ОБА снова failed. Причина по журналу воркера: [billing][billing_guard_operation_budget] attempts=3 limit=2 (channel rag_embeddings, text-embedding-3-small, serviceIdentity source-indexing) → VendorCallRejectedError «This operation reached its retry limit» (meterVendorCallInner → denyOrObserve → reject). Guard бюджета операции считает попытки по operationId (op_<hash>, SpendReservation: по 2 строки/операцию, max attempt 2), а operationId эмбеддингов не включает новый attemptBase источника → revive не может дать «свежую» операцию. Paid gate при этом остался открыт (3a382a0e работает по своей части). → Волна 2149-reviveopbudget поставлена на A2 (luna xhigh, база l113b-candidate 02812b90) с журналом и SQL-фактами в inputs-2149. KNOWN ISSUE: симптом «revive → failed сразу» → проверка journalctl -u nc-a1-indexing | grep operation_budget и SQL SpendReservation по operationId/attempt → причина: идентичность операции без attemptBase → лечение: волна 2149.
2026-09-06T03:04:21.452Z · coordinator[06.09 03:04Z координатор] [2026-09-06T03:04Z координатор] Волна 2149b-reviveopbudget2 (A2, luna xhigh; продолжение спасённой работы после переполнения диска): VERDICT=PASS, commit=75ac1e21 — идентичность операции эмбеддингов включает durable attemptBase (revive = новая операция для guard бюджета), лимит не ослаблен. Независимая приёмка 2164-accreviveopbudget поставлена (sol xhigh). GO → l113c → посадка → revive PDF/big-test на проде как финальная проверка. Отчёт: A2 /home/ubuntu/waves/REVIVEOPBUDGET-REPORT.md.
2026-09-06T03:27:31.635Z · coordinator[06.09 03:27Z координатор] [2026-09-06T03:27Z координатор] ПРИЁМКА 2164-accreviveopbudget (A2, sol xhigh): VERDICT=GO на 75ac1e21 — revive даёт новую операцию для guard, лимит не ослаблен, epoch не закрывается. Cherry-pick в l113c; после посадки — revive PDF cmtkm80jo01u8z8vgj446km1x и big-test на проде как финальная проверка.
2026-09-06T04:04:48.600Z · coordinator[06.09 04:04Z координатор] [2026-09-06T04:04Z координатор] ПОСАЖЕНО: ПРОД = l113c 0390afc9 (03:59Z, без простоя; оба бэкенда ready, paid enforce_ready, edge 200×4; hetzbk l113c-0390afc9 + env-pack; Pi standby → l113c). В составе: WEB-505 3bb21db4 (окно цитирования), WEB-497 a1b3f9fd (судья), WEB-495/465 revive-бюджет (сквош 75ac1e21), WEB-564/566 Apple origin-lock 7c46b0ee, WEB-530 f7a427bd(+db551088), WEB-562 2daaf3db, WEB-556 1666dfb2, WEB-549/551 5d497bfe. Откат = l113b 02812b90 (RUN l113b-02812b90, REL arm64-l113b-20260906T003405Z). Артефакт me2-standalone-linux-arm64-0390afc9-20260906T035404Z sha 97076030…
2026-09-06T04:06:12.143Z · coordinator[06.09 04:06Z координатор] [2026-09-06T04:06Z координатор] ПРОВЕРКА НА ПРОДЕ l113c 04:03Z: revive --apply обоих источников. PDF cmtkm80jo01u8z8vgj446km1x → running с НОВЫМИ operationId (op_a6dd6ebe…, op_84fc225c…, SETTLED_ACTUAL) — фикс 75ac1e21 работает. big-test 1782161239510l4gl4zzur → failed: billing_guard_operation_budget attempts=3 limit=2 без новых reservation — второй call site (withRetry2 → meterVendorCallInner, большой txt) не получил attemptBase. → Волна 2171-reviveopbudget3 (A2, luna xhigh, база l113c 0390afc9): инвентарь всех call sites + единая идентичность. KNOWN ISSUE: проверять revive на ОБОИХ типах (PDF и большой txt).
2026-09-06T08:51:25.424Z · coordinator[06.09 08:51Z координатор] [2026-09-06T08:51Z координатор] ПРИЁМКА 2222-accreviveopbudget3 (A2, sol xhigh): NO-GO на 1fff536a. Принято: attemptBase доходит до всех vendor-путей (большой TXT chunk-batch/withRetry, NER, outline, Wiki), real-PG проверка ок. Блокер: diff меняет persisted operation identity даже при НЕИЗМЕННОМ attemptBase → «без revive третья попытка отвергается» провален (исторический бюджет не считается). → Волна 2229-reviveopbudget4 (luna xhigh) поверх 1fff536a: identity стабильна для той же попытки, новая — только при новом attemptBase. Отчёт: A2 /home/ubuntu/waves/ACCREVIVEOPBUDGET3-REPORT.md.
2026-09-06T10:41:33.967Z · coordinator[06.09 10:41Z координатор] [2026-09-06T10:41Z координатор] Revive-identity v4 646e4967: приёмка 2238b (A2, sol xhigh, real PG) = NO-GO — non-retry embeddings path и revive CLI (poisoned→pending→done без budget-guard) прошли на PG, но duplicate-paid retry path WEB-465 строит другой ключ rag.embeddings:<billingOperationId>:<attemptDigest>:<operationDigest>:<payloadDigest>, чем 0390afc9 → круг 5 = 2272-reviveopbudget5 (единый резолвер ключа для всех путей + снимки ключей 0390afc9 в тестах). Big-test 1782161239510l4gl4zzur ждёт этого фикса.
2026-09-06T11:12:34.487Z · coordinator[06.09 11:12Z координатор] [2026-09-06T11:12Z координатор] Revive-identity круг 5: автор 2272c (claude-opus) сдал 51b32e57 (GO) — единый резолвер ключа для non-retry/retry WEB-465/revive CLI → приёмка 2283-accreviveopbudget5 (A2, sol xhigh, real PG) + проверка совместимости с WEB-499 c157a3e1.
2026-09-06T13:17:05.910Z · coordinator[06.09 13:17Z координатор] [2026-09-06T13:15Z координатор] ПОСАЖЕНО: ПРОД = l113g 4c322c46 (flip 13:14:18Z, без простоя; оба бэкенда ready, paid enforce_ready, edge 200×8; миграция WEB-550 file_link_lifecycle применена (188/193); hetzbk l113g-4c322c46 + env-pack, Pi standby → l113g). Состав (20 коммитов над l113f): большой PDF — финализация 3 круга (3c6a6f86, 76dcb114, 7779df11: короткая идемпотентная tx, hook вне tx, no-indexable-chunks для документов без текста), revive-identity 5 + WEB-499 doc_ner identity (a958df4b…42b61743), WEB-531 SEC-014 3 круга (ca35fbeb, ad7c0cfd, e8c97f1f — слияние), WEB-568 SEC-046 (84dce358, faf26ab9), WEB-550 SEC-033 (819da84e, ed246cae), WEB-552 SEC-035 (9d47fdf4, ecca7846), манифесты (188 миграций). Откат = l113f 221e8f39 (RUN l113f-221e8f39, REL arm64-l113f-20260906T123500Z). Дальше: revive документа cmtkm80jo… по инструкции приёмки; l113h = roles r3 (приёмка), WEB-560 build-fix (приёмка), WEB-507 8b155fc1.
2026-09-06T13:23:43.084Z · coordinator[06.09 13:23Z координатор] [2026-09-06T13:23Z координатор] ПРОВЕРЕНО НА ПРОДЕ l113g: big-test 1782161239510l4gl4zzur после revive → воркер снова billing_guard_operation_budget attempts=3 limit=2 → status=failed («This operation reached its retry limit»). Это ожидаемое поведение revive-identity v5 (старый parent авторитетен), но операторского пути «новая попытка» нет: revive-poisoned-source сбрасывает только metadata, unpoison отвечает «not poisoned (status=failed)». Волна 2319-revive-newattempt (A2, luna xhigh, PG): флаг --new-attempt с аудитом (новый parent, старые не трогаются). KNOWN ISSUES: симптом «после revive снова retry limit» → SQL по reservations parent → лечение = --new-attempt после посадки. Замечание: worker db-pool near capacity active=3 threshold=3 (connection_limit=3) — тесно для воркера индексации.
2026-09-06T14:12:57.559Z · coordinator[06.09 14:12Z координатор] [2026-09-06T14:12Z координатор] ПРИНЯТО: revive-poisoned-source --new-attempt — 2326 ACCREVIVENEWATTEMPT (sol xhigh, PG) = GO 2f0fde7c → кандидат l113h. Целостность l113h (2330, M4) = GO (импорт-гард cron/social под phase-production-build чист, манифесты rc 0). Astra блок 19: брифы 2113–2117 (extraction wiring, generated config mode, package portability, beta terminal outcome, canonical cookie document) ушли на M4.
2026-09-06T14:49:52.950Z · coordinator[06.09 14:49Z координатор] [2026-09-06T14:48Z координатор] ПОСАЖЕНО: ПРОД = l113h 83683d48 (flip 14:47:06Z, без простоя; оба бэкенда ready, paid enforce_ready, edge 200×8; миграция WEB-560 scheduled_social_idempotency применена (189/194); hetzbk l113h-83683d48 + env-pack, Pi standby → l113h). Состав (7 коммитов над l113g): WEB-560 SEC-043 (merge a7f41620/38aaad4e + build-fix 742066c1, импорт-гард phase-production-build), WEB-507 data-testid реестр (cd6afbf9, 8b155fc1), revive-poisoned-source --new-attempt (2f0fde7c). Откат = l113g 4c322c46 (RUN l113g-4c322c46, REL arm64-l113g-20260906T131045Z). Дальше: revive --new-attempt для big-test 1782161239510l4gl4zzur; l113i = C4-RU-3 11f3cdd5 + roles r5 + realtime r2 + Astra block-19 fixes после приёмок.
2026-09-06T15:02:09.992Z · coordinator[06.09 15:02Z координатор] [2026-09-06T15:02Z координатор] ПРОВЕРЕНО НА ПРОДЕ l113h: big-test 1782161239510l4gl4zzur — после revive --new-attempt (новый parent бюджета) воркер довёл индексацию: status=done, chunkCount=3932 (15:01Z). Оба долго висевших документа владельца (big PDF 9801 и big-test 3932) закрыты на l113g/l113h. KNOWN ISSUES: документ с исчерпанным бюджетом операции (attempts>limit) оживляется только из релизного дерева с RUN env; обычный revive/unpoison возвращает retry-limit.
Воркер
не привязан — привязать:
curl -X POST https://bugs.wool2.online/api/web/assign -H 'content-type: application/json' \
-d '{"issueId":"WEB-465","session":"<имя tmux-сессии>","host":"m4"}'
Обновлён
2026-09-02T11:03:00.357Z