194 lines
68 KiB
Markdown
194 lines
68 KiB
Markdown
# Якоря техдолга — справочник к строкам бэклога (НЕ трекер)
|
||
|
||
> **Часть находок ниже уже ЗАКРЫТА — закрытие помечено по месту D-номером, счёт закрытий в трекер не дублируется (D39.101).**
|
||
> **Единственный трекер — таблица «Бэклог» в `../PROGRESS.md`.** Этот файл — справочные file:line-якоря и скоуп-заметки к её строкам (вынесен из архива решением владельца — содержимое ЖИВОЕ). Актуализируется лендингами паков, которые трогают эти строки; исполненный пункт помечать ссылкой на D-номер, не удалять.
|
||
> **Снятая мёртвая половина** (историческая улика ОТСУТСТВИЯ механизмов — снимок свипа 26.07–01.08 с file:line того времени) живёт носителем: `docs/archive/architecture/05-decisions-D39-59-90.md`, греп `D39.66-пост-сверка`; исполнение среза строки 25 — там же греп `D39.78`; закрытия банк-арки — `D39.69`. Здесь оставлен только ДЕЙСТВУЮЩИЙ статус.
|
||
> ⚠ **Второй гвоздь под якоря НЕ строить — гейт уже построен и ратифицирован (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 бэклога в `../PROGRESS.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/POLYGON_PACKAGE4_SESSION_PROMPT.md:4`=`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 «model_context_window_exceeded … raw (deferred GLM-overflow item)». Ниже по потоку гарда тоже нет: classify() (backend/internal/pipeline/disposition.go:201–246) знает ветки decodeErrorFinish/content_filter/refusal/length — model_context_window_exceeded не матчится ни одной: пустой выход упадёт в FlagEmpty («retryable — thinking usually ate the entire budget», строки 230–233) — платный ретрай, обречённый при 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 их увидит. Теста нет (grep duplicate/дубл/already defined по `langpack_test.go` — 0). Скоуп: мелкие хвосты качества одним паком; улика — `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–16 «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/ пуст); checks/sanitizer.go:83 и :429 прямо документируют «NOT offline-detectable without a morphology/dictionary pass (Ф2) — left silent»; pymorphy в бэкенде существует только в комментах ОТБРОШЕННОГО pymorphy3-подканала лемматизатора майнера (miner/miner.go:18-23, дефолт B). Gender в банке хранится как TEXT «male|female|hidden|''» (`backend/internal/store/migrate.go`, колонка `gender` — тот же якорь, что в пункте «Строка 84» ниже; membank/memory.go: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 (pipeline/status.go:561-582), не «чанки с термом X». Источник кандидата — research/15-voice-and-state.md:200: одна команда ставит until_ch=N старой записи и since_ch=N новой. При этом СУБСТРАТ построен целиком: оконные строки в схеме (UNIQUE (book_id, src, sense, since_ch, until_ch), migrate.go:202) и $0-пере-пин при bank-only-сдвиге (pipeline/repin.go: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: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:233`=`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 байт — не трекер). Живая диспозиция каждой строки — ТОЛЬКО таблица бэклога `../PROGRESS.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` размышление 170–313 ток. и флор 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.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` (`checks/sanitizer.go:228`) сработает на ЧИСТОЙ целевой прозе и дропнет 100% чанков — внутри санитайзера он НЕ обусловлен `TargetScriptNonLatin()`, хотя доккоммент это объявляет (реальный гард только на репэйре — `quality.go:215`, `repair.go:208`), а частичный файл цели невозможен (`CompileCheckers` паникует). ⇒ **ревью-вопрос «заработает ли пара, которой в репо нет, без правки Go?» для →en/→de отвечается НЕТ**; кандидат фикса — тот же шов, что уже применён к репэйру. *(Контрпример «pipeline-c2.yaml — легальная сборка без санитайзера» проверен и СНЯТ: c2 неисполняем `CheckRunnable`, его санитайзер забукован строкой 33.)* Даже при включённом санитайзере худший исход — не потеря юнита, а ТИХО ОТГРУЖЕННЫЙ релейный перевод zh→en→ru, если билингв-редактор отрендерит русский с английского черновика. Область фикса — «выход любой НЕ-последней стадии», не «черновик» (`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%: потерей юнита или тихо отгруженным релейным zh→en→ru · английских черновика найдено ДВА (`fb51e135a395`, `4080ee8287af`), плюс японский в exp15 · **`cultivation` чинить в СИДЕ, а не порогом:** 86 из 1055 здоровых несут голое английское `cultivation` внутри беглого русского, и все 32 абзаца ниже 0.90 содержат именно его, ни один — ханьцзы; правка пар-данных двигает `LangpackVersion` с `omitempty` ⇒ перекупка ограничена книгами ЭТОЙ пары (чинить на плане, где перекупка уже) · Hunspell и GlotScript-эмбед — **не строить** · база замера = строка **113** · **02.08 вечер (D39.92): владелец пере-поставил задачу closed-set** («вернуло НЕ тот язык, что просили»; полноценный LID — только запасной флаггер вне пути вердикта; проверку изолировать отдельным слоем) — ресёрч §5.1–5.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.20–0.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:109`=`узкие мандаты + диффы` дословно: «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.5–2.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` (`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`, пункты A–F этапа 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
|
||
|
||
**Гигиена пака стандартов (не-блокеры приёмки).** `TestCheckerLabelsCandidates` — ни одного ассерта (дизайн-REPL в одежде теста) · сообщение `TestMemoryVersionPinsTheUnverifiedRenderRevision` не различает «изменился рендер»/«изменилась нормализация» · Makefile: regex GO_MIN_VERSION пропускает go1.26.0–1.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 — читатели»: `chunktest/epub.go: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).
|