diff --git a/docs/BACKLOG.md b/docs/BACKLOG.md index 09a4b010..7fe606ed 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`; обновлять при каждом лендинге):** всего **355** строк · зона бэкенд **186** строго / **239** широко (⚠ колонки счётчик читает С КОНЦА — испр. D39.116) · **блокеров очереди 0** (236 закрыта D39.175; **371** — актом D39.233, **360** — актом D39.232, обе 10.09), платные прогоны разблокированы · «скоро» **186** (перечень — грепом по таблице, рукописный список снят D39.126) · гейт-строка эксп-22: 153 (плюс 150 — руки владельца; ⚠ 55 из гейтов СНЯТА — D39.198 п.5); строка 5 — остаток гейчен ре-пробой 74, носитель события теперь строка 188 (аудит D39.140); остальное «когда-нибудь». ⚠ Счёт — НИЖНЯЯ граница долга, не потолок (разбор — легенда таблицы ниже). +> - **СЧЁТ ОЧЕРЕДИ на 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); остальное «когда-нибудь». ⚠ Счёт — НИЖНЯЯ граница долга, не потолок (разбор — легенда таблицы ниже). > - ⚠ **Переезд 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; правки — только через оркестратора) @@ -379,7 +379,7 @@ | 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 | +| 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. | | 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 | @@ -387,7 +387,8 @@ | 470 | **РИДЕР ТАБЛИЦЫ СТОПА МОЛЧА ТЕРЯЕТ ДАННЫЕ, А КОММЕНТАРИЙ УТВЕРЖДАЕТ ОБРАТНОЕ.** Строка-продолжение контекста, начинающаяся с ` why: `, разбирается как ПОЛЕ: `Signals` перезаписаны, хвост контекста потерян, счёт строк цел, ошибки нет. ⛔ Комментарий `backend/internal/pipeline/bankstopparse.go:109` утверждает, что случай ловит проверка объявленного счёта — опровергатель показал ИСПОЛНЕНИЕМ, что не ловит. Комментарий, несущий ложный вывод, опаснее самой потери: он закрывает вопрос, не задав его | бэкенд | скоро | вход со строкой-продолжением разбирается верно либо отвергается громко; комментарий говорит то, что делает код | сессия пака D39.257, её собственный адверсариальный круг | | 471 | **КОНТРОЛЬ `conventions carried` НЕСЁТ ДВА СМЫСЛА В ДВУХ ЗАГРУЗЧИКАХ:** у листа это `Conventions > 0`, у JSON — присутствие поля. Один и тот же файл этот класс прямо запрещает для `conf`, то есть правило в нём уже сформулировано и нарушено соседней строкой | бэкенд | когда-нибудь | контроль отвечает на один вопрос в обоих загрузчиках | сессия пака D39.257, ответ 16.09 | | 472 | **`immutable=1` НИЧЕМ НЕ ЗАПИНЕН** — ни тестом, ни мутацией, ни рядом, хотя на нём держится обещание «харнесс никогда не пишет в купленную улику». Замерено сессией: `mode=ro` без него оставил рядом с уликой файл `-shm`, то есть открытие БЕЗ флага уликой уже не безобидно | бэкенд | скоро | обещание неприкосновенности улики стережёт пин, а не дисциплина читающего | сессия пака D39.257, ответ 16.09 | -| 473 | **ПРИБОР НЕ ПЕЧАТАЕТ КОНТРОЛЬ, НА КОТОРЫЙ ССЫЛАЕТСЯ АКТ.** Утверждение «компаратор не слеп — движение входа есть у 4 из 56 и 8 из 51 НЕ менявшихся строк» верно и пере-снято поимённо, но сданный `tmbankprobe` его не считает: оба компаратора сравнивают вход только у СМЕНИВШИХСЯ строк, и для пере-снятия понадобилась отдельная программа на 90 строк. ⚠ Это контроль отрицательного замера — ровно то, что канон требует ПЕЧАТАТЬ, а не упоминать; в приборе он стоит три строки | бэкенд | скоро | контрольная величина печатается самим прибором, а не восстанавливается сторонней программой | сессия пака D39.257, ответ 16.09 | +| 473 | **ПРИБОР НЕ ПЕЧАТАЕТ КОНТРОЛЬ, НА КОТОРЫЙ ССЫЛАЕТСЯ АКТ.** Утверждение «компаратор не слеп — движение входа есть у 4 из 56 и 8 из 51 НЕ менявшихся строк» верно и пере-снято поимённо, но сданный `tmbankprobe` его не считает: оба компаратора сравнивают вход только у СМЕНИВШИХСЯ строк, и для пере-снятия понадобилась отдельная программа на 90 строк. ⚠ Это контроль отрицательного замера — ровно то, что канон требует ПЕЧАТАТЬ, а не упоминать; в приборе он стоит три строки | бэкенд | скоро | контрольная величина печатается самим прибором, а не восстанавливается сторонней программой | сессия пака D39.257, ответ 16.09 ⚠ **Уточнение автора находки 16.09, без которого исполнитель сделает меньше нужного:** три строки — это ПЕЧАТЬ числа, а проверяемость даёт не она, а то, что контроль считается ТЕМ ЖЕ входом, что и остальная таблица. Посчитанный отдельной функцией, он станет вторым смыслом под одним именем — ровно ряд **471**, только в новом месте. | | 474 | **ПОЛОВИНЧАТЫЙ НАБОР ТЕКСТОВ ИНЪЕКЦИИ НЕ ЗАПИНЕН СКВОЗНО.** Предикат полноты запинен на байтах в `internal/lang`, но проводка проверена только на цели, где строк нет ВОВСЕ; цель с `glossary_header` и без `editor_header` сквозным тестом не покрыта. Причина названа честно (в embedded-данных ровно одна цель `ru`, синтетическая вторая пере-чеканила бы unit id каждой книги) — и всё же ветка, ради которой строился громкий отказ, остаётся без сквозного пина | бэкенд | скоро | цель с половинным набором ловится сквозным тестом либо невозможность этого записана носителем | сессия пака D39.257, её §10 | | 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 | diff --git a/docs/research/35-bank-memory-consilium.md b/docs/research/35-bank-memory-consilium.md index 71faf857..f756123e 100644 --- a/docs/research/35-bank-memory-consilium.md +++ b/docs/research/35-bank-memory-consilium.md @@ -1487,7 +1487,7 @@ D39.50 (просьба владельца против «до него kwic не | # | остаток | почему не закрыт | чем закрывается | |---|---|---|---| -| О-1 | **все правки по кругу 3 — включая сворачивание N-2 в N-1 — ни одним кругом не судились** | три круга — потолок заказа, четвёртого нет | круг проверки следующей смены; предмет назван поимённо в этой таблице | +| О-1 | ⚠ **Сужено 16.09, потому что в прежней форме уже неверно.** Было: «все правки по кругу 3 ни одним кругом не судились». Их СУДИЛИ — отдельной осью приёмки оркестратора («несудёные починки круга 3»: из 19 проверенных дефектных 7, включая то, что N-2 был свёрнут только в теле), и найденное внесено. **Несудёным осталось у́же:** правки последнего узкого круга (7 мажоров, 13 миноров) и правки 16.09 по паку D39.257 и решению D39.256 — их не судил никто | три круга — потолок заказа, четвёртого нет | круг проверки следующей смены; предмет назван поимённо в этой таблице | | О-2 | цена лечится выборкой названа механизмом, но не величиной | величина требует замера M4, а он требует стройки Б-11 и санкции владельца | В4 → Б-11 → M4 | | ~~О-3~~ | ⭐ **ЗАКРЫТ 16.09 владельцем:** «переносим подписанное плюс решённое движком», ратифицировано `D39.256`; носитель стройки — ряд 461 (платформа проводит перенос, движок определяет форму слоя). Остатком больше не является. Ниже — как он выглядел на момент сдачи: умолчание, которое я предложил, оказалось пустым для некурированной книги | слово владельца | | О-4 | ⚠ у моего прохода починки нет собственного прибора | дважды за смену я отчитался о правке, которой не сделал | следующая смена: после каждого прохода — греп по каждому объявленному месту, а не по черновику |