From 7d86406ebd829eeec6969425e2b90e824a0323f5 Mon Sep 17 00:00:00 2001 From: heaven Date: Wed, 2 Sep 2026 15:16:46 +0300 Subject: [PATCH] Convert the nine bare anchors the cut introduced into verifiable form: the sweep removed 260 of them net, and these nine came back in --- docs/architecture/13-tech-debt-anchors.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/architecture/13-tech-debt-anchors.md b/docs/architecture/13-tech-debt-anchors.md index e273ba35..17355a1e 100644 --- a/docs/architecture/13-tech-debt-anchors.md +++ b/docs/architecture/13-tech-debt-anchors.md @@ -9,7 +9,7 @@ ### [RESCOPE ИСПОЛНЕН] Строка 81 — ja-преп B6-ja: Поливанов-валидатор + kana-омограф POS/known-word гейтинг (D17.1) + чек-лист kana-алиасов сида (D16.4) -Два компонента реально отсутствуют: (1) Поливанов-валидатор — `backend/internal/store/migrate.go:187`=`translit_policy TEXT` («field only in v1; validator = Phase 2») и `backend/internal/store/migrate.go:195`=`ruby_reading` («bridge to Polivanov dst validation, B6 Phase 2 — NOT a dst»); grep polivanov/Поливанов по backend/*.go даёт только значения конфига в тестах/примерах и коммент `backend/internal/config/book.go:50` — валидирующего кода нет. (2) kana-омограф гейтинг — `backend/internal/membank/memory.go`, греп `KANA and HAN are deliberately NOT boundary-checked`: «… their ≥4 precision is deferred to the kana-precision measurement + the B6 tokenizer»; подтверждено D-логом (D17, тело — слайс `D1-D38`: митигация kana-омографов → «скоуп B6»). Третий компонент — чек-лист kana-алиасов сида (D16.4) — ПОСТРОЕН (`backend/README.md:38` §ja + `backend/internal/pipeline/bankmaterialize.go`, греп `AttachRubyAliasesToManual`); в чек-листе остался лишь Ф2-хвост «двойные чтения (強敵→とも) полная дизамбигуация», и он тоже под B6. +Два компонента реально отсутствуют: (1) Поливанов-валидатор — `backend/internal/store/migrate.go:187`=`translit_policy TEXT` («field only in v1; validator = Phase 2») и `backend/internal/store/migrate.go:195`=`ruby_reading` («bridge to Polivanov dst validation, B6 Phase 2 — NOT a dst»); grep polivanov/Поливанов по backend/*.go даёт только значения конфига в тестах/примерах и коммент `backend/internal/config/book.go:50`=`Transcription string `yaml:"transcription"` /` — валидирующего кода нет. (2) kana-омограф гейтинг — `backend/internal/membank/memory.go`, греп `KANA and HAN are deliberately NOT boundary-checked`: «… their ≥4 precision is deferred to the kana-precision measurement + the B6 tokenizer»; подтверждено D-логом (D17, тело — слайс `D1-D38`: митигация kana-омографов → «скоуп B6»). Третий компонент — чек-лист kana-алиасов сида (D16.4) — ПОСТРОЕН (`backend/README.md:38`=`Подготовка ja-книги (чек-лист сида)` §ja + `backend/internal/pipeline/bankmaterialize.go`, греп `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** @@ -61,7 +61,7 @@ grep sanitiz по backend/configs/pipeline-c2.yaml — 0 вхождений (exi ### [ЗАКРЫТО D39.69 §1 + D39.71] Кандидат 73: ranked-set (инъективность рангов) -Инъективность dst построена (`membank.InjectivityCollisions`, warning-only на загрузке); типа ranked-set и проверки ПОРЯДКА ступеней из исходного обязательства (`04-unhappy-paths.md:19`) нет. Улики с file:line — D39.66-пост-сверка (п.2). **Качество закрыто D39.69 §1, hard-режим = Q4 → D39.71 (не строить).** +Инъективность 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-ретирование инъекции отработанных термов @@ -79,7 +79,7 @@ grep sanitiz по backend/configs/pipeline-c2.yaml — 0 вхождений (exi Команды НЕТ (⚠ список команд здесь НЕ дублируется — снятый снапшот отставал ТРИЖДЫ; единственный носитель — `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`, `archive/reports/BANK_QUALITY_DESIGN_2026-08-01.md`, греп `замена термина`). Скоуп при стройке — ТОНКАЯ CLI-обёртка над уже построенным (правка двух окон в сиде + штатный `repin`), не пайплайн-работа. +⚠ **Строки 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) — «бюджет-гейт режет хвост батча» @@ -97,7 +97,7 @@ grep sanitiz по backend/configs/pipeline-c2.yaml — 0 вхождений (exi **Р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` («повтор в параллельных позициях оригинала = „не трогать“ … иначе редактор-агент убивает рефрены») и :130 п.5. +**НЕ построено, диспозиции даны:** 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` (лемма-матч {dst,decl.forms}; сам починил 2 K6-fp 凡人/甲等) — ⚠ target-алиасы к нему НЕ заведены, это сид-концерн, не код.