From 5b8c5845a78468e98b23dc2f0e800b04ad7fbd37 Mon Sep 17 00:00:00 2001 From: heaven Date: Wed, 16 Sep 2026 23:50:35 +0300 Subject: [PATCH] Record the batch-ordinal re-purchase, the transfer's source-label fork and the anchor evidence that the sequel cannot inherit a settled verdict --- docs/BACKLOG.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/docs/BACKLOG.md b/docs/BACKLOG.md index 7fe606ed..736a6a89 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). Здесь только долг и его диспозиции. -> - **СЧЁТ ОЧЕРЕДИ на 16.09 (скриптом по таблице — `python3 docs/scripts/counts.py`; обновлять при каждом лендинге):** всего **356** строк · зона бэкенд **187** строго / **240** широко (⚠ колонки счётчик читает С КОНЦА — испр. D39.116) · **блокеров очереди 0** (236 закрыта D39.175; **371** — актом D39.233, **360** — актом D39.232, обе 10.09), платные прогоны разблокированы · «скоро» **187** (перечень — грепом по таблице, рукописный список снят D39.126) · гейт-строка эксп-22: 153 (плюс 150 — руки владельца; ⚠ 55 из гейтов СНЯТА — D39.198 п.5); строка 5 — остаток гейчен ре-пробой 74, носитель события теперь строка 188 (аудит D39.140); остальное «когда-нибудь». ⚠ Счёт — НИЖНЯЯ граница долга, не потолок (разбор — легенда таблицы ниже). +> - **СЧЁТ ОЧЕРЕДИ на 16.09 (скриптом по таблице — `python3 docs/scripts/counts.py`; обновлять при каждом лендинге):** всего **357** строк · зона бэкенд **188** строго / **241** широко (⚠ колонки счётчик читает С КОНЦА — испр. D39.116) · **блокеров очереди 0** (236 закрыта D39.175; **371** — актом D39.233, **360** — актом D39.232, обе 10.09), платные прогоны разблокированы · «скоро» **188** (перечень — грепом по таблице, рукописный список снят 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; правки — только через оркестратора) @@ -375,12 +375,12 @@ | 457 | **ТРИ ПРОТУХШИХ ЯКОРЯ В ДОКАХ ФРОНТ-ЗОНЫ, и две цели живы по известным адресам.** `frontend/docs/frontend-PROGRESS.md:187`=`Какое слово о состоянии книги стоит в дереве` целит в контракт по адресу 1054 — токен живёт на `docs/architecture/14-api-contract/README.md:1138`=`не различает две беды`; `frontend/docs/frontend-PROGRESS.md:190`=`Фразы отказа книги` целит в openapi по адресу 1606 — enum отказов живёт на `docs/architecture/14-api-contract/openapi.yaml:1633`=`enum: [source_unreadable, not_configured, processing_failed, content_refused]`; `frontend/docs/STACK_DECISIONS.md:263`=`pend.Source = u.sourceText()` целит в экспорт по адресу 176 — присваивание живёт на `backend/internal/pipeline/export.go:178`=`pend.Source = u.sourceText()` (замер 16.09: `sourceText()` в файле два, второе — `ce.Source` на 344, и оно про другое). ⛔ **Мёртвые адреса здесь НАЗВАНЫ СЛОВАМИ, а не якорями, и это существенно:** выписав их в форме `` `путь:строка`=`токен` ``, я воспроизвёл чужую поломку у себя — линтер прочитал их как МОИ живые якоря и дал три новых красных (8 → 11). **Документируя протухший якорь, не пиши его якорем.** ⚠ Правит их ФРОНТ: доки чужой зоны оркестратор не переписывает, а обе уехавшие цели — В МОЕЙ зоне, поэтому адреса названы здесь готовыми. ⛔ Замер 16.09: цели контракта БАЙТ-ИДЕНТИЧНЫ дереву и HEAD (README 1608 строк в обеих, `openapi.yaml` 3497 в обеих) ⇒ якоря протухли НЕ лендингом приёмки, а раньше. ⚠ И они едва не уехали в находку: контрольный прогон на HEAD показал 25 строк из 27 — линтер капит список, и «эти два якоря новые» было артефактом прибора, снятым замером | фронт | когда-нибудь | три якоря зелёные в `python3 docs/scripts/counts.py --lint` | приёмка пака «КУПЛЕНО — ЗНАЧИТ ДОСТАВЛЕНО» 16.09 (`D39.255`) | | 458 | **ПЯТНАДЦАТЬ ГОЛЫХ ЯКОРЕЙ В ЖИВЫХ СТРОКАХ: путь и номер есть, ТОКЕНА ОЖИДАНИЯ нет — линтер такой якорь не читает, и «ноль жалоб» тут неотличимо от «не разобран».** Одиннадцать в `docs/BACKLOG.md` — pipeline/export.go 307 · stagerun.go 93 · seed/seed.go 24 · store/chunkstatus.go 92 · bankmaterialize.go 214 и 295 · export.go 174 и 320–322 · quality.go 492 · status.go 538–543 · voicerun.go 46 (⚠ у восьми нет и КОРНЯ пути, а такой якорь не ловится даже существованием файла); четыре в `docs/experiments/00-provider-quirks.md` — pipeline-c1.yaml 129 · pipeline-arm-glm.yaml 61 · pipeline-arm-deepseek-pro.yaml 62 · pipeline-arm-mistral.yaml 61. ⛔ **Адреса здесь намеренно НЕ в форме якоря:** выписав их якорями, я за одну смену ДВАЖДЫ завёл своими руками ровно тот дефект, который ряд описывает — сперва в ряду 457 с чужими протухшими целями, потом здесь, и оба раза поймал ХУК, а не я. **Перечень поломанных якорей сам якорями не пишется.** ⛔ **Чинить ОПТОМ нельзя:** токен, подобранный под то, что в цели ОКАЗАЛОСЬ, есть подгонка под зелень (`D39.121`) — каждый разбирается чтением прозы, которая его описывает, и половина таких разборов кончается тем, что уехала ЦЕЛЬ, а не номер. Замер 16.09 (`D39.255` п.10): пред-существуют — лендинг приёмки эти строки лишь дополнял, а ввёл он двенадцать своих, и они закрыты в тот же заход | оркестратор | когда-нибудь | у каждого якоря есть корень пути и токен; пред-коммитный хук на этих строках молчит | приёмка пака «КУПЛЕНО — ЗНАЧИТ ДОСТАВЛЕНО» 16.09 (`D39.255`) | | 459 | **РАТИФИЦИРОВАННАЯ НОТА И ДЕРЕВО РАСХОДЯТСЯ ПО ОТКАЗ-СИГНАЛУ ⟦TM-NO-DST⟧, и банковый пак упрётся в это на первой же строке.** `D39.102` п.2 числит отказ-сигнал в корзине «закрыть по нужности», ратифицированной ЦЕЛИКОМ; п.3 той же ноты добавляет его в «опровергнуто/не заводится»: «NoDst-почти-сентинел на zh-ru (target_script обязателен конфигом, OffLanguage отбивает)». ⛔ **В ДЕРЕВЕ он жив и стоит на БОЕВОМ проводе zh-ru:** `backend/prompts/zh-ru/terminologist.md:36`=`не можешь выбрать перевод уверенно` велит роли вернуть сентинел и называет это нормальным исходом; парсер ждёт его вместе с искажёнными формами (`backend/internal/terminology/terminology.go:694`=`const NoDst = "⟦TM-NO-DST⟧"`, `backend/internal/terminology/terminology.go:1248`=`func isNoDst`); счёт печатается прогоном (`backend/internal/pipeline/terminologist.go:649`=`"declined", res.Declined`). Итог консилиума повторил НОТУ, а не дерево (`docs/research/35-bank-memory-consilium.md` §П3, «исхода движка „это не термин“ нет и не вводится»). ⇒ пак обязан выбрать ЯВНО: сентинел остаётся законным исходом (тогда ряд 445 — ужесточение разбора ответа) либо снимается из промта — а это двигает хеш запроса и перекупает проход на консолидированных книгах. Найдено советчиком-фаблом, проверено деревом оркестратором | бэкенд | скоро | нота и дерево говорят одно, выбор назван нотой | совет фабла 16.09 + сверка дерева оркестратором | -| 461 | **ПЕРЕНОС БАНКА В КНИГУ-ПРОДОЛЖЕНИЕ — СТРОЙКА ПО РЕШЕНИЮ ВЛАДЕЛЬЦА `D39.256`.** Переезжают ДВА слоя: подписанное владельцем и решённое движком. ⛔ Сегодня механизма нет ВООБЩЕ: ни один из 17 не-тестовых файлов `platform/internal/books` и `httpapi` не упоминает ни сид, ни глоссарий, ни дельту, а продолжение приходит ОТДЕЛЬНОЙ книгой. Работа двухзонная: **платформа** — предложить перенос при заведении продолжения и провести выбранные слои; **движок** — форма переносимого (что именно едет: `src`/`sense`/`dst`/`gender`/`status`, и что делать с окнами `since_ch`/`until_ch`, которые нумерованы главами ДРУГОЙ книги). ⚠ Денежная сторона: перенос сокращает пожизненный пул банк-ролей тома 2 ($1+$1), а ошибочно перенесённая строка живёт во всей следующей книге — значит перенос обязан быть видимым и отменяемым, а не молчаливым. ⚠ Это первый предмет, за который платформе есть что заказать: её собственный major `PD-441` закрыт с её стороны, остальное — minor и info | платформа + бэкенд | скоро | книга-продолжение получает банк предшественницы двумя слоями, перенос виден владельцу и отменяем | `D39.256`, слово владельца 16.09 ⛔ **НАЗВАНО НЕЗАВИСИМО ДВУМЯ ИСТОЧНИКАМИ 16.09 (консилиум §1.2 N-1 и сессия пака `D39.257`): «решённое движком» НЕ СУЩЕСТВУЕТ КАК ХРАНИМЫЙ СТАТУС.** Статусов три — `auto`/`draft`/`approved`, а «решено» есть ВЫВОД, который считается на прогоне фильтром `dropBankSettled` из банка плюс черновиков, и предикат привязан к БАЗИСУ конкретной книги: он требует, чтобы отпечаток улик строки совпал с записанным, и чтобы то же было верно для всех членов её юнита. ⚠ У книги-продолжения улики другие по построению ⇒ переносится СОДЕРЖИМОЕ строки, а статус «решено» в новой книге заново НЕ наследуется: унаследованный, он утверждал бы совпадение улик, которого нет. ⇒ развилка стройки: либо переносить вывод вместе с уликами, на которых он сделан, либо заводить статус — и второе есть ратификация, а не оформление. ⚠ И третьего у строки нет вовсе: провенанса — откуда она пришла — нет ни поля, ни места. | +| 461 | **ПЕРЕНОС БАНКА В КНИГУ-ПРОДОЛЖЕНИЕ — СТРОЙКА ПО РЕШЕНИЮ ВЛАДЕЛЬЦА `D39.256`.** Переезжают ДВА слоя: подписанное владельцем и решённое движком. ⛔ Сегодня механизма нет ВООБЩЕ: ни один из 17 не-тестовых файлов `platform/internal/books` и `httpapi` не упоминает ни сид, ни глоссарий, ни дельту, а продолжение приходит ОТДЕЛЬНОЙ книгой. Работа двухзонная: **платформа** — предложить перенос при заведении продолжения и провести выбранные слои; **движок** — форма переносимого (что именно едет: `src`/`sense`/`dst`/`gender`/`status`, и что делать с окнами `since_ch`/`until_ch`, которые нумерованы главами ДРУГОЙ книги). ⚠ Денежная сторона: перенос сокращает пожизненный пул банк-ролей тома 2 ($1+$1), а ошибочно перенесённая строка живёт во всей следующей книге — значит перенос обязан быть видимым и отменяемым, а не молчаливым. ⚠ Это первый предмет, за который платформе есть что заказать: её собственный major `PD-441` закрыт с её стороны, остальное — minor и info | платформа + бэкенд | скоро | книга-продолжение получает банк предшественницы двумя слоями, перенос виден владельцу и отменяем | `D39.256`, слово владельца 16.09 ⛔ **НАЗВАНО НЕЗАВИСИМО ДВУМЯ ИСТОЧНИКАМИ 16.09 (консилиум §1.2 N-1 и сессия пака `D39.257`): «решённое движком» НЕ СУЩЕСТВУЕТ КАК ХРАНИМЫЙ СТАТУС.** Статусов три — `auto`/`draft`/`approved`, а «решено» есть ВЫВОД, который считается на прогоне фильтром `dropBankSettled` из банка плюс черновиков, и предикат привязан к БАЗИСУ конкретной книги: он требует, чтобы отпечаток улик строки совпал с записанным, и чтобы то же было верно для всех членов её юнита. ⚠ У книги-продолжения улики другие по построению ⇒ переносится СОДЕРЖИМОЕ строки, а статус «решено» в новой книге заново НЕ наследуется: унаследованный, он утверждал бы совпадение улик, которого нет. ⇒ развилка стройки: либо переносить вывод вместе с уликами, на которых он сделан, либо заводить статус — и второе есть ратификация, а не оформление. ⚠ И третьего у строки нет вовсе: провенанса — откуда она пришла — нет ни поля, ни места. ⛔ **РАЗВИЛКА, КОТОРУЮ РЕШАТЬ ДО ПРОМТА — МЕТКА ИСТОЧНИКА у перенесённого слоя, и от неё зависит, сэкономит ли перенос хоть доллар (разбор советчика 16.09, адреса пере-сняты).** Как `mined` — строка отвечает «да» предикату `backend/internal/membank/memseed.go:766`=`Source == "mined"`, майнер тома 2 пере-предлагает поверхность, фильтр решённого её settled не видит ⇒ терминолог пере-спрашивает и ПЕРЕ-ПЛАТИТ каждую строку, а авто-банк перепишется первым же прогоном. Как сид владельца — не пере-платится, НО правка сид-ключа с экрана подписи запрещена ⇒ перенесённую ошибку не исправить, что противоречит требованию «видимо и отменяемо» этого же ряда, и слово движка ложится в файл руки владельца против онтологии. ⇒ предложен ТРЕТИЙ источник с меткой «унаследованное», грузимый между сидом и авто-банком. ⚠ И различить происхождение по самой строке НЕЛЬЗЯ: комментарий у того же предиката говорит, что строка mined-дельты владельца и строка авто-банка отвечают одинаково, документа происхождения не несёт ни та ни другая. ⚠ Перенос обязан произойти ДО первого прогона тома 2, иначе двигается базовый снапшот и черновая волна пере-платится. ⚠ И платформа СОБРАТЬ переносимую строку из проекции не может (в ней нет рода, склонения и заметки), а копировать слияние руками платформы значит пере-реализовать закон движка ⇒ нужен $0-глагол экспорта переносимого слоя, и сегодня его нет | | 462 | **АРМ `unresolved` СЧИТАЕТСЯ ПО ЗНАМЕНАТЕЛЮ, ИЗ КОТОРОГО САМ ВЫЧТЕН — доля выходит бессмысленной, и сегодня это невидимо.** Пост-колл-знаменатель = `preCall − unresolved` (`backend/cmd/tmbankprobe/main.go:324`=`rows the role ANSWERED`), а арм отбирает ровно вычтенные строки (`backend/internal/pipeline/stopcontest.go:78`=`CountUnresolved`). На купленном сырье популяция ноль ⇒ в таблице чувствительности не видно. Показано ИСПОЛНЕНИЕМ (ось приёмки, синтетический лист из двух строк): «unresolved only 1/1 = 100.0%» при двух строках листа. ⚠ Денег сегодня не стоит — платного потребителя у предиката нет вовсе, — но по этой сетке будут выбирать ПОРОГ ЗА ДЕНЬГИ, и до первого такого читателя дефект обязан уйти: либо арм считать к pre-call-знаменателю, либо печатать абсолютом без доли | бэкенд | скоро | доля арма считается по популяции, в которую он входит; пин на синтетике | `D39.257` п.5, ось денег | | 463 | **НОВЫЙ ГАРД ЦЕЛИ ЧУВСТВИТЕЛЕН К РЕГИСТРУ, а его сосед по паку — нет.** Исполнено осью: `target="RU"` ⇒ `HasData=false`, `missing=[glossary_header editor_header]`; `"Ru"` и `"ru "` — то же, тогда как `DeclinePhrasesFor("RU ")` регистр и пробелы СВОРАЧИВАЕТ (`backend/internal/lang/declinephrases.go:92`=`strings.ToLower(strings.TrimSpace(targetLang))`), и это прямо запинено доводом «книга, написанная `RU`, молча остаётся без реестра». ⇒ книга с `target_lang: RU` раньше молча шла без блока, теперь НЕ СТАРТУЕТ вовсе. Живых книг с таким написанием 0 из 48 (контроль: yaml прочитано 180, конфигов книг 48, все `ru`) ⇒ риск будущей пары, не сегодняшний. Лечение — свёртка в `InjectionTextsFor`, одна строка | бэкенд | когда-нибудь | регистр цели сворачивается одинаково гардом и реестром | `D39.257` п.6 | | 464 | **ДОККОММЕНТАРИЙ И ПИН СЧИТАЮТ ЧЕТЫРЕ ДВЕРИ ПРИ ПЯТИ АРМАХ.** `backend/internal/pipeline/injectionpreflight.go:24`=`rows reach a book through` перечисляет четыре (терминолог, сид, мината-дельта, авто-банк), пропуская `gates.banknote`, который в самой функции стоит вторым кейсом; тот же счёт в пине (`backend/internal/pipeline/contourpreflight_test.go:349`=`disjunction over the four doors bank rows come through`) при ПЯТИ подтестах. Заголовок отчёта «арм пять» верен — расходится проза вокруг. ⚠ Класс знакомый: комментарий, несущий ЧИСЛО, протухает молча | бэкенд | когда-нибудь | число в доккомментарии и пине равно числу арм | `D39.257` п.6 | | 465 | **РЕЕСТР ОТКАЗНЫХ ФРАЗ ЗАПОЛНЯЕТСЯ ТОЛЬКО С ИЗМЕРЕННОЙ ПОПУЛЯЦИЕЙ.** Сегодня лендится ПУСТЫМ и запинен пустым (`backend/internal/lang/declinephrases_test.go:22`=`TestTheDeclineRegistryShipsEmpty`), и это решение оркестратора, а не недоделка: цена ошибки несимметрична — ложное срабатывание выбрасывает ОПЛАЧЕННУЮ верную передачу, терм спрашивается заново, а ретрая у банк-ролей нет (ряд 438). Популяция на купленном сырье ноль: строк, похожих на отказ прозой, 0 из 265 (контроль осью). ⚠ Контрольная величина в отчёте названа неверно («23 строки файла» при 26) — пере-снять вместе с заполнением | бэкенд | когда-нибудь | фразы заведены вместе с замером их популяции на сырье; пин пустоты заменён пином состава | `D39.257` п.6, вопрос сессии 1 ⚠ **Этот же критерий закрывает и соседний вопрос — решение автора находки 16.09:** синтетичность пина пост-колл-предиката на конфликтах ОТДЕЛЬНЫМ рядом не заводится. Долг тут один и он здесь; когда придёт материал с ненулевой популяцией (длинная книга у бюджетного потолка — единственный названный кандидат), критерий сработает сам. Второй носитель одного факта — отдельный класс ошибки. | -| 466 | **ПЕРСИСТЕНЦИЯ СОСТАВА БАТЧА — последний кусок вопроса «якорь против стохастики».** Тела запросов не хранятся нигде (`LOG_LLM_BODIES` пишет только в лог и только на debug), поэтому что именно менялось во входе между покупками, восстанавливается лишь частично: замер `D39.257` п.3 закрыл 25 из 26 смен, но `key` и `related` провода не восстанавливаются ничем. Форма предложена сдачей и она дешёвая: хранить не тела, а УПОРЯДОЧЕННЫЙ состав батча плюс строки якоря, ключом на `request_hash`. ⚠ Вес «скоро» потому, что на этом стоит ратифицированное `D39.256`: без записи состава якорь от стохастики не разделится никогда, сколько бы покупок ни прошло | бэкенд | скоро | состав батча и якорь пишутся ключом на хеш запроса; вопрос о якоре отвечается замером | `D39.257` п.7, вопрос сессии 2 ⛔ **НА КУПЛЕННОМ СЫРЬЕ РАЗЛИЧИТЬ НЕЛЬЗЯ СТРУКТУРНО (замер сессии пака 16.09):** проба «уже оплачено» РЕПЛЕИТ идентичный запрос вместо повторного вопроса — у одного батча терминолога прогона B хеш в обеих покупках один, а вторая строка журнала запросов несёт нулевые токены, то есть модель не спрашивали вовсе. ⇒ пары «тот же вход, второй сэмпл» движок не производит. ⭐ **Что даёт сужение за $0:** разложить 26 сменившихся строк по их батчам на три корзины — у неё двинулся якорь; двинулся состав батча; не двинулось НИЧЕГО. Третья корзина есть чистая стохастика, и если она непуста, «причина — якорь» опровергается одним числом. ⛔ **Контрольная величина обязательна:** реконструированные батчи первой покупки обязаны воспроизвести ХЕШИ из журнала запросов (по четыре вызова терминолога у A и у B) — не сошлось, значит реконструкция негодна и вторая покупка не атрибутируется. Цена — маленький пак на час-два, $0. | +| 466 | **ПЕРСИСТЕНЦИЯ СОСТАВА БАТЧА — последний кусок вопроса «якорь против стохастики».** Тела запросов не хранятся нигде (`LOG_LLM_BODIES` пишет только в лог и только на debug), поэтому что именно менялось во входе между покупками, восстанавливается лишь частично: замер `D39.257` п.3 закрыл 25 из 26 смен, но `key` и `related` провода не восстанавливаются ничем. Форма предложена сдачей и она дешёвая: хранить не тела, а УПОРЯДОЧЕННЫЙ состав батча плюс строки якоря, ключом на `request_hash`. ⚠ Вес «скоро» потому, что на этом стоит ратифицированное `D39.256`: без записи состава якорь от стохастики не разделится никогда, сколько бы покупок ни прошло | бэкенд | скоро | состав батча и якорь пишутся ключом на хеш запроса; вопрос о якоре отвечается замером | `D39.257` п.7, вопрос сессии 2 ⛔ **НА КУПЛЕННОМ СЫРЬЕ РАЗЛИЧИТЬ НЕЛЬЗЯ СТРУКТУРНО (замер сессии пака 16.09):** проба «уже оплачено» РЕПЛЕИТ идентичный запрос вместо повторного вопроса — у одного батча терминолога прогона B хеш в обеих покупках один, а вторая строка журнала запросов несёт нулевые токены, то есть модель не спрашивали вовсе. ⇒ пары «тот же вход, второй сэмпл» движок не производит. ⭐ **Что даёт сужение за $0:** разложить 26 сменившихся строк по их батчам на три корзины — у неё двинулся якорь; двинулся состав батча; не двинулось НИЧЕГО. Третья корзина есть чистая стохастика, и если она непуста, «причина — якорь» опровергается одним числом. ⛔ **Контрольная величина обязательна:** реконструированные батчи первой покупки обязаны воспроизвести ХЕШИ из журнала запросов (по четыре вызова терминолога у A и у B) — не сошлось, значит реконструкция негодна и вторая покупка не атрибутируется. Цена — маленький пак на час-два, $0. ⭐ **$0-ПРИБОР ВТОРОГО РОДА СНЯТ СОВЕТЧИКОМ 16.09, и он говорит ПРОТИВ якоря как главной причины:** содержимым якоря объяснимы **3 смены из 25** (родственные строке якоря исходники сменились 1 из 11 и 2 из 10 против 13 из 52 и 9 из 52 у неродственных); остальное — стилистический дрейф, к якорю отношения не имеющий. ⛔ **И окончательно разделить за $0 нельзя ПО ПОСТРОЕНИЮ:** байт-идентичные сообщения при том же ординале дают чекпойнт-хит, то есть реплей вместо второго сэмпла — пере-выборки в корпусе не бывает никогда, и персистенция состава этого не изменит: она скажет лишь, ЧТО различалось. Платный различитель стоит ≈$0.12 (одна пачка, k=10, два плеча — якорь пустой против якоря из двух строк), но глагола «спросить ещё раз тем же самым» в движке нет. ⇒ **ряд научный, а не денежный: перед рядом 461 его ставить не надо** — при любой причине лечение одно, решённое не пере-спрашивать | | 467 | **ЛЕНДИНГ, ДВИГАЮЩИЙ СТРОКИ КОДА, ОБЯЗАН НАЗЫВАТЬ СДВИНУТЫЕ ЯКОРИ — сегодня это не норма, а случайность.** Пак `D39.257` сдвинул строки под 25 якорями живых доков (импорт + новые функции), и отчёт об этом молчал, включая секцию «проверено и дефекта не найдено». Поймала ось приёмки, перенавёл оркестратор. ⛔ Почему это не мелочь: пред-коммитный хук зовёт якорный линт **warn-only** (`docs/scripts/githooks/pre-commit`, греп `--lint`), то есть лендинг не остановится и расхождение станет нормой молча. Зона кода доки править не вправе — но НАЗВАТЬ обязана: «файл вырос на N строк выше строки X» стоит одной команды. ⇒ либо строка в промты зон, либо гейт, считающий дельту якорей до и после | оркестратор | скоро | сдача, двигающая строки, приносит список сдвинутых якорей; правит оркестратор | `D39.257` п.4 | | 468 | **СЕКЦИЯ `consolidation` БАНК-СТОПА ТОЖЕ БЕЗ ЧИТАТЕЛЯ — ряд 224 накрывал только `proposed`.** Движок публикует, что банк консолидирован ЧАСТИЧНО (неотвеченные строки, выброшенные батчи), а платформа этого не читает: человек подписывает как ПОЛНЫЙ банк то, что движок сам называет неполным. ⛔ Пере-снято мной (не по чужому отчёту): `consolidat\|unanswered\|batches_dropped` по `platform/internal` — **3 хита при 195 не-тестовых и тестовых .go**, и все три посторонние (подметание в `runs/sweep_test.go`, комментарии о книжных проходах в `platform/internal/pricing/pricing.go:112`=`BookOnce is the BOUND` и `platform/internal/ingest/manifest.go:97`=`classifier read the whole book`). Движковая половина закрыта 08.09 (`D39.228`), платформенная не построена. ⚠ Форма лечения названа заранее, чтобы не нарушить закон шва: бит полноты берётся ГОТОВЫМ у движка, а не выводится платформой заново (иначе это дубль движкового закона, запрещённый п.6 закона шва); поле на странице банка — минором к контракту 14. Нашёл сквозной аудит закрытости 16.09 | платформа + контракт | скоро | подписывающий видит, что банк консолидирован частично, и бит берётся у движка | аудит 16.09, смежный ряд 224 | | 469 | **ДВА КОМПАРАТОРА ОДНОГО БИНАРЯ ДАЮТ РАЗНЫЕ ЧИСЛА НА ОДНОМ СЫРЬЕ.** `-passes A` печатает «12 of 69», `-compare A-pass1,A-pass2` — «13 of 69»: второй засчитывает сменой строку, решённую банком. Доккомментарий `backend/cmd/tmbankprobe/main.go:440`=`the §4.4 instrument` зовёт вторым прибором именно тот, чьё число в акт НЕ попало. Ряд 462 этого не покрывает — там только арм `unresolved`. ⚠ На этом же стоит эррата 16.09-в: пока числа расходятся, любая ссылка на «знаменатель §4.4» двусмысленна | бэкенд | скоро | оба компаратора на одном сырье дают одно число либо расхождение объявлено и названо в справке | сессия пака D39.257, ответ на вопрос оркестратора 16.09 | @@ -392,3 +392,4 @@ | 475 | **УЛИКИ ПРОГОНА A НЕЧИТАЕМЫ ДВИЖКОВЫМ СТОРОМ, И НОСИТЕЛЯ ЭТОГО ФАКТА НЕТ НИГДЕ.** База прогона A несёт схему 16 при голове 18: `OpenReadOnly` отказывает, а `Open` МИГРИРУЕТ, то есть уничтожает улику при попытке её прочесть. Свойство архива, а не дефект кода — но следующий, кто захочет реплей, потратит час, чтобы это выяснить, и рискует испортить сырьё | бэкенд | когда-нибудь | способ читать старые прогоны назван носителем; опасность миграции при чтении объявлена рядом с ней | сессия пака D39.257, её §10 | | 476 | **ДЕНЬГИ ВТОРОГО ВЫЗОВА НЕ ПОСЧИТАНЫ:** сетка чувствительности даёт число СТРОК, а не сумму, поэтому «сколько стоит включить второй вызов» сегодня не отвечается ничем. Предмет пака-маршрутизатора, но сегодня он не записан нигде, и по этой же сетке будут выбирать порог за деньги | бэкенд | скоро | рядом с числом строк стоит их цена | сессия пака D39.257, её §10 | | 477 | **ЗАМЕР M2 — ПОПУЛЯЦИЯ КНИГ С ДВОЙНИКОМ КЛЮЧА НЕ ИЗМЕРЕНА, А НА НЕЙ СТОИТ ДОВОД «ПАК 1 БЕСПЛАТЕН ПО СНАПШОТАМ».** Прибор ряда 330 (`backend/internal/membank/memseed.go:714`=`func UnverifiedKeyConflicts`) ключуется на `entryFiringKeys`, поэтому пере-определённый вопрос M2 он вернёт тем же НУЛЁМ ПО ПОСТРОЕНИЮ — то есть «ноль» будет ответом прибора на свой вопрос, а не о предмете. Чтобы вопрос был задан, нужны три правки `membank`: снять пропуск пары подписанных (`backend/internal/membank/memseed.go:733`=`ApprovedSharedKeyCollisions`), снять пропуск одинаковой передачи (`backend/internal/membank/memseed.go:735`=`ei.Dst == ej.Dst`) и экспортировать порог ключа (`backend/internal/membank/memory.go:78`=`func minKeyLenFor`). ⚠ Значит это правка ДВИЖКА, а не $0-ресёрч, как значилось прежде. ⛔ Цена молчания: пока популяция не измерена, довод консилиума о бесплатности пака 1 по снапшотам остаётся недоказанным. Ряд 330 — ДРУГОЙ предмет (решение владельца по противоречию, цена там уже замерена на 142 книгах) | бэкенд | скоро | популяция книг с двойником ключа измерена прибором, который этот вопрос действительно задаёт | консилиум `D39.253` §3 строка 0-M2, ответ автора 16.09 | +| 478 | **ОРДИНАЛ БАТЧА ВХОДИТ В КЛЮЧ ПОКУПКИ ⇒ СНЯТИЕ ОДНОЙ РЕШЁННОЙ СТРОКИ ПЕРЕ-ПОКУПАЕТ ВСЕ ПОСЛЕДУЮЩИЕ БАТЧИ.** Ключ берёт номер куска (`backend/internal/pipeline/render.go:366`=`strconv.Itoa(req.ChunkIdx)`), а терминолог нумерует батчи порядком (`backend/internal/pipeline/terminologist.go:1003`=`Chapter: 0, ChunkIdx: i`). ⇒ когда фильтр решённого убирает кандидата из раннего батча, ординалы ВСЕХ следующих сдвигаются, хеши меняются, чекпойнт не находится — и они покупаются заново, ДАЖЕ когда их сообщения не изменились ни на байт. Замерено советчиком на купленном сырье B (батчи покупки 1 с номерами 1 и 2 стали в покупке 2 номерами 0 и 1), оба адреса пере-сняты оркестратором. ⛔ Бьёт прямо по экономике `D39.256`: чем лучше работает «решённое остаётся решённым», тем больше сдвиг ординалов и тем дороже он обходится. Комментарий у фильтра называет только смену СОСТАВА батча и про ординал молчит | бэкенд | скоро | ключ покупки не зависит от порядкового номера батча либо зависимость названа у фильтра и учтена сметой | советчик Fable 16.09, пере-снято по двум адресам |