diff --git a/docs/BACKLOG.md b/docs/BACKLOG.md index de35ccc5..5bbc4bfa 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). Здесь только долг и его диспозиции. -> - **СЧЁТ ОЧЕРЕДИ на 07.09 (скриптом по таблице — `python3 docs/scripts/counts.py`; обновлять при каждом лендинге):** всего **256** строк · зона бэкенд **126** строго / **172** широко (⚠ колонки счётчик читает С КОНЦА — испр. D39.116) · **блокеров очереди 0** (236 закрыта D39.175), платные прогоны разблокированы · «скоро» **118** (перечень — грепом по таблице, рукописный список снят D39.126) · гейт-строка эксп-22: 153 (плюс 150 — руки владельца; ⚠ 55 из гейтов СНЯТА — D39.198 п.5); строка 5 — остаток гейчен ре-пробой 74, носитель события теперь строка 188 (аудит D39.140); остальное «когда-нибудь». ⚠ Счёт — НИЖНЯЯ граница долга, не потолок (разбор — легенда таблицы ниже). +> - **СЧЁТ ОЧЕРЕДИ на 07.09 (вечер) (скриптом по таблице — `python3 docs/scripts/counts.py`; обновлять при каждом лендинге):** всего **254** строк · зона бэкенд **125** строго / **170** широко (⚠ колонки счётчик читает С КОНЦА — испр. D39.116) · **блокеров очереди 0** (236 закрыта D39.175), платные прогоны разблокированы · «скоро» **115** (перечень — грепом по таблице, рукописный список снят 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; правки — только через оркестратора) @@ -37,7 +37,7 @@ | 90 | **Ф2-кандидаты 02-mvp-плана без носителя** (свип-хвост, D39.73): CometKiwi/T-index метрики судьи · Batch API судьи (экономия) · llama-server-интеграция локали · стриминг — взять/закрыть при пилот-препе; + H16 самоулучшение (V3-п.2, ПТ-26): дизайн петли по данным судьи — тем же препом | полигон/бэкенд | когда-нибудь (Ф2.5) | пилот-преп-промт (с 85) | 02-mvp-plan, D39.66, D39.73, D39.80 | | **— НАХОДКИ СВИПА ПОЛНОТЫ (D39.66: 951 обязательство проверено, потери возвращены в трекер) —** | | | | | | | 80 | **Резюме-слой памяти** — проза-суммарайзер ЗАКРЫТ (D39.69); строка = ГЕЙТ ПИЛОТА Ф2.5: первый деливерабл пилота — «допускает ли автономная нарратив-состояние-строка ДЕТЕРМИНИРОВАННЫЙ верификатор (source-anchored) — или это D1-компаундинг со схемой»; не-покрытые классы (source-anchored reveal · арк-колбэки без ключа) реальны, но не измерены как дефект | Ф2.5 (Q3 подтверждён D39.70) | когда-нибудь (пилот) | Ф2.5 пре-рег | D25 п.8–9, D39.66, D39.69 | -| 81 | **ja-преп B6-ja (сужено пост-сверкой D39.66)**: Поливанов-валидатор (`translit_policy` = «Phase 2»-заглушка, `backend/internal/store/migrate.go:187`=`translit_policy TEXT` и `backend/internal/store/migrate.go:195`=`ruby_reading`) + kana-омограф POS/known-word гейтинг / B6-токенизатор (`backend/internal/membank/memory.go:1181`=`KANA and HAN are deliberately NOT boundary-checked`); чек-лист kana-алиасов сида УЖЕ построен (backend/README §ja + `AttachRubyAliasesToManual`) — остаток в нём только дизамбигуация двойных чтений (тот же B6) | бэкенд | когда-нибудь (перед ja→ru) | ja→ru-пак (рядом 35) | D16.4, D17.1, D18, D39.66 | +| 81 | **ja-преп B6-ja (сужено пост-сверкой D39.66)**: Поливанов-валидатор (`translit_policy` = «Phase 2»-заглушка, `backend/internal/store/migrate.go:187`=`translit_policy TEXT` и `backend/internal/store/migrate.go:195`=`ruby_reading`) + kana-омограф POS/known-word гейтинг / B6-токенизатор (`backend/internal/membank/memory.go:1184`=`KANA and HAN are deliberately NOT boundary-checked`); чек-лист kana-алиасов сида УЖЕ построен (backend/README §ja + `AttachRubyAliasesToManual`) — остаток в нём только дизамбигуация двойных чтений (тот же B6) | бэкенд | когда-нибудь (перед ja→ru) | ja→ru-пак (рядом 35) | D16.4, D17.1, D18, D39.66 | | 82 | **Морфо-гейт РОДА** (C3: русский глагол прош. вр. при gender=hidden = механический спойлер-канал; «жалоба №1 читателей MTL»; python-сайдкар/pymorphy, связка с морфопроходом Decl из 73). **$0-прототип получен эксп-21** (`battery.check_gender`: карточки из подписанного сида, фильтр по именительному падежу, 86–112 сверок/арм — D39.117); движковый гейт не построен | бэкенд | когда-нибудь (Ф2-гейты) | отдельный пак (с 52) | 06-реестр C3, research/12, D39.66, **D39.117** | | 85 | **Пилот-преп добор** (к переупаковке PACKAGE4): Bertalign GOLD-пары + zh→ru spot-check (D29.2в; GPL-тулинг отдельно) · fidelity-каскад R2 shadow с корпус-подготовкой (D25.2) · exp08 v3 пере-съём COGS до фиксации budget_usd (D21.8) | полигон | когда-нибудь (Ф2.5) | пилот-преп-промт | D25, D29, D21.8, D39.66 | | **— ПАК-21 «чекеры»: РАСТВОРЁН (D39.62); шестёрка исполнена 2/6 фазой 2 (D39.64: #11 · строка 26), остаток — ниже —** | | | | | | @@ -130,7 +130,7 @@ | 228 | **Отклонённая поверхность возвращается АЛИАСОМ уцелевшей строки — движок не держит того, что канон уже обещает** (находка воркфлоу-ревью P9 в форме Д1, УЗКО пере-сформулирована бэкенд-сессией 28.08 и принята приёмкой): канон говорит дословно «declining a surface removes EVERY window of that surface» (`docs/architecture/14-api-contract/openapi.yaml:2362`=`declining a surface removes EVERY window`; адрес пере-нацелен 02.09 — минор 0.9.0 сдвинул прежний 2051), а эмиссия майнера энтити-широка (`backend/internal/pipeline/miner_emit.go`, `clusterTouches`), тогда как фильтр авто-банка ключуется только по собственному `src` строки (`backend/internal/pipeline/mining.go:179`=`NormalizeSourceKey(m.Src)`). ⚠ **Правильная форма — снять АЛИАС со строки, а не снести строку:** расширение `decline` до энтити противоречило бы ратифицированному контракту, и именно поэтому бэкенд-сессия применила право §9 и НЕ чинила это попутно. Предмет — банковая онтология (`18-bank-ontology.md`), не тихая порча | бэкенд | скоро (гейт: заказ по читающей стороне банка) | отдельный заказ узкой формы | воркфлоу-ревью P9; форма — бэкенд-сессия 28.08, D39.164 | | 229 | **Снапшот не фолдит модель ВНУТРЕННИХ гейтов — флип провода под неизменным `request_hash`** (самонаходка бэкенд-сессии 28.08, подтверждена приёмкой): снапшот фолдит `Capability` СТАДИЙНЫХ моделей и их эскалации (`backend/internal/pipeline/snapshot.go:316-340`), но модель `gates.terminology.model` / `gates.repair.model` (`backend/internal/config/internal_call.go:72`) не фолдится сознательно — а терминолог шлёт ДВА системных сообщения, так что смена оси `capabilities.system_messages` у провайдера, которым пользуется только гейт, меняет байты запроса при неизменном хеше: тихий false-hit класса D5.2. ⚠ **Сегодня ЛАТЕНТНА и денег не стоит — проверено приёмкой: гейта `terminology` нет НИ В ОДНОМ конфиге репозитория** (`grep -c terminology configs/pipeline-c1.yaml` = 0). Триггер починки — день, когда гейт включат с провайдером, объявляющим НЕдефолтную возможность. ⚠ Цена лечения — денежная: фолд гейт-моделей сдвигает хеши и обесценивает чекпойнты; дешёвая форма — фолдить ТОЛЬКО недефолтное (приём `omitempty`, прецедент `MinMaxTokens`), тогда сегодняшние снапшоты остаются байт-равными | бэкенд | когда-нибудь (гейт: включение внутреннего гейта либо следующее касание снапшот-контракта) | правка снапшот-контракта | самонаходка бэкенд-сессии, D39.164 | | 230 | **Инертный `decline` подписанного сид-терма отвечает `already_applied` вместо единственной работающей инструкции** (названный размен пака «тихая порча», D39.164): сузив отказ по поверхности ради СХОДИМОСТИ повтора, движок потерял поучение в одном углу — когда отказ и записан, и по-прежнему инертен против `glossary_seed`, пользователь получает «уже применено» вместо «убери терм из сида». Сходимость сочтена более тяжёлой обязанностью (на ней стоит вся раскладка класса 15 и синхронная дверь платформы), но размен РЕАЛЕН. **Форма закрытия — поле отчёта со стоячим фактом**, то есть аддитивная правка формы шва: платформенный `BankReport` — аллоулист, лишнее поле на провод не уедет само | бэкенд + контракт | скоро (с ближайшим касанием отчёта двери) | аддитивное поле отчёта | размен пака «тихая порча», D39.164 | -| 232 | ⚠ **ЛИД ПРОТУХ — испр. 05.09: вторая половина (слот гранта на прерванном между волнами юните) ЗАКРЫТА** паком «число согласия» (`D39.187`, пин `TestAUnitInterruptedBetweenWavesTakesNoSecondSlot`; эррата 03.09-а). **Настоящий остаток** — две схемные оси («первая редакторская стадия», «прерванная пере-делка») и отложенное слово владельца о семантике переноса. **Ось «свежий/пере-делка» выведена из ПОЛНОТЫ СТРОК, а не из факта отгрузки** (D39.170, находки охотника 3 и 4). Следствия ДЕНЕЖНЫЕ на слух покупателя: добавление стадии в пайплайн превращает ДОЧИТАННУЮ книгу в «3 unit(s) NEVER delivered» и приглашает купить её снова; юнит, прерванный между волнами (signature stop, денежный потолок, Ctrl-C), второй раз считается свежим и тратит слот гранта повторно — замерено 4 купленных юнита → 2 главы. Носитель у движка УЖЕ есть: реестр анонсов `events_outbox.once_key` (`backend/internal/pipeline/events.go:401`=`unitOnceKey is the identity of one announcement`), ключ `unit:<книга>:<волна>:<глава>:<юнит>`, монотонный на всю жизнь книги и переживающий и добавление стадии, и обрыв между волнами. ⚠ **ПЕРВАЯ ПОЛОВИНА ИСПОЛНЕНА 31.08** (`bb541a8`, экземпляр A11; испр. 02.09): читающий метод `store.AnnouncedOnceKeys()` построен, его докстринг называет эту строку по номеру, предикат — `delivered[key] && unitShipped(rows)`. **ЖИВОЙ ОСТАТОК — ВТОРАЯ ПОЛОВИНА:** юнит, прерванный МЕЖДУ ВОЛНАМИ, повторно тратит слот гранта (разбор — `backend/docs/MONEY_HONESTY_REPORT.md` §4.5). ⚠ РАЗВИЛКА, которую надо назвать в промте: ключ несёт ВОЛНУ, значит «юнит отгружен» — факт per-wave. **Ответ есть и он не новый механизм:** отгрузкой считается волна, владеющая ОТГРУЖАЮЩЕЙ (последней) стадией — `backend/internal/pipeline/snapshot.go:243`=`finalStageWave is the wave that owns the SHIPPING (last) stage`; на редакторском конвейере это edit, на черновом-только — draft. Проверять надо ИМ, иначе черновой-только конвейер получит ось, которая никогда ничего не считает отгруженным (предложено движковой сессией при сдаче, сверено мной по коду) | бэкенд | скоро | Читающий метод стора + перевод оси на факт отгрузки; отдельный пак | приёмка D39.170 | +| 232 | ⚠ **ЛИД ПРОТУХ — испр. 05.09: вторая половина (слот гранта на прерванном между волнами юните) ЗАКРЫТА** паком «число согласия» (`D39.187`, пин `TestAUnitInterruptedBetweenWavesTakesNoSecondSlot`; эррата 03.09-а). **Настоящий остаток** — две схемные оси («первая редакторская стадия», «прерванная пере-делка») и отложенное слово владельца о семантике переноса. **Ось «свежий/пере-делка» выведена из ПОЛНОТЫ СТРОК, а не из факта отгрузки** (D39.170, находки охотника 3 и 4). Следствия ДЕНЕЖНЫЕ на слух покупателя: добавление стадии в пайплайн превращает ДОЧИТАННУЮ книгу в «3 unit(s) NEVER delivered» и приглашает купить её снова; юнит, прерванный между волнами (signature stop, денежный потолок, Ctrl-C), второй раз считается свежим и тратит слот гранта повторно — замерено 4 купленных юнита → 2 главы. Носитель у движка УЖЕ есть: реестр анонсов `events_outbox.once_key` (`backend/internal/pipeline/events.go:401`=`unitOnceKey is the identity of one announcement`), ключ `unit:<книга>:<волна>:<глава>:<юнит>`, монотонный на всю жизнь книги и переживающий и добавление стадии, и обрыв между волнами. ⚠ **ПЕРВАЯ ПОЛОВИНА ИСПОЛНЕНА 31.08** (`bb541a8`, экземпляр A11; испр. 02.09): читающий метод `store.AnnouncedOnceKeys()` построен, его докстринг называет эту строку по номеру, предикат — `delivered[key] && unitShipped(rows)`. **ЖИВОЙ ОСТАТОК — ВТОРАЯ ПОЛОВИНА:** юнит, прерванный МЕЖДУ ВОЛНАМИ, повторно тратит слот гранта (разбор — `backend/docs/MONEY_HONESTY_REPORT.md` §4.5). ⚠ РАЗВИЛКА, которую надо назвать в промте: ключ несёт ВОЛНУ, значит «юнит отгружен» — факт per-wave. **Ответ есть и он не новый механизм:** отгрузкой считается волна, владеющая ОТГРУЖАЮЩЕЙ (последней) стадией — `backend/internal/pipeline/snapshot.go:247`=`finalStageWave is the wave that owns the SHIPPING (last) stage`; на редакторском конвейере это edit, на черновом-только — draft. Проверять надо ИМ, иначе черновой-только конвейер получит ось, которая никогда ничего не считает отгруженным (предложено движковой сессией при сдаче, сверено мной по коду) | бэкенд | скоро | Читающий метод стора + перевод оси на факт отгрузки; отдельный пак | приёмка D39.170 | | 233 | **Трата терминолога вне объёмного потолка масштабируется КНИГОЙ, а не грантом** (D39.170). Замер: три последовательные покупки по одному юниту на четырёхглавной книге дали три полнокнижных консолидации по $0.005460 каждая — покупка одного юнита обходится в ~1.5× стоимости самого юнита. Книга на 500 юнитов, проданная по одному, оплатит 500 полнокнижных проходов. Место траты — в ЦЕНЕ, а не в потолке (решение подтверждено), но при мелкой нарезке продажи она перестаёт быть накладной и становится основной статьёй: это ВХОД В КАЛИБРОВКУ ЦЕНЫ, а не сноска | бэкенд | скоро | Учесть в модели цены при следующей калибровке; либо чекпойнт консолидации, переживающий покупку | приёмка D39.170 | | 237 | **Два загейченных триггера НАЖАТЫ и не отработаны** (реестр `13-tech-debt-anchors.md` §Б-108, сверено 30.08). **(а) `go.work`:** условие «появление Go-кода платформы» выполнено давно — `platform/go.mod` есть, `ls go.work` в корне даёт «No such file or directory». Ратифицировано D39.85 §8 п.4 (`docs/research/23-engine-platform-seam.md:66` = `go.work — коммитить, когда у платформы появится Go-код`); цена — один файл, по тому же §6 он решает только dev-удобство и не меняет ни видимости, ни версий. **(б) вендор-сверка маппинга эффорта `deepseek-v4-pro`:** вахта D39.92 сработала 13.08 changelog'ом вендора. ⚠ **Испр. 05.09: НОСИТЕЛИ БОЛЬШЕ НЕ ПРОТИВОРЕЧАТ** — и квирки (`docs/experiments/00-provider-quirks.md` §3г), и `STACK.md` говорят одно: ручка ДОХОДИТ до модели. Прежняя редакция обвиняла оба носителя в утверждении «ручки у pro НЕТ», которого ни один из них уже не несёт, и это заставляло сессию искать спор, которого нет. Живой остаток — вендор-сверка САМОГО МАППИНГА и величина эффекта, и по гардрейлу владельца это закрывается ТОЛЬКО вендор-докой, а не выбором стороны. Держит жильца Д5 и калибровку цены редакторского арма. ⚠ **Класс важнее двух пунктов: спроектированный механизм без носителя события тихо становится долгом, и никто не проверяет, не нажат ли спусковой крючок.** | оркестратор | скоро | (а) один файл в корень; (б) заказ полигону на вендор-сверку | аудит очереди 30.08 | | 241 | **Канон противоречит сам себе на ДОЧИТАННОЙ книге, и принятая правка банка умирает молча** (названо телом D39.165 §3 28.08, носителя не получило; заведено оркестратором №20 30.08 по находке сессии P12). Две фразы: правка банка «takes effect on the NEXT run» (`docs/architecture/14-api-contract/openapi.yaml:529`=`takes effect on the NEXT run`) против «finished work is not bought twice» + подъём потолка только у ПРИОСТАНОВЛЕННОЙ книги (`:590`=`finished work is not bought twice`). У дочитанной книги следующего прогона купить нечем: пользователь правит банк, получает квитанцию об успехе — и правка не доезжает ни до одной строки никогда. ⚠ Смежное лечение уже существует и не связано с этой дырой: пере-проход ПОКУПАЕТСЯ членом `RunRequest.re_pass` (канон 0.7.0, D39.166) — то есть механизм есть, а фраза канона его не признаёт для дочитанной книги. Решать формой: либо канон признаёт пере-проход входом для дочитанной книги, либо дверь правок отказывает такой книге ЧЕСТНО вместо ложной квитанции | контракт (+платформа) | скоро (следующее касание контракта) | контрактный минор + пин на дочитанной книге | D39.165 §3, эррата 30.08-б, находка сессии P12 | @@ -190,7 +190,7 @@ | 221 | **Джойн «предложено × решено × нерешено» живёт ТОЛЬКО в движке.** Читаемый банк несёт итоги без предложений, карта подписи — предложения без решений; семантика «решено ли» (`ownerHandled`) существует в двух файлах движка и больше нигде (греп по трём зонам). Экран подписи при разморозке фронта заставит платформу пере-реализовать движковый закон у себя — дубль, запрещённый п.6 закона шва. **Фикс:** движок публикует нерешённость (секцией банк-экспорта или отдельной проекцией) — но ТОЛЬКО когда экран закажут: рефакторить под несуществующий экран не надо. Сейчас — ноль кода ⚠ **КОНСИЛИУМ 27.08 (оркестратор №19 + автор движковой двери), итог записан, чтобы его не выводили заново.** **(1) Это ОДИН дефект, а не три:** 221 и 224 — ось СОДЕРЖАНИЯ (проекция не несёт предложенное и не несёт джойн), остаток компаньона — ось СВЕЖЕСТИ (дверь пишет источники мгновенно, проекция ждёт границы прогона, которой при стоящем прогоне не наступает). Классический разрыв CQRS. Чинить порознь = три полу-лечения. **(2) Поле `BankTerm.decision` МЕРТВО СТРУКТУРНО** — довод сильнее прежнего «запрет владельца»: decline выражает себя ИСЧЕЗНОВЕНИЕМ строки, а не значением поля (`writeAutoBank` делает `continue` на `ownerHandled`, `mining.go:709+`), и негде показаться ни в одном из трёх окон; для approve поле избыточно — `status: approved` публикуется. Проверено двумя независимыми трассами. ⚠ Вопрос был СНЯТ ещё D39.144 вместе с ложной посылкой «марш к нулю, 17 из 300»; сегодняшняя потребность иная и уже — перезагруженный экран показывает СДЕЛАННЫЕ ПРАВКИ. **(3) Форма-кандидат Д′:** ДВЕ проекции, у каждой РОВНО ОДИН писатель — «решено на границе» пишет прогон рядом с картой, «решено после границы» пишет дверь при записи; экран склеивает по паре (поверхность, `map_id`), счёт приезжает ПОСЧИТАННЫМ. Правило единственного писателя остаётся буквально, поправка онтологии НЕ нужна. Конверт карты из дофикса-2 получает здесь первого потребителя. ⚠ Колонка `undecided` обязана ехать с тем же НЕ-гейтовым контрактом, что `SignatureState`, иначе пер-термная модель вернётся через новую проекцию. **(4) Подпункт «история»:** `glossary_revisions` построен наполовину — читатель вызывается только из тестов, графа `reason` заполняется литералом `seed-replace`, а ревизия пишется лишь для ОСТАВШИХСЯ строк, то есть журнал слеп к отклонениям; владельческий `note` доезжает до вида (`glossary.go:41,161`) и не публикуется ни одной проекцией. ⚠ Journal append-only: не заказать ревизии без исчезновений задним числом уже не выйдет. **Пак не заказан — ждёт слова владельца** | бэкенд | гейчена разморозкой фронта | аддитивное поле проекции | приёмка двери 27.08, D39.158 | | 222 | **ВНУТРИкнижный остаток оси арбитра: второй конфиг ТОЙ ЖЕ книги с другим `project_db` пишет ту же пару файлов решений под ДРУГИМ локом**, мимо флока живого прогона. Достижимо по построению: пути решений считаются от каталога `book.yaml` и `book_id`, лок — от `project_db`. Рукотворная конфигурация оператора (две базы одной книге), лечение трогает ратифицированный п.2 закона (второй арбитр на идентичности файлов решений либо отказ при загрузке). ⚠ Межкнижная версия ЗАКРЫТА снятием объявляемых ключей (D39.158 п.5) | бэкенд | когда-нибудь (непропорционально: правка ратифицированного закона ради операторского футгана) | второй арбитр ЛИБО отказ при загрузке | приёмка двери 27.08, D39.158 | | 223 | **Майнерский хвост за потолком структурно недостижим.** Потолок эмиссии (200) применяется ДО фильтров пригодности, сида и отказов, а детектор кандидатов сида и отказов не видит вовсе — репозиторий пишет это про себя дословно. Замер: 2110 ранжированных → 442 годных во всём алфавите → 117 внутри окна потолка → **325 невидимы постоянно**; отклонение всех 117 не подняло ни одного. ⚠ Решения владельца слотов НЕ освобождают, и это верно СЕГОДНЯ, а не следствие флажка; цитата «пере-предлагается once these are signed or declined» относится только к ОБРАТНОЙ секции. Двигать потолок — трогать фрозен-паритет, отдельное решение. Якорь-пин: `internal/miner/emissioncap_test.go` | бэкенд | когда-нибудь | решение о потолке, не правка | приёмка двери 27.08, D39.158 | -| 224 | **Банк-экспорт на стопе ПУСТ** — проекция, наиболее пустая ровно в момент, когда её читает экран подписи. Замерено: стоп с двумя предложенными термами даёт `total=0`, авто-банк на стопе отсутствует, потому что он пишется только в ветке авто-продолжения; при этом комментарий рядом называет стоп «границей, которую читает экран подписи», а платформа читает именно `.bank.json`. Член класса «проекция без контракта потребителя» (`architecture/18-bank-ontology.md`) ⚠ **ФОРМУЛИРОВКА ПРОТУХЛА, испр. оркестратором 05.09 по итогу стратегического веера:** лид говорит «экспорта на стопе нет, пишется только в ветке авто-продолжения» — сегодня `exportBank(ctx, "bank-mining/signature-stop")` НА СТОПЕ ЕСТЬ (`backend/internal/pipeline/mining.go`, греп `signature-stop`). Отсутствует не ВЫЗОВ, а НАПОЛНЕНИЕ: `exportBank` проецирует таблицу глоссария, а майненные строки попадают в неё только через `writeAutoBank`+`seedGlossary`, и оба лежат ВНУТРИ ветки `if !stopping`. ⇒ Экран подписи читает артефакт, гарантированно пустой ровно от тех строк, ради которых открыт. **Кто пойдёт чинить по прежнему тексту — будет искать несуществующий пропущенный вызов.** ⚠ **дописка 07.09 — закрывать ВМЕСТЕ с пином ПОРЯДКА, иначе фикс не сторожится ничем:** мутация «`exportBank("bank-mining/signature-stop")` раньше `writeAutoBank`/`seedGlossary`» и мутация «`exportBank("run-start/seeded")` раньше `seedGlossary`» (`bookrun.go:174/180`) обязаны краснеть; сегодня в каталоге про порядок 0 записей у `bookrun.go` и 0 из 8 у `mining.go`. Прецедент — строка **257** → пины `volumeslot_test.go`; подмножество каталога в `make battery` реально (`tmmutate -id`, `cmd/tmmutate/main.go:88`), пакет `internal/pipeline` проходит за 15 с (замер 07.09: `go test ./internal/pipeline/ -count=1` → `ok 15.053s`) (research/33 Д9) | бэкенд + платформа | скоро (держит экран подписи вместе с 221) | публиковать предложенное на стопе | приёмка двери 27.08, D39.158 | +| 224 | ⚠ **ДВИЖКОВАЯ ПОЛОВИНА ЗАКРЫТА 07.09 (`D39.225`): стоп публикует свои предложения секцией того же сайдкара, порядок запинен мутациями. ОСТАЁТСЯ ПЛАТФОРМЕННАЯ — у секции сегодня НОЛЬ читателей** (`json:"proposed` в `platform/` — 0 хитов), и до её лендинга это сознательно заведённый класс A онтологии банка. **Банк-экспорт на стопе ПУСТ** — проекция, наиболее пустая ровно в момент, когда её читает экран подписи. Замерено: стоп с двумя предложенными термами даёт `total=0`, авто-банк на стопе отсутствует, потому что он пишется только в ветке авто-продолжения; при этом комментарий рядом называет стоп «границей, которую читает экран подписи», а платформа читает именно `.bank.json`. Член класса «проекция без контракта потребителя» (`architecture/18-bank-ontology.md`) ⚠ **ФОРМУЛИРОВКА ПРОТУХЛА, испр. оркестратором 05.09 по итогу стратегического веера:** лид говорит «экспорта на стопе нет, пишется только в ветке авто-продолжения» — сегодня `exportBank(ctx, "bank-mining/signature-stop")` НА СТОПЕ ЕСТЬ (`backend/internal/pipeline/mining.go`, греп `signature-stop`). Отсутствует не ВЫЗОВ, а НАПОЛНЕНИЕ: `exportBank` проецирует таблицу глоссария, а майненные строки попадают в неё только через `writeAutoBank`+`seedGlossary`, и оба лежат ВНУТРИ ветки `if !stopping`. ⇒ Экран подписи читает артефакт, гарантированно пустой ровно от тех строк, ради которых открыт. **Кто пойдёт чинить по прежнему тексту — будет искать несуществующий пропущенный вызов.** ⚠ **дописка 07.09 — закрывать ВМЕСТЕ с пином ПОРЯДКА, иначе фикс не сторожится ничем:** мутация «`exportBank("bank-mining/signature-stop")` раньше `writeAutoBank`/`seedGlossary`» и мутация «`exportBank("run-start/seeded")` раньше `seedGlossary`» (`bookrun.go:174/180`) обязаны краснеть; сегодня в каталоге про порядок 0 записей у `bookrun.go` и 0 из 8 у `mining.go`. Прецедент — строка **257** → пины `volumeslot_test.go`; подмножество каталога в `make battery` реально (`tmmutate -id`, `cmd/tmmutate/main.go:88`), пакет `internal/pipeline` проходит за 15 с (замер 07.09: `go test ./internal/pipeline/ -count=1` → `ok 15.053s`) (research/33 Д9) | бэкенд + платформа | скоро (держит экран подписи вместе с 221) | публиковать предложенное на стопе | приёмка двери 27.08, D39.158 | | 225 | **Гейт «строка `open`, а лекарство уже в дереве».** При лендинге пересекать ПОЛНЫЕ пути застейдженных файлов с якорями открытых строк регистра и бэклога; совпадение — вопрос лендеру, а не находка следующего пака. Замерено прежде решения: по именам файлов 22 совпадения, почти все ложные; по полным путям 2, оба настоящие, и один из них (`PD-157`) убил мой же лендинг `d1eb8a9`. Норма-половина уже стоит в `platform/docs/ENGINEERING_STANDARDS.md` §3 п.8; здесь — машинная половина, режимом `counts.py` | оркестратор | скоро (окупился до постройки) | режим `counts.py`, берущий список путей и печатающий открытые строки, чьи якоря в них целят | приёмка пака P8-REVIEW 27.08, D39.159 п.7 | | 226 | **История ПРЕДЪЯВЛЕННОГО не ведётся — «почему меня не остановило на этом термине» ответить нечем.** Карта и человеческая таблица стопа перезаписываются каждым прогоном, память флажка — плоское множество поверхностей без `map_id` и без времени. Это прямая расплата за то, что стоп срабатывает ОДИН раз (кластерная память, названный остаток дофикса-2), и единственная возможная диагностика спора. Кандидат в пак решённости, не заказ. ⚠ Шестое, названное консилиумом и оставленное владельцу: авторство и время решения — сегодня цена нуля (владелец один), станет нужным при мультипользовательской платформе, и тогда его захотят ЗАДНИМ ЧИСЛОМ | бэкенд | скоро (диагностики нет вовсе) | движок метит предъявленное `map_id` и временем; оверлей отвечает «что предъявлялось на прошлом стопе» | консилиум по читающей стороне банка 27.08 | | 250 | **Заголовок глоссария на проводе ОПИСЫВАЕТ маркер, которого после пака больше нет — живая строка с висячей ссылкой.** Строка данных `ru glossary_header` (`backend/internal/lang/data/injection.txt`) дословно объясняет модели: «строки с пометкой ⟨проверить⟩ — неподтверждённые кандидаты», а пункт 3 вайр-батча снимает маркер с провода по `D39.104` п.2 ⇒ на проводе не останется НИ ОДНОЙ помеченной строки, а заголовок продолжит объяснять пометку. ⚠ Это НЕ мёртвая строка данных (те — `editor_unverified_header` и `unverified_marker`, они просто перестают читаться), это ЖИВАЯ строка, которую читает модель. По `D39.104` п.1 клаузула становится ВАКУУМНОЙ, а не ложной, вред не измерен — поэтому не блокер. ⛔ **Чинится ТОЛЬКО правкой `injection.txt`, а она двигает `EmbeddedVersion` → `cutTag` → ключ манифеста → снос `unit_resolutions` книги (строка 198).** Носитель — ближайшее ОКНО правки эмбед-данных: строка **160** идёт своим паком и всё равно бампает форму манифеста. Найдено бэкенд-сессией вайр-батча 04.09 — она правильно НЕ тронула и принесла предмет | бэкенд | скоро (в окне строки 160) | правка `injection.txt` в окне 160 | пинг бэкенд-сессии 04.09 | @@ -250,7 +250,7 @@ | 312 | ✅ **ИСПОЛНЕНО ЛЕНДИНГОМ 06.09 `e4211d4`** — счётчик `backend/internal/chunk/ingest.go:86-99`=`TOCUnreadable counts tables of contents`, вынесен в ноты рефлексионным сторожем; пин `TestADeclaredTableOfContentsThatCannotBeReadIsCounted`, пять подтестов, три дороги проверены мутацией порознь, а «не заявлено» и «прочли, цели висят» держатся отдельными случаями. ⚠ **Последняя миля НЕ пройдена и названа зоной прямо:** нота идёт в лог ДВИЖКА (`r.Log.Warn`), а платформа читает `events.jsonl` — то есть тревога есть, а увидит ли её человек, не показано (Д-3, открыт). ⛔ **ЗАЯВЛЕННОЕ, НО НЕЧИТАЕМОЕ ОГЛАВЛЕНИЕ ПРОВАЛИВАЛОСЬ МОЛЧА — И ЭТО САМЫЙ ДЕГРАДИРОВАННЫЙ СЛУЧАЙ КЛАССА, КОТОРЫЙ ТОТ ЖЕ ПАК И ЛЕЧИЛ.** Книга ЗАЯВИЛА оглавление (`properties="nav"` в манифесте либо `toc` в spine), движок не смог прочесть или разобрать эти байты — и тихо падает до spine, отдавая `delimited`, то есть продажу ПО ЗНАКАМ, без единого слова о причине. ⚠ **Улики на момент находки** (адреса намеренно БЕЗ якорей: код починен `e4211d4`, и якорь целил бы в строку, которая дефекта больше не показывает): ошибка чтения глоталась в `ingest.go` обеими ветвями — nav и NCX, — провалившийся разбор возвращал метки, а счётчика не было вовсе (греп по `unreadable`/`tocUnread` в `chunk/` давал пусто). ⛔ **`toc_unresolved = 0`, потому что целей НОЛЬ** — прибор снова честно отвечает на свой вопрос, а читается это как «всё разрешилось» (`D39.202`). ⇒ тревога, построенная для класса M-2 («часть целей не разрешилась»), НЕ покрывает случай «оглавления не прочли вообще». ⇒ заказ дешёвый: один счётчик в `Document` («declared table of contents that could not be read»), который рефлексионный сторож сам вынесет в `IngestNotes()`. ⭐ **Названо строителем в письме о вычитке и НЕ починено** — он сам нашёл это, только когда я спросил про сомнения. **Улика к норме: находка, живущая в письме, носителя не имеет и исчезает** — ровно то, что зона платформы сказала про находки без ряда | бэкенд | скоро | заявленное нечитаемое оглавление называет себя, а не тонет в `delimited` | **D39.202** | -| 313 | ⛔ **КАТАЛОГ МУТАЦИЙ ДОКАЗЫВАЕТ, ЧТО МУТАЦИЯ СУЩЕСТВУЕТ, А НЕ ЧТО ОНА ЛОВИТСЯ.** Из **211** записей каталога регулярно гоняются единицы (в паке структуры глав — 14, целящие в изменённое поведение); остальные проверяются только на ЖИВОСТЬ ЦЕЛИ грепом. ⇒ зелёный каталог говорит «посадка на месте», а читается как «посадка краснит». **Тот же класс, что `D39.214` п.3: доказано одно, сказано про другое.** ⚠ Носителя у этого НЕ БЫЛО ни строкой, ни рядом — проверено грепом по живому бэклогу 06.09 по прямому вопросу оркестратора; ближайшая строка 252 говорит о ДВУХ конкретных выживших посадках 04.09 и о полном прогоне не говорит ничего. ⭐ **Третий за час случай, когда находка жила только в письме** (первые два — находки платформы без рядов и нечитаемое оглавление строки 312): **находка без носителя не находится.** ⇒ заказ: либо каталог гоняется целиком по расписанию, либо его зелень перестаёт называться доказательством ловли — формулировку выбирает зона, но молча оставлять нельзя. ⚠ Назвал СТРОИТЕЛЬ про собственный пак, единственным из пяти своих сомнений, что закрыл бы ДО продажи ⚠ **Цена полного прогона ЗАМЕРЕНА 06.09, и отсрочка обоснована ею, а не удобством:** 126 записей из 211 гоняют `internal/pipeline` по ~3 минуты ⇒ полный прогон **6+ часов**. При этом 197 непрогнанных — УНАСЛЕДОВАННЫЕ, каждая краснела у заводившей смены. ⇒ это стоячая гигиена, а не крит; зона прямо отказалась изображать закрытие шестичасовым прогоном «вдруг что-то протухло» | бэкенд | когда-нибудь | зелень каталога означает пойманную мутацию, а не существующую запись | **D39.214** | +| 313 | ⚠ **НОСИТЕЛЬ ПОЯВИЛСЯ 07.09 (`D39.225`): цель `make mutations` гоняет подмножество каталога (14 из 225) на копии дерева и печатает свип якорей СО ЗНАМЕНАТЕЛЕМ (`0 of 225 rotten`) при каждом прогоне, зелёном тоже. Вне `battery` намеренно: пере-замер 07.09 дал 123 % её времени и гейт идёт без `-race`. ОСТАЁТСЯ: остальные 211 записей по-прежнему проверяются только на живость цели.** ⛔ **КАТАЛОГ МУТАЦИЙ ДОКАЗЫВАЕТ, ЧТО МУТАЦИЯ СУЩЕСТВУЕТ, А НЕ ЧТО ОНА ЛОВИТСЯ.** Из **211** записей каталога регулярно гоняются единицы (в паке структуры глав — 14, целящие в изменённое поведение); остальные проверяются только на ЖИВОСТЬ ЦЕЛИ грепом. ⇒ зелёный каталог говорит «посадка на месте», а читается как «посадка краснит». **Тот же класс, что `D39.214` п.3: доказано одно, сказано про другое.** ⚠ Носителя у этого НЕ БЫЛО ни строкой, ни рядом — проверено грепом по живому бэклогу 06.09 по прямому вопросу оркестратора; ближайшая строка 252 говорит о ДВУХ конкретных выживших посадках 04.09 и о полном прогоне не говорит ничего. ⭐ **Третий за час случай, когда находка жила только в письме** (первые два — находки платформы без рядов и нечитаемое оглавление строки 312): **находка без носителя не находится.** ⇒ заказ: либо каталог гоняется целиком по расписанию, либо его зелень перестаёт называться доказательством ловли — формулировку выбирает зона, но молча оставлять нельзя. ⚠ Назвал СТРОИТЕЛЬ про собственный пак, единственным из пяти своих сомнений, что закрыл бы ДО продажи ⚠ **Цена полного прогона ЗАМЕРЕНА 06.09, и отсрочка обоснована ею, а не удобством:** 126 записей из 211 гоняют `internal/pipeline` по ~3 минуты ⇒ полный прогон **6+ часов**. При этом 197 непрогнанных — УНАСЛЕДОВАННЫЕ, каждая краснела у заводившей смены. ⇒ это стоячая гигиена, а не крит; зона прямо отказалась изображать закрытие шестичасовым прогоном «вдруг что-то протухло» | бэкенд | когда-нибудь | зелень каталога означает пойманную мутацию, а не существующую запись | **D39.214** | | 314 | ⛔ **РАЗРЕЗ ПРОВЕРЯЕТСЯ ТОЛЬКО НА НЕИЗМЕННОСТЬ — НА ПРАВИЛЬНОСТЬ ЕГО НЕ ПРОВЕРЯЕТ НИЧТО.** Ни один гейт, тест или замер не отвечает на вопрос «верны ли ЭТИ границы»: гейт сравнивает «до» и «после», оракул сверяет два прибора движка МЕЖДУ СОБОЙ. ⚠ **Инвариант сохранения доказывает СОХРАННОСТЬ и молчит о КОРРЕКТНОСТИ** — он считает разбиение (каждый читаемый документ либо исключён намеренно, либо ровно в одной группе) и сходится ОДИНАКОВО при верной и при неверной группировке, если та ничего не теряет. ⇒ «инвариант сошёлся на трёх живых книгах» доказывает сохранность, а читается как корректность разреза. Что 71 глава для Kristoff — ВЕРНО, не показал никто; показано лишь, что так говорит его `nav`. **Тот же класс, что `D39.214` п.3: доказано одно, сказано про другое.** ⭐ Назвал СТРОИТЕЛЬ про собственный пак, найдя это в своих же утверждениях, а не в чужих. ⚠ **Измеримая часть ЗАМЕРЕНА 06.09 и расхождения не дала:** «совпадает ли отданный разрез с тем, что книга ОБЪЯВЛЯЕТ» — по трём книгам 193 цели оглавления, **все на уровне документа, ни одной внутрь документа** (Kristoff 71 · isekai 88 · fifty_shades 34) ⇒ там, где объявленное можно сверить механически, оно сходится. **Остаётся ровно некруговая часть: верно ли то, что объявляет сам `nav`** — она требует человеческого суждения и не закрывается ни тестом, ни прибором. ⇒ **строка стоит не как задача, а как признанная ГРАНИЦА** | бэкенд | когда-нибудь | есть носитель, отвечающий «верны ли границы», а не только «не изменились ли они» | **D39.214** | | 315 | ✅ **ЗАКРЫТА ЗАМЕРОМ 06.09 — ПРОШЛА.** Блокер («промтов пары `en-ru` нет») снят БЕЗ нарушения запрета: у пар-конфига есть ручка `prompts_root` (`backend/internal/config/pair.go:33`=`PromptsRoot string`, проверено мной), и корень промтов-заглушек собран ВНЕ репозитория — в дереве не создано ничего, промт-пака пары как не было, так и нет. **Замер зоны, `tmctl manifest`, EXIT 0, $0:** `structure: declared` · 71 глава / 351 юнит / 356 чанков · `manifest_version` НЕ сдвинут · нумерация плотная 1..71 без дыр и дублей, `number: null` — ноль · id глав уникальны · **`title_raw` на проводе 71 из 71**, настоящие · ценовая проекция на всех трёх уровнях, глав без цены ноль. ⭐ **И то, что видно только на живой НЕ-CJK книге: `heading` пуст у ВСЕХ глав** (шаблона для пары нет), **а `title_raw` заполнен** ⇒ единственное, что несёт название главы для этой книги, — поле, которое построил этот пак. Обоснование §2.5 стало замером, а не доводом. ⚠ Числа — зоны, на её стенде; механизм обхода блокера и чистоту дерева проверил я. ⛔ Прежняя формулировка: **МАНИФЕСТНАЯ ПОЛОВИНА EPUB НЕ ПРОХОДИЛА НИ РАЗУ НА ЖИВОЙ КНИГЕ.** `tmctl manifest` на EPUB владельца не идёт — промтов пар `en-ru`/`ja-ru` не существует, и пак структуры глав чинить это не заказывал. ⇒ `title_raw` на проводе, id глав и ЦЕНОВАЯ ПРОЕКЦИЯ для EPUB держатся **исключительно на фикстурах авторства самой зоны**; книги владельца мерены только на уровне ингеста. ⚠ **Первая же платная EPUB-книга пойдёт по пути, который на живой книге не проходил никогда** — и это ДЕНЬГИ, а не удобство. ⭐ Стоит в отчёте зоны §6, но отчёт не трекер: через месяц его никто не откроет — ровно довод, которым эта строка и заведена | бэкенд+полигон | скоро | манифестная половина EPUB пройдена на живой книге хотя бы раз | **D39.214** | @@ -285,10 +285,8 @@ | 342 | **ВОССТАНОВЛЕНИЕ ИЗ БЭКАПА НЕ ПРЕДЪЯВЛЕНО НА МАСШТАБЕ.** Предъявлено на малых данных; не проверено на книге в сотни мегабайт, при заполненном диске и при чужих открытых соединениях. `PD-462` покрывает СОСЕДНИЙ класс, этот — нет. ⚠ Бэкап, не проверенный на условиях, в которых он понадобится, — это не бэкап, а намерение | платформа | скоро | восстановление предъявлено на большой книге, полном диске и чужих соединениях | вопросы платформы 07.09 | | 343 | **`counts.py` ДЕРЖИТ РЕГИСТР ОДНИМ ПУТ�ём И НЕ ГЛОБИТ СЛАЙСЫ — предусловие нарезки `DEFECT_REGISTER.md`.** Вынос без этого молча уронит счёт открытых рядов, а гейт чисел покажет зелень: он читает ровно один файл. ⚠ План нарезки живёт в `docs/DOC_CLEANUP_PLAN.md` (Б14в) | доки | скоро | прибор читает регистр и его слайсы, счёт не меняется при выносе | вопросы платформы 07.09 | | **— ТЕХДОЛГ БЭКЕНДА: разбор research/33 (D39.224) —** | | | | | | -| 344 | ⛔ **ШОВ «ЗАГОЛОВОК ГЛАВЫ» НЕ УТВЕРЖДАЕТСЯ НИЧЕМ: ТРИ МУТАНТА ПЕРЕЖИВАЮТ ПОЛНУЮ БАТАРЕЮ, И ПОД ОДНИМ ГОТОВАЯ КНИГА ТЕРЯЕТ ВСЕ НАЗВАНИЯ ГЛАВ.** `chunk/chunker.go:145` кладёт заголовок в `chapterChunks[0]`, `pipeline/manifest.go:664` восстанавливает его по `ChunkIdx == 0` на read-пути (так читается артефакт `tmctl export`, который берёт платформа), `pipeline/export.go:176/342/343` берёт `u.Members[0].Heading`; боевой код КОРРЕКТЕН — не защищено ровно РАСПОЛОЖЕНИЕ заголовка. ⚠ Мутанты живут в ДВУХ файлах, не в одном: M1 (`manifest.go:664` → `if i == 0`, заголовок на первый чанк каждого ЮНИТА) и M2 (`→ if false`) — в манифесте, M5 (заголовок на последний чанк) — в `chunker.go:145`. Замер 07.09: M2 и M5 посажены на копии HEAD `e989068` и прогнаны полной батареей — каждый **18 ok / 0 FAIL, exit 0**; M1 — ⟲ research/33. Под M2 `bookbuild.go:526-528` подставляет номер при пустом `Heading`, и готовая книга выходит с «1», «2» вместо «Глава 1», «Глава 2». Причина — вырожденные фикстуры двух тестов, чьи имена обещают эту гарантию: `chunker_heading_test.go:101` даёт короткие главы и утверждает только `chunks[0]`; `contractblockers_test.go:294` — ja→ru книга с русским текстом через `\f`, правило заголовка не матчится ⇒ `Heading` пуст с обеих сторон и сравнение вырождается в `"" == ""`. В каталоге мутаций `internal/chunk/chunker.go` — **0** записей из 211 (контроль: `bankdecisions.go` 20). Сосед по шву — строка **201**; ⚠ сосед по СИМПТОМУ — строка **160**: вычитка боевого перевода нашла потерянный заголовок у 6 глав из 17 (`D39.190` п.2), причина там другая, но читателю видно то же. Лечение $0 и снапшот-нейтрально, боевой код не трогается: обеим фикстурам главу, которая реально режется, и правило заголовка zh-ru · утверждение «не-первый чанк главы несёт пустой `Heading`» · M1/M2/M5 в `mutations.json` | бэкенд | скоро (шаг 0 research/33 — параллельно дизайн-паку 161, ДО пака стройки) | невырожденные фикстуры + утверждение о не-первом чанке + три записи каталога | research/33 Д10/Д11, D39.208 п.5 | -| 345 | ⛔ **НОВАЯ ПАРА МОЖЕТ ОТВЕЧАТЬ СВОИМИ СЛОВАМИ КЛАССОВ, И ВСЯ БАТАРЕЯ ЗЕЛЁНАЯ — словари классификатора закрыты в Go и прозой промта.** `terminology/classify.go:18` `Types`, `:26` `CandidateTypes`, `:50` `Genders`; третья копия — `pipeline/banknote.go:80` `bankTypeOK` (не упомянут ни одним тестом); те же слова прозой в `prompts/zh-ru/classifier.md`. Леджер меток промтов смотрит на одну пару (`promptlabel_test.go:53` `const pair = "zh-ru"`), а off-vocabulary ответ модели — только `Log.WarnContext` (`terminologist.go:603`), отказа нет. ⟲ research/33: подложенная `prompts/ja-ru/classifier.md` с локализованными словами классов (人名 · 地名 · 称号 · 用語) проходит батарею БЕЗ единого шага автора; цена — молчаливая потеря качества на второй паре (тип неверен 12–22 %, `name/place` форсирует транслитерацию — D39.65). Бьёт прямо по цели №2: дежурный ревью-вопрос «заработает ли пара без правки Go» получает ответ «да, и молча неверно». Лечение $0: линт КАНОНИЧЕСКОЙ формы промта (комментарии снять — наивная версия ложно-зелёная, слова есть в HTML-шапке) в существующем `internal/config/prompt_lint_test.go` (89 строк; сам объявляет целью «ja-ru or en-ru pack authored by copying the zh-ru one») + свести `bankTypeOK` к `terminology.CandidateTypes` (одна строка импорта, уже экспортирован). ⛔ Обратная дорога (словарь в данные) двигает `prompt_sha256`/`RequestHash`/`classifierVersion` и ЗАПРЕЩЕНА — D39.194 п.9 и **D39.195 п.5** (⚠ испр. 07.09: research/33 и первая редакция этой строки ссылались на D39.199 п.5 — там закрытие строки 264, не запрет) | бэкенд | скоро (шаг 0 research/33, $0) | линт в `prompt_lint_test.go` + одна строка импорта | research/33 Д1 | -| 346 | ⛔ **ПРАВИЛО ЗАГОЛОВКА РАЗЪЕХАЛОСЬ ПО ТРЁМ ПРЕДИКАТАМ, И «第零章» ЛОМАЕТ ПРОЛОГ — две половины с РАЗНОЙ ценой.** Страж длины живёт только в ингесте (`chunk/ingest.go:307` `chapterHeaderMaxRunes = 60`, применён `:323`; в `chunker.go` `RuneCountInString` — 0 хитов), осмысленность номера — только в чанкере (`chunk/chunker.go:316` `if !any || v <= 0`). Воспроизведено исполнением 07.09 (выброшенная проба на копии дерева): `第零章:序幕` ингест режет главой, а чанкер заголовок НЕ снимает — `heading=""`, сырой CJK-маркер уезжает модели; `parseSectionNumeral` на `零`/`0`/`〇` даёт `0,false` (контроль: `一`=1, `十二`=12); номера расходятся (`第一章` = `Chapter 2` при «Глава 1»); 84-рунный заголовок: ингест `false`, чанкер `ok=true`. ⚠ **Испр. 07.09 — без этой оговорки строка читается как ЛОЖНАЯ:** расхождение живёт ТОЛЬКО у заголовка С СЕПАРАТОРОМ после юнита (`第四章:…`); без сепаратора оба предиката дают `false` на любой длине, потому что такую строку отвергают и `isHeaderSeparator` ингеста, и `matchHeaderLine` чанкера. Пере-снято оркестратором на копии `d6dfc49`: с сепаратором 59 и 60 рун — оба `true`; 61 и 84 — ингест `false` при чанкере `ok=true n=4`; без сепаратора 12/55/59/60/61/84 — `false`/`false` во всех шести. Граница ровно `chapterHeaderMaxRunes` = 60. Перекрёстного теста нет ни в одном из 97 тестов `internal/chunk`. **(а) $0 СЕЙЧАС — пин ИЗВЕСТНОГО расхождения, а не паритет:** красный тест в `main` не ложится (`Makefile:58` `battery: build vet fmt lint test`), скип — класс D39.208; поэтому тест утверждает, что на `第零章` и на 61–84-рунной строке ингест и чанкер СЕГОДНЯ расходятся, назван этой строкой и краснеет ровно тогда, когда приземлится фикс (б), заставляя фиксера его перевернуть. Дизайн-пак 161 §4.5 паритет-тест ОПИСЫВАЕТ, пишет его пак стройки — пин (а) этому не мешает. **(б) В ОКНО ПЕРЕНАРЕЗКИ:** сам фикс меняет ТЕКСТ чанка ⇒ бампает `chunkerVersion` ⇒ снапшот обеих волн (`render.go:55-58` — «a deliberate re-translation»); отдельным актом он платит ту самую перепокупку, которую отменяет. ⚠ Ось «обязательность юнита» — НЕ трогать: носитель строка **303** (⚠ испр. 07.09: research/33 приписывал её `D39.207`, в теле ноты этого нет — греп по предмету 0 при 23 строках тела) | бэкенд | скоро для (а); (б) — в окне перекроя (шаг 3) | (а) пин расхождения · (б) сведение двух предикатов к ингестовским стражам внутри пака перекроя | research/33 Д3, research/27 §6 | +| 346 | ⚠ **ПОЛОВИНА (а) ЗАКРЫТА 07.09 (`D39.225`): пин расхождения и паритет-тест стоят, оба под мутациями. ОСТАЁТСЯ (б) — фикс в окне перенарезки.** ⛔ **ПРАВИЛО ЗАГОЛОВКА РАЗЪЕХАЛОСЬ ПО ТРЁМ ПРЕДИКАТАМ, И «第零章» ЛОМАЕТ ПРОЛОГ — две половины с РАЗНОЙ ценой.** Страж длины живёт только в ингесте (`chunk/ingest.go:307` `chapterHeaderMaxRunes = 60`, применён `:323`; в `chunker.go` `RuneCountInString` — 0 хитов), осмысленность номера — только в чанкере (`chunk/chunker.go:316` `if !any || v <= 0`). Воспроизведено исполнением 07.09 (выброшенная проба на копии дерева): `第零章:序幕` ингест режет главой, а чанкер заголовок НЕ снимает — `heading=""`, сырой CJK-маркер уезжает модели; `parseSectionNumeral` на `零`/`0`/`〇` даёт `0,false` (контроль: `一`=1, `十二`=12); номера расходятся (`第一章` = `Chapter 2` при «Глава 1»); 84-рунный заголовок: ингест `false`, чанкер `ok=true`. ⚠ **Испр. 07.09 — без этой оговорки строка читается как ЛОЖНАЯ:** расхождение живёт ТОЛЬКО у заголовка С СЕПАРАТОРОМ после юнита (`第四章:…`); без сепаратора оба предиката дают `false` на любой длине, потому что такую строку отвергают и `isHeaderSeparator` ингеста, и `matchHeaderLine` чанкера. Пере-снято оркестратором на копии `d6dfc49`: с сепаратором 59 и 60 рун — оба `true`; 61 и 84 — ингест `false` при чанкере `ok=true n=4`; без сепаратора 12/55/59/60/61/84 — `false`/`false` во всех шести. Граница ровно `chapterHeaderMaxRunes` = 60. Перекрёстного теста нет ни в одном из 97 тестов `internal/chunk`. **(а) $0 СЕЙЧАС — пин ИЗВЕСТНОГО расхождения, а не паритет:** красный тест в `main` не ложится (`Makefile:58` `battery: build vet fmt lint test`), скип — класс D39.208; поэтому тест утверждает, что на `第零章` и на 61–84-рунной строке ингест и чанкер СЕГОДНЯ расходятся, назван этой строкой и краснеет ровно тогда, когда приземлится фикс (б), заставляя фиксера его перевернуть. Дизайн-пак 161 §4.5 паритет-тест ОПИСЫВАЕТ, пишет его пак стройки — пин (а) этому не мешает. **(б) В ОКНО ПЕРЕНАРЕЗКИ:** сам фикс меняет ТЕКСТ чанка ⇒ бампает `chunkerVersion` ⇒ снапшот обеих волн (`render.go:55-58` — «a deliberate re-translation»); отдельным актом он платит ту самую перепокупку, которую отменяет. ⚠ Ось «обязательность юнита» — НЕ трогать: носитель строка **303** (⚠ испр. 07.09: research/33 приписывал её `D39.207`, в теле ноты этого нет — греп по предмету 0 при 23 строках тела) | бэкенд | скоро для (а); (б) — в окне перекроя (шаг 3) | (а) пин расхождения · (б) сведение двух предикатов к ингестовским стражам внутри пака перекроя | research/33 Д3, research/27 §6 | | 347 | **ПАР-ДАННЫЕ НЕЛЬЗЯ ЗАВЕЗТИ ПО ЧАСТЯМ: манифест требует ≥1 канал, и транслитерационный канал зашит в китайскую форму.** `lang/langpack.go:632` — «manifest declares no channel — omit the file to ship all channels, or list at least one»; каналов два и они закрыты в Go (`source-morphology`, `transliteration`, `:108-114`), а `validate()` при `transliteration` требует ПОИМЁННО пиньинь-категории (`:521-527`); морфологический канал просит общие таблицы (`:507-516`) и в китайскую форму не зашит. Отказ жёсткий: при `gates.terminology.enabled` и `pack == nil` прогон отказывает `RefusalBadConfig` (`pipeline/runner.go:349`), а в боевом `pipeline-c1.yaml:151` гейт включён ⇒ вторая пара выбирает между фиктивными данными китайской формы и прогоном БЕЗ банка терминов (продуктовая цель №1). ⚠ **Триггер — первая новая ИСХОДНАЯ пара, и он РАНЬШЕ строки 115:** манифест лежит в `//` и хешируется языком-ИСТОЧНИКОМ (`langpack.go:252`), а 115 — про новую ЦЕЛЬ; ближайшая исходная пара в трекере — ja→ru (строка **81**), цель у неё ru. ⚠ **Пять строк снимают отказ, но банка на не-Han источнике НЕ дают** — детектора нет (строка **35**: en-детектор не существует, ja с zh-таблицами активно неверен); заказывать вместе, иначе строка обещает больше, чем покупает. Сегодня не оплачено ни разу: 0 `manifest.txt` в `configs/`, каталог пары один. ⚠ D39.64 П4 ратифицировала ОБРАТНОЕ намерение («источник без пиньинь-морфологии грузится без Palladius-файлов») — строка `list at least one` не дошла шаг до собственной цели | бэкенд | когда-нибудь (вход пака второй пары; триггер общий со строками 81 и 35) | разрешение нулевого числа каналов + решение по форме каналов | research/33 Д7, D39.64 П4 | -| 348 | ⛔ **ШАПКИ АРМ-КОНФИГОВ ОБЪЯВЛЯЮТ «ЕДИНСТВЕННОЕ ИЗМЕНЕНИЕ», А АРМ РАСХОДИТСЯ С БОЕВЫМ НА ДВА ДЕСЯТКА КЛЮЧЕЙ — включая снятый банк терминов; лжёт и сам гейт.** Замер 07.09, две независимые методики: голый дифф не-комментарных строк против `configs/pipeline-c1.yaml` — glm **26** / mistral **28** / deepseek-pro **23**; тот же дифф со снятыми пустыми и хвостовыми комментариями — **18/18/15** (КОНТРОЛЬ обеих: c1 против себя = 0). Популяции разные, вывод один: во всех трёх армах `banknote:` 0, `terminology:` 0, `contrast_path` 0, `classify_types` 0, `target_script` 0, `prompt_override` 0 — при ровно ОДНОМ YAML-ключе каждого имени в c1 (⚠ испр. 07.09: прежние «1/1/3/1/1/3» — подстрочный счёт, для этого вопроса негодный). ⚠ **Носителей лжи ТРИ, и они разной силы.** (1) Шапки армов («копия боевого C1 с ЕДИНСТВЕННЫМ изменением») — ложны буквально. (2) `internal/config/echo_mine_test.go:227/234` `TestSwapArmConfigs` обещает в доке «swaps ONLY the editor model … only the editor differs», а утверждает лишь модель редактора, `few_shot` и `rate_limit` — гейт, который назвал себя сторожем этого свойства и им не является (класс D39.208 п.5). (3) `docs/STACK.md:12` («резерв; флип = один арм-конфиг») буквально ВЕРНА — флип и правда подмена одного файла — и подлежит не правке, а дописке о цене подмены. Дрейф датирован: `b8154cd` (04.09) дал c1 +64 строки банкового контура, а всем трём армам — только `prompt_version`. ⚠ **Риск ЛАТЕНТНЫЙ, а не текущий:** деплой прибит к боевому (`platform/deploy/README.md:216`), кодового пути выбора арма нет, армы читают только тесты, платные прогоны идут по книго-локальным конфигам вне git. ⛔ **МЕХАНИЗМ ЦЕНЫ ЗДЕСЬ БЫЛ НАЗВАН НЕВЕРНО — снято 07.09 оркестратором по коду обеих зон, и правда ОБРАТНАЯ.** Снятая формулировка: «платформа берёт за банк плоские $2.00 ⇒ пользователю выставят $2 за банк, которого никто не майнил». Ложна дважды. (1) `book_once_usd` платформа не вычисляет, а ЧИТАЕТ из манифеста движка (`platform/internal/ingest/manifest.go:104`), производит его `bookOnceUSD()` (`backend/internal/pipeline/priceprojection.go`), и он возвращает **0**, когда терминология выключена или `contrast_path` пуст — ровно состояние до-пакового арма (замер: во всех трёх армах оба ключа отсутствовали) ⇒ поле было НОЛЬ, а не $2. (2) Платформа этот плоский $2 в холд НЕ складывает намеренно, и её же комментарий (`manifest.go:99-103`) объясняет почему: «folding a flat two dollars into the hold would make a five-chapter book unbuyable again». ⇒ **настоящий симптом противоположный и злее:** арм ехал БЕЗ банкового контура, `book_once_usd` книги молча падал в ноль, и контур не был ни настроен, ни оплачен, ни назван; идущий чинить по прежней букве искал бы лишнее списание, которого нет. ⚠ Класс моей ошибки: я прочёл комментарий, назвавший плоские $2, и процитировал ПЕРВУЮ половину предложения, которое написано ровно затем, чтобы запретить мой вывод. ⚠ **Наследования конфигов НЕТ — испр. 07.09:** research/33 §7.13 и первая редакция этой строки называли его ратифицированным `D39.23` п.(г); в теле ноты (г) — слой пар-КАЛИБРОВОК (`configs/pairs/<пара>`, fertility/len_ratio_bounds, промпт-резолв конвенцией), а в `internal/config/pipeline.go` `extends|inherit|base_config` — 2 хита, оба про ручку, которая «deliberately NOT inherited». Лечение — не «подтянуть наследованием», а пере-снять три арма копией c1 со сменённым редактором и заставить `TestSwapArmConfigs` утверждать «арм == c1 вне блока редактора». ⚠ **Названная цена пере-снятия (07.09):** пере-снятый арм получает банковый контур и банкнотный `prompt_override` черновика ⇒ снапшот ПРОГОНА ПО АРМУ становится другим, и удерживаемый для сравнения арм-прогон не резюмится, а пере-покупается. Оплаченных книг это не касается — деплой прибит к боевому (`platform/deploy/README.md:216`), кодового пути выбора арма нет | доки + бэкенд | скоро (до любого флипа деплоя на арм) | пере-снятые армы + гейт равенства + дописка в STACK | research/33 §7.13, строка 251 | -| 349 | **ОСТАТКИ ОПРОВЕРГАТЕЛЕЙ research/33 — мелочи одной строкой, носителей не было.** (а) `pipeline/snapshotdiff.go:157-159` при движении одного `memory_version` дописывает оператору причину, которой НЕ проверял («the auto-bank grew between purchases»). (б) `pipeline/snapshot.go:206-218` — протухшие клаузы про «последовательный драйвер», драйвер один (`bookrun.go:242`). (в) `backend/README.md` называет `export.go`/`quality.go`/`status.go` read-only проекциями, а `status.go:1174` внутри `Runner.Redrive` (`:1047`) зовёт `Store.ResetChunkStages` (`store/chunkstatus.go:161`) — единственный деструктивный путь движка (сверено оркестратором 07.09); вторая половина находки — «`status_test.go:376` обещает замок, который в одиночку не держит» — со слов агента research/33, не пере-проверена. (г) `tracedCtx()` во флаг-фикстуре. ⚠ Заявленный мутационный пробел по `CacheWritePerM` СУЖЕН: ненулевая фикстура уже есть на уровне юнита (`ledger/pricing_test.go:20` `CacheWritePerM: 2.5`), пробел — если он есть — уровня пайплайна, где 25 YAML-фикстур `internal/pipeline/*_test.go` пишут явный 0, а ненулевых там 0 (счёт 07.09). Всё снапшот-нейтрально, берётся попутно | бэкенд | когда-нибудь (попутно с касанием этих файлов) | правки на месте | research/33 §7.7/7.11/7.12/7.14/7.17 | -| 350 | **РЕФАКТОРИНГ ОБЛЕГЧЕНИЯ ВЕДЕНИЯ (санкция владельца 07.09) — снапшот-нейтрально, и заказ здесь «решить», а не «удалить».** Вызовов вне определения ноль у шести функций (греп 07.09; КОНТРОЛЬ — `SplitChunks` 34 живых вызова): `obs.SafeGo`, `text.TokenizeCyrillic`, `CheapGateResult.UnitScaleHard`/`UnitScaleSoft`, `Bank.Voices()`, `Bank.Pairs()`. ⚠ **Четыре из шести стоят НАМЕРЕННО, и слепое удаление снимет намеренное:** `UnitScaleHard/Soft` сами называют, кого ждут — `checks/cheapgates.go:155-156` «for the report and a future hard gate», то есть строку **12**; `TokenizeCyrillic` — образец паттерна value-default, на который ссылаются `checks/sanitizer.go:21` и `:197`; `SafeGo` — намеренный контраст к `obs/panic.go`, названный решением `pipeline/waverun.go:405` («NOT obs.SafeGo»), и его удаление повесит два комментария в воздухе — класс строки **299**; `Voices`/`Pairs` (`membank/memory.go:371-376` «frozen for the job») ждут потребителя, которого держит строка **13б**. ⇒ по каждой ОДИН исход с объявлением в отчёте: удалить ЛИБО назвать причину жизни в комментарии. Плюс ИМЯ последней стадии дважды одинаковым инлайном — `r.Pipeline.Stages[n-1].Name` в `pipeline/export.go:283` и `quality.go:342` (адреса на `d6dfc49`). ⚠ **Испр. 07.09: и research/33 §7.1, и первая редакция этой строки называли здесь «готовый `finalStageWave()`» — это ДРУГАЯ функция**: она возвращает ВОЛНУ (`snapshot.go:247`, вызовов 13 — 10 прод и 3 теста), а хелпера для ИМЕНИ не существовало вовсе, и «при готовом хелпере» читалось как «работа уже сделана» и словарь родов в четырёх носителях (`membank/memory.go`, `membank/memseed.go`, `terminology/classify.go:50`, промт), где текст собственной ошибки врёт о принимаемом множестве. ⛔ Границы санкции: НЕ дробить `internal/pipeline` и НЕ переписывать `Runner` (`12-go-style-notes.md` §1, D39.23), ничего, что двигает снапшот / хеш запроса / ключ манифеста. ⚠ Адреса сняты research/33 на `e69902a`, а лендинг 07.09 тронул `memseed.go` и `export.go` — пере-снимать командой, не по тексту | бэкенд | когда-нибудь | попутный проход с батареей + объявление исхода по каждой функции | research/33 §7.1, санкция владельца 07.09 | +| 350 | ⚠ **ИСПОЛНЕНО 07.09 (`D39.225`) КРОМЕ ОДНОГО: по каждой из шести функций назван исход — четыре получили причину жизни комментарием («NO CALLER TODAY: contract surface waiting on backlog row 12»), дубль инлайна свёрнут в `finalStageName()`. ОСТАЁТСЯ словарь родов в четырёх носителях; текст его собственной ошибки врать перестал.** **РЕФАКТОРИНГ ОБЛЕГЧЕНИЯ ВЕДЕНИЯ (санкция владельца 07.09) — снапшот-нейтрально, и заказ здесь «решить», а не «удалить».** Вызовов вне определения ноль у шести функций (греп 07.09; КОНТРОЛЬ — `SplitChunks` 34 живых вызова): `obs.SafeGo`, `text.TokenizeCyrillic`, `CheapGateResult.UnitScaleHard`/`UnitScaleSoft`, `Bank.Voices()`, `Bank.Pairs()`. ⚠ **Четыре из шести стоят НАМЕРЕННО, и слепое удаление снимет намеренное:** `UnitScaleHard/Soft` сами называют, кого ждут — `checks/cheapgates.go:155-156` «for the report and a future hard gate», то есть строку **12**; `TokenizeCyrillic` — образец паттерна value-default, на который ссылаются `checks/sanitizer.go:21` и `:197`; `SafeGo` — намеренный контраст к `obs/panic.go`, названный решением `pipeline/waverun.go:405` («NOT obs.SafeGo»), и его удаление повесит два комментария в воздухе — класс строки **299**; `Voices`/`Pairs` (`membank/memory.go:371-376` «frozen for the job») ждут потребителя, которого держит строка **13б**. ⇒ по каждой ОДИН исход с объявлением в отчёте: удалить ЛИБО назвать причину жизни в комментарии. Плюс ИМЯ последней стадии дважды одинаковым инлайном — `r.Pipeline.Stages[n-1].Name` в `pipeline/export.go:283` и `quality.go:342` (адреса на `d6dfc49`). ⚠ **Испр. 07.09: и research/33 §7.1, и первая редакция этой строки называли здесь «готовый `finalStageWave()`» — это ДРУГАЯ функция**: она возвращает ВОЛНУ (`snapshot.go:247`, вызовов 13 — 10 прод и 3 теста), а хелпера для ИМЕНИ не существовало вовсе, и «при готовом хелпере» читалось как «работа уже сделана» и словарь родов в четырёх носителях (`membank/memory.go`, `membank/memseed.go`, `terminology/classify.go:50`, промт), где текст собственной ошибки врёт о принимаемом множестве. ⛔ Границы санкции: НЕ дробить `internal/pipeline` и НЕ переписывать `Runner` (`12-go-style-notes.md` §1, D39.23), ничего, что двигает снапшот / хеш запроса / ключ манифеста. ⚠ Адреса сняты research/33 на `e69902a`, а лендинг 07.09 тронул `memseed.go` и `export.go` — пере-снимать командой, не по тексту | бэкенд | когда-нибудь | попутный проход с батареей + объявление исхода по каждой функции | research/33 §7.1, санкция владельца 07.09 | +| 351 | **ЛИНТ СЛОВАРЯ КЛАССИФИКАТОРА ПИНИТ ОДНО НАПРАВЛЕНИЕ: слово, УБРАННОЕ из Go, не ловит ничто.** Гейт `TestEveryClassifierPromptSpeaksTheEnginesVocabulary` (лендинг `D39.225`) утверждает «каждое слово из `terminology.Types`/`Genders` названо в промте пары» — и потому сжимается вместе со своим предметом: выкинутый класс `title` оставляет батарею зелёной (замер 07.09 на копии: 19 ok / 0 FAIL). Вырожденный предел закрыт стражем `len(classifierVocabulary()) == 0`, общий случай — нет. Настоящий дом — пин САМОГО словаря, которого в репозитории нет (research/33 Д1: 0 тестов на `terminology.Types`). ⚠ Граница названа зоной самостоятельно, в заказ пака не входила | бэкенд | когда-нибудь | пин словаря (голден или рефлексивный тест) | `D39.225`, research/33 Д1 | +| 352 | **ПЯТЬ РУКОПИСНЫХ СПИСКОВ АРМ-КОНФИГОВ ЖИВУТ РЯДОМ С ДВУМЯ ГЕЙТАМИ, КОТОРЫЕ ТЕПЕРЬ ГЛОБЯТ.** `pipeline/promptlabel_test.go:45` · `config/echoregen_shipping_test.go:35` · `config/content_labels_test.go:529` и `:575` · `config/prompt_pack_test.go:239` перечисляют армы поимённо; новый арм автоматически попадает в `TestAnArmIsTheProductionConfigWithADifferentEditor` и `TestSwapArmConfigs` и проходит мимо всех пяти. Найдено приёмкой `D39.225`, вне заказа пака; предсуществующее | бэкенд | когда-нибудь (со следующим касанием армов) | свести пять списков к глобу | `D39.225` | diff --git a/docs/PROGRESS.md b/docs/PROGRESS.md index a8ce942f..c39a4b16 100644 --- a/docs/PROGRESS.md +++ b/docs/PROGRESS.md @@ -1,6 +1,6 @@ # Журнал прогресса -> **⟶ ТЕКУЩЕЕ СОСТОЯНИЕ** (на 2026-09-07, голова D39.224 — КУРС: движок и платформа до «работает и отдаёт результат», фронт ЗАМОРОЖЕН и P7 его НЕ размораживает (D39.147). **ОЧЕРЕДЬ №23** (единственный носитель — здесь; роль передана 06.09, №22 закрыт нотой передачи D39.217; ⚠ испр. 06.09: коммит передачи `c992ee5` бампнул голову и НЕ тронул номер — гейта на номер очереди нет вовсе, `counts.py` сверяет только голову, поэтому носитель разошёлся молча). ⚠ **ЗАКАЗ ВЛАДЕЛЬЦА 01.09 — ПЕРВЫМ:** (0а) **ревизия документации на ПРОТУХШЕЕ** — по всем зонам, не только тронутым; (0б) **планы доработок в БЭКЕНД и ПЛАТФОРМУ** по остатку бэклога и регистра; (0в) **вынос неактуального в АРХИВ** (`docs/archive/`, `platform/docs/archive/`) — за сутки 31.08 закрыто много, и часть носителей стала историей. ⚠ Трезвость по масштабу (пере-считано 02.09): **90** живых дока в `docs/` (пере-счёт 04.09: `find docs -name '*.md' -not -path 'docs/archive/*' | wc -l`), 8 в `platform/docs`, 9 в `backend/docs` — ⚠ из 94 ВРЕМЕННЫЙ остался ОДИН (`DOC_CLEANUP_PLAN`, живой до закрытия батчей Б14/Б15/Б17); два прежних временных уехали в `archive/reports/` 02.09; счёт бэклога — бюллетенем ниже, открытых рядов регистра платформы — 112 (major 3), всего рядов 465 (пере-счёт `python3 docs/scripts/counts.py`; с 04.09 оба числа под гардом `--check`, прежние 95/3 разошлись молча) ⚠ (ревизией 02.09 ряды **154** и **157** переведены из «скоро» в «когда-нибудь»: их гейтом стоял первый холодный прогон, он ОТРАБОТАЛ 31.08 и оба предусловия оказались другими — разбор в самих ячейках, ни одна НЕ закрыта). ⚠ Числа доков `counts.py` НЕ сторожит — при переносе файлов пере-считывать руками командой `find docs -name '*.md' -not -path 'docs/archive/*' | wc -l`. ⚠ И предупреждение о МЕТОДЕ, купленное сменой №21: «выглядит протухшим» ≠ «протухло». Три факта оркестратора опровергнуты ЗАМЕРОМ сессий, а якоря `15-money-path.md` в девяти случаях из двенадцати РОДИЛИСЬ верными и сгнили дрейфом — то есть ревизия обязана быть исполнением, а не чтением. ⚠ **ОЧЕРЕДЬ, унаследованная от №21** (три лендинга 31.08 — секция «СОСТОЯНИЕ ПАКОВ» ниже): **(1) ~~РАЗРЫВ ЦИКЛА~~ ЗАМКНУТ ЖИВЬЁМ 04.09** — пользователь получил EPUB настоящего ПЛАТНОГО перевода ЧЕРЕЗ API, `epubcheck` 5.3.0 на СКАЧАННОМ файле 0/0/0/0 (книга `bk_SS5VES2JELESJSTR`, потрачено $0.278319 из гранта $0.60 при потолке пака $1.5, санкция D39.189). Дверь выдачи построена и проверена исполнением: `202`+`Location`, поллинг с `Retry-After`, Range 206 · второй клиент 200 · аноним 401 · чужая книга 404, TTL с GC, идемпотентность третьего создающего вызова. Все ТРИ сценария строки 216 предъявлены живьём (подпись банка · halt на потолке с exit 4 · `409 run_not_resumable/ceiling_reached` и лечение новым прогоном). +> **⟶ ТЕКУЩЕЕ СОСТОЯНИЕ** (на 2026-09-07, голова D39.225 — КУРС: движок и платформа до «работает и отдаёт результат», фронт ЗАМОРОЖЕН и P7 его НЕ размораживает (D39.147). **ОЧЕРЕДЬ №23** (единственный носитель — здесь; роль передана 06.09, №22 закрыт нотой передачи D39.217; ⚠ испр. 06.09: коммит передачи `c992ee5` бампнул голову и НЕ тронул номер — гейта на номер очереди нет вовсе, `counts.py` сверяет только голову, поэтому носитель разошёлся молча). ⚠ **ЗАКАЗ ВЛАДЕЛЬЦА 01.09 — ПЕРВЫМ:** (0а) **ревизия документации на ПРОТУХШЕЕ** — по всем зонам, не только тронутым; (0б) **планы доработок в БЭКЕНД и ПЛАТФОРМУ** по остатку бэклога и регистра; (0в) **вынос неактуального в АРХИВ** (`docs/archive/`, `platform/docs/archive/`) — за сутки 31.08 закрыто много, и часть носителей стала историей. ⚠ Трезвость по масштабу (пере-считано 02.09): **90** живых дока в `docs/` (пере-счёт 04.09: `find docs -name '*.md' -not -path 'docs/archive/*' | wc -l`), 8 в `platform/docs`, 9 в `backend/docs` — ⚠ из 94 ВРЕМЕННЫЙ остался ОДИН (`DOC_CLEANUP_PLAN`, живой до закрытия батчей Б14/Б15/Б17); два прежних временных уехали в `archive/reports/` 02.09; счёт бэклога — бюллетенем ниже, открытых рядов регистра платформы — 112 (major 3), всего рядов 465 (пере-счёт `python3 docs/scripts/counts.py`; с 04.09 оба числа под гардом `--check`, прежние 95/3 разошлись молча) ⚠ (ревизией 02.09 ряды **154** и **157** переведены из «скоро» в «когда-нибудь»: их гейтом стоял первый холодный прогон, он ОТРАБОТАЛ 31.08 и оба предусловия оказались другими — разбор в самих ячейках, ни одна НЕ закрыта). ⚠ Числа доков `counts.py` НЕ сторожит — при переносе файлов пере-считывать руками командой `find docs -name '*.md' -not -path 'docs/archive/*' | wc -l`. ⚠ И предупреждение о МЕТОДЕ, купленное сменой №21: «выглядит протухшим» ≠ «протухло». Три факта оркестратора опровергнуты ЗАМЕРОМ сессий, а якоря `15-money-path.md` в девяти случаях из двенадцати РОДИЛИСЬ верными и сгнили дрейфом — то есть ревизия обязана быть исполнением, а не чтением. ⚠ **ОЧЕРЕДЬ, унаследованная от №21** (три лендинга 31.08 — секция «СОСТОЯНИЕ ПАКОВ» ниже): **(1) ~~РАЗРЫВ ЦИКЛА~~ ЗАМКНУТ ЖИВЬЁМ 04.09** — пользователь получил EPUB настоящего ПЛАТНОГО перевода ЧЕРЕЗ API, `epubcheck` 5.3.0 на СКАЧАННОМ файле 0/0/0/0 (книга `bk_SS5VES2JELESJSTR`, потрачено $0.278319 из гранта $0.60 при потолке пака $1.5, санкция D39.189). Дверь выдачи построена и проверена исполнением: `202`+`Location`, поллинг с `Retry-After`, Range 206 · второй клиент 200 · аноним 401 · чужая книга 404, TTL с GC, идемпотентность третьего создающего вызова. Все ТРИ сценария строки 216 предъявлены живьём (подпись банка · halt на потолке с exit 4 · `409 run_not_resumable/ceiling_reached` и лечение новым прогоном). > ⛔ **ПЯТЬ ПОТОКОВ РАБОТЫ — состояние на 07.09 (пере-снято лендингами смены №23).** > **(1) ПОЛИГОН — «ремонт прибора»** (`docs/POLYGON_INSTRUMENT_REPAIR_SESSION_PROMPT.md`, строки 319 · 300 · 265 · 143): > ⚠ **ЕДИНСТВЕННЫЙ ПОТОК, НЕ СДВИНУВШИЙСЯ ЗА СМЕНУ — сессия по промту так и не стартовала.** Блокирующая линза @@ -19,7 +19,7 @@ > **344–350**, дописки в 86/114/119/182/224; «переписать» не получил ни один из одиннадцати долгов. Ратифицированы > ПОРЯДОК (шаг 0 параллельно дизайну 161 → шаги 2+3 ОДНИМ окном перенарезки, wire-очередь **182** ложится в него > же → шаг 4 аддитивно) и ФОРМА запретов (жёсткие — только под ратифицированной базой, прочее — условия с -> механизмом, чтобы не спорить с дизайн-паком). **Пак шага 0 НАПИСАН и ВЫДАН 07.09** — +> механизмом, чтобы не спорить с дизайн-паком). **Пак шага 0 ✅ ЗАЛЕНДЕН 07.09, акт `D39.225`** (две смены поведения названы, вторая денежная: прогон по арму теперь покупает банковый контур). Промт был — > `docs/BACKEND_GATES_NOT_PROSE_SESSION_PROMPT.md`, $0 и снапшот-нейтрально: строки 344 · 345 · 346(а) · 348 · 224, > попутно 349/350. Прошёл оба рубежа; вход зоны зелёный (`go test ./... -count=1` → 19 `ok`, 0 FAIL, 4 пакета без > тестов). ⚠ Единственная заказанная смена поведения — экспорт банка на стопе, и её форма ЗАДАНА аддитивной: diff --git a/docs/README.md b/docs/README.md index 1d98f294..a7260746 100644 --- a/docs/README.md +++ b/docs/README.md @@ -24,7 +24,7 @@ |---|---|---| | Оркестратор | [ORCHESTRATOR_SESSION_PROMPT.md](ORCHESTRATOR_SESSION_PROMPT.md) | роль и нормы; счётчик роли — CURRENT-STATE | | Бэкенд · КОНСИСТЕНТНОСТЬ | активного НЕТ | пак ОТРАБОТАН и **ПРИНЯТ С ДОФИКСОМ 07.09** — акт **D39.222**; промт в `archive/prompts/` с баннером исхода. Строки 267 и 318 закрыты, у 320 исполнена половина (а). Живой остаток зоны — строка **333** (шов-близнец: мутация любого из трёх ключей переживает три пакета) и 320(б) | - | **Бэкенд · ГЕЙТ ВМЕСТО ПРОЗЫ (шаг 0)** | [BACKEND_GATES_NOT_PROSE_SESSION_PROMPT.md](BACKEND_GATES_NOT_PROSE_SESSION_PROMPT.md) | ⚠ **ВЫДАН 07.09**, пак **$0** и снапшот-нейтрально — шаг 0 разбора техдолга (`D39.224`): строки 344 · 345 · 346(а) · 348 · 224, попутно 349/350. Идёт ПАРАЛЛЕЛЬНО дизайну 161; лендинг — ДО пака стройки | + | Бэкенд · ГЕЙТ ВМЕСТО ПРОЗЫ | активного НЕТ | пак ОТРАБОТАН и **ПРИНЯТ С ДОФИКСОМ 07.09** — акт **D39.225**; промт в `archive/prompts/` с баннером-исходом | | **Бэкенд · СТРУКТУРА ГЛАВ (ДИЗАЙН)** | [CHAPTER_STRUCTURE_DESIGN_SESSION_PROMPT.md](CHAPTER_STRUCTURE_DESIGN_SESSION_PROMPT.md) | ⚠ **ПРОЕКТИРОВАНИЕ, НЕ СТРОЙКА** (`D39.136` п.3): дизайн окна большой пере-нарезки — чем адресуется глава и развязка чанкера (161) · карта осей сдвига · банк-окна на chapter-ID · контент-адресуемый resume `D15.2` · IR/адаптеры/индуктор · правило заголовка и не-CJK путь (303) · гранулярность EPUB (302) и выдача (283). Снимает временный отказ интейка книге из одной главы (`D39.221`). Пак 1 «форматы и честный словарь» ОТРАБОТАН и ПРИНЯТ 06.09 — акт **D39.210**, промт в `archive/prompts/`. ⚠ **ПАК 2 (лексиконы не-CJK, корпус, замер оракулом) — НЕ НАПИСАН и ждёт файлов владельца** | | Бэкенд · отозванный | активного НЕТ | пак КАЧЕСТВО написан и ОТОЗВАН до выдачи 05.09 (`archive/prompts/…_WITHDRAWN.md`): предмет дешевле пака — точность чекера уже измерена, пере-снять её стоит одной команды. Следующий пак — СТРУКТУРА ГЛАВ (решение владельца 05.09 «любая книга любого формата»), пишется | | Бэкенд · прежний | активного НЕТ | пак «денежный стоп» ОТРАБОТАН и ПРИНЯТ С ДОФИКСОМ 05.09 — акт **D39.206** (`81a89e9` + `616a8e4`), промт в `archive/prompts/` с баннером исхода. Следующая работа зоны — строки **291** (флаг вместо клина, `D39.204`) · **294** (форма «сколько добавить», `D39.203`) · **296** (точечная перегенерация по промаху глоссария, после 295) | diff --git a/docs/STACK.md b/docs/STACK.md index 07dc3a2f..228beed6 100644 --- a/docs/STACK.md +++ b/docs/STACK.md @@ -9,7 +9,7 @@ | **терминолог** | `deepseek-v4-flash` | thinking ON, `gates.terminology.reasoning:"low"` (одна ручка на обе бэнк-роли) | `configs/pipeline-c1.yaml`, блок `gates.terminology` — **ВКЛЮЧЁН в shipping с `b8154cd`** (`enabled: true`, `budget_usd: 1.00`); схема — `internal/config/pipeline.go`, греп `type TerminologyGate struct` | боевой по факту прогонов; носитель — конфиг книги | quirks §0731 п.3а: пустой `reasoning` = вендор-`high` → 4/5 `length` с пустым телом; экран `target_script: Cyrillic` обязателен при гейте ON | | **классификатор** (типы кандидатов) | flash (`classify_model` пуст ⇒ = model) | та же ручка | там же: `classify_types: true` + `classify_budget_usd: 1.00` | **ВКЛЮЧЁН в shipping с `b8154cd`** (прежде — только проба/полигон) | латентный мис-вердикт `cjk_artifact` — `13-tech-debt-anchors.md` §Б-105 | | **editor** | `deepseek-v4-pro` **БИЛИНГВ** | thinking ON; `reasoning:"off"` = осознанный NO-OP (ReasoningNone); ⚠ **ручка эффорта у `pro` ЕСТЬ — прежний клейм «ручки НЕТ (`low`→`high`)» СНЯТ 04.09 сверкой с квирк-каноном.** Канон пере-снят полигоном 30.08 живым `curl` (§3а: «ТАБЛИЦА У ВЕНДОРА ИЗМЕНИЛАСЬ, И ЗАПИСЬ НИЖЕ БОЛЬШЕ НЕ ВЕРНА»), а поведенческая проба того же дня (§3г, $0.038276) показала: **параметр `low` на `pro` ТЕПЕРЬ ДОХОДИТ ДО МОДЕЛИ** (−79 prompt_tokens). ⚠ **Фиксируем ровно «ручка доходит», НЕ «ручка работает»:** ВЕЛИЧИНА эффекта не установлена (§3д: разброс ×38, причина не установлена), и это живой остаток строки 172(г). ⚠ **ИСПР. 05.09: НОСИТЕЛИ БОЛЬШЕ НЕ ПРОТИВОРЕЧАТ.** Прежняя редакция говорила «`PROGRESS.md` утверждает обратное» — не утверждает: и строка **237**(б), и квирки §3г, и этот файл говорят ОДНО — ручка ДОХОДИТ до модели с вендор-апдейта 13.08. Спор был фантомным и заставлял читателя искать сторону там, где сторон нет. Живой остаток другой и он один: **вендор-сверка САМОГО МАППИНГА (`low`→что именно) и ВЕЛИЧИНА эффекта** — поведенческого замера после 13.08 нет ни у кого. ⚠ **D39.137 про эффорт МОЛЧИТ** (11 строк, ноль упоминаний) — ссылаться на неё как на «ручка появилась 13.08» уже пробовали (испр. №18 20.08): конфабуляция по смежности, `V4-Pro-0813` — чекпойнт ВЕСОВ при вендорском «Model names remain unchanged», а не дата появления ручки. **Закрывается вендор-сверкой, а не выбором стороны**; до неё в силе КАНОН | `configs/pipeline-c1.yaml` блок редактора; floor 16000 — `models.yaml` ключ `deepseek-v4-pro`, поле `min_max_tokens` | боевой ИНТЕРИМ (D30.1/D39.22); D39.117: топология 2-прохода ПОДТВЕРЖДЕНА (`A/F3` +2.50 Holm 0.0004), жильцы dspro/glm-5 неразличимы ⇒ выбор = цена; закон-блок ОБЯЗАТЕЛЕН и ВНЕСЁН (D39.104 п.2, вайр-батч; строка 134 закрыта и снята) | quirks §0731 п.3а (маппинг pro), п.3б (замер `low` на pro ОТОЗВАН — НЕ УСТАНОВЛЕНО); вахта смены маппинга «early August 2026» — §Б-108 | -| **editor-резерв** | `glm-5` | thinking OFF ЯВНО (`extra_body {thinking:{type:disabled}}`, иначе таймауты ×3) | `configs/pipeline-arm-glm.yaml` блок редактора + `models.yaml` ключ `glm-5` | резерв; флип = один арм-конфиг. mistral-арм есть, но mistral ИСКЛЮЧЁН как редактор (D39.20) | quirks thinking-таблица (glm-5); эхо-экспозиция билингва при thinking-OFF НЕ измерена (`sourceEchoExposure`) | +| **editor-резерв** | `glm-5` | thinking OFF ЯВНО (`extra_body {thinking:{type:disabled}}`, иначе таймауты ×3) | `configs/pipeline-arm-glm.yaml` блок редактора + `models.yaml` ключ `glm-5` | резерв; флип = один арм-конфиг — **и с 07.09 это правда**: арм равен боевому вне блока редактора, и равенство держит гейт `TestAnArmIsTheProductionConfigWithADifferentEditor` (сравнивает конфиги ЦЕЛИКОМ, а не список ключей). ⚠ **Цена флипа названа:** арм теперь несёт банковый контур, поэтому прогон по арму ПОКУПАЕТ банк терминов и его волновые снапшоты отличаются от боевых; прежде контур в армах отсутствовал, книжная часть сметы молча падала в ноль, и флип покупал книгу дешевле, чем о ней сообщал. Арм `deepseek-v4-pro` СНЯТ 07.09: редактор боевого — он же, и файл был второй копией боевого. mistral-арм есть, но mistral ИСКЛЮЧЁН как редактор (D39.20) | quirks thinking-таблица (glm-5); эхо-экспозиция билингва при thinking-OFF НЕ измерена (`sourceEchoExposure`) | | **судья Ф2** | Gemini (нативный адаптер — Ф2, строка 33); в C2-скелете провизорно `glm-5` | Gemini: thinking mandatory | `models.yaml` ключ `gemini-3.1-pro-preview`; `pipeline-c2.yaml` блок `select` («DO NOT FLIP») | Ф2/полигон — в движке НЕ построен; C2 неисполняем | quirks: `thinking_budget:0` → HTTP 400; учёт `additive_total`; судья ЭРОТИКИ непригоден (PROHIBITED_CONTENT неконфигурируем, D22.6) → первичный судья 18+ = grok | | **канал B (18+)** | `mistral-large-2512` (переводчик-дефолт, D19.1) + `grok-4.3` (эскалация reasoning-ON + судья 18+) | mistral: не-reasoning; grok: OFF только явным `reasoning_effort:"none"` | `models.yaml` ключи `mistral-large-2512` (accepts_labels, rate_limit) и `grok-4.3` · c1 `chains.adult:[grok-4.3]` | данные заведены; полный wiring — Ф2; `content_policy` пуст во всех shipping (сознательно) | quirks §Транспорт: mistral rate-limiter (~48% retry-fails → `max_concurrency:2`); grok: вложенная форма эффорта молча глотается; additive-биллинг (think-ON только за резервом D6.2) | | **эскалация (канал A)** | draft single-hop → `deepseek-v4-pro`; цепочка `[deepseek-v4-pro, glm-5.1, gemini-3.1-pro-preview]` | наследует политику мишени; апекс mandatory-thinking | `configs/pipeline-c1.yaml`, блок `escalation` | заведена, но ⚠ `budget_usd: 0` в shipping ⇒ НЕ исполняется (ран-локальные: 0.10 / 0.015) | слаг ИМЕННО `-preview` (без него 404); C2-цепочка `[kimi-k2.6]` = интерим-заглушка, НЕ контракт | diff --git a/docs/architecture/05-decisions-index.md b/docs/architecture/05-decisions-index.md index 52c9f6df..215ab145 100644 --- a/docs/architecture/05-decisions-index.md +++ b/docs/architecture/05-decisions-index.md @@ -1,4 +1,4 @@ -# Реестр D-нот — карта актуальности v2 (D1–D39.224; титул — носитель головы, бампать при каждом аппенде) +# Реестр D-нот — карта актуальности v2 (D1–D39.225; титул — носитель головы, бампать при каждом аппенде) > ⚠ **Колонку «тело» `counts.py --check` НЕ сторожит по устройству:** он сверяет полноту НОМЕРОВ, а не > место тела, поэтому колонка держится дисциплиной лендинга. Не нашёл тело по колонке — иди в слайсы, @@ -283,3 +283,4 @@ | D39.222 | 07.09 | **АКТ: движковый пак «закон банка честно» ПРИНЯТ С ДОФИКСОМ**. Непокрытая пара закрыта, слепое пятно постчека названо В КОДЕ, два ложных комментария сняты; репорт-онли подтверждён исполнением (снапшот, `memory_version`, `manifest_key` не двигаются). Приёмка: 3 major — обещание о `src` достроено и запинено идемпотентностью нормализатора · гарантия `approvedNeighbours` жила только в комментарии (пин заведён, пере-проверен мутацией оркестратора) · утверждение отчёта опровергнуто его же §9. Шесть кругов, 43 находки в своей работе; цена подпорки измерена — ТРИ круга. Строки 267 · 318 закрыты | жив | ЖИВОЕ: строка 333 (шов-близнец), 320(б) — стоп-мир данных | лендинг бэкенд банк приёмка мутации | | D39.223 | 07.09 | **ТРИАЖ ОТКРЫТОГО ПОСЛЕ ДВУХ ЛЕНДИНГОВ**: строки **334–343** заведены (в т.ч. 340 — асинхронная ветвь интейка проницаема, закрыть нечем без пятой причины отказа, НА ВЛАДЕЛЬЦЕ); два пункта отклонены с причиной. ⚠ Пропуск носителей на обоих актах нашёл ВОПРОС ВЛАДЕЛЬЦА, а не гейт. Находка платформы про §2.12 компаньона оказалась половинчатой: каналы разные, утверждение истинно, мертвы были якоря | жив | ЖИВОЕ: строка 340 ждёт слова владельца | триаж носители приёмка контракт | | D39.224 | 07.09 | **РАЗБОР research/33 В ТРЕКЕР**: заведены строки **344–350** (шов заголовка · словари классификатора · правило заголовка и `第零章` · каналы langpack · арм-шапки · остатки · рефакторинг по санкции владельца), дописки в 86/114/119/182/224; «переписать» не получил ни один из 11 долгов. Порядок: шаг 0 ПАРАЛЛЕЛЬНО дизайну 161 → шаги 2+3 одним окном перенарезки (wire-очередь 182 ложится в него же) → шаг 4 аддитивно; цена «дважды» условна (D39.190 п.4), ограничение — время до интейка. Запреты только под ратифицированной базой, остальное — условия с механизмом | жив | ЖИВОЕ: место строки 160 относительно стоп-мира перекроя — вопрос дизайну (п.6); критерий шага 1 (п.8) — в дизайн-пак; четыре ошибки разбора названы в п.9 | техдолг трекер порядок деньги | +| D39.225 | 07.09 | **АКТ: движковый пак «гейт вместо прозы» ПРИНЯТ С ДОФИКСОМ** (`7ffec51` + `4188ba5`). Пять швов, державшихся прозой, держат гейты; закрыты строки 344/345/348/349, половинами 224/313/346/350, остатки — 351/352. Числа пере-сняты приёмкой: батарея 19/0/4, мутационный гейт 14 записей и 0 unexpected со свипом якорей `0 of 225`. СМЕН ПОВЕДЕНИЯ ДВЕ: секция предложений в сайдкаре стопа (аддитивно) и ДЕНЕЖНАЯ — прогон по арму теперь покупает банковый контур. Класс A онтологии банка заведён сознательно: у секции ноль читателей, носитель — платформенная половина 253 | жив | ЖИВОЕ: платформенная половина 224/253 (читатель секции) · вопрос `pending_decisions` в контракте 14 · строки 351/352 | движок гейты банк деньги приёмка | diff --git a/docs/architecture/05-decisions-log.md b/docs/architecture/05-decisions-log.md index f8dd3c66..5d048c20 100644 --- a/docs/architecture/05-decisions-log.md +++ b/docs/architecture/05-decisions-log.md @@ -1,4 +1,4 @@ -# Журнал решений оркестратора — контракт D1–D39.224 (живой файл: карта · эрраты · живые тела · голова D39.124+ (подрезка D39.139); тела закрытых эр — в слайсах `docs/archive/architecture/`, указатель ниже; реестр всех нот — `05-decisions-index.md`) +# Журнал решений оркестратора — контракт D1–D39.225 (живой файл: карта · эрраты · живые тела · голова D39.124+ (подрезка D39.139); тела закрытых эр — в слайсах `docs/archive/architecture/`, указатель ниже; реестр всех нот — `05-decisions-index.md`) > **⟶ КАРТА АКТУАЛЬНОСТИ (ревизия D31, продлена до D38.2 [12.07]; исторические записи ниже НЕ переписываются — дисциплина D23.3).** Работая с контрактом (греп номера: живой файл → слайсы, целиком НЕ читать — D39.125), держи под рукой, что чем перекрыто: > ⚠ **Эррата 09.08 (D39.125):** D39.111 п.1 предписывал промту S3 «максимум = баланс МИНУС открытые холды» — формула ОШИБОЧНА (вычитание дважды), исправлена D39.115 п.2(а): максимум = Balance КАК ЕСТЬ; тело D39.111 — в слайсе `../archive/architecture/05-decisions-D39-106-123.md` (испр. 05.09: прежнее «живёт ниже в этом файле» протухло подрезкой D39.139) (голова D39.106+). @@ -2990,3 +2990,53 @@ inherited». Это самая дорогая из четырёх: она отп и часть адресов §3 протухла. Пере-снято: `export.go:174/340/341` → `:176/342/343` · `terminologist.go:570` → `:603` · `PROGRESS.md:31` → `:52`. Контроль в другую сторону: якоря `mining.go` (234/241/244/269) лендинг НЕ тронул, порядок экспорта банка на стопе открыт ровно как описан. + +## D39.225 — АКТ: движковый пак «ГЕЙТ ВМЕСТО ПРОЗЫ» ПРИНЯТ С ДОФИКСОМ; две смены поведения названы, класс A заведён сознательно (07.09, оркестратор №23) ✅ + +**1. Что заландено.** `7ffec51` (зона, 37 файлов, снят `configs/pipeline-arm-deepseek-pro.yaml`) + `4188ba5` (три новых +тест-файла: pathspec не берёт untracked, и первый коммит их не взял). Отчёт зоны — `PROGRESS.md`, секция +«Бэкенд», подзаголовок «Пак «гейт вместо прозы»». Закрыты строки **344 · 345 · 348 · 349**; половинами — +**346**(а) · **224** (движковая) · **313** (носитель появился) · **350** (кроме словаря родов); остатки +заведены строками **351** и **352**. + +**2. Числа пере-сняты мной на заландённом дереве, а не приняты с отчёта.** `make battery` exit 0 — +**19 `ok` · 0 `FAIL` · 4 без тестов**, линт 0 issues, 4 скипа поимённо. `make mutations` exit 0 — +**14 записей · 0 unexpected**, и `anchors swept: 0 of 225 rotten` печатается ВСЕГДА, зелёным прогоном тоже. +Дифф тестов снят ИМЕНАМИ (`comm -13` по отсортированным спискам), а не разностью счётчиков: **+8**. + +**3. СМЕН ПОВЕДЕНИЯ ДВЕ, обе заказанные, обе называются вслух.** **(а)** Стоп-граница публикует свои +предложения отдельной секцией того же сайдкара; форма аддитивная, `tm-bank-v1` не бампается, платформа +разбирает аллоулистом и поле игнорирует. ⛔ Запрещённая форма — перенос засева в ветку стопа — не взята и +запрещена в промте: неподписанные строки инъектируются законом (`D39.104` п.2) и двинули бы +`memory_version`, то есть снапшот. **(б) ДЕНЕЖНАЯ:** пере-снятые армы получили банковый контур, поэтому +прогон ПО АРМУ покупает то, чего не покупал, и оба его волновых снапшота сдвинуты. Оплаченных книг это не +касается — деплой прибит к боевому, ни одна книга не пиннута к арм-файлам. ⚠ Прежде было наоборот и молча: +без `contrast_path` книжная часть сметы арма равнялась НУЛЮ, и флип деплоя покупал книгу дешевле, чем о ней +сообщал. + +**4. Класс A заведён СОЗНАТЕЛЬНО и записан у своего предмета.** У новой секции сегодня НОЛЬ читателей. +`18-bank-ontology.md` получила эррату: третий член её класса A (строка 224) закрыт со стороны движка — ровно +как требует её же правило «чинятся раньше, а не когда читатель придёт», — а обязательство сделать читателя +названным несёт платформенная половина строки **253**. ⚠ Её фраза «читаемый банк несёт итоги БЕЗ +предложений» с этого дня ложна и помечена; оговорка «когда экран закажут» относится к полному ДЖОЙНУ +«предложено × решено × нерешено», который наружу по-прежнему не выносится. + +**5. Контракт 14: две посылки помечены, ни одна не переписана.** Якорь `kind` указывал на снесённый паком +`bankTypeOK` — пере-направлен на `CandidateTypes` (единственный носитель `nickname`; `Types` его не несёт). +Довод сноса `pending_decisions` («честный счёт нерешённости платформа не вычислит») ОСЛАБ: источник теперь +есть снаружи движка ⇒ вопрос открыт и решается вместе с платформенной половиной 253. + +**6. Недосмотр заказа, названный чтобы не повторился.** Карта чтения пака не назвала `18-bank-ontology.md`, +хотя пак заказывал правку ПРОЕКЦИИ, которую эта страница нормирует тремя правилами. Нашла приёмка, а не +заказ. ⇒ ревью-вопрос к будущим промтам: правит ли пак носитель, у которого есть своя нормативная страница. + +**7. Приёмка.** Два верификатора: слепой по диффу против заказа (8 находок) и по местам вне карты отчёта +(11). Блокирующих нет. Дофикс закрыл вырожденность линта словаря, плейсхолдер `{{title}}`, необеспеченные +поля листа подписи, текст падения стража предпосылки и ПОСЛЕДНИЙ ХОП шва (`bookbuild`) — там и рождается +симптом «книга выходит с «1» вместо названия», с которого пак начинался. Одну находку зона ОТКЛОНИЛА +доводом с числом (бound `reasoning_max_tokens` в паритете армов: у боевого этого ключа нет и быть не может, +значит сравнивать не с чем, и проверка была бы политикой, придуманной тестом) — принято. + +**8. Ратифицировано этим актом.** `make mutations` живёт СОСЕДНЕЙ целью, а не внутри `battery`: пере-замер +дал **123 %** её времени, и гейт идёт без `-race` — доказывает меньше, стоит больше. Снятый +`pipeline-arm-deepseek-pro.yaml` остаётся снятым: редактор боевого — он же, файл был второй копией боевого. diff --git a/docs/architecture/14-api-contract/README.md b/docs/architecture/14-api-contract/README.md index 99faa446..4e3d24ff 100644 --- a/docs/architecture/14-api-contract/README.md +++ b/docs/architecture/14-api-contract/README.md @@ -304,7 +304,7 @@ drop юнит несёт причину ПЕРВОГО выпавшего чле | Поле | Словарь 0.3.0 | Что было у движка | Грунт | |---|---|---|---| | `status` | `proposed · in_progress · approved` | `auto · draft · approved` | `store/migrate.go:191`; только `approved` — канон | -| `kind` ◆ | `name · place · title · term · nickname` **плюс `null`** | то же | `terminology/classify.go:15` + `banknote.go:74`; пустое — `membank/memseed.go:323-326` | +| `kind` ◆ | `name · place · title · term · nickname` **плюс `null`** | то же | `terminology/classify.go:27` (`CandidateTypes` — единственный носитель `nickname`; ⚠ испр. 07.09: прежние `classify.go:15` + `banknote.go:74` мертвы — `Types` не несёт `nickname`, а `bankTypeOK` снесён паком «гейт вместо прозы» и сведён к `CandidateTypes`); пустое — `membank/memseed.go:323-326` | | `origin` | `given · annotated · found` | `seed · ruby · mined` | пути записи, см. ниже | | `sense` | свободный текст, пустая строка = «нет различителя» | то же | `store/migrate.go:182` | | окно | `since_chapter`/`until_chapter`, **`null` = без границы** | целые, `0` = без границы | `store/migrate.go:189-190` | @@ -792,7 +792,11 @@ the original request was never applied». Каждый `POST /books` созда - **пере-определить нельзя**: честный счёт нерешённости — движковый (`SignatureState`: карта последнего стопа против файлов решений); read-модель платформы его НЕ вычислит, не пере-реализовав - движковый закон у себя, что запрещено (17-seam-inbound-law п.6; `18-bank-ontology.md`, «Чего эта + движковый закон у себя, что запрещено ⚠ **ИСПР. 07.09: посылка сноса ОСЛАБЛА, довод — нет.** Платформа + по-прежнему не вычислит счёт сама, но с пака «гейт вместо прозы» движок публикует свои предложения + стопа секцией сайдкара, то есть источник для честного счёта теперь ЕСТЬ снаружи движка. ⇒ вопрос + «возвращать ли `pending_decisions`» снова открыт и решается вместе с платформенной половиной строки + **253**; до её лендинга читателей у секции ноль, и контракт её НЕ объявляет намеренно (17-seam-inbound-law п.6; `18-bank-ontology.md`, «Чего эта форма НЕ несёт»); - **пометить («пока нули») нельзя**: поле, обязательное в схеме и вечно лгущее нулём, — это ровно класс PD-370 («канон объявляет — деплой не обслуживает»), только в поле вместо пути; diff --git a/docs/architecture/18-bank-ontology.md b/docs/architecture/18-bank-ontology.md index 317c9fa5..e4b7ed00 100644 --- a/docs/architecture/18-bank-ontology.md +++ b/docs/architecture/18-bank-ontology.md @@ -71,6 +71,17 @@ один писатель» — читается в обе стороны: **два писателя без читателя судятся так же строго, как проекция без потребителя, и чинятся раньше, а не когда читатель придёт.** +⚠ **ЭРРАТА 07.09 (оркестратор, акт лендинга пака «гейт вместо прозы»): ТРЕТИЙ ЧЛЕН КЛАССА A ЗАКРЫТ СО +СТОРОНЫ ДВИЖКА.** Стоп-граница теперь публикует свои предложения отдельной секцией того же сайдкара, +который экран подписи уже читает, — то есть исполнено ровно то, чего требует правило этой страницы +(«чинятся раньше, а не когда читатель придёт»), а не рефактор под несуществующий экран. Следствия для +текста ниже: фраза «читаемый банк несёт итоги БЕЗ предложений» с этого дня ЛОЖНА и читается как описание +до-паковой формы; оговорка «когда экран закажут» относится к полному ДЖОЙНУ «предложено × решено × +нерешено», который по-прежнему живёт только внутри движка и наружу не выносится. ⛔ **Долг, названный +вслух:** у новой секции сегодня НОЛЬ читателей — платформа разбирает сайдкар аллоулистом и поле +игнорирует; носитель обязательства сделать читателя названным — платформенная половина строки **253**. +Пока она открыта, это проекция без потребителя, то есть класс A, заведённый сознательно и с адресом. + ## Чего эта форма НЕ несёт Джойн «предложено × решено × нерешено» существует только внутри движка. Читаемый банк несёт итоги без diff --git a/docs/BACKEND_GATES_NOT_PROSE_SESSION_PROMPT.md b/docs/archive/prompts/BACKEND_GATES_NOT_PROSE_SESSION_PROMPT.md similarity index 98% rename from docs/BACKEND_GATES_NOT_PROSE_SESSION_PROMPT.md rename to docs/archive/prompts/BACKEND_GATES_NOT_PROSE_SESSION_PROMPT.md index 64a37e3c..60687b4b 100644 --- a/docs/BACKEND_GATES_NOT_PROSE_SESSION_PROMPT.md +++ b/docs/archive/prompts/BACKEND_GATES_NOT_PROSE_SESSION_PROMPT.md @@ -1,3 +1,8 @@ +> ⚠ **ОТРАБОТАН И ПРИНЯТ С ДОФИКСОМ 07.09 — акт `D39.225`.** Инструкции отсюда НЕ исполняются: пак закрыт, +> его строки 344/345/348/349 закрыты, остатки живут строками 351/352 и половинами 224/313/346/350. +> ⚠ Известный недосмотр заказа: карта чтения не назвала `architecture/18-bank-ontology.md`, которая нормирует +> правку проекции, заказанную §4.2(а) — разбор в `D39.225` п.6. + # Пак бэкенда: «ГЕЙТ ВМЕСТО ПРОЗЫ» — шаг 0 разбора техдолга ## 1. Какая проблема и что решит твой результат diff --git a/docs/product-requirements.md b/docs/product-requirements.md index 1d38953a..953328e0 100644 --- a/docs/product-requirements.md +++ b/docs/product-requirements.md @@ -84,7 +84,7 @@ | ID | Требование (источник) | Статус | Носитель / доказательство | |---|---|---|---| -| ПТ-37 | **Нарезка по границам СЦЕН**, а не по объёму: «граница сцены — удобная порция, где не теряется смысл; сцены можно склеить, крупная должна вмещаться в контекст» (V6-1/V6-3) | ⭕ | не построено. Книга режется бюджетом ОЦЕНЁННЫХ ВЫХОДНЫХ токенов: пакуются целые абзацы, при переполнении спуск до границ предложений, предложение не разрывается (`backend/internal/chunk/chunker.go:336-342`=`prefer paragraph boundaries`). Сцены как семантической единицы нет; ближайшее — «инерция сцены» A5, где границей сцены считается граница ГЛАВЫ (`backend/internal/pipeline/wave.go:72`=`a new chapter is a scene change`). Полигон отдельно фиксирует, что требование «не исполнено ни разу» | +| ПТ-37 | **Нарезка по границам СЦЕН**, а не по объёму: «граница сцены — удобная порция, где не теряется смысл; сцены можно склеить, крупная должна вмещаться в контекст» (V6-1/V6-3) | ⭕ | не построено. Книга режется бюджетом ОЦЕНЁННЫХ ВЫХОДНЫХ токенов: пакуются целые абзацы, при переполнении спуск до границ предложений, предложение не разрывается (`backend/internal/chunk/chunker.go:336-342`=`prefer paragraph boundaries`). Сцены как семантической единицы нет; ближайшее — «инерция сцены» A5, где границей сцены считается граница ГЛАВЫ (`backend/internal/pipeline/wave.go:71`=`a new chapter is a scene change`). Полигон отдельно фиксирует, что требование «не исполнено ни разу» | | ПТ-38 | **Майнинг ВСЕХ терминов дешёвой моделью с явной JSON-схемой и КООРДИНАТАМИ вхождений** (V6-1) | 🔶 | майнер и фокус-классификатор построены; KWIC-контексты вхождений персистятся и едут терминологу. Чего нет: ответ терминолога — не JSON, а три поля через табуляцию (`backend/prompts/zh-ru/terminologist.md`), офсетов/координат в нём нет вовсе. Служебная инфа о книге (нарезка по главам) построена; поиск идиом и прочего — не начат | | ПТ-39 | ⚠ **испр. 05.09: ось рода ПРОИЗВОДИТСЯ** классификатором и доезжает до редакторского провода с лендингом вайр-батча (на ЧЕРНОВОЙ не едет и не поедет — базовый банк исключает майненное по денежному контракту D39.42 п.3); как пример непостроенного производителя больше не годится. **Решение по термину С ОБОСНОВАНИЕМ** от дорогой модели, с контекстом первого появления (V6-2) | ⭕ | терминолог возвращает РОВНО три поля — термин, перевод, уверенность 0–100 — и уверенность явно НЕ арбитр, она только сортирует лист ревью. Обоснования нет ни в промпте, ни в парсере. ⚠ Формат его примет аддитивно: поле `Note` в схеме сида существует (`backend/internal/seed/seed.go:81`=`Note string `), то есть строить надо ПРОИЗВОДИТЕЛЯ, а не формат — тот же паттерн, что у оси рода (строка 210) | | ПТ-40 | **Раздельные правила перевода по классам сущностей** — имена отдельно, магические предметы отдельно (V6-2, ПРЯМОЙ вопрос владельца «мы кстати так и делаем или нет?») | 🔶 | **Наполовину да.** Отдельный фокус-классификатор построен, со своей ролью, промптом и осью цены, и раскладывает термины по ЧЕТЫРЁМ закрытым классам `name`/`place`/`title`/`term`, где имена и топонимы транскрибируются, а титулы и реалии переводятся по смыслу (`backend/prompts/zh-ru/classifier.md`). Заведён 01.08, потому что черновой тип врал в 12–22%. **Чего нет:** отдельных ВЫЗОВОВ и отдельных наборов правил на класс — терминолог получает один смешанный список; отдельного класса «магические предметы» не существует, они лежат в `term` вместе с материалами, веществами и классами существ. Окупается ли разделение — не мерено |