diff --git a/docs/BACKLOG.md b/docs/BACKLOG.md index 6e16f24b..ca723aec 100644 --- a/docs/BACKLOG.md +++ b/docs/BACKLOG.md @@ -3,7 +3,7 @@ > **Единственный трекер проекта.** Здесь живут строки, на которые доки, промты и D-ноты ссылаются словами «строка N» / «строка бэклога N»: **ID строки стабилен навсегда**, не перенумеровывается и не переиспользуется (D39.80). Правки — только через оркестратора; каждая петля обязана иметь диспозицию: решено / отложено-с-записью / отклонено. > ⚠ **Это НЕ бэклог зоны `docs/`, а бэклог ПРОЕКТА.** У зон свои, с другими неймспейсами ID, и единый их строк не принимает (D39.84): платформа — [../platform/BACKLOG.md](../platform/BACKLOG.md) (`П-N`) и её регистр дефектов `platform/docs/DEFECT_REGISTER.md` (`PD-N`); фронт — [../frontend/docs/BACKLOG.md](../frontend/docs/BACKLOG.md) (`Ф-N`). > ⚠ **Состояние проекта — не здесь.** Очередь, курс, CURRENT-STATE, состояние паков и живая хроника — шапка [PROGRESS.md](PROGRESS.md). Здесь только долг и его диспозиции. -> - **СЧЁТ ОЧЕРЕДИ на 16.09 (скриптом по таблице — `python3 docs/scripts/counts.py`; обновлять при каждом лендинге):** всего **339** строк · зона бэкенд **173** строго / **225** широко (⚠ колонки счётчик читает С КОНЦА — испр. D39.116) · **блокеров очереди 0** (236 закрыта D39.175; **371** — актом D39.233, **360** — актом D39.232, обе 10.09), платные прогоны разблокированы · «скоро» **175** (перечень — грепом по таблице, рукописный список снят D39.126) · гейт-строка эксп-22: 153 (плюс 150 — руки владельца; ⚠ 55 из гейтов СНЯТА — D39.198 п.5); строка 5 — остаток гейчен ре-пробой 74, носитель события теперь строка 188 (аудит D39.140); остальное «когда-нибудь». ⚠ Счёт — НИЖНЯЯ граница долга, не потолок (разбор — легенда таблицы ниже). +> - **СЧЁТ ОЧЕРЕДИ на 16.09 (скриптом по таблице — `python3 docs/scripts/counts.py`; обновлять при каждом лендинге):** всего **340** строк · зона бэкенд **174** строго / **226** широко (⚠ колонки счётчик читает С КОНЦА — испр. D39.116) · **блокеров очереди 0** (236 закрыта D39.175; **371** — актом D39.233, **360** — актом D39.232, обе 10.09), платные прогоны разблокированы · «скоро» **176** (перечень — грепом по таблице, рукописный список снят D39.126) · гейт-строка эксп-22: 153 (плюс 150 — руки владельца; ⚠ 55 из гейтов СНЯТА — D39.198 п.5); строка 5 — остаток гейчен ре-пробой 74, носитель события теперь строка 188 (аудит D39.140); остальное «когда-нибудь». ⚠ Счёт — НИЖНЯЯ граница долга, не потолок (разбор — легенда таблицы ниже). > - ⚠ **Переезд 06.09 (D39.218):** таблица вынесена из `PROGRESS.md` ДОСЛОВНО и ни один ID не сдвинут — **с единственным исключением: две ячейки (строки 220 и 306) тронуты РОВНО в номере якоря `docs/scripts/counts.py:566`→`:569` и `:592`→`:595`**, потому что цель сдвинул этот же коммит; текст ячеек не менялся, длины равны. В `PROGRESS.md` на прежнем месте оставлен заголовок-указатель, поэтому ссылки «секция „Бэклог“» доезжают в один хоп. ## Бэклог (ЕДИНЫЙ, собран 26.07, актуализация 04.08 D39.99/D39.101; правки — только через оркестратора) @@ -375,3 +375,4 @@ | 456 | **Пин читательской фразы отчитывается за КЛАСС, а меряет СРЕЗ.** `backend/internal/pipeline/readerholewords_test.go:47-64`=`DroppedReason: string(FlagHardRefusal)`: строки таблицы варьируют причину флага (`retry_unaffordable`, `cancelled`, `hard_refusal`, `sanitizer_defect`), но `DroppedReason` захардкожен `FlagHardRefusal` во ВСЕХ строках. Поэтому строка «a stop mark over a unit that lost a member for good» меряет защитимый случай — член потерян настоящим отказом — и молчит ровно о случае ряда 375, где выпавший член САМ есть метка стопа. Прогон: 5/5 PASS, то есть зелень ничего не говорит о предмете | бэкенд | скоро | варьировать `DroppedReason` по строкам | `D39.255`, приёмка пака 291 | | 457 | **ТРИ ПРОТУХШИХ ЯКОРЯ В ДОКАХ ФРОНТ-ЗОНЫ, и две цели живы по известным адресам.** `frontend/docs/frontend-PROGRESS.md:187`=`Какое слово о состоянии книги стоит в дереве` целит в контракт по адресу 1054 — токен живёт на `docs/architecture/14-api-contract/README.md:1138`=`не различает две беды`; `frontend/docs/frontend-PROGRESS.md:190`=`Фразы отказа книги` целит в openapi по адресу 1606 — enum отказов живёт на `docs/architecture/14-api-contract/openapi.yaml:1633`=`enum: [source_unreadable, not_configured, processing_failed, content_refused]`; `frontend/docs/STACK_DECISIONS.md:263`=`pend.Source = u.sourceText()` целит в экспорт по адресу 176 — присваивание живёт на `backend/internal/pipeline/export.go:178`=`pend.Source = u.sourceText()` (замер 16.09: `sourceText()` в файле два, второе — `ce.Source` на 344, и оно про другое). ⛔ **Мёртвые адреса здесь НАЗВАНЫ СЛОВАМИ, а не якорями, и это существенно:** выписав их в форме `` `путь:строка`=`токен` ``, я воспроизвёл чужую поломку у себя — линтер прочитал их как МОИ живые якоря и дал три новых красных (8 → 11). **Документируя протухший якорь, не пиши его якорем.** ⚠ Правит их ФРОНТ: доки чужой зоны оркестратор не переписывает, а обе уехавшие цели — В МОЕЙ зоне, поэтому адреса названы здесь готовыми. ⛔ Замер 16.09: цели контракта БАЙТ-ИДЕНТИЧНЫ дереву и HEAD (README 1608 строк в обеих, `openapi.yaml` 3497 в обеих) ⇒ якоря протухли НЕ лендингом приёмки, а раньше. ⚠ И они едва не уехали в находку: контрольный прогон на HEAD показал 25 строк из 27 — линтер капит список, и «эти два якоря новые» было артефактом прибора, снятым замером | фронт | когда-нибудь | три якоря зелёные в `python3 docs/scripts/counts.py --lint` | приёмка пака «КУПЛЕНО — ЗНАЧИТ ДОСТАВЛЕНО» 16.09 (`D39.255`) | | 458 | **ПЯТНАДЦАТЬ ГОЛЫХ ЯКОРЕЙ В ЖИВЫХ СТРОКАХ: путь и номер есть, ТОКЕНА ОЖИДАНИЯ нет — линтер такой якорь не читает, и «ноль жалоб» тут неотличимо от «не разобран».** Одиннадцать в `docs/BACKLOG.md` — pipeline/export.go 307 · stagerun.go 93 · seed/seed.go 24 · store/chunkstatus.go 92 · bankmaterialize.go 214 и 295 · export.go 174 и 320–322 · quality.go 492 · status.go 538–543 · voicerun.go 46 (⚠ у восьми нет и КОРНЯ пути, а такой якорь не ловится даже существованием файла); четыре в `docs/experiments/00-provider-quirks.md` — pipeline-c1.yaml 129 · pipeline-arm-glm.yaml 61 · pipeline-arm-deepseek-pro.yaml 62 · pipeline-arm-mistral.yaml 61. ⛔ **Адреса здесь намеренно НЕ в форме якоря:** выписав их якорями, я за одну смену ДВАЖДЫ завёл своими руками ровно тот дефект, который ряд описывает — сперва в ряду 457 с чужими протухшими целями, потом здесь, и оба раза поймал ХУК, а не я. **Перечень поломанных якорей сам якорями не пишется.** ⛔ **Чинить ОПТОМ нельзя:** токен, подобранный под то, что в цели ОКАЗАЛОСЬ, есть подгонка под зелень (`D39.121`) — каждый разбирается чтением прозы, которая его описывает, и половина таких разборов кончается тем, что уехала ЦЕЛЬ, а не номер. Замер 16.09 (`D39.255` п.10): пред-существуют — лендинг приёмки эти строки лишь дополнял, а ввёл он двенадцать своих, и они закрыты в тот же заход | оркестратор | когда-нибудь | у каждого якоря есть корень пути и токен; пред-коммитный хук на этих строках молчит | приёмка пака «КУПЛЕНО — ЗНАЧИТ ДОСТАВЛЕНО» 16.09 (`D39.255`) | +| 459 | **РАТИФИЦИРОВАННАЯ НОТА И ДЕРЕВО РАСХОДЯТСЯ ПО ОТКАЗ-СИГНАЛУ ⟦TM-NO-DST⟧, и банковый пак упрётся в это на первой же строке.** `D39.102` п.2 числит отказ-сигнал в корзине «закрыть по нужности», ратифицированной ЦЕЛИКОМ; п.3 той же ноты добавляет его в «опровергнуто/не заводится»: «NoDst-почти-сентинел на zh-ru (target_script обязателен конфигом, OffLanguage отбивает)». ⛔ **В ДЕРЕВЕ он жив и стоит на БОЕВОМ проводе zh-ru:** `backend/prompts/zh-ru/terminologist.md:36`=`не можешь выбрать перевод уверенно` велит роли вернуть сентинел и называет это нормальным исходом; парсер ждёт его вместе с искажёнными формами (`backend/internal/terminology/terminology.go:694`=`const NoDst = "⟦TM-NO-DST⟧"`, `backend/internal/terminology/terminology.go:1183`=`func isNoDst`); счёт печатается прогоном (`backend/internal/pipeline/terminologist.go:621`=`"declined", res.Declined`). Итог консилиума повторил НОТУ, а не дерево (`docs/research/35-bank-memory-consilium.md` §П3, «исхода движка „это не термин“ нет и не вводится»). ⇒ пак обязан выбрать ЯВНО: сентинел остаётся законным исходом (тогда ряд 445 — ужесточение разбора ответа) либо снимается из промта — а это двигает хеш запроса и перекупает проход на консолидированных книгах. Найдено советчиком-фаблом, проверено деревом оркестратором | бэкенд | скоро | нота и дерево говорят одно, выбор назван нотой | совет фабла 16.09 + сверка дерева оркестратором | diff --git a/docs/architecture/13-tech-debt-anchors.md b/docs/architecture/13-tech-debt-anchors.md index e29f809b..98a7752b 100644 --- a/docs/architecture/13-tech-debt-anchors.md +++ b/docs/architecture/13-tech-debt-anchors.md @@ -30,7 +30,7 @@ Bertalign: grep -rni bertalign по eval/ и backend/ — 0 вхождений ( ### [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 без решения, полигон-пакет до МАСШТАБА. +`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: было :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 §Внутрифайловый) @@ -40,7 +40,7 @@ Bertalign: grep -rni bertalign по eval/ и backend/ — 0 вхождений ( ### [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 лок-степ). +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б) @@ -58,7 +58,7 @@ Go-гейт стоит на v1 без поглощения кавычек: backe ### [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») — жива, не закрыта. +В 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). @@ -86,7 +86,7 @@ Go-гейт стоит на v1 без поглощения кавычек: backe ### [БЕЗ СТРОКИ ТРЕКЕРА] Кандидат 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) — платятся только юниты, где инъекция реально изменилась. +Команды НЕТ (⚠ список команд здесь НЕ дублируется — снятый снапшот отставал ТРИЖДЫ; единственный носитель — `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`), не пайплайн-работа. @@ -129,7 +129,7 @@ Go-гейт стоит на v1 без поглощения кавычек: backe ### [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 реален и жив. +Подтверждено отсутствие: `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): инъекционная половина построена условно и НЕ включена, оба провода @@ -166,7 +166,7 @@ Go-гейт стоит на v1 без поглощения кавычек: backe > ⚠ **Закрыто, тело оставлено археологией по норме этой секции.** Обе половины опровергнуты деревом: экран цели построен пакетом `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` (`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** (⚠ **закрыта вместе с 46**, `D39.199`; в живом трекере её нет) · **02.08 вечер (D39.92): владелец пере-поставил задачу closed-set** («вернуло НЕ тот язык, что просили»; полноценный LID — только запасной флаггер вне пути вердикта; проверку изолировать отдельным слоем) — ресёрч §5.1–5.3 отвечает постановке, форма (а)+изолированный модуль подтверждена, слой-0 владельца (полоса len(out)/len(in)) добавить замером на фикстуре 113 +**Экран целевого языка на выходе НЕ-ПОСЛЕДНЕЙ стадии — ЖИВОЙ НОСИТЕЛЬ ПОЛУЧЕН, класс поднят (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.)* Даже при включённом санитайзере худший исход — не потеря юнита, а ТИХО ОТГРУЖЕННЫЙ релейный перевод 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** (⚠ **закрыта вместе с 46**, `D39.199`; в живом трекере её нет) · **02.08 вечер (D39.92): владелец пере-поставил задачу closed-set** («вернуло НЕ тот язык, что просили»; полноценный LID — только запасной флаггер вне пути вердикта; проверку изолировать отдельным слоем) — ресёрч §5.1–5.3 отвечает постановке, форма (а)+изолированный модуль подтверждена, слой-0 владельца (полоса len(out)/len(in)) добавить замером на фикстуре 113 ### Б-105 — тело строки 105 на 09.08.2026 @@ -178,7 +178,7 @@ Go-гейт стоит на v1 без поглощения кавычек: backe ### Б-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(д) (триггер реопена: первый живой инцидент перелёта) +**Реестр ЗАГЕЙЧЕННЫХ ТРИГГЕРОВ + норма закрытия «по нужности».** ⚠ Первый жилец реестра, найденный тем же лендингом: **сиблинг-угроза экрана целевого языка** — выход на языке, БЛИЗКОМ к целевому (украинский/болгарский для 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(а)**, зона оркестратора. @@ -198,7 +198,7 @@ Go-гейт стоит на v1 без поглощения кавычек: backe > ⚠ **ЧАСТИЧНО ЗАКРЫТ 07.09 (`D39.225`, дофикс):** пункт «`.skips.log` не в gitignore» снят В ИСТОЧНИКЕ — харвест-лог батареи уехал во временный каталог с обработчиком, файла в дереве нет вовсе, а `backend/.gitignore` получил все три артефакта `go build ./cmd//` (`tmctl` · `tmvet` · `tmmutate`), а не один. ⛔ Остальные пункты тела ЖИВЫ и держат строку 122: `wastedassign` и скоуп errcheck-исключения на `cmd/`. -**Гигиена пака стандартов (не-блокеры приёмки).** `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) — переписать честно +**Гигиена пака стандартов (не-блокеры приёмки).** `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 — читатели»: `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 diff --git a/docs/experiments/23-editor-tier.md b/docs/experiments/23-editor-tier.md index dca158d8..d1aed39e 100644 --- a/docs/experiments/23-editor-tier.md +++ b/docs/experiments/23-editor-tier.md @@ -8451,3 +8451,20 @@ sd(log R̂(low₂) − log R̂(low₁)) = 1.493 по n=19 ⇒ σ = 1.493/√ токенов. Но для ЛЮБОГО замера, который судит ТЕКСТ, это предупреждение первого порядка: там шум розыгрыша крупнее межрукового различия, и без активного нуля такой замер награждал бы шум. Наша проба защищена парным дизайном по 20 юнитам — и, теперь, прямой репликацией. + +--- + +## ⚠ ПОМЕТКА 16.09 (оркестратор №23) — поправка к якорям тела и к одной его претензии + +Тело улики не правится (D23.3), поэтому поправка живёт здесь. **В конце файла намеренно:** вставка в шапку +сдвинула бы номера строк, а в этот отчёт целятся 23 якоря из других доков, и 21 из них БЕЗ токена — +такой сдвиг испортил бы их молча, потому что голый якорь линтер не читает. + +**Два адреса тела уехали:** «system_messages: single» живёт на `backend/configs/models.yaml:183`=`system_messages: single`, +`toOpenAIMessages` — на `backend/internal/llm/httpllm.go:766`=`func toOpenAIMessages` (в теле стоят 137 и 528). + +⛔ **И существеннее адресов: претензия тела «носитель решения врёт прямо сейчас» (про арм-конфиги) ЗАКРЫТА — носители ИСПРАВЛЕНЫ.** +Обоснования «×2 дешевле glm» в дереве больше нет ни в одном из двух файлов; на его месте пере-пин цен `D39.137` п.4: +`backend/configs/pipeline-c1.yaml:97`=`ПЕРЕВЁРНУТА пере-пином цен` и `backend/configs/pipeline-arm-glm.yaml:6`=`ПЕРЕВЁРНУТА пере-пином цен` +— «в ПИК dspro дороже glm ×1.26, офф-пик дешевле ×1.59». Контроль: «дешевле» встречается в каждом файле РОВНО ОДИН раз, +и оба раза — про пере-пин; «×2» — ноль вхождений в обоих. ⇒ читающий тело НЕ должен заводить по этой претензии работу. diff --git a/docs/research/35-bank-memory-consilium.md b/docs/research/35-bank-memory-consilium.md index fec86ee4..6b239bf3 100644 --- a/docs/research/35-bank-memory-consilium.md +++ b/docs/research/35-bank-memory-consilium.md @@ -1622,3 +1622,26 @@ D39.50 (просьба владельца против «до него kwic не починка предыдущего. Это не значит, что решение негодно: его несущая часть проверена исполнением трижды, а найденное внесено. Это значит, что **правки последнего круга уже никем не судились**, и честно назвать их незакрытыми (О-1), а не выдать за проверенные. + +--- + +## ⚠ ПОМЕТКА 16.09 (оркестратор №23) — поправка к §П3 «Исходы решения» + +**В конце файла намеренно:** тело итога — улика (D23.3) и не правится, а вставка выше сдвинула бы номера строк и молча +испортила бы якоря, которые целятся в этот отчёт. + +§П3 утверждает: «Исхода движка „это не термин“ нет и не вводится. Класс отказ-сигналов закрыт D39.102 п.2». **Это верно +про НОТУ и неверно про ДЕРЕВО.** В боевом проводе zh-ru отказ-сигнал жив и приглашается самим промтом: +`backend/prompts/zh-ru/terminologist.md:36`=`не можешь выбрать перевод уверенно` («верни ⟦TM-NO-DST⟧… это нормальный»), +парсер ждёт его вместе с искажёнными формами (`backend/internal/terminology/terminology.go:694`=`const NoDst = "⟦TM-NO-DST⟧"`, +`backend/internal/terminology/terminology.go:1183`=`func isNoDst`), а счёт печатается прогоном +(`backend/internal/pipeline/terminologist.go:621`=`"declined", res.Declined`). + +⚠ Различение, без которого поправка читается грубее, чем есть: §П3 прав в том, что у СТРОКИ БАНКА нет исхода «не термин» — +отказ роли не становится решением, а превращается в передачу черновика (это сам отчёт и говорит абзацем ниже). Неверно +другое — что класса отказ-сигналов в движке нет. Он есть, оплачен и течёт на провод. + +⇒ Работа заведена строкой бэклога: пак обязан выбрать явно — сентинел остаётся законным исходом (тогда ряд 445 есть +ужесточение разбора ответа) либо снимается из промта, что двигает хеш запроса и перекупает проход. Нашёл советчик-фабл, +проверено деревом оркестратором. +