WEB-570 · Дефект · Чат · web
P0 ПРОД: 54.7k чанков в карантине (sourceContentRevision NULL) невидимы retrieval — repair-CLI, Google-Drive без тела, pending-index
Закрыт
P0 · горит
ведёт: —
Суть
ДЛЯ НУЛЕВОГО АГЕНТА. Найдено 06.09 11:20Z при разборе батареи ролей (C1-6/C3-1/C3-2 cites=0): 54 728 из 104 761 чанков DocumentChunk на проде имеют sourceContentRevision = NULL (QUARANTINE) и невидимы retrieval; у владельца _@wool2.online (cmmqphkdw0000247m2m56dl0l) 62% чанков. Судья при пустом retrieval схлопывает ответ в «general knowledge», completeness receipt слеп к карантину.
ЭВОЛЮЦИЯ:
- l113e (65ff9060): чинит только новые чанки (ревизия ставится при индексации).
- l113k (d00b8f35, 00:41Z 07.09): ROLES5BREBASE — repair-CLI scripts/reindex-quarantined-chunks.ts --in-process-repair; QUARANTINEREPAIRCLI f4eb5f85 (l113l) — headers() outside request scope.
- 07.09 05:5xZ: apply на проде: фикстура батареи 3→0 чанков (C3 3/3 зелёные в r43b); владелец: 26 614 карантинных чанков в 845 источниках = 842 Google-Drive без тела (source-body-unavailable) + 3 обычных (rechunk) — но CLI из source-worktree падает containment_misconfigured (GENERATED_ACTIVATION_ATTESTATION invalid + MANIFEST rows missing: генерённый манифест активации есть только в BUILD) → волна 2536 QUARANTINEREPAIRPRODRUNNER (runner от релиза).
- Google Drive без тела: DRIVEBODYSERVERSIDE (2517) → приёмка ACCDRIVEBODYSERVERSIDE (M4) шесть P1 → круг 2 DRIVEBODYSERVERSIDER2 (2530, HEAD 44c55308, автор GO: hard-budget, MIME-aware, resumable apply) → приёмка 2538 (M4). Жалоба владельца 01:09Z: тело Google Doc подгружается только после клика по документу.
- Pending-index в чате: PENDINGINDEXANSWER (2518) → ACC NO-GO 2527 (частичный карантин = ложное «индексируется») → R2 20f10b29 (2532 GO) → приёмка 2534.
KNOWN ISSUES / ТРАБЛШУТИНГ:
- Симптом: ответ без цитат / «в источниках нет» при загруженном документе → проверка: select count(*) filter (where "sourceContentRevision" is null) from "DocumentChunk" where "documentId" in (…) → причина: карантин чанков (ревизия NULL) → лечение: repair-CLI apply (runner A1 /home/ubuntu/run-quarantine-dryrun.sh OWNER LIMIT apply, SOURCE_IDS=…) после 2536.
- Симптом: Google-Drive источник без тела (chunks=0, status done) → проверка: source.body пустое, mime google-apps → причина: тело грузилось только клиентом по клику → лечение: 2530 r2 (серверная подгрузка + apply) после приёмки 2538.
- Симптом: «документ ещё индексируется» на старом файле → причина: pendingIndexPresentation.ts:76-79 считал частичный карантин незавершённой индексацией → лечение: 2532 r2 (l113n).
Ссылки: батарея r43b 45/50 (WEB-99 комментарий 06:2xZ), волны 2476/2497/2517/2518/2527/2530/2532/2534/2536/2538.
Связи
- связан → WEB-99 — ЭПИК: роли-агенты по-настоящему — per-role retrieval/мозг-политики, объединение двух систем ролей, цитат-требования (по AGENTS-AUDIT sol)
- связан (обратная) → WEB-086 — ЭПИК: движок редактора этап C — CodeMirror-гибрид для огромных документов («Война и мир»)
Лента
2026-09-07T06:15:09.536Z · coordinator[07.09 06:15Z координатор] ПРИЁМКА 2534 ACCPENDINGINDEXANSWERR2 (claude-opus, 06:4xZ) круга 2 (2532) = NO-GO: блокер круга 1 закрыт (частичный карантин → «VERTEX-77 [1]» с citation, receipt degraded=true, независимая фикстура + негативная мутация), НО новый дефект того же класса: ветка «полный карантин ⇒ unavailable (quarantine)» (route.ts:1140-1151) стоит раньше штатного in-request ремонта WEB-99 recoverStaleProvenanceChunks (route.ts:1174-1190). На ПРОД da6799b2 источник со всеми чанками в карантине чинится в запросе (stale 3→0) и отвечает; кандидат делает visible=0 терминальным (stale 3→3, citations=[], 0 вызовов) — регрессия обычного пути. Круг 3 = волна 2540 PENDINGINDEXANSWERR3 (порядок: in-flight → ремонт → retrieval → quarantine только если ремонт отказал). KNOWN ISSUES: симптом «Some documents are unavailable (quarantine)» при полном карантине → проверка: stale-счётчик в receipt до/после ремонта → причина: порядок веток в chat-global route → лечение: 2540.
2026-09-07T06:42:33.285Z · coordinator[07.09 06:42Z координатор] КРУГ 3 PENDINGINDEXANSWERR3 (2540, sol, 06:4xZ): VERDICT=GO автора — полный карантин больше не терминален до штатного WEB-99 recovery; real-PG: repairable 3→0 → «VERTEX-77 [1]», quarantine-состояние только если ремонт отказал. HEAD 9b1b9394 (3 коммита над l113l), bundle sha 85a66773…; независимая приёмка = 2543 (A2, claude-opus xhigh) на базе ПРОД l113m.
2026-09-07T06:42:36.764Z · coordinator[07.09 06:42Z координатор] ПРИЁМКА 2538 ACCDRIVEBODYSERVERSIDER2 (M4, sol xhigh, 06:10–06:21Z) круга 2 = NO-GO при 6/6 закрытых P1 (harness 0/6 → 6/6): (1) Google Sheets и Slides не экспортируются — UnsupportedDriveBodyError → terminal ledger; (2) --max-usd не hard budget — оценка по числу СТАРЫХ чанков. Круг 3 = 2546 DRIVEBODYSERVERSIDER3 (A2, база l113m). До GO — никакого reindex-drive-sources --apply на проде.
2026-09-07T07:03:58.440Z · coordinator[07.09 07:03Z координатор] КРУГ 3 DRIVEBODYSERVERSIDER3 (2546, sol, 07:0xZ): VERDICT=GO автора, HEAD e4105aee над ПРОД l113m (replay 3dd4ed6d7 + 44c553089 + фикс r3: экспорт Sheets/Slides, hard budget по реальному объёму). Bundle sha 31bce14a…; независимая приёмка = 2551 (M4, sol xhigh). Repair-CLI на проде уже починил 3 обычных источника владельца (45 чанков, 07:00Z); остаток владельца = 842 Google-Drive без тела → после GO 2551 и посадки в l113n — apply.
2026-09-07T07:05:29.941Z · coordinator[07.09 07:05Z координатор] ПРИЁМКА 2543 ACCPENDINGINDEXANSWERR3 (claude-opus, 07:0xZ) круга 3 = NO-GO: целевой дефект 2534 закрыт и доказан A/B на реальном PG (полный карантин → ремонт stale 3→0 → «HELIX-13 [1]»), но два новых блокера, где ПРОД отвечает, а кандидат гасит ответ: F1 — «готов» требует metadata.processing.indexing.status=done, источник из UI без статуса объявляется неиндексированным (route.ts:1086-1088; S7 с queued-соседом → pending вместо ответа); F2 — в ноутбучном чате порядок quarantine→ремонт не исправлен (route.ts:1232-1249), receipt после ремонта устаревший. Круг 4 = 2553 PENDINGINDEXANSWERR4 (A2, база l113m). KNOWN ISSUES: симптом «документ ещё индексируется» у только что добавленного через UI источника → проверка: metadata.processing.indexing.status отсутствует при живых чанках → причина: готовность по статусу, а не по чанкам → лечение: 2553.
2026-09-07T07:20:19.705Z · coordinator[07.09 07:20Z координатор] ПРИЁМКА 2551 ACCDRIVEBODYSERVERSIDER3 (M4, 07:04–07:4xZ) = NO-GO: (а) identity — получила промежуточный HEAD 471b4cb2 (автор 2546 дописывал после первого отчёта; финальный HEAD f828a802, bundle 7c951537…); (б) на 471b4cb2: прежний independent harness регрессировал 6/6→5/6, ceiling 2×bytes не покрывает V2 hard ceiling, terminal-limit negative красный, stopReason=run-budget вызывал paid-processing path (7/9). Повторная приёмка на финальном f828a802 = 2558 (M4). Урок процесса: артефакты волны забирать только после маркера *_DONE/WAVE_EXIT.
2026-09-07T07:23:17.687Z · coordinator[07.09 07:23Z координатор] КРУГ 4 PENDINGINDEXANSWERR4 (2553, sol, 07:20Z): VERDICT=GO автора — F1 (источник с живыми чанками не гасится из-за отсутствующего/запаздывающего indexing status) и F2 (ноутбучный чат ремонтирует карантин до quarantine-решения, receipt после ремонта) закрыты; серия 4 коммита над l113m, HEAD d5d86103, bundle sha aeb684f6…; независимая приёмка = 2559 (A2, claude-opus xhigh).
2026-09-07T07:28:51.651Z · coordinator[07.09 07:28Z координатор] ПОВТОРНАЯ ПРИЁМКА 2558 ACCDRIVEBODYSERVERSIDER3B (M4, 07:5x–08:1xZ) финального f828a802 = NO-GO: identity ок, но три условия не закрыты — independent harness круга 2 остаётся 5/6 (не 6/6), V2 hard ceiling и terminal-limit негативы (см. отчёт). Круг 4 = 2571 DRIVEBODYSERVERSIDER4 (A2, sol xhigh) с harness приёмщика как целевым. Prod --apply по-прежнему запрещён.
2026-09-07T08:12:08.163Z · coordinator[07.09 08:12Z координатор] ПРИЁМКА 2559 ACCPENDINGINDEXANSWERR4 (claude-opus, 07:41Z) = GO: F1 (готовность по живым чанкам, statusless-источник отвечает) и F2 (ноутбучный чат ремонтирует карантин до quarantine-решения, receipt после ремонта) закрыты и доказаны на реальном PG независимыми фикстурами. Серия d5d86103 (4 коммита над l113m) → l113o.
2026-09-07T08:12:10.998Z · coordinator[07.09 08:12Z координатор] КРУГ 4 DRIVEBODYSERVERSIDER4 (2571, sol xhigh, 07:44Z): VERDICT=GO автора, COMMIT f44584c8 над l113m (independent harness приёмщика воспроизведён; V2 hard ceiling, terminal-limit, harness круга 2 6/6). Независимая приёмка = 2576 (M4). Prod --apply до GO запрещён.
2026-09-07T08:29:48.458Z · coordinator[07.09 08:29Z координатор] ПРИЁМКА 2576 ACCDRIVEBODYSERVERSIDER4 (M4, sol xhigh, 08:13–08:28Z) = GO: все три блокера 2558 закрыты независимым proof — harness круга 2 6/6; V2 plan при 50% overlap резервирует 29 020 токенов (было 20 040) и останавливает under-cap run stopReason=run-budget ДО processDocument/embedding/metadata; done[]/terminal[] исключаются в SQL до ORDER BY/LIMIT. Ранее принятое (Sheets/Slides export, checkpoint v2, owner principal, generation fencing, budget-before-mutation, идемпотентность) сохранено. Серия f44584c8 → l113o (2580 L113OPREP вместе с pending-index r4 и roles6 r2) → после посадки операторский --apply на 842 источниках владельца.
2026-09-07T08:37:07.832Z · coordinator[07.09 08:37Z координатор] L113OPREP (2580, 08:33Z): VERDICT=STOP по моему же запрету миграций — серия ROLES6 (generation pointer) несёт 3 миграции (20260906160000_web99_chunk_generation_pointer, 20260906160100_web99_chunk_generation_index_online, +1). Перенос всех серий выполнен (HEAD 3882d514 над l113n). Повтор 2582 L113OPREP2: миграции разрешены (проверить additive/online, обновить manifest миграций под P19-гейт, оценить время) → сборка l113o → посадка со стадией migrate.
2026-09-07T09:13:57.796Z · coordinator[07.09 09:13Z координатор] КАНДИДАТ l113o (2582 L113OPREP2, sol, 09:0xZ): VERDICT=GO, commit df0376cf над ПРОД l113n (bundle sha 50902f34…): ROLES6CON r2 (6 коммитов, +3 миграции generation pointer/index online, manifest миграций обновлён), PENDINGINDEX r4 (4), DRIVEBODY r4 (4), regen manifest. Сборка на A2 запущена ~09:05Z → посадка со стадией migrate (~09:55Z).
2026-09-07T09:36:07.257Z · coordinator[07.09 09:36Z координатор] ПОСАЖЕНО: ПРОД = l113o (df0376cf) с 09:34:36Z 07.09 (флип 09:33:41–09:34:36Z rolling). Над l113n: ROLES6CON r2 7eb7befd (WEB-99: публикация generation pointer батчами по 24 строки; +3 миграции, prisma migrate deploy 09:31:43–09:32:11Z, 193/193), PENDINGINDEX r4 d5d86103 (WEB-086/570: готовность по живым чанкам, ремонт карантина до quarantine-решения в chat-global и ноутбучном чате), DRIVEBODY r4 f44584c8 (WEB-570: серверные тела Google Drive — Docs/Sheets/Slides export, checkpoint v2, hard budget). Артефакт da22ddc6…, attestation fable-a2-l113o, активация подписана владельцем. Verify: ready/paid enforce_ready на обоих бэкендах, edge ×8 = 200, корни ×3 = 200, /login 200, вебхук 401, AttestationError/nginx/LEASE_LOST = 0, Telegram pending 0; воркеры indexing/extraction на l113o (timer-driven). Ловушка: spend-runtime env унаследовал SPEND_MIGRATION_SET_SHA256 от l113n → dry-run paid enforce_blocked до замены на значение att-build (7d49ad11…). hetzbk + env-pack + Pi → l113o-df0376cf. Откат = l113n (миграции additive). Расписка L113O-RELEASE-RECEIPT.md. Далее: post-QA 2593; операторский apply Drive-тел владельца (842 источника); батарея r45 после l113p.
2026-09-07T09:43:14.565Z · coordinator[07.09 09:43Z координатор] DRIVE APPLY НА ПРОДЕ (координатор, 09:43Z, l113o): release-bound runner /home/ubuntu/run-drive-release.sh (overlay генерённых файлов l113o, containment paidReady=true, env unit nc-a1 + ACTIVE_PASSIVE_LEASE_REQUIRED=0 + WALLET_OVERDRAFT_REQUIRES_FUNDING=0 только для CLI). Dry-run: 50/50 planned, оценка ~$0.00015/источник (по старым чанкам; реальный hard budget считается по экспортированному телу). Apply запущен: owner cmmqphkdw…, limit 900, --max-usd 3.0 (hard cap), checkpoint /home/ubuntu/inputs/drive-apply-owner-checkpoint.json, лог /home/ubuntu/drive-apply-owner-<ts>.log. Итог и остаток карантина — следующим комментарием.
2026-09-07T09:45:28.976Z · coordinator[07.09 09:45Z координатор] DRIVE APPLY (09:43Z, l113o): остановлен stopReason=no-drive-token — у владельца нет серверного Google-креденшела (OAuthClientAccountState: 0 строк с google во всей таблице). Тела Drive-файлов исторически грузились клиентским токеном picker-а → отсюда «тело только после клика». Нужно действие владельца: подключить Google Drive в настройках (server-side OAuth, scope drive.readonly), после чего повторить apply (runner готов, checkpoint сохранён). KNOWN ISSUES: симптом no-drive-token → проверка OAuthClientAccountState.integrations->google для userId → причина: нет stored credential → лечение: connect в UI, затем run-drive-release.sh apply.
2026-09-07T10:03:37.900Z · coordinator[07.09 10:03Z координатор] POST-QA ЖИВОГО l113o (2593, A1, 09:40–10:02Z): VERDICT=NO-GO по состоянию кошелька QA-учётки, не по посаженным изменениям: global chat → HTTP 500 insufficient_funds (правило «Б»: QA c09 никогда не пополнялась), notebook chat → 200 со spending-limit notice без citation → pending-index и два roles6-кейса не приняты. GO: readiness/миграционный набор на обоих бэкендах, Drive r4 bytes/status, периметр. Координатор: грант $10 QA c09 через admin-route (10:05Z) → повтор 2593n (только пункты 1–2). Отдельная находка: unfunded на /api/chat-global отдаёт 500 вместо 402 (KNOWN ISSUE → волна после l113p).
2026-09-07T10:41:17.927Z · coordinator[07.09 10:41Z координатор] **Статус карантина после l113p.** ПРОД = l113p `1c850d92876757812eab9ffa7f381bcea95aad86` (флип 10:21:43Z 07.09; откат l113o df0376cf). Расписка: `waves/queue/L113P-RELEASE-RECEIPT.md` (A1/A2/M4). Verify: ready/paid на обоих бэкендах, edge ×8, корни ×3, webhook 401, 0 AttestationError/nginx err/LEASE_LOST. Hetzner `/home/app-artifact/l113p-1c850d92`, Pi standby на l113p. (Drive r4 и pending-index r4 — в l113o; l113p без изменений по карантину.)
Факты: 3 обычных источника владельца восстановлены (45 чанков) runner'ом `/home/ubuntu/run-quarantine-release.sh`; остаток ≈54 713 чанков = 842 Google-Drive источников без тела. Drive apply остановлен `stopReason=no-drive-token`: серверный credential читается из `OAuthClientAccountState.integrations->google` (0 строк) → владельцу нужно подключить Google Drive в настройках приложения; после — `run-drive-release.sh cmmqphkdw0000247m2m56dl0l 900 apply` с `DRIVE_MAX_USD=3.0` и checkpoint. Пост-QA l113o нашёл смежный дефект completeness (statusless source с живыми чанками → indexing-unknown) → волна 2599 (см. WEB-086).
2026-09-07T11:40:37.631Z · ЭВОЛЮЦИЯ ЗА 12 Ч (гигиена 2609, 11:25Z 07.09)
СОСТОЯНИЕ ЭПИКА 11:25Z: формальных children по parentId нет; прогресс ведётся самим тикетом и связанными карточками. Эпик не закрывать.
ХРОНОЛОГИЯ КРУГОВ
- QUARANTINEREPAIRCLI → независимая приёмка (`M4 waves/ACCQUARANTINEREPAIRCLI-REPORT.md`); prod-runner/adopt-existing подготовили безопасный bounded repair (`A2 waves/QUARANTINEREPAIRPRODRUNNER-REPORT.md`, `A2 waves/QUARANTINEDRIVEADMISSION-REPORT.md`).
- DRIVEBODYSERVERSIDE r1–r3 получил последовательные NO-GO по authority/checkpoint/budget; r4 `f44584c8` → ACC 2576 GO (`M4 waves/ACCDRIVEBODYSERVERSIDER4-REPORT.md`) → l113o.
- Pending-index r4 `d5d86103` → ACC 2559 GO → l113o, но post-QA выявил statusless/numeric регресс; r5 `6aae47d6` author GO → ACC 2605 сейчас.
- Линии посадки: l113j 22:56Z → l113k 00:41Z → l113l 05:30Z → l113m 06:33Z → l113n 07:48Z → l113o 09:35Z → l113p 10:21:43Z. Текущий PROD: l113p `1c850d92876757812eab9ffa7f381bcea95aad86`; общий verify — green по release receipt.
ДЛЯ НУЛЕВОГО АГЕНТА
- На проде: server-side Drive body/checkpoint/budget и pending-index r4. Восстановлены 3 обычных источника / 45 чанков; ≈54 713 чанков из 842 Google Drive источников остаются без тела. r5 не посажен.
- Следующий шаг / владелец: Владелец подключает Google Drive в настройках приложения. Затем координатор запускает `run-drive-release.sh cmmqphkdw0000247m2m56dl0l 900 apply` при `DRIVE_MAX_USD=3.0`; A2 закрывает 2605; после l113q — post-QA/battery. Статус остаётся in_progress.
KNOWN ISSUES / ТРАБЛШУТИНГ
- Симптом: `stopReason=no-drive-token` и 842 Drive sources без body → проверка `OAuthClientAccountState.integrations->google` показывает 0 строк → причина: отсутствует server credential → лечение: owner OAuth connect, затем bounded apply. Отдельно r4 вызывает `indexing-unknown`; см. `A2 waves/DRIVEBODYSERVERSIDER4-REPORT.md`, `A1 waves/L113OPOSTQAN-REPORT.md`.
СВЯЗИ / ИСТОЧНИКИ
- Release: `M4 waves/L113P-RELEASE-RECEIPT.md`; координаторский срез: `M4 waves/OPS-STATUS-HEAD-1120.md`; точные отчёты перечислены в хронологии/KNOWN ISSUES.
- Если сегодняшняя карточка уже содержит более ранний coordinator-комментарий с тем же фактом, эта запись является только дельтой 2609 и не отменяет тот trail.
2026-09-08T11:16:55.970Z · coordinator[08.09 11:16Z координатор] **08.09 поставлена волна 2795 на РЕМОНТ уже застрявших чанков.** Прошлая линия чинила только новые — 54 728 из 104 761 так и остались в QUARANTINE с `sourceContentRevision = NULL` и невидимы для retrieval (у владельца непокрыто 62 % его документов).
В бриф заложены три требования: идемпотентный ремонт партиями с возможностью остановиться и продолжить; поведенческое доказательство на реальной изолированной PostgreSQL (документ ДО ремонта не находится, ПОСЛЕ — находится и цитируется); отдельно — слепота расписки полноты, которая сейчас рапортует полноту, не замечая карантина. Отрицательные контроли: законно карантинный чанк ремонтом не воскрешается, повторный прогон ничего не дублирует.
2026-09-08T13:20:47.550Z · coordinator[08.09 13:20Z координатор] Статус → **review**. принято независимой приёмкой, в линию ещё не собрано. Ремонт застрявших чанков, кандидат `7a96ffc6`, приёмка ACCWEB570 = GO — доказано, что документ до ремонта не находится, после находится и цитируется, ремонт идемпотентен при прерывании.
2026-09-08T15:51:06.408Z · coordinator[08.09 15:51Z координатор] Статус → **done**. РЕМОНТ карантина: 54 728 чанков с NULL-ревизией возвращены в выдачу. Приёмка проверила прерывание ремонта на середине и повторный прогон — данные не портятся и не дублируются
Посажено на прод линией **l113u** `4e0e5406db8b3844bfc7bc43148c37ddd4cdbf99` (артефакт `me2-standalone-linux-arm64-4e0e5406-20260908T151242Z`, sha256 `43a6d010…`), флип 08.09 15:34Z.
Проверено ПОСЛЕ флипа, не по факту деплоя: оба бэкенда `ready=true` и `paidReady=true` с новым releaseId; корень `https://app.sixbyy.com/` = 200; вебхук Telegram = 401; готовность SIP 4080 = 200; строк `LEASE_LOST` — 0.
Откат: l113t `a45e820c7ec1043fe601974fe24fe5026eaaf118`, релиз `arm64-l113t-20260908T131657Z`.
Воркер
не привязан — привязать:
curl -X POST https://bugs.wool2.online/api/web/assign -H 'content-type: application/json' \
-d '{"issueId":"WEB-570","session":"<имя tmux-сессии>","host":"m4"}'
Обновлён
2026-09-08T15:51:06.407Z