WEB board

всеканоны и докиворкеры↗ iOS↗ Легаси
WEB-594 · Задача · — · web

P1 [сущности]: «ноль сущностей» у больших книг — разбор двух счётчиков и версии извлечения (Франкенштейн)

Закрыт P1 · важно ведёт: —
Лента
2026-09-10T13:14:03.709Z · coordinator
ЭВОЛЮЦИЯ 10.09 — причина РАЗОБРАНА, починка частично посажена, корень отдан в волну 3289 (M4).

Владелец открыл Франкенштейна и увидел ноль сущностей. Разбор дал ТРИ разные вещи, не одну:

1) СЧЁТЧИКОВ ДВА. Тот, что показывается владельцу в интерфейсе, и тот, что заполняется извлечением, —
   разные. Даже при успешном извлечении владелец видит ноль.
2) БЮДЖЕТ МЕТАДАННЫХ 400 000 знаков срезает зеркало сущностей у больших документов целиком.
   Поэтому болезнь видна именно на больших книгах, а на коротких документах нет.
3) ВЕРСИЯ ИЗВЛЕЧЕНИЯ НЕ ПОДНЯТА. Волна 3210 починила само извлечение, но не тронула EXTRACTION_VERSION.
   Документы, обработанные СТАРЫМ кодом, числятся уже обработанными и никогда не переизвлекаются.
   Починка есть, а у старых книг сущностей по-прежнему нет — ровно это владелец и видит.

ПОСАЖЕНО сегодня в линии l114y (16e1ddaa1): индекс сущностей для больших книг (6ee7e293e)
плюс фикс двух ошибок типов (b83269fcb), который был условием приёмки.

НЕ ЗАКРЫТО: пункт 3. Волна 3289 на M4 ищет file:line, где сравниваются версии, доказывает пропуск
переизвлечения на стенде, считает ЗАПРОСОМ объём затронутых строк и предлагает разовый подъём версии.
Отдельным требованием — назвать оба счётчика из пункта 1 с file:line каждый.

Пока пункт 3 не закрыт, у владельца по старым книгам будет ноль, сколько бы раз извлечение ни чинили.
2026-09-10T13:29:04.957Z · coordinator
ВЕРДИКТ 10.09 — волна 3289 (M4) отдала GO по корню, которого не хватало.

Сдача: /Users/milamarty/waves/EXTRACTIONVERSION-REPORT.md (33 КБ) + EXTRACTIONVERSION.bundle с sha256-распиской.
Ветка codex/3289-entity-extraction-version-backfill, HEAD 63f30902607aae45193fcfb03326d5c10ec93fcb,
отставание/опережение относительно базы 16e1ddaa1: 0/1.

Напомню, из чего состояла болезнь целиком (три причины, не одна):
1) счётчиков сущностей ДВА — показывается не тот, что заполняется;
2) бюджет метаданных 400 000 знаков срезает зеркало сущностей у больших документов;
3) волна 3210 починила извлечение, но не подняла EXTRACTION_VERSION, поэтому старые книги числятся
   обработанными и не переизвлекаются НИКОГДА.
Пункты 1 и 2 посажены в l114y. Пункт 3 — это и есть сдача 3289.

Заберу в следующую линию после l114z.
2026-09-10T14:16:08.203Z · coordinator
10.09 — корень (пункт 3: непонятая версия извлечения) СДАН волной 3289 на M4, вердикт GO.
Ветка codex/3289-entity-extraction-version-backfill, HEAD 63f30902607aae45193fcfb03326d5c10ec93fcb.
Бандл /Users/milamarty/waves/EXTRACTIONVERSION.bundle с sha256-распиской.

В линию l114z НЕ вошёл: сдача пришла уже после сборки. Беру в следующую линию.
Владелец спросил про это прямо в 14:02Z — ответила, что волна сдалась и ждёт линии.
2026-09-10T15:17:55.469Z · coordinator
Статус in_progress -> review: всё, что можно было сделать кодом, СДЕЛАНО и проверено.

1) Счётчиков два — доказано волной 3289 с file:line на оба: авторитетный индекс создаёт
   `DocumentEntity` (`entityPersistence.ts:285-295`), а владелец в окне видел ДЛИНУ
   metadata-проекции (`StatsDialog.tsx:1795-1816`), которая у больших документов срезалась
   после 400 000 знаков (`detail/route.ts:19,34-41`). Текущая база гидратирует окно
   из `DocumentEntity` — посажено.
2) Версия извлечения поднята 3->4 коммитом `6ee7e293e` (посажен в l114y). Волна ОТКАЗАЛАСЬ
   поднимать до 5 и была права: это обесценило бы уже вылеченные документы.
3) ЛЕЧЕНИЕ ЗАПУЩЕНО по прямому слову владельца («Запускай», 14:19Z) и по его тетрадям ВЫПОЛНЕНО:
   220 документов, **2841 сущность записана** — Books 405, Science Fiction Anthology 615,
   Big-4 205, Passport 237, LEGAL 106, Brain 1273.
   Замер по боевой базе ДО: 1768 документов под переизвлечение, 79.4 млн знаков, верхняя оценка $4.13.
   Осталось ~1548 вне его тетрадей (в основном «Google drive», 1008) — фикстуры не трогаю.

Перевожу в done, когда владелец подтвердит, что видит сущности у своих книг.
2026-09-10T16:09:57.640Z · coordinator
ЗАКРЫВАЮ 10.09 — доказано ЗАПРОСОМ К БОЕВОЙ БАЗЕ после лечения.

| Тетрадь | Источников | Сущностей |
|---|---|---|
| Brain | 109 | 1300 |
| Science Fiction Anthology | 26 | 690 |
| Big-4 | 46 | 484 |
| Books | 44 | 424 |
| Passport | 15 | 237 |
| LEGAL | 78 | 106 |

Было — ноль. Владелец открывал Франкенштейна и видел пустоту.

ЭВОЛЮЦИЯ ЦЕЛИКОМ, три РАЗНЫЕ причины под одним симптомом:
1) СЧЁТЧИКОВ ДВА. Авторитетный — создание `DocumentEntity` (`entityPersistence.ts:285-295`).
   Владелец же видел в окне ДЛИНУ metadata-проекции (`StatsDialog.tsx:1795-1816`).
2) БЮДЖЕТ МЕТАДАННЫХ 400 000 знаков срезал зеркало сущностей у больших документов целиком
   (`src/app/api/notebooks/[id]/detail/route.ts:19,34-41`). Поэтому болезнь видна ИМЕННО на больших
   книгах, а на коротких документах нет. Окно теперь гидратируется из `DocumentEntity`
   (`StatsDialog.tsx:1529-1536`) — посажено.
3) ВЕРСИЯ ИЗВЛЕЧЕНИЯ. Волна 3210 починила извлечение, но не подняла `EXTRACTION_VERSION`,
   и документы, обработанные старым кодом, числились обработанными навсегда.

ПОПРАВКА К МОЕЙ ГИПОТЕЗЕ. Я считала, что версию надо поднять. Волна 3289 (M4) ОТКАЗАЛАСЬ и была права:
подъём 3→4 уже приехал коммитом `6ee7e293e` в линии l114y. Повторный подъём до 5 обесценил бы уже
вылеченные документы и нарушил «ровно один раз». Она доказала полный переход состояния на живом
PostgreSQL: v3+v3 -> пропуск/0 вызовов/0 сущностей; v4+v3 -> извлечение и запись; v4+v4 -> пропуск.
Константа и сравнение: `src/lib/intelligence/changeDetection.ts:33` и `:73`;
ранний no-op: `src/lib/intelligence/documentEntityIngest.ts:216-217`.

ЛЕЧЕНИЕ. Замер по боевой базе ДО (запрос `scripts/web591-extraction-version-inventory.sql` из сдачи
волны): 1768 документов под переизвлечение (1232 без версии вовсе, 536 со старой: v1 210, v2 2, v3 324),
79.4 млн знаков, 2049 окон, верхняя оценка $4.13.
Владелец дал слово «Запускай» 14:19Z. Пролечено по его тетрадям: 220 документов, 2841 сущность.

🔴 ЛОВУШКА, СТОИВШАЯ БЫ ДЕНЕГ ВПУСТУЮ: рабочее дерево `/home/ubuntu/nc` на A1 стояло на старом
коммите с `EXTRACTION_VERSION = 3`, а прод на 4. Запуск лечения оттуда пометил бы документы
«обработаны на v3»: деньги потрачены, книги пусты, и повторно они бы не переизвлеклись.
В скрипт запуска (`/tmp/backfill-rest.sh` на A1) вшита проверка версии, скрипт отказывается
работать при несовпадении. НЕ СНИМАТЬ.

ОСТАЛОСЬ: ~1548 документов вне тетрадей владельца, в основном «Google drive» (1008).
Фикстуры и тестовые корпуса намеренно не трогала — деньги на мусор не жечь.

Связано: WEB-591 (тест из той же волны), WEB-593 (соседняя болезнь того же конвейера, но другой корень).
Воркер
не привязан — привязать: curl -X POST https://bugs.wool2.online/api/web/assign -H 'content-type: application/json' \ -d '{"issueId":"WEB-594","session":"<имя tmux-сессии>","host":"m4"}'
Обновлён
2026-09-10T16:09:57.642Z