diff --git a/docs/BACKLOG.md b/docs/BACKLOG.md index c0e374d3..6e09b13e 100644 --- a/docs/BACKLOG.md +++ b/docs/BACKLOG.md @@ -3,7 +3,7 @@ > **Единственный трекер проекта.** Здесь живут строки, на которые доки, промты и D-ноты ссылаются словами «строка N» / «строка бэклога N»: **ID строки стабилен навсегда**, не перенумеровывается и не переиспользуется (D39.80). Правки — только через оркестратора; каждая петля обязана иметь диспозицию: решено / отложено-с-записью / отклонено. > ⚠ **Это НЕ бэклог зоны `docs/`, а бэклог ПРОЕКТА.** У зон свои, с другими неймспейсами ID, и единый их строк не принимает (D39.84): платформа — [../platform/BACKLOG.md](../platform/BACKLOG.md) (`П-N`) и её регистр дефектов `platform/docs/DEFECT_REGISTER.md` (`PD-N`); фронт — [../frontend/docs/BACKLOG.md](../frontend/docs/BACKLOG.md) (`Ф-N`). > ⚠ **Состояние проекта — не здесь.** Очередь, курс, CURRENT-STATE, состояние паков и живая хроника — шапка [PROGRESS.md](PROGRESS.md). Здесь только долг и его диспозиции. -> - **СЧЁТ ОЧЕРЕДИ на 11.09 (скриптом по таблице — `python3 docs/scripts/counts.py`; обновлять при каждом лендинге):** всего **304** строк · зона бэкенд **146** строго / **198** широко (⚠ колонки счётчик читает С КОНЦА — испр. D39.116) · **блокеров очереди 0** (236 закрыта D39.175; **371** — актом D39.233, **360** — актом D39.232, обе 10.09), платные прогоны разблокированы · «скоро» **150** (перечень — грепом по таблице, рукописный список снят D39.126) · гейт-строка эксп-22: 153 (плюс 150 — руки владельца; ⚠ 55 из гейтов СНЯТА — D39.198 п.5); строка 5 — остаток гейчен ре-пробой 74, носитель события теперь строка 188 (аудит D39.140); остальное «когда-нибудь». ⚠ Счёт — НИЖНЯЯ граница долга, не потолок (разбор — легенда таблицы ниже). +> - **СЧЁТ ОЧЕРЕДИ на 11.09 (скриптом по таблице — `python3 docs/scripts/counts.py`; обновлять при каждом лендинге):** всего **304** строк · зона бэкенд **146** строго / **197** широко (⚠ колонки счётчик читает С КОНЦА — испр. D39.116) · **блокеров очереди 0** (236 закрыта D39.175; **371** — актом D39.233, **360** — актом D39.232, обе 10.09), платные прогоны разблокированы · «скоро» **149** (перечень — грепом по таблице, рукописный список снят D39.126) · гейт-строка эксп-22: 153 (плюс 150 — руки владельца; ⚠ 55 из гейтов СНЯТА — D39.198 п.5); строка 5 — остаток гейчен ре-пробой 74, носитель события теперь строка 188 (аудит D39.140); остальное «когда-нибудь». ⚠ Счёт — НИЖНЯЯ граница долга, не потолок (разбор — легенда таблицы ниже). > - ⚠ **Переезд 06.09 (D39.218):** таблица вынесена из `PROGRESS.md` ДОСЛОВНО и ни один ID не сдвинут — **с единственным исключением: две ячейки (строки 220 и 306) тронуты РОВНО в номере якоря `docs/scripts/counts.py:566`→`:569` и `:592`→`:595`**, потому что цель сдвинул этот же коммит; текст ячеек не менялся, длины равны. В `PROGRESS.md` на прежнем месте оставлен заголовок-указатель, поэтому ссылки «секция „Бэклог“» доезжают в один хоп. ## Бэклог (ЕДИНЫЙ, собран 26.07, актуализация 04.08 D39.99/D39.101; правки — только через оркестратора) @@ -339,4 +339,4 @@ | 415 | ⛔ **ЧЕТВЕРТЬ ДЕНЕГ КНИГИ КУПИЛА ПУСТОТУ, И ПОДНЯТЫЙ ФЛОР ЭТОГО НЕ СНЯЛ — доля БОЛЬШЕ, чем у инцидента, ради которого флор поднимали.** Замер 11.09: 4 вызова из 27 вернулись без пригодного текста и стоили **$0.106472 = 25.4 %** книги; три из них вернули РОВНО 0 знаков ($0.094835 = 22.6 %), четвёртый — выброшенный обрезок. Самый дорогой одиночный вызов прогона ($0.071009, `edit`/`deepseek-v4-pro`) не дал НИЧЕГО. ⚠ Мина задокументирована (размышление съедает `max_tokens`), боевой `pipeline-c1.yaml` ставит на draft `reasoning: "low"` именно против неё — **сработала всё равно: трижды на draft и один раз на edit, где ручка не выставлена вовсе**; а `min_max_tokens: 16000` у `pro` поднят с 8000 ПОСЛЕ прошлого такого инцидента, чья цена записана рядом в комментарии как 15.5 % счёта — здесь один вызов НА ПОДНЯТОМ флоре сжёг 16 000 токенов и вернул ноль, **16.9 % счёта**. ⭐ Лечение в движке ЕСТЬ и сработало 4 раза из 4 (перевыпуск с удвоенным потолком вернул текст) — путь не рвётся, он ДОРОЖАЕТ вдвое. Вторая точка того же явления: на прогоне 08.09 было 32 % | бэкенд | **скоро** | ручка против мины на ВСЕХ платных стадиях + решение, платит ли читатель за выброшенную попытку | критик чисел прогона A, 11.09 | | 416 | **СОГЛАСИЕ НА ПЕРЕ-ОПЛАТУ, ВЫСТАВЛЕННОЕ НА ВЕСЬ БЮДЖЕТ, ПРИ ФАКТИЧЕСКОЙ ПЕРЕ-ПОКУПКЕ В 78 РАЗ МЕНЬШЕ.** Замер 11.09: на резюме после банк-стопа `runs.accept_rebill_micro = 2 241 631` — то есть согласие пере-оплатить ВЕСЬ бюджет прогона, — тогда как фактически пере-куплено $0.028742. Разрыв **78×**; от пере-покупки спасли чекпойнты, а не потолок согласия. ⇒ промахнись хэши промптов (смена провода, `memory_version`, снапшота), и черновая волна была бы куплена заново — с уже стоящим согласием читателя. Родня `D39.196` п.2а (переплата читателя запрещена): здесь запрет не нарушен, но и не охраняем ничем, кроме везения | платформа+бэкенд | скоро | согласие соразмерное тому, что реально может быть пере-куплено | критик чисел прогона A, 11.09 | | 417 | ⛔ **ЗАКОН БАНКА НА ПРОВОДЕ НЕ ВИДЕН В ОТГРУЖЕННОМ ТЕКСТЕ, И СПРОСИТЬ БД «ДОЕХАЛ ЛИ ОН» НЕЧЕМ.** Замерено на живом платном прогоне 11.09 и открыто глазами по каждому попаданию: движок сам объявил на стопе майнинга **9 разошедшихся терминов из 69** (`bank-stop.txt`, распределение `spread`: 1→60 · 2→6 · 3→2 · 4→1). Из девяти **четыре отданы ОДНОЙ формой, и это форма терминолога** (`甲等资质` 6 вхождений при трёх конкурентах по 0 — черновик давал «дар цзя», «дарование первого ранга», «талант класса А»); **одна отдана ДВУМЯ** (`开窍大典` ×9 плюс развёрнутая ×1); ⛔ **и четыре отданы одной формой, которая НЕ БАНКОВСКАЯ**: `高脚吊楼` — банк несёт «дом на сваях», в файле **«свайный дом» ×4 и «дом на сваях» ×0**; `家老` — банк «старейшина рода», в файле «старейшины» ×13 без «рода»; `舅母` — банк «жена дяди по матери», в файле «тётя» ×16. ⇒ **`D39.104` (строка на проводе есть ЗАКОН для каждой роли) в этих юнитах не исполнен, и почему — не установлено:** доехал ли банк до промпта редактора, по БД ответить НЕЛЬЗЯ. ⛔ **ИСПР. 11.09 — формулировка уточнена ЗАМЕРОМ, прежняя была неверна: счётчики инъекции ЕСТЬ и они богатые** (`retrieval_state`: `n_exact_hits` · `n_sticky` · `n_ambiguous_flagged` · `n_spoiler_blocked` · `n_evicted` · `n_postcheck_miss` · `injected_ids` JSON, `backend/internal/store/migrate.go:239-255`, и код сам называет их «механизмом, превращающим тихую деградацию в громкую»). **Дефект в КЛЮЧЕ: `PRIMARY KEY (book_id, chapter, chunk_idx)` — строка ОДНА НА ЧАНК, а не на чанк×СТАДИЮ.** Черновая и редакторская волны инъектируются РАЗНЫМИ выборками (черновик — базовый банк без намайненного, редактор — обогащённый), и их следы складываются в одну строку ⇒ вопрос «что видел РЕДАКТОР» неразрешим по построению схемы, а не по отсутствию прибора. ⇒ первый шаг — не «завести счётчик», а **развести ключ по стадии**, и он же дешёвый: таблица пере-считывается детерминированно каждый прогон ($0, матчер бесплатный) и само-восстанавливается на резюме. Замерено РАСХОЖДЕНИЕ формы; место его возникновения — открытый вопрос, и первый шаг к нему $0: счётчик инъекций на редакторской стадии. ⚠ Не путать с рядом **407** (пост-проверка спрашивает присутствие вместо формы на месте): там прибор не видит дрейфа, здесь дрейф ВИДЕН и не объяснён | бэкенд | **скоро** | счётчик подтверждённых инъекций у редактора; затем объяснение четырёх случаев | критик полноты прогона A, 11.09 | -| 418 | **ДВА ЧИСЛА ДВИЖКА ОБ ОДНОМ ТЕРМЕ НЕ СХОДЯТСЯ — второй экземпляр класса, найден на живом прогоне.** Замер 11.09 по всем 69 термам банк-стопа: у **68** счётчик `spread` равен длине перечисленного рядом списка черновых форм, и ровно один терм — `开窍大典` — несёт `spread=4` при ТРЁХ формах в списке. Первый экземпляр того же класса в том же прогоне: `古月山寨` — `other proposals` карты подписи даёт 2, а `drafts:` файла банк-стопа — 3. ⚠ **Дефект это или разные определения — НЕ УСТАНОВЛЕНО**, и оба раза сессия брала в таблицу ДЛИНУ СПИСКА, а не счётчик. Цена: любой прибор консистентности, опирающийся на `spread`, наследует расхождение молча — а строка **406** заказывает ровно такой прибор | бэкенд | скоро | одно определение `spread` на оба носителя либо названная разница | критик полноты прогона A, 11.09 | +| 418 | ⛔ **ЗАКРЫТ ОБЪЯСНЕНИЕМ 11.09 — РАСХОЖДЕНИЯ НЕТ, БЫЛА МОЯ ОШИБКА ЧТЕНИЯ.** Ряд утверждал, что «два числа движка об одном терме не сходятся»: `spread=4` при трёх формах в списке и `other proposals` = 2 против `drafts:` = 3. Пере-снято бэкенд-сессией и пере-проверено мной: **это ДВЕ РАЗНЫЕ ВЕЛИЧИНЫ, и движок печатает их В ОДНОЙ СТРОКЕ** — `spread=%d conventions=%d` (`backend/internal/pipeline/mining.go:542`), где `Spread()` считает Σ сырых форм, а `Conventions() = len(Variants)` — свёрнутые классы (`backend/internal/terminology/terminology.go`, греп `func (c Candidate) Spread`). Комментарий там же говорит это прямым текстом: «Conventions 1 is one canon written three ways — a normalization nit; Spread 3 with Conventions 3 is a real contest, and the two must not read the same at the stop». Распределение по всем 69 термам прогона: 60×(1,1) · 6×(2,2) · 2×(3,3) · 1×(4,3). Второй «экземпляр» тем же образом: `other proposals` печатает `props[1:]`, то есть ИСКЛЮЧАЕТ текущий `dst` (`backend/internal/miner/miner_emit.go`, греп `other proposals`) — 3−1=2 при трёх черновиках. ⚠ **Класс моей ошибки — тот самый, что смена записала нормой: я сравнил число с длиной списка, который меряет другую величину, и обе половины по отдельности были верны.** Работы ряд не несёт; пин равенства (`spread == Σ Forms`, `conventions == len(Variants)`) вешает пак консистентности, чтобы объяснение держалось не текстом | — | — | закрыт объяснением | бэкенд-сессия пака консистентности, 11.09 |