textmachine/docs/architecture/13-tech-debt-anchors.md

207 lines
72 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Якоря техдолга — справочник к строкам бэклога (НЕ трекер)
> **Часть находок ниже уже ЗАКРЫТА — закрытие помечено по месту D-номером, счёт закрытий в трекер не дублируется (D39.101).**
> **Единственный трекер — таблица «Бэклог» в `../BACKLOG.md`** (переехала из `PROGRESS.md` 06.09, D39.218; ID строк прежние). Этот файл — справочные file:line-якоря и скоуп-заметки к её строкам (вынесен из архива решением владельца — содержимое ЖИВОЕ). Актуализируется лендингами паков, которые трогают эти строки; исполненный пункт помечать ссылкой на D-номер, не удалять.
> **Снятая мёртвая половина** (историческая улика ОТСУТСТВИЯ механизмов — снимок свипа 26.0701.08 с file:line того времени) живёт носителем: `docs/archive/architecture/05-decisions-D39-59-90.md`, греп `D39.66-пост-сверка`; исполнение среза строки 25 — там же греп `D39.78`; закрытия банк-арки — `D39.69`. Здесь оставлен только ДЕЙСТВУЮЩИЙ статус.
> ⛔ **ЗАМЕР 10.09: ГОЛЫЕ ЯКОРИ ГНИЮТ И В ЖИВЫХ СЕКЦИЯХ, А НЕ ТОЛЬКО В АРХЕОЛОГИИ.** Оговорка ниже
> («снимок 09.08, сверяйся ГРЕПОМ») по тексту относится к секции археологии, и живые секции читались как
> надёжные. Ревизия разрешила каждый голый якорь живых секций по одному: **из 19 попали в цель 9, съехали
> 10** — среди съехавших `classify()`, `RedriveSelector`, `SpoilerLeaks`, `repinnable`, `VoiceFlags`.
> Контроль на том же приборе: **все 9 токен-формных якорей этого файла — 9 из 9 на месте, 0 съездов**.
> ⇒ **правило файла: новый якорь пишется ТОЛЬКО токен-формой либо грепом; голый `файл.go:N` не заводить**,
> а встреченный — переводить в токен-форму при первом же касании ячейки. Голые адреса гейт не видит ПО
> ПОСТРОЕНИЮ, поэтому их гниение ничем не сигналится, кроме такой ревизии.
> ⚠ **Второй гвоздь под якоря НЕ строить — гейт уже построен и ратифицирован (D39.126):** `docs/scripts/counts.py --lint` сверяет якорь ПО СОДЕРЖИМОМУ через опт-ин токен `` `путь:123`=`подстрока` ``, органический остаток мигрируется на ЗАТРОНУТЫХ строках (бэклог-строка 205 — ЗАКРЫТА D39.200: гейт построен, миграция корпуса на токен-форму органическая и носителя больше не требует). Этот док — концентрат якорей, и органика на нём не сработала: токен-форму несут единицы, остальные гейт не видит ПО ПОСТРОЕНИЮ. Правильное действие — пакетная миграция якорей в токен-форму, не новый механизм.
## Срез: строки 81/83/85 + инфра-дописки
### [RESCOPE ИСПОЛНЕН] Строка 81 — ja-преп B6-ja: Поливанов-валидатор + kana-омограф POS/known-word гейтинг (D17.1) + чек-лист kana-алиасов сида (D16.4)
Два компонента отсутствуют (полный состав и токен-якоря — строка 81 бэклога в `../BACKLOG.md`; здесь только отрицательная улика). **(1) Поливанов-валидатор:** валидирующего кода НЕТ — grep `polivanov`/`Поливанов` по `backend/**/*.go` даёт только значения конфига в тестах/примерах, коммент `Transcription` (`backend/internal/config/book.go`) и мост ruby-чтения (`backend/internal/membank/memseed.go`, греп `Polivanov bridge`, там же «B6, Phase 2»); поля схемы `translit_policy`/`ruby_reading` помечены «Phase 2» самим кодом. **(2) kana-омограф гейтинг** отложен явно: «KANA and HAN are deliberately NOT boundary-checked … their ≥4 precision is deferred to the kana-precision measurement + the B6 tokenizer» (`backend/internal/membank/memory.go`), подтверждено D17 (тело — слайс `D1-D38`: митигация kana-омографов → «скоуп B6»). **Третий компонент — чек-лист kana-алиасов сида (D16.4) — ПОСТРОЕН** (`backend/README.md` §ja + `AttachRubyAliasesToManual`); в чек-листе остался лишь Ф2-хвост «двойные чтения (強敵→とも) полная дизамбигуация», и он тоже под B6.
### [ЗАКРЫТО D39.82] Строка 83 — F4: бэкап + integrity_check SQLite перед платным прогоном (VACUUM INTO) → **ИСПОЛНЕНО D39.82: `tmctl backup` + pre-flight (`backend/cmd/tmctl/backup.go`, коммит `9f60746`; команда `backup` в `dispatchCommands`), строка 83 закрыта; остаток F4-хвоста — строка 93**
### [CONFIRMED_LOST] Строка 85 — пилот-преп добор: Bertalign GOLD-пары (D29.2в) · R2 shadow (D25.2) · exp08 v3 (D21.8)
Bertalign: grep -rni bertalign по eval/ и backend/ — 0 вхождений (нет ни кода, ни данных). exp08 v3: в docs/experiments/ существует только 08-cost-model-v2.md; его шапка (греп `Пере-съём заказан как exp08 v3`) прямо говорит «Пере-съём заказан как exp08 v3 (D21.8 … D25.8 …)» — т.е. заказан, не исполнен; в eval/ есть только cost_model_v2.py (v3-скрипта нет). Подтверждается и D-логом (D21): «→ exp08 v3 … до фиксации budget_usd-дефолтов Ф2» — висящее поручение, и `docs/architecture/02-mvp-plan.md:37`=`пере-съём exp08 v3` — как открытый. Скоуп — пилот-преп-промт Ф2.5, дельта вписана в `docs/archive/prompts/POLYGON_PACKAGE4_SESSION_PROMPT_2026-09-06.md:11`=`exp08 v3 (D21.8)`.
### [CONFIRMED_LOST] Дописка к строке 59 — GLM context-overflow гард (finish=model_context_window_exceeded)
`normalizeOpenAIFinish` (`backend/internal/llm/provider_openai.go`, греп `EVERY other value`) схлопывает только content_filter-композит и `sensitive`: «EVERY other value — network_error, model_context_window_exceeded … passes through RAW». Тест фиксирует это как осознанный дефер: `backend/internal/llm/pack12_transport_test.go:190`=`raw (deferred GLM-overflow item)` «model_context_window_exceeded … raw (deferred GLM-overflow item)». Ниже по потоку гарда тоже нет: classify() (`backend/internal/pipeline/disposition.go:354`=`func classify(in classifyInput) classification`; ⚠ испр. 16.09: было :201246, под-адреса ниже — прежней редакции) знает ветки decodeErrorFinish/content_filter/refusal/length — model_context_window_exceeded не матчится ни одной: пустой выход упадёт в FlagEmpty («retryable — thinking usually ate the entire budget», строки 230233) — платный ретрай, обречённый при overflow; непустой выход пройдёт как reasonOK (строка 245) — усечённый по контексту текст принят как годный. Скоуп: NOT-do пака-12 без решения, полигон-пакет до МАСШТАБА.
### [CONFIRMED_LOST] Дописка к строке 53 — внутрифайловый дубль ключа pair-файла → громкая ошибка → **частично ИСПОЛНЕНО D39.82 (putUniqueDC, строка 53 закрыта); остаток parseCategoryRows — строка 111** (PACK15 §Внутрифайловый)
`parseCategoryRows` (`backend/internal/lang/langpack.go`, греп `cats[f[0]][f[1]] = val`): повторный ключ ВНУТРИ одного файла молча перезаписывает предыдущий (last-wins). ГРОМКО коллизия ловится только на стыке уже слитого состояния и следующего источника — `unionStringMap` («key … is already defined … and the overlay redefines it»); внутрифайловые дубли схлопываются ДО того, как merge их увидит. ⚠ **Отрицательный замер испр. 10.09: он ПРОТУХ, а вывод устоял по ДРУГОЙ причине.** Тот же греп по `backend/internal/lang/langpack_test.go` даёт сегодня **3** хита (контроль: файл жив, 619 строк) — но держат они `parseDCCheckers` (`TestParseDCCheckersRefusesIntraFileDupKey`), а предмет ячейки — `parseCategoryRows`, и он по-прежнему тихо last-wins: `backend/internal/lang/langpack.go`, греп `cats[f[0]][f[1]] = val` — проверки на существующий ключ там нет. Скоуп: мелкие хвосты качества одним паком; улика — `docs/archive/reports/PACK15_STRUCTURE_REPORT_2026-07-25.md`, греп `Дубль ключа ВНУТРИ`.
### [CONFIRMED_LOST] Дописка к строке 11 — судьба v1.1 quote-absorption при флипе coverage-гейта (D12-Q1)
Go-гейт стоит на v1 без поглощения кавычек: `backend/internal/checks/coverage.go:39`=`CoverageGateVersion = "coverage-v1-naive-split-lower-bound"`; grep quote/кавыч/absor/поглощ по coverage.go — 0 вхождений. Python-оракул тоже: eval/refusal_bench.py split_sentences (строка 81) без absorption-логики (grep absorb/quote — 0 содержательных попаданий). Дефер задокументирован в обе стороны: `eval/coverage_precision.py:14`=`naive sentence segmentation can undercount` «naive sentence segmentation can undercount RU sentences vs a CJK source (quote-absorbing §3.7 is deferred to v1.1)» и D-лог (D12 Q1) «§3.7 „поглощение кавычек" → v1.1 (координированно)». Гейт при этом выключен (шапка coverage.go: «opt-in (gates.coverage.enabled)») — решение о судьбе v1.1 реально висит на флипе (владелец, Python-first лок-степ).
### [CONFIRMED_LOST] Дописка к строке 33 — включить sanitizer в pipeline-c2 при оживлении (D33.4б)
`backend/configs/pipeline-c2.yaml` секции `sanitizer:` НЕ несёт (греп = 0), при том что её несут `pipeline-c1.yaml` и все три arm-конфига. C2 — спящий скелет («Фаза 0 фиксирует СХЕМУ … исполнение fan-out/селекции — механика раннера Фазы 2»), поэтому отсутствие сейчас безвредно, но при оживлении C2 без правки конфига финал пойдёт БЕЗ санитайзера — строка держит это условием оживления. ⚠ Секции «D33.4б» в журнале нет и не будет: это ПОДНОМЕР, тело — `^## D33`.
## Срез: строки 80/82/84 + кандидаты 73
### [ЗАКРЫТО ПО НУЖНОСТИ D39.69 — строка 80 живёт ГЕЙТОМ ПИЛОТА Ф2.5] Резюме-слой памяти (глава→арка→книга) + fact-gate
Механизма резюмирования в `backend/internal/` нет: grep `summary`/`резюме` даёт только несвязанное (план redrive, текст флага санитайзера, детектор ХВОСТОВОГО edit-summary модели, коммент-плейсхолдер «approved-glossary+summary+series-bible» в снапшоте, где `memoryVersion()` материализует ТОЛЬКО frozen APPROVED glossary rows); таблицы/колонки резюме нет и в схеме `backend/internal/store/migrate.go`.
**Фикс/скоуп:****Диспозиция ДАНА D39.69: закрыт по нужности; строка 80 = гейт пилота Ф2.5.**
### [CONFIRMED_LOST] Строка 82: морфо-гейт РОДА (C3, глагол прош. вр. при gender=hidden)
В checks/*.go НОЛЬ упоминаний gender (grep gender по backend/internal/checks/ пуст); `backend/internal/checks/sanitizer.go:83`=`NOT offline-detectable without a morphology` и :429 прямо документируют «NOT offline-detectable without a morphology/dictionary pass (Ф2) — left silent»; pymorphy в бэкенде существует только в комментах ОТБРОШЕННОГО pymorphy3-подканала лемматизатора майнера (`backend/internal/miner/miner.go:18`=`Default B drops the pymorphy3-backed sub-channels`, дефолт B). Gender в банке хранится как TEXT «male|female|hidden|''» (`backend/internal/store/migrate.go`, колонка `gender` — тот же якорь, что в пункте «Строка 84» ниже; `backend/internal/membank/memory.go:154`=`male|female|hidden` — ⚠ испр. 16.09: было :140); hidden даёт лишь ИНЪЕКЦИЮ-мандат избегать род-маркирующих конструкций (memory.go:810-823, GenderHidden-текст), а ДЕТЕКТОРА нарушения нет — membank.SpoilerLeaks проверяет только появление dst-поверхности до окна (mempostcheck.go:205-224), не род глагола. Отложенность зафиксирована реестром рисков (`docs/architecture/06-memory-risk-registry.md`, греп `морфо-гейт глагольного рода`: «Отложено в v1.1/Фазу 2») — жива, не закрыта.
**Фикс/скоуп:** Строка верна как есть (python-сайдкар/pymorphy, связка с морфопроходом Decl из 73).
### [ЗАКРЫТО D39.69 §3] Строка 84: канон D39.21 «generic „гу" = средний род» — носитель ПОСТРОЕН
Канон ратифицирован (D39.21: «generic-«гу» СРЕДНИЙ род, именные — по-термово из банка»). **Носитель ПОСТРОЕН и строка ЗАКРЫТА ратифицированной D39.69 §3** (там же закрыта строка 27): `neuter` работает end-to-end — `genderConstraintNote` принимает `neuter`/`n` (`backend/internal/membank/memory.go`, греп `case "neuter", "n":`) · ключ пары `gender_neuter` в разборе и структуре (`backend/internal/lang/embedded.go`, греп `GenderNeuter`) + `lang/data/injection.txt` · род ВАЛИДИРУЕТСЯ: SeedLint ГРОМКО отбраковывает неизвестный род (`backend/internal/membank/memseed.go`, греп `knownGenders`) · ось снапшота = scoped-фолд `neuter-directive-v1` в `memory_version` (книга без neuter байт-идентична).
**ЖИВОЙ ОСТАТОК — косметика комментария, не поведение:** комментарий схемы БД до сих пор перечисляет `male|female|hidden|''` без neuter (`backend/internal/store/migrate.go:184`=`male|female|hidden|`). Оговорка к альтернативе: `decl.Invariant` (memory.go:128,151,311; seed.go:85) несёт только несклоняемость формы, не род для согласования глагола/прилагательных — «decl.invariant достаточно» неверно.
### [ЗАКРЫТО D39.69 §1 + D39.71] Кандидат 73: ranked-set (инъективность рангов)
Инъективность dst построена (`membank.InjectivityCollisions`, warning-only на загрузке); типа ranked-set и проверки ПОРЯДКА ступеней из исходного обязательства (`04-unhappy-paths.md:19`=`| Коллапс терминосистемы рангов («Immortal, im`) нет. Улики с file:line — D39.66-пост-сверка (п.2). **Качество закрыто D39.69 §1, hard-режим = Q4 → D39.71 (не строить).**
### [ЗАКРЫТО D39.69] Кандидат 73: STITCH-ретирование инъекции отработанных термов
Механизма подавления инъекции терма, отработанного N чанков подряд, в membank нет; идея — `docs/research/15-voice-and-state.md`, греп `STITCH-паттерн`.
**Фикс/скоуп:****Закрыто D39.69 (реопен-триггеры: бюджет инъекции / измеренный эффект размера).** Счётная база для «N чанков подряд без промаха» уже есть в retrieval_state/post-check — стройка сводится к политике селекции.
### [ЗАКРЫТО D39.69] Кандидат 73: эмбеддинг-второй-эшелон A7/D2
Ретривала по эмбеддингам в движке нет (плейсхолдер-колонка `embedding_tier_used` = always 0; бенч живёт в `eval/retrieval_bench.py`).
**Фикс/скоуп:****Закрыто по нужности D39.69 (реопен: измеренный recall-разрыв на масштабе).**
### [БЕЗ СТРОКИ ТРЕКЕРА] Кандидат 73: tmctl «замена термина с главы N»
Команды НЕТ (⚠ список команд здесь НЕ дублируется — снятый снапшот отставал ТРИЖДЫ; единственный носитель — `backend/cmd/tmctl/main.go`, греп `dispatchCommands`, сверяйся с ним, не с этой строкой); RedriveSelector выбирает только ФЛАГНУТЫЕ чанки по chapter/chunk/reason (`backend/internal/pipeline/status.go:1078`=`RedriveSelector picks the flagged chunks` — ⚠ испр. 16.09: было :561-582), не «чанки с термом X». Источник кандидата — `docs/research/15-voice-and-state.md:201`=`одна команда ставит` (⚠ испр. 16.09: было :200): одна команда ставит until_ch=N старой записи и since_ch=N новой. При этом СУБСТРАТ построен целиком: оконные строки в схеме (UNIQUE (book_id, src, sense, since_ch, until_ch), migrate.go:202) и $0-пере-пин при bank-only-сдвиге (`backend/internal/pipeline/repin.go:14`=`POINTWISE re-edit by key`, :14-36, D39.42 п.5/D39.45) — платятся только юниты, где инъекция реально изменилась.
**Строки 73 в трекере больше нет, а этот кандидат D39.69 НЕ закрывал** — держателя, кроме этой ячейки, у него нет (смежные носители: `research/15-voice-and-state.md:200`=`2. 🧪 **NG-лексика персонажа** (5-е поле 口調表; F`, `archive/reports/BANK_QUALITY_DESIGN_2026-08-01.md`, греп `замена термина`). Скоуп при стройке — ТОНКАЯ CLI-обёртка над уже построенным (правка двух окон в сиде + штатный `repin`), не пайплайн-работа.
### [ЗАКРЫТО D39.69 §1] Кандидат 86/73: feed_cap терминолога (D39.45) — «бюджет-гейт режет хвост батча»
**feed_cap ПОСТРОЕН И ЗАКРЫТ ратифицированной D39.69 §1 (испр. 02.09), из строки 86 ИЗЪЯТ:** бюджет режет теперь НАИМЕНЕЕ ЦЕННОЕ, а не лексикографический хвост — value-порядок отреза (частота-desc) живёт в `backend/internal/terminology/terminology.go` (греп `feed_cap`), гвоздь — `TestBatchValueOrder` в `backend/internal/terminology/series_test.go`.
## Срез: строка 25 — дефекты чекеров (строка ЗАКРЫТА пакетом-чекеров 02.08, D39.78)
> Шесть дефектов (#3 chevron-речь · #5 数-магнитуды · #6 латиница-детектор · #7 `minLatinResidueLen` · #10 пост-чек банка · #1 K5c-супрессор + Р2-семантика «значение»), их улики, замеры на labels и §6-вопросы владельцу лежат ДОСЛОВНО в [reports/CHECKER_PACKAGE_2026-08-02.md](../archive/reports/CHECKER_PACKAGE_2026-08-02.md) (D39.78); §6-Q1…Q4 РЕШЕНЫ D39.79, довершение — D39.82 (`shichen_re`). Тела нот — слайс `docs/archive/architecture/05-decisions-D39-59-90.md`. Ниже только то, что осталось ЖИВЫМ.
**⚠ Границы, на которые нельзя опираться:**
- **`fn=0` демоции пост-чека КЛАСС-ВАКУУМЕН** (D39.78): в labels НОЛЬ одно-Han-позитивов, recall-цена `singleHanKeyFired` не измерена — **hard-gate строки 12 на этот ноль опираться НЕ должен**. Остаточные 6 K6-fp (元石/蛊虫 плюральные формы) = сид-полнота, не код.
- **Слепота магнитуд объявлена и НЕ закрыта:** узкий DC2-проб покрывает РОВНО `数十万→«десятки тысяч»`, а `数万`/`数百万`/`数千万` и иные рендеры слепы для обоих механизмов (`hasDigitBeforeBigMarker` требует ЦИФРУ, 数 не numeral rune). Расширение 数-коэффициента ловит **0 новых единиц** на labels ⇒ не чинить; **на иных корпусах может понадобиться — текущая эмпирика этого не закрывает**.
- **Precision латиница-детектора = 0.971, а 1.0 — только ЕСЛИ бренд занесён в `style_allowlist`**; боевой конфиг «Qidian» не заносит — дыра открыта.
- **K5c-супрессор гасит по ВСЕМУ юниту** (`backend/internal/checks/checkers.go`, греп `ok-suppressor`): одно верное 千万 маскирует второе неверное, DC1 берёт только ПЕРВЫЙ матч. Пер-вхожденческий супрессор — Р4-потолок, не строить. Value-сравнения у `lintPercentScale` тоже нет: чекер стреляет по ПРИЗНАКАМ (в источнике `成`-паттерн, в выходе нет процентной формы и есть дробный маркер), а не по числу — `backend/internal/checks/checkers.go`, греп `percent-scale checker`. ⚠ Испр. 02.09: доккомментарий-самопризнание («A correct fix compares the rendered VALUE… a design, not a patch») в дереве БОЛЬШЕ НЕ ЖИВЁТ, чекер переехал из `cheapgates.go` — цитату не искать.
**Р4-потолки, записанные В КОНТРАКТ правил** (двигать только замером): chevron-речь ~0.22 (24 безатрибутивные реплики офлайн неотличимы от цитат) · `minLatinResidueLen` = 3 (замер THRESHOLD=2 дал 0 изменений; гомоглиф «гy» — mixed-скрипт токен, ловится `detectBrokenWords`, не длиной) · HARD-value-чек 成/万 **не строить** (§6-Q3 → D39.79 п.4; реопен ДВУМЯ триггерами: флип hard-gate строки 12 ЛИБО ненулевой поток value-дефектов с добора идеала). ⚠ Inline-записи потолка на самих функциях НЕТ — хвост в строке 93.
**НЕ построено, диспозиции даны:** DC7 grade/role-чекер — вслепую НЕ строить, сперва $0-замер нужности на боевых финалах labels (§6-Q1 → D39.79 п.2; триггер — первая книга с живой грейд-серией) · DC2 word↔word дроби — 分之-дроби в корпусе есть (8 юнитов), размеченных дефектов класса НОЛЬ ⇒ строить вслепую — против мандата; сперва разметить 分之-срез · полный детектор повторов лемм для alignment-защиты рефренов — промпт-половина закрыта (`editor.md` + `editor-mono.md` несут исключение авторского рефрена), детектора в `checks/` нет, связка с alignment/Bertalign — строка 85. Требование защиты живо: `04-unhappy-paths.md:97`=`| **Повторы: сорный vs авторский рефрен (ритм ` («повтор в параллельных позициях оригинала = „не трогать“ … иначе редактор-агент убивает рефрены») и :130 п.5.
**Построено, возврата не требует:** omission-бэкстоп = стеммер `declinedFormPresent` (`backend/internal/membank/mempostcheck.go`; лемма-матч {dst,decl.forms}; сам починил 2 K6-fp 凡人/甲等) — ⚠ target-алиасы к нему НЕ заведены, это сид-концерн, не код.
## Срез: строка 86 + дописки 79/41/24/74/49
### [CONFIRMED_LOST] (1) Echo-семантика дропнутого c-lite-члена (строка 86, D39.18): код сохраняет pre-c-lite семантику «эхо где угодно, вкл. дропнутых членов»
Код реализует pre-c-lite семантику, альтернатива не построена: `echo_draft` считается ПРЯМО по draft-рядам (`backend/internal/pipeline/quality.go`, греп `no c-lite per-unit re-derivation`), `draftEcho` берёт ВСЕ draft-ряды с `cjk_artifact` без фильтра по member-drop ⇒ эхо дропнутого c-lite-члена ВХОДИТ в метрику; то же в рендере (`backend/cmd/tmctl/render.go`, греп `incl. dropped c-lite members`). Ветки «echo только в шипнутом тексте» в `quality.go` НЕТ. **ОТКРЫТОЕ решение владельцу (D39.18):** «сохранена pre-c-lite семантика…; альтернатива — one-line, за владельцем»; D39.66 числит открытым, решения после D39.18 нет.
### [CONFIRMED_LOST] (2) Magnitude-кап тяжёлой CJK-утечки (строка 86, D38.3 п.4в): сейчас только strip+flag, капа >X%→drop нет
Капа в коде нет: `StripCosmetic` — косметический стрип, `FlagSanitizerStripped` — «STRIPPED, остаток ЭКСПОРТИРОВАН, чанк НЕ теряется» (`backend/internal/pipeline/disposition.go`, греп `FlagSanitizerStripped`), `detectCJKLeak` доли утечки не считает вовсе — только собирает раны. Единственные share-пороги: `cjkEchoThreshold` = 0.15 (класс ЭХА → `FlagCJKArtifact`, не кап под-эховой утечки) и `latinHeavyShare` = 0.25 (Latin-класс, не CJK). Промежуточного «CJK-доля >X% (X<15) drop» нет ни в `checks/`, ни в `disposition.go`. **ОТКРЫТО владельцу (D38.3 п.4в):** «нужен ли кап»; D39.66 повторно числит открытым.
### [ПОСТРОЕНО D39.78] (3) lintNumberMagnitude — гейт по письму источника (дописка 79) СТОИТ
**ГЕЙТ ПО ПИСЬМУ ИСТОЧНИКА ПОСТРОЕН (испр. 02.09):** он внутри `lintNumberMagnitude` `backend/internal/checks/cheapgates.go`, греп `SOURCE-script gate`; комментарий называет заказ по имени строка 79, D39.39»), шов единый `lang.IsDenseScript` (D39.78). ЖИВОЙ ОСТАТОК строки 79 граница `cjkScriptNames`: она НЕ тронута.
### [CONFIRMED_LOST] (4) Golden-счётчики голоса (дописка 41): в capture.golden voice-счётчиков нет
Подтверждено отсутствие: `grep -c -i voice backend/internal/pipeline/testdata/golden/capture.golden` = 0 (ни одного вхождения); в testdata/golden/pipeline.yaml ключа `voice:` нет (grep пуст) гейт opt-in OFF по умолчанию (`backend/internal/config/pipeline.go:315`=`type VoiceGate struct` испр. 16.09: было :279-281), фикстура его не включает, значит golden не пинит ни n_voice_flags/voice_detail, ни VoiceFlags/SpoilerLeaks (quality.go:269-278, 436 счётчики существуют в коде, но в golden-контур не заведены). Хвост D39.58 реален и жив.
### [CONFIRMED_LOST] (5) Слот инъекции голоса (дописка 24): инъекционная половина построена условно и НЕ включена, оба провода
Оба провода подтверждены. **Провод 1 (инъекция)** построен в membank УСЛОВНЫМ фолдом (`backend/internal/membank/memory.go`, греп `InjectVoice reports whether`; книга без voice-строк и прогон с выключенной инъекцией хешируются БАЙТ-ИДЕНТИЧНО), но pipeline захардкоживает выключенность: `backend/internal/pipeline/bankmaterialize.go`, греп `InjectVoice is FALSE` «no config knob Wiring the injection means setting it and accepting a full `--resnapshot`». **Провод 2 (флаггер)** гейтится `Gates.Voice.Enabled`, opt-in OFF (`backend/internal/pipeline/voicerun.go`, греп `Gates.Voice.Enabled`). Совпадает с D39.55: «слот инъекции НЕ выбран, оба провода, решит полигон-эксперимент»; решение по `gates.voice` и инъекции на следующем живом прогоне.
### [ЗАКРЫТО D39.95] (6) Остаток §12.7 (дописка 74): 8 несудимых fidelity-пар P4 существуют в ~/books/gu-zhenren/research15-probes/
Сырьё существует, суд не докуплен: судья остановлен своим капом $0.28 на 16 парах из 24 (улика и разбор комбо `docs/archive/reports/POLYGON_PROMPTLANG_ANTIECHO_2026-07-31.md`, греп `Судья остановлен своим капом`, §12.7).
**Фикс/скоуп:** **Строка 74 закрыта D39.95, P4-хвост принят D39.61; добор ≈$0.10 — резидуал §12.7 D39.61 (цены записаны там), отдельного носителя не заводилось.**
### [RESCOPE ИСПОЛНЕН] (7) Протокол гендер-твиста D5.1 (дописка 49): «redrive есть, селективного by-until_ch пути нет»
Посылка «селективного пути нет» ОПРОВЕРГНУТА: селективная пере-редактура по изменению банка + смета ПОСТРОЕНЫ и живьём проверены. `backend/internal/pipeline/repin.go:14-35`=`POINTWISE re-edit by key` «POINTWISE re-edit by key (pack-20 point 5, D39.42 п.5: bank-only сдвиг снапшота + неизменный content_hash пере-пин юнита за $0, изменённые инъекции платно; «The same predicate drives the ESTIMATE: projectRebill uses it» (смета «N units, ~$X»); встроено в штатный резюм stagerun.go:87 (repinnable); согласие на пере-оплату rebill.go:11-40 (D20.2-Q2). until_ch-апдейт = правка строки банка двигается ТОЛЬКО memory_version ровно этот путь (D39.42 п.5: «поздняя подпись и ЛЮБАЯ правка»; D39.45: «точечная ре-редактура по ключу с $0-пере-пином построено, живьём проверено... 20 юнитов пере-пинены за $0 при bank-only-сдвиге»). При этом верно: tmctl redrive существует (`cmd/tmctl/main.go:234`=`case "redrive":`), но его селектор только chapter/chunk/reason по ФЛАГНУТЫМ чанкам (status.go:564-582), until_ch-пути в НЁМ нет селективность живёт в другом инструменте (translate-резюм + repin + rebill), и это by-design правильный носитель.
**Живой остаток дописки** (пере-формулировка исполнена строка 49 бэклога и D39.66-пост-сверка п.3): только операторский ПРОТОКОЛ-документ релиза D5.1 последовательность «выставить `until_ch` у `gender=hidden`-терма `tmctl translate` согласие на rebill-смету», плюс курация 白凝冰 из строки 24.
## Архео-хвосты жирных строк бэклога (выселение докс-паком строки 167, 09.08.2026)
> Тела ячеек «Хвост» перенесены сюда ДОСЛОВНО на момент выселения (норма D39.125 п.3: «диспозиция сверху, археология вниз»; ячейка >800 байт — не трекер). Живая диспозиция каждой строки — ТОЛЬКО таблица бэклога `../BACKLOG.md`; здесь справочная археология. Закрытия помечать по месту стрелкой «→ Dxx», не удалять.
> ⚠ **Голые `file.go:NNN` в этой секции — снимок 09.08.2026, и часть номеров с тех пор съехала (сверено 02.09).** Сверяйся ГРЕПОМ по названной функции/константе/цитате, а не по номеру строки; пере-нацеленный якорь пиши токен-формой `` `путь:123`=`подстрока` ``.
### Б-13б — тело строки 13б на 09.08.2026
**`speech-cue.txt` zh НЕ шипить до замера голос-флаггера на холодном прогоне** (данные для недоказанного детектора = инерция; вывод обсуждения 31.07): оси пустые файл не нужен, оси ловят решение владельца о шипе (байты двигают `LangpackVersion`). **Замера ВСЁ ЕЩЁ НЕТ (D39.86):** поверхность вывода построена (строка `VOICE` в `tmctl report`), и живое чтение coldrun-a даёт `flags=0 over attributed=0 of replies=0` но это НЕ «оси пустые»: флаггер живёт на ФИНАЛЬНОЙ волне (`waverun.go:392,512`), а редакторская волна там не гонялась оси не считались НИ РАЗУ. И поле `rules=` в новой строке говорит «гейт СКОНФИГУРИРОВАН» (читается из конфига ВРЕМЕНИ ОТЧЁТА, `quality.go:436`), а не «гейт отработал» честный дискриминатор это ЗНАМЕНАТЕЛИ (`replies=`); читать так до фикса строка **292** (испр. 05.09: строка 105 закрыта D39.200 половиной (а); эта поправка половина (б), и она переехала в 292)
### Б-44 — тело строки 44 на 09.08.2026
**Флор — калиброванная константа без модели «thinking в completion»: МОДЕЛЬ ПОЛУЧЕНА замером (D39.86), сама строка сужена до выбора числа.** Замер боевой формы: при вендор-дефолте `high` размышление на плотном хане потолком НЕ ограничивается (8496 0/9 пригодных, 16992 1/5; вендорская норма вывода для `high` = 384K) **флор не является рычагом против неограниченного думания — рычаг это `reasoning_effort`**; при `low` размышление 170313 ток. и флор 8000 избыточен. Остаток строки: какое число ставить ПОСЛЕ развилки 74 (⚠ испр. 02.09: клейм «у `deepseek-v4-pro` эффорт не настраивается, `low→high`» БОЛЬШЕ НЕ ДЕЙСТВУЕТ звено про `low` отозвано самим же квирком (`docs/experiments/00-provider-quirks.md`, греп `ЗВЕНО (б) ПРО`, п.3б: статус `low` «НЕ УСТАНОВЛЕНО»), а вендор-чейнджлог 13.08 дал V4-Pro уровни low/high/max §Б-108, вахта D39.92). **РАСХОЖДЕНИЕ ТРЕКЕРА СНЯТО (D39.90):** строка 74 объявляла 44 «закрытой этим замером» это верно только для ПОЛОВИНЫ «поднять флор» (фальсифицирована). Живой остаток обратный: **опустить/пере-калибровать число по числам пробы `bank-low`**, где стена на `low` не исчезла, а разредилась (упавший батч: `content=""`, `finish=length`, `completion=7999`, `reasoning=7999` тот же тяжёлый хвост, 1/5 вместо 4/5, и это стохастика вызова: батч не самый большой по входу). **Флор при `low` НЕ варьировался ни разу** упавший батч умер ровно на потолке 8000, так что «сколько ставить» остаётся незамеренным вопросом, а не выводом
### Б-46 — тело строки 46 на 09.08.2026 → **D39.199, ОБЕ половины закрыты (пометка 10.09)**
> ⚠ **Закрыто, тело оставлено археологией по норме этой секции.** Обе половины опровергнуты деревом: экран цели построен пакетом `backend/internal/langscreen/` (греп `func Screen`), вердикт заходит в классификатор (`backend/internal/pipeline/disposition.go`, греп `FlagOffTargetLang`); латинская вставка в санитайзере ОБУСЛОВЛЕНА `TargetScriptNonLatin()` (`backend/internal/checks/sanitizer.go`, греп `if c.TargetScriptNonLatin()`), и доккоммент над гардом называет эту самую ячейку. Строки 46 в живом трекере нет.
**Экран целевого языка на выходе НЕ-ПОСЛЕДНЕЙ стадии — ЖИВОЙ НОСИТЕЛЬ ПОЛУЧЕН, класс поднят (D39.86).** Было: 38/40 дефектов латиницы живут в черновиках вне охвата гейтов (`waverun.go:486`). Стало: на ре-пробе 74 при `effort:low` **1 черновик из 18 пришёл ПОЛНЫМ связным переводом НА АНГЛИЙСКИЙ** и прошёл как `disposition=ok` `classify` экранирует ИСХОДНУЮ письменность, пустоту, обрыв и отказ, а «не исходный и не целевой» не ловит ни один предикат (частично ловится лишь третий язык, ДЕЛЯЩИЙ письменность с источником, и ловится под ЛОЖНОЙ причиной `cjk_artifact`). Последний рубеж УСЛОВЕН тройкой `isFinal && Gates.Sanitizer.Enabled && checkers.TargetActive()` (`chunkrun.go:52`), и **дыра на оси ЦЕЛИ двусторонняя**: (i) без данных цели слой 7 инертен ПО ОТСУТСТВИЮ (осознанный дизайн, `disposition.go:302-305`) для не-русской цели рубежа нет вовсе; (ii) а с данными будущей ЛАТИНОПИСЬМЕННОЙ цели `detectLatinInsertion` (`backend/internal/checks/sanitizer.go:228`=`THE LATIN-RESIDUE CLASS IS GATED ON THE TARGET'S OWN SCRIPT`) сработает на ЧИСТОЙ целевой прозе и дропнет 100% чанков внутри санитайзера он НЕ обусловлен `TargetScriptNonLatin()`, хотя доккоммент это объявляет (реальный гард только на репэйре `quality.go:215`, `repair.go:208`), а частичный файл цели невозможен (`CompileCheckers` паникует). **ревью-вопрос «заработает ли пара, которой в репо нет, без правки Go?» для →en/→de отвечается НЕТ**; кандидат фикса тот же шов, что уже применён к репэйру. *(Контрпример «pipeline-c2.yaml — легальная сборка без санитайзера» проверен и СНЯТ: c2 неисполняем `CheckRunnable`, его санитайзер забукован строкой 33.)* Даже при включённом санитайзере худший исход не потеря юнита, а ТИХО ОТГРУЖЕННЫЙ релейный перевод zhenru, если билингв-редактор отрендерит русский с английского черновика. Область фикса «выход любой НЕ-последней стадии», не «черновик» (`isFinal` позиционный, `stagerun.go:145`). **ИСПР. 05.09: КОД ПОСТРОЕН — экран целевого языка внесён вайр-батчем (`backend/internal/langscreen/`), строка бэклога 46 ЗАКРЫТА и снята из таблицы (D39.199/D39.195).** Ниже АРХЕОЛОГИЯ подачи дизайна, читать как историю. **ДИЗАЙН ПОДАН, КОДА НЕТ — СТОИТ НА РЕШЕНИИ ВЛАДЕЛЬЦА (D39.90).** Три поправки сессии к посылке, все замером: **(1) боевой гейт уже ловит 18 из 20** off-target событий (`sourceScriptShare > 0.15`, `disposition.go:224,275`; 0 ложных на 1055 здоровых, запас 13×) остаточная дыра **2 чанка из ~1100 = 0.18%**, оба английские, японский ловится долей ханьцзы; **(2) второй рубеж существует, но стоит не там** санитайзер поймал бы те самые байты Latin insertion»), но `chunkrun.go:52` требует `isFinal`, а в двухстадийной топологии черновик НИКОГДА не финальный; тот же `isFinal` глушит на черновике латинный линт, флаггер голоса и глоссарный пост-чек; **(3)** здоровый минимум на тексте, который РЕАЛЬНО видит гейт (после среза банкноты), = 0.9767 при n=1055. **Развилка владельцу:** (а) предикат внутри `classify()` + бамп `classifierVersion` двигает снапшот у всех книг, голден пере-захват один раз, на свежем стенде $0; (б) отдельный опциональный гейт вне `classify()` снапшот не двигает, но это второй способ сказать «ответ непригоден», и он выключен по умолчанию; (в) языковой детектор. **Выбор сессии — (а).** Носитель данных `lang.LangScripts(Book.TargetLang)`, НОВЫЙ go:embed-файл не заводить (`EmbeddedVersion` фолдится безусловно = перекупка всех книг всех пар); порог 0.50 не калиброван, а поставлен в середину пустого интервала. Три мины наивной реализации названы: новый флаг провалился бы мимо `escalatable()`/`retryable()` (⇒ переиспользовать `FlagCJKArtifact`), классификатор ложно флагался бы 16/16, экран слеп к ПОДМНОЖЕСТВАМ письменности (чисто китайский выход для ja наберёт 1.000). Вторая половина дыры (`detectLatinInsertion` без `TargetScriptNonLatin()`) чинить тем же диффом, для ru вердикты не двигаются. **Константы и хвосты дизайна, без которых подпись неполна:** порог **abstain 200 букв** (ниже экран воздерживается; самое короткое off-target событие 346 букв, ниже 200 падают лишь 5 из 1055 здоровых, все со счётом 1.0000) · **опубликованная база «~1.5% off-target» НЕВЕРНА по знаменателю** он пулит черновики с редакторскими выходами, а редактор такой отказ произвести не может; на ЧЕРНОВОЙ вызов база **3.02%**, то есть вдвое хуже · **не проверено, что делает РЕДАКТОР с английским черновиком** вытащит обратно в русский или отредактирует как английский; именно этот неизвестный решает, чем является остаточные 0.18%: потерей юнита или тихо отгруженным релейным zhenru · английских черновика найдено ДВА (`fb51e135a395`, `4080ee8287af`), плюс японский в exp15 · **`cultivation` чинить в СИДЕ, а не порогом:** 86 из 1055 здоровых несут голое английское `cultivation` внутри беглого русского, и все 32 абзаца ниже 0.90 содержат именно его, ни один ханьцзы; правка пар-данных двигает `LangpackVersion` с `omitempty` перекупка ограничена книгами ЭТОЙ пары (чинить на плане, где перекупка уже) · Hunspell и GlotScript-эмбед **не строить** · база замера = строка **113** (⚠ **закрыта вместе с 46**, `D39.199`; в живом трекере её нет) · **02.08 вечер (D39.92): владелец пере-поставил задачу closed-set** вернуло НЕ тот язык, что просили»; полноценный LID только запасной флаггер вне пути вердикта; проверку изолировать отдельным слоем) ресёрч §5.15.3 отвечает постановке, форма (а)+изолированный модуль подтверждена, слой-0 владельца (полоса len(out)/len(in)) добавить замером на фикстуре 113
### Б-105 — тело строки 105 на 09.08.2026
**ПОЧИНЕНО ВАЙР-БАТЧЕМ (испр. 05.09, пак принят D39.199): предикат теперь ОДИН — `isBankRole`** (`backend/internal/pipeline/chunkrun.go` + `terminologist.go`, греп `isBankRole`), и классификатор больше не выпадает из поблажки; `classify_types: true` в shipping-конфиге. Ниже АРХЕОЛОГИЯ состояния на 09.08, читать как историю. **Роль `classifier` мис-вердиктилась как эхо + честность двух новых строк наблюдаемости (D39.86).** (а) `classifyOutput` давал поблажку `SourceEchoExpected` только `roleTerminologist` (`chunkrun.go:37`), а ответ классификатора по формату состоит из исходных ханьских термов доля исходного письма 0.200.29 > порога 0.15 на каждом батче: живой артефакт пробы 6/6 несёт `verdict=cjk_artifact` при `bad_lines=0`. Ущерб узкий — `runBankRoleBatches` кладёт `run.texts[i] = att.text` без проверки диспозиции (`backend/internal/pipeline/terminologist.go`, греп `run.texts[i] = att.text`), посчитанные эхо-ставки (`quality.go:313-321`) берутся из `chunk_status`, куда бэнк-путь не пишет ⇒ портятся только строки `tmctl report`/лога; **латентно** (`classify_types` выключен во всех шиппинг-конфигах). ⚠ Цена дисциплинированного фикса, которую надо знать заранее: бамп `classifierVersion` (литерал, сам не двигается) меняет payload снапшота → snapshot id → `RequestHash` ⇒ промах ВСЕХ чекпойнтов книги, то есть `--resnapshot` + пере-покупка. (б) тем же касанием — честность поверхностей: строка `VOICE` берёт `rules=` из конфига ВРЕМЕНИ ОТЧЁТА (`quality.go:436`), поэтому включение `gates.voice` после прогона печатает «измерено, чисто» для неизмеренной книги (воспроизведено); и она печатается при выключенном гейте, если `SpoilerLeaks>0` (дизъюнкция — поведение верное, формулировка отчёта/коммента неверна); знаменатель `BANKNOTE` = `len(states)` включая призрачные строки `retrieval_state`, тогда как соседний агрегатор их фильтрует (`quality.go:259-260`) ⇒ после пере-чанковки покрытие занижается
### Б-106 — тело строки 106 на 09.08.2026
**Слой 3 НЕ достроен: контракт редактора = full-regen, а целевой — узкие мандаты + ДИФФЫ.** `docs/architecture/09-target-architecture.md:111`=`узкие мандаты + диффы` дословно: «research/07 предписывает узкие мандаты + диффы, а не полную перегенерацию — сейчас ровно наоборот (4 мандата, full-regen), что и породило хвост инверсий» (⚠ прежний голый якорь `:121-126` съехал на слой 5/6); целевой контракт — редактор правит anchored search/replace-спанами с детерминированным Go-apply (ограниченный blast-radius, дешевле, аудируемо, структурно omission-safe). Пак-16 построил петлю РЕМОНТА (починка флагнутого спана постфактум), а не diff-контракт роли ⇒ это разные вещи. **Строки не было ни одной** — дыра учёта, найденная сверкой 02.08 (грепы `diff`/`мандат`/`span` по бэклогу = 0). Смежное: арм Q4b «diff-fidelity+style редактор» (`exp15:108`) не прогонялся НИ РАЗУ, хотя трек B объявлен завершённым. **ЭМПИРИКА ПОЛУЧЕНА (D39.108, экспы 19/20):** дифф-контракт механически исправен (комплаенс 0.966 на боевой единице, аппликатор 15/15), но по замороженному гейту Q4b диффы ОТЛОЖЕНЫ (fidelity-trap 11/12; дороже full-regen на dspro×ru ×2.52.9 при невскрытой причине; D21.4/D21.10 закрыты явно). **Эксп-21 (D39.117):** полный regen выигрывает у точечного ремонта (`C2/A_law` 3.75 Holm 0.0006) — довод против диффов, НЕ опровержение: чинил дешёвый фиксер по предложению, а не сильный редактор узким мандатом; гейт «перепроверить до стройки» в силе, приоритет понижен
### Б-108 — тело строки 108 на 09.08.2026
**Реестр ЗАГЕЙЧЕННЫХ ТРИГГЕРОВ + норма закрытия «по нужности».** ⚠ Первый жилец реестра, найденный тем же лендингом: **сиблинг-угроза экрана целевого языка** — выход на языке, БЛИЗКОМ к целевому (украинский/болгарский для ru): ни одного события не наблюдалось, но если появится, дискриминатор — плотность РУССКО-ЭКСКЛЮЗИВНЫХ букв (ы/э/ё) НИЖЕ ожидания, а НЕ замыкание алфавита (`EFFORT_HANDLE §5.4` шаг 8). Шесть остальных реопенов живут только в телах D-нот и не имеют места, где их поднимут: **МАСШТАБ** (uniformity-пасс D12 · эмбеддинг A7/D2 «реопен = измеренный recall-разрыв, только batch-time лейн» · STITCH «бюджет ИЛИ измеренный эффект размера инъекции» · канон-пин серий) · **вторая пара живьём** (C-триггер softsign-decl · автономная Decl-эмиссия) · **вторая книга того же жанра** (жанровый shared-слой) · **первая traditional-книга** (probe-литералы 时辰/千万/数十万 цельным дата-батчем) · **появление Go-кода платформы** (`go.work` — ⚠ `platform/go.mod` УЖЕ заведён, триггер наступил) · **перед стройкой fix-8** (ёлочный экстрактор атрибуции + корпус-замер). **+Два жильца приёмки D39.91:** Д5 — enum эффорта провайдер-слеп (`medium` на DeepSeek не определён, `max`/`xhigh` недостижимы; пер-модельную таблицу решено НЕ строить — механизм без носителя качества/денег, misconfig ограничен бюджетами и назван в доккомменте `ValidReasoningEffort`; триггер: первый живой инцидент кривого поведения уровня на проводе) · Д9 — аддитивные провайдеры отказываются бэнк/repair-гейтам, блок не несёт `reasoning_max_tokens` (fail-closed в лоадере; триггер: первая потребность гейта в аддитивной модели). **+Вахта D39.92 — СРАБОТАЛА:** changelog вендора 13.08 — у V4-Pro и V4-Flash теперь уровни low/high/max (квирк 3а «low→high, эффорт не настраивается» УСТАРЕЛ, `max` стал достижим — двигает и Д5-жильца выше); тем же днём пик/офф-пик цены с 16.08 16:00 UTC (строка 172); changelog 31.07 официально подтверждает re-post-train флэша под слагом (провенанс D39.61); пере-проба поведением + абсорбция — полигоном по слову владельца (снято оркестратором 14.08).** Почему реестр вообще существует (замер лендинга 09.08): норма D39.66 «каждое отложено обязано ТЕМ ЖЕ лендингом получить строку или явное закрытие» **нарушена ≥6 раз ПОСЛЕ собственной ратификации**, и класс потерь узкий — теряются именно ЗАГЕЙЧЕННЫЕ РЕОПЕНЫ. Норма реестра (D39.66, D39.125 п.3): сверять на КАЖДОМ переходе горизонта (расписан до Ф3, точки известны заранее) · **(D39.96)** тулчейн go1.27 переключит x/text на таблицы Unicode 17.0.0 МОЛЧА (`xTextVersion` пинит go.mod-строку, не таблицы) — триггер: любое движение тулчейна к 1.27 ⇒ строка 119 ПЕРВОЙ · **(D39.96)** CI-воркфлоу Forgejo (удалёнка 10.0.3, раннер не подтверждён; решение владельца 03.08 — не писать) — триггер: появление раннера ⇒ файл workflow; до того точка входа `make battery`. **+Два жильца аудита бэклога D39.140 (16.08):** граница пробы провода строки-однодневки 117 — CONNECT-туннель, CONTINUATION-фреймы и поведение под нагрузкой НЕ проверены, SETTINGS-фингерпринт не абсорбирован в `00-provider-quirks.md` (`docs/archive/reports/ARCHGUARD_DOFIX_2026-08-03.md:173`=`три эндпоинта, по одному вызову`; триггер: смена транспорта/HTTP-стека ИЛИ провайдер-аномалия класса «зависший стрим») · компонент «перспектива» нарративной гендер-аннотации пака-19 (строка 15 ушла лендингом D39.56 без этого компонента; смежный морфо-гейт рода — строка 82 — ДРУГОЙ предмет; триггер: подписание осей голоса при доборе идеала, строки 24/13б) · эскалационный кап НЕ прицениваает хоп — перелёт ≤1 хопа `escalate_to`-модели, оставлен и запинен D39.131 п.2(д) (триггер реопена: первый живой инцидент перелёта)
**СВЕРКА 04.09 — ДВА ТРИГГЕРА РЕЕСТРА НАЖАТЫ И НЕ ОТРАБОТАНЫ, третий отработал.** Реестр заведён нормой «каждое отложенное получает носитель», и его цена ровно в том, чтобы нажатый триггер не пролежал незамеченным; поэтому состояние пишется здесь, а не выводится читателем.
> **(а) `go.work` — НАЖАТ и не отработан.** Условие было «появление Go-кода платформы»; он появился давно (`ls platform/go.mod` — файл есть), а `ls go.work` в корне до сих пор даёт «No such file or directory». Ратифицировано `D39.85` §8 п.4; цена — один файл, и по тому же §6 он решает только dev-удобство, не меняя ни видимости, ни версий. Носитель — строка бэклога **237(а)**, зона оркестратора.
> **(б) Вендор-сверка маппинга эффорта `deepseek-v4-pro` — НАЖАТА и не отработана.** Вахта `D39.92` сработала чейнджлогом вендора 13.08. ⚠ **Испр. 05.09: носители БОЛЬШЕ НЕ противоречат** — и квирк-канон (§3г), и `STACK.md` говорят одно: ручка ДОХОДИТ до модели. Прежняя редакция обвиняла обоих в утверждении «ручки у pro нет», которого ни один уже не несёт. Живой остаток — сверка САМОГО МАППИНГА и величина эффекта. По гардрейлу владельца это закрывается ТОЛЬКО вендор-докой, а не выбором стороны. Держит жильца Д5 полигона и калибровку цены редакторского арма. Носитель — строка **237(б)**.
> **(в) Движение тулчейна к go1.27 — ещё НЕ наступило,** но жилец назван и первым идёт строка **119**: `x/text` переключится на Unicode 17.0.0 МОЛЧА (`tables17.0.0.go //go:build go1.27`), а вердикт-несущие вызовы в версии не свёрнуты.
> ⚠ **Класс важнее трёх пунктов, и он назван строкой 237:** спроектированный механизм без носителя события не срабатывает сам. Реестр — половина лечения; вторая половина — сверка реестра НА КАЖДОМ переходе горизонта, и она обязанность лендящего.
### Б-109 — тело строки 109 на 09.08.2026
**Продуктовые требования БЕЗ строки-носителя (сверка 02.08):** **ПТ-6** структурные традиции целевого языка (короткие zh-абзацы → читаемые ru-структуры) — держится только редакторскими мандатами в пар-промптах, поверхности измерения нет, в составе Ф2-гейтов (52) структуры абзацев нет · **ПТ-7** «слабый оригинал: подправлять художественно или быть верным» — вопрос владельца, не заведён даже в блоке «висит на владельце»; после ответа: режим параметром запуска (данные, не ветка Go) + мандат в промпте + гейт «улучшение vs отсебятина» · **ПТ-22** продуктовый ИНТЕЙК настроек (сегодня = рукописный `book.yaml`; частично покрыт 67 в части «версия исходника») · **ПТ-10** сам механизм веб-фетча (tool-calling, провенанс/кэш добытого, инжект под правилом «книга = недоверенные данные») — есть только гейт безопасности 70. Гигиена реестра тем же касанием: ПТ-24 не проставлена 101, ПТ-1/ПТ-11 не проставлена 105, ПТ-2 не проставлены 46 и 34а
### Б-121 — тело строки 121 на 09.08.2026
**archguard v2 (посадки приёмки D39.96 + §7-12/13 + §7-9). ⚠ Пункты (0а)/(0б) — РЕГРЕССИЯ против снесённого байт-гарда; дофикс ИСПОЛНЕН и принят D39.97 — (0а)/(0б)/(а) ЗАКРЫТЫ вместе с блокером type-param, осью имени и ложным срабатыванием сверх промта (разбор и посадки — `docs/archive/reports/ARCHGUARD_DOFIX_2026-08-03.md`, пункты AF этапа 1); остаток строки — (б)/(в)/(г)/(д).** (б) класс «встраивание · make+присваивание · дженерик-ноль» закрывается не свитчем, а ТИПОМ (нулевое значение `config.Stage` непригодно вне пакета); (в) политика build-тегов vet (сегодня default+live; чужой тег невидим — других в репо нет); (г) кандидат 4-й анализатор границы импортов — `backend/README.md:3`=`go list -deps` заявляет «проверяется `go list -deps`», что не автоматизировано ничем; (д) семь осознанных пропусков после дофикса 03.08 (принят D39.97; фикстуры БЕЗ want — покраснеют, когда начнут ловиться): llm.Ask-класс · пара внутри named-обёртки · встраивание/make/generic-zero · `internal/llm` исключён целиком (второй провод внутри адаптеров ловится только ревью) · внешние тест-пакеты · рефлексия (статикой не закрывается) · файлы за третьим сборочным тегом — всё, что закрываемо, закрывается типовым швом (б), не свитчем
### Б-122 — тело строки 122 на 09.08.2026
> ⚠ **ЧАСТИЧНО ЗАКРЫТ 07.09 (`D39.225`, дофикс):** пункт «`.skips.log` не в gitignore» снят В ИСТОЧНИКЕ — харвест-лог батареи уехал во временный каталог с обработчиком, файла в дереве нет вовсе, а `backend/.gitignore` получил все три артефакта `go build ./cmd/<x>/` (`tmctl` · `tmvet` · `tmmutate`), а не один. ⛔ Остальные пункты тела ЖИВЫ и держат строку 122: `wastedassign` и скоуп errcheck-исключения на `cmd/`.
**Гигиена пака стандартов (не-блокеры приёмки).** `TestCheckerLabelsCandidates` — ни одного ассерта (дизайн-REPL в одежде теста) · сообщение `TestMemoryVersionPinsTheUnverifiedRenderRevision` не различает «изменился рендер»/«изменилась нормализация» · Makefile: regex GO_MIN_VERSION пропускает go1.26.01.26.3 (патч-уровень не проверяется) · включить `unconvert` (1) и `wastedassign` (2) — дешевле уже включённых по собственному правилу конфига · `.skips.log` не в gitignore (прерванная battery оставляет мусор в дереве) · Fprint-исключение errcheck скоупить на `cmd/` (сейчас весь модуль — будущий писатель файла экспорта получит молча съеденную ошибку) · `w\.Write`-исключение ключуется ИМЕНЕМ receiver-а вопреки собственному принципу конфига · miningstop-исключение глушит текстом весь файл — якорить на функцию · provenance-числа конфига дрейфуют от дерева (293/31/93 против 294/33/91; контрпример «все прод-Close — читатели»: `backend/internal/chunk/chunktest/epub.go:219`=`if err := c.Close(); err != nil` — ⚠ испр. 16.09: было :51) · инвариант-коммент `httpllm.go:77` «zero wire bytes» — верен для полей пинга, неверен для бампа x/net, который их привёз (находка-4 D39.96) — переписать честно
### Б-126 — тело строки 126 на 09.08.2026
⚠⚠ **ЭРРАТА 05.09: ЗАПРЕТ «ДЕНЕЖНЫХ ПОЛЕЙ В UI» ОТОЗВАН ВЛАДЕЛЬЦЕМ (`D39.196`, эррата 05.09-а называет ЭТУ секцию носителем).** Баланс аккаунта, потолок заказа и холд ВЫХОДЯТ наружу деньгами; поля приезжают паком формы заказа. Запрещённым осталось и НЕ отменялось: цены моделей, стоимость стадий и ВЫЗОВОВ, структура наших расходов (ПТ-35) — ⚠ с различением `D39.203`: наружу идёт до-вызовная ОЦЕНКА, а не стоимость. Ниже — редакция ДО отзыва.
**Потолок прогона — УПРАВЛЯЕМЫЙ, решение владельца 07.08: настройка в интерфейсе фронта, шкала от минимума (ноль выбрать НЕЛЬЗЯ, подсвечен серым) до максимума баланса аккаунта.** Форма снимает конфликт с Р7 бесплатно: максимум = баланс ⇒ движок всегда получает положительное число, состояния «выключено» не существует, валидатор `book.go:250` не правится. Три следствия ратифицированы формой, тело — D39.110 п.2: единица шкалы = ГЛАВЫ, а не доллары (доллары на пользовательском экране = осознанный амендмент D39.84) · потолок принадлежит ПРОГОНУ, в `book.yaml` не пишется · максимум = ДОСТУПНЫЙ ОСТАТОК, то есть `Balance` как есть. ⚠ Звено «баланс МИНУС открытые холды» было ОШИБКОЙ приёмки — вычитание дважды: холд есть дебет в момент взятия (`credits.go:179`), снято D39.115 п.2(а) замером ($10 грант + $1 холд = `Balance` 9, `Reserved` 1, «минус Reserved» дало бы 8). **Поверхность ПОСТРОЕНА (испр. 02.09, прежний текст «ручки в контракте НЕТ» протух):** границы шкалы отдаёт `GET /books/{bookId}/run-options` (`docs/architecture/14-api-contract/openapi.yaml`, греп `run-options`), `ceiling_chapters` приходит УЖЕ подрезанным и клиенту подрезать второй раз ЗАПРЕЩЕНО; «сколько глав влезает в остаток» считает ПЛАТФОРМА по оценке движка, формула наружу не выходит. Продуктовое слово стопа — К-8, ЗАКРЫТ владельцем 04.08 (D39.100: страница лимитов = СТАТУС без сумм, стоп по потолку = `paused` + оповещение; ПТ-35).