WEB board

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

P0: конспект строится, платит за 20 вызовов модели и НЕ СОХРАНЯЕТСЯ; лог врёт «outline built»

Закрыт P0 · горит ведёт: backup-opus
Суть
Owner-бенчмарк Франкенштейна 06.08 09:21-09:34 показал РЕГРЕСС: цитат 6, 6, 5 вместо вчерашних 16, ответ не структурируется, owner видит «готовит конспект» больше 12 минут. РАЗБОР: журнал прода показывает [WEB-243] outline plan (455 чанков, 19 батчей) в 09:21:35 и [WEB-243] outline built (19 секций, 0 проваленных батчей, status ok, $0.03216, 20 вызовов LLM) в 09:22:43 — построение прошло УСПЕШНО и стоило денег. Но каждый следующий вопрос (09:27:37, 09:32:01, 09:33:49) даёт [WEB-243] broad question routing { scope: pending, reason: missing } и уходит в RAG-ветку. ПРОВЕРКА БАЗЫ (прод, Pi 55432): у источника cmsayu5p90025rmyy7sszom8p в metadata НЕТ ключей documentOutline и documentOutlineStatus; во ВСЕЙ таблице Source таких строк 0 и 0; updatedAt источника = 2026-08-01 23:09, то есть строка не обновлялась вообще. Запись не дошла ни разу и ни для кого. КОД: documentOutlineRuntime.ts:223 зовёт writeSourceOutline и присваивает succeeded=written.updated, но console.info(«[WEB-243] outline built») печатается БЕЗУСЛОВНО ниже (:234) — телеметрия рапортует успех независимо от факта записи (нарушение правила 10, второй раз за сутки). writeSourceOutline (sourceOutlineMetadata.ts:203) возвращает updated:false БЕЗ записи, если findUnique не нашёл строку. Проверить: тот ли Prisma-клиент/схема используется в рантайме сборки, не откатывается ли объемлющая транзакция, и совпадает ли sourceId сборки с Source.id. СЛЕДСТВИЕ: эпик WEB-243 фазы 1-3 на проде не работает вовсе — каждый широкий вопрос платит за пересборку и не получает конспект.
Как воспроизвести
Франкенштейн (446k знаков) → чат тетради → «о чём вся книга по хронологии» ×3 с интервалами; журнал: built есть, routing = pending/missing
Чем закрывается (приёмка)
После сборки metadata источника содержит documentOutline и documentOutlineStatus; следующий широкий вопрос даёт scope ready; лог печатает результат ЗАПИСИ, а не факт сборки; при неудачной записи — предупреждение с причиной
Доказательства
journalctl 09:21:35 plan / 09:22:43 built; SELECT count(*) WHERE metadata ? documentOutline = 0; updatedAt=2026-08-01
Замечен в сборке
v4-ea42c58
Починено в
v4-72226b1
Лента
2026-08-06T10:41:34.225Z · backup-opus
КОРЕНЬ ДОКАЗАН И ЗАКРЫТ (воркер o260, волна CH). Механизм: writeSourceOutline спрашивал разрешения у ПРЕДВАРИТЕЛЬНОГО ЧТЕНИЯ — findUnique по строке источника; если чтение по любой причине строку не видит, функция молча возвращает updated:false БЕЗ отправки UPDATE, а вызывающий строкой ниже БЕЗУСЛОВНО печатал «outline built … status: ok … estimatedUsd». Воркер построил инструментированный харнесс с двумя мирами, где строка в базе есть ВСЕГДА и меняется только её видимость для findUnique: «мир A» — findUnique | findUnique | UPDATE, ключи конспекта в metadata есть; «мир B» — findUnique | findUnique и НИ ОДНОГО UPDATE, metadata пуста, а в журнале тот же самый «outline built status: ok» с потраченными вызовами. Подпись мира B совпадает с прод-журналом по смыслу побайтово. ПОСЛЕ ФИКСА: лог печатает результат ЗАПИСИ (persisted, writePath, rowUpdatedAt), при неудаче — «outline NOT persisted» с причиной (source-row-missing и т.п.), плюс read-back после записи. Тесты 15 на персистентность конспекта. СВЕРХ ЗАДАЧИ: тот же дефект найден и починен ещё у ДВУХ писателей Source.metadata (тесты 19 на слияние метаданных).
2026-08-06T11:03:34.907Z · backup-opus
ЖИВАЯ ПРИЁМКА НА ПРОДЕ (не тесты): после посадки CH я сам запустил maybeBuildDocumentOutline для того самого источника Франкенштейна (cmsayu5p90025rmyy7sszom8p) против прод-базы. ДО: outlineKeys [], updatedAt 2026-08-01 (строка не менялась пять дней), во всей таблице Source ноль строк с documentOutline. ПОСЛЕ: RESULT {"built":true,"sections":19,"llmCalls":20,"status":"ok"}, лог печатает persisted:true / writePath:jsonb-merge / rowUpdatedAt, а в базе outlineKeys ["documentOutline","documentOutlineStatus","documentOutlineFingerprint"] и обновлённый updatedAt. Прод-запрос count(*) WHERE metadata ? documentOutline теперь 1 (было 0). Конспект Франкенштейна уже построен — owner-бенчмарк можно гнать без ожидания.
2026-08-06T15:00:17.448Z · backup-opus
ПРИНЯТО МНОЙ. Доказательство: живой прогон maybeBuildDocumentOutline против прод-базы — ДО: outlineKeys [], updatedAt 2026-08-01; ПОСЛЕ: persisted:true, writePath jsonb-merge, ключи documentOutline/Status/Fingerprint на месте, 19 секций. Лог теперь печатает результат ЗАПИСИ, а не факт сборки.
Воркер
не проверен o260 M4 движение в панели: неизвестно
Подключиться и смотреть/перехватить руками. Колесо мыши листает; клавишами — Ctrl-b затем [, выход из прокрутки q. Отсоединиться — Ctrl-b затем d:
Прочитать историю панели без подключения — листается и ищется (/ поиск, q выход), воркеру не помешает:
Обновлён
2026-08-06T15:00:17.447Z