textmachine/docs/archive/reports/CHECKER_PACKAGE_2026-08-02.md

38 KiB
Raw Blame History

Отчёт: ПАКЕТ-ЧЕКЕРОВ — детекторы качества против размеченного корпуса ($0)

ПРИНЯТ И ЗАЛЕНДЕН (оркестратор №9, 02.08.2026, D39.78; постфикс §8 — тем же лендингом, v7 бампнут ОДИН раз). Двухраундовая приёмка исполнением: labels-харнесс перепрогнан лично (все ячейки §2 побайтно; фрозен-ДО #3 5/1/41/99 из дерева; k4a 0/0/0/348 — 12/12); голден — независимый маскированный дифф ПУСТ дважды (v7-захват и постфикс-no-op); build/vet/-race/майнер-парити зелёные. Раунд 1 (10-агентный адверсариал-воркфлоу): 0 блокеров, 5 CONFIRMED major — скоуп k4_inverse (= весь хвост строки), 2 ложных «вскрытых» примера #3 (§2 первой редакции), BASE==EXT кандидат-теста, рассинхрон репэйр-твина латиницы, Р4-потолки не в контракте — ВСЕ закрыты постфиксом §8 до коммита. Раунд 2 (дельта, 3 агента + верификация): 0 major; остаточные минорки → бэклог-строка 93; вопросы §6 + жанр-ось register_neg («xianxia» в msg-шаблоне пар-пака) + асимметрия 兩-батча → строка 92. Честные границы ратифицированы: «fn=0» #10 — класс-вакуумен (hard-gate строки 12 на него не опираться); p=1.0 k4_inverse не ограничивает вне-корпусные формы. Лендинг-штамп: «D39.76» в постфикс-пометках → фактический D39.78 (здесь + 2 код-коммента — механическая нумерация). Незаявленные в §-списке дерева файлы (langpack.go — коммент-указатели ведра D; memdecl_test.go — gofmt) тривиальны, проверены.

Дата: 02.08.2026 · Сессия: бэкенд · Промт: docs/BACKEND_CHECKER_PACKAGE_SESSION_PROMPT.md (строка 25 + 79, D39.67/68). Зона: backend/ (+ configs/langpacks/zh-ru/) + этот отчёт. Деньги: $0 — ни одного платного вызова; --resnapshot-эквивалент не запускался; голден пере-захвачен фейк-провайдером ОДИН раз в конце. Статус: НЕ закоммичено — лендит оркестратор. СТОП в конце — приёмка оркестратора.

ЭХО-БЛОК (как понят скоуп)

  1. Скоуп: $0-детекторы качества против ~/books/gu-zhenren/labels/; перечень = строка 25 + 79. Для КАЖДОГО пункта — вердикт-тройка (посылка/нужность/форма) ДО кода; допустимый исход = «не чинить, закрыть с обоснованием».
  2. $0: денег ноль, вызовов провайдеров нет.
  3. Зона: backend/ + configs/langpacks/ + отчёт + краткий итог в PROGRESS §Бэкенд (бэклог-таблицу/CURRENT-STATE не трогаю).
  4. Стоп-точки: НЕ коммитить; TM_UPDATE_GOLDEN один раз в конце; чужие правки backend/ → СТОП+пинг.
  5. Мандат: ревизия посылок; замер против посылки → СТОП+пинг; самопроверка исполнением (author≠reviewer).

§1. Харнесс labels — пересобран В GIT, калибровка на неизменённом коде

Прежний харнесс утрачен в scratch («персист, не scratch»). Пересобран как env-гейченный Go-тест В GIT (образец майнер-парити), durable:

  • backend/internal/checks/labelharness_test.goTestCheckerLabelsBaseline (K1/K2/K3/K4b/k4_inverse/K5a/K5b/K5c×2/K5d), вызывает НАСТОЯЩИЕ internal/checks через компиляцию zh-ru пака точно как раннер.
  • backend/internal/membank/labelharness_test.goTestK6LabelsBaseline (пост-чек K6; dstFormPresent/entry не-экспортны → white-box здесь).
  • backend/internal/checks/labelcandidates_test.goTestCheckerLabelsCandidates (замер КАНДИДАТ-правил ДО коммита — «мерить, потом решать»).

Гейт: TM_CHECKER_LABELS=1; данные вне git (текст книги) → тест СКИПается без стенда. Пути overridable env (TM_CHECKER_LABELS_DIR, TM_CHECKER_LANGPACK_ROOT).

Воспроизведение metrics.json (колонка ДО) — ПОБАЙТНО на неизменённом коде

ВСЕ 12 ключей metrics.json воспроизведены точно до внесения правок. Два независимых пути счёта совпали: (а) Go-харнесс; (б) независимая пере-реконструкция джойн-конвенций из СОХРАНЁННЫХ verdicts/ (units.jsonl/misc.json/k4.jsonl) — обе бьются с metrics.json. ⚠ Поправка ревью-агента (D39.78): первая редакция писала «11 ключей» — k4a (n=348, all-TN, дефект-МАРКЕР по всем 348 строкам k4.jsonl) молча выпал. Теперь воспроизведён measureK4a МАРКЕР-ОНЛИ (ведущая « " » / « - » / « »-опечатка, НЕ фолд-счётчик DialogueDash), закреплён 0/0/0/348 — иначе фолд inverseMarker в DialogueDash читал бы 3 инверс-файра как маркер-дефекты. 11 из 12 в checks-харнессе + K6 в membank.

Конвенции джойна (реверс-инжинирены из сохранённых вердиктов, зафиксированы в харнессе):

  • Юнит-классы (K1/K5a/K5b/K5c): окончания-разметки агрегируются к юниту с приоритетом defect > disputable > ok; вердикт = суб-счётчик чекера > 0.
  • K2: пер-токен по размеченному полю (детектор гоняется и на draft, и на final).
  • K3: пер-словотип.
  • K4b: пер-ёлочная-строка (chevronSpeechShape && isSpokenChevronLine), spoken=defect, ambiguous=disputable. k4_inverse: пер-тире-строка, thought=defect.
  • K6: dstFormPresent пер-строку пула; predDefect = !present.

Ловушка ApplyHeading (README): боевой гейт видит финал ДО chunk.ApplyHeading (waverun.go:547/export.go:215 идут ПОСЛЕ RunCheapGates на :501); корпус запёк детерминированный «Глава N». Харнесс снимает голый «Глава N» (stripManifestHeading) — иначе номер главы читается регресс-гардом как «появившееся число». Это ровно даёт k5d = 4 fp + 1 tn: minirun:10:0 («Глава 10», номер только в заголовке) → TN после снятия; старостековые acceptance-заголовки («Раздел N: title») — запечённое ТЕЛО, не снимаются → остаются fp. Воспроизведено точно.

Конвенция K5c — выбрана и названа

Две конвенции разметки:

  • k5c_unit (читательская мерка, значение=дефект): precision 0.167 — 5 срабатываний несут ВЕРНОЕ значение в форме дроби (六成六→«шесть десятых и шесть сотых»=0.66=66%). Это целевая мерка Р2 (жёсткий флаг только за неверное ЗНАЧЕНИЕ).
  • k5c_unit_codeconv (форма=дефект): precision 1.0 — верность кода КАК НАПИСАН (файрит по форме).

Выбор: обе именованы и меряются. k5c_unit_codeconv = фиделити текущего кода; k5c_unit = контракт Р2, к которому код должен прийти (см. вердикт-тройку #1 ниже).

Две дельты пост-банк-пака (объяснены, не код-баги)

  • K6 стеммер (D39.75): metrics.json предшествует стеммеру. Текущий declinedFormPresent (стеммер) принимает 凡人→смертных и 甲等→разряд А ⇒ K6 fp 14→12 ещё ДО моих правок. Первопричина — банк-пак §и/§3 (стеммер + combmark-фикс text.TokenizeLetters). Харнесс меряет ОБА пути (стеммер off = базлайн, on = текущий) — дельта локализована и объяснена.
  • K3 combmark (D39.64/75): U+0301-фикс НЕ двинул k3 на этом наборе (ни один размеченный дефект не бил в кейс бо́льшим-сплита) — метрика байт-идентична.

§2. Метрики per-class ДО/ПОСЛЕ (вскрытые единицы)

класс ДО (metrics.json) ПОСЛЕ что двинулось
K1 DC1 время 6/0/0/9 · p1.0 r1.0 = не трогал
K2 латиница 30/0/10/52 · p1.0 r0.75 34/1/6/51 · p0.971 r0.85 #6: +4 tp (BANK×2, Cultivation×2); 1 fp = «Qidian» (бренд; p→1.0 лишь ЕСЛИ занесён в allowlist — сейчас конфиг не заносит)
K3 битые формы 1/0/9/2167 · r0.1 = Р4-потолок (один шаблон «-йть»)
K4b ёлочная речь 5/1/41/99 · p0.833 r0.109 10/1/36/99 · p0.909 r0.217 #3: +5 tp (восклиц. атрибуции), 0 новых fp
k4_inverse 0/0/4/71 · r0 3/0/1/71 · p1.0 r0.75 build: inner_marker-на-тире (+3 tp, 0 fp)
K5a магнитуда 0/0/1/26 · r0 = #5 закрыт: единственный дефект DC2-покрыт
K5b DC2 1/0/0/7 · p1.0 r1.0 = не трогал
K5c 成 (значение) 1/5/1/8 · p0.167 = детекция; Р2: PercentScale→SOFT 5 fp = верное значение/форма-дробь ⇒ мягкий счётчик
K5c 成 (форма) 7/0/1/8 · p1.0 = #8 (两) замаскирован супрессором
K5d дрейф 0/4/0/1 · p0 = вне скоупа-дефектов (регресс-гард, D38)
K6 глоссарий 1/14/0/243 · p0.067 1/6/0/251 · p0.143 #10: 6 fp (转); +стеммер 2 (凡人/甲等); fn=0 сохранён (古月方正 пойман)

Вскрытые единицы (глазами, ≥1 с каждой стороны):

  • #3 K4b +5 tp (все со связкой-глаголом ИЗ speech_verb, ранее слепые из-за требования запятой после »): acceptance:6:0:draft:100 «Гуюэ Фан Чжэн!» — крикнул старейшина; acceptance:17:0:final:22 «…в такую позднюю пору…» — пробормотал слуга; acceptance:21:0:final:38 … — сказал … (+ 15:0:draft:68 «крикнул», 6:0:final:96 «крикнул»). 0 новых fp (глагол-гейт isSpokenChevronLine держит точность). ⚠ Поправка ревью-агента (D39.78): прежние примеры «раздался голос»/«скривился кто-то» БЫЛИ ЛОЖНЫ — «раздался»/«скривился» НЕ в speech_verb, эти строки остаются FN; агрегат 10/1/36/99 честен (реальные +5 tp — по id выше, сверены с fn_ids базлайна), но «вскрыто глазами» держится на глаголах из списка, не на этих двух.
  • #6 K2 +4 tp: BANK (маркер банка), Cultivation (утечка англ. термина) в финалах — реальные утечки. 1 fp = Qidian (платформа-бренд, метка ok) → allowlist книги нейтрализует.
  • #10 K6 6 fp: все 6 = 转 внутри 转身/辗转/转为 (глаголы, не ранг) — демотированы в observability; ни одного реального промаха не потеряно (fn=0). ⚠ fn=0 здесь КЛАСС-ВАКУУМЕН (поправка D39.78): в размеченном наборе НОЛЬ реальных промахов на одно-руновом Han-ключе, поэтому демотация не могла спрятать реальный промах — но и recall-ЦЕНА демотации этим корпусом НЕ измерена; hard-gate строки 12 на «fn=0» здесь опираться не должен.
  • k4_inverse +3 tp: «— …, — вздохнул ПРО СЕБЯ Фан Юань» — мысль, набранная тире; 1 остаточный промах = маркер вне списка (потолок ДАННЫХ, не правила).

§3. Вердикт-тройки (ВСЕХ пунктов, включая «не чинить»)

Легенда: (а) посылка · (б) нужность на labels · (в) форма/исход.

Построено

#10 — однознаковые Han-ключи пост-чека (membank/mempostcheck.go). (а) Посылка ВЕРНА: 转 через allow_short фаерит подстрокой в 转身, collisionProneKey ложен для Han ⇒ ложный Confirmed-miss (6 из 14 fp). (б) 6 fp на labels, fn=0 — чистое precision-улучшение. (в) Построено: миссы с одно-руновым Han-ключом (singleHanKeyFired(p.Via)) роутятся в Unverified observability, не Confirmed. Мульти-руновые Han (元石) НЕ демотируются (контроль-тест). Гвозди: mempostcheck_test.go (single→Unverified, multi→Confirmed). Контракт коротких Han-ключей описан §-блоком в коде + скоординирован с B6-токенизатором. ⚠ Стеммер-путь declinedFormPresent НЕ тронут (правка на уровне роутинга миссов, не dstFormPresent).

#3 — атрибуция ёлочной речи (cheapgates.go chevronSpeechShape). (а) Посылка ВЕРНА (38/46 реплик мимо). (б) Замер: +5 tp, K4b recall 0.109→0.217. (в) Построено (уточнено после ревью): принимается «X», — (запятая) ИЛИ «X!»/«X?»/«X…» — (восклиц. реплика); плоская цитата «X» — (буква перед », без запятой) ОТВЕРГАЕТСЯ. ⚠ Ревью-агент нашёл FP моей первой версии (просто «опциональная запятая»): цитата-прозвище «Бессмертный» — так его называли, …произнёс старик ловилась (глагол в другом предложении). Уточнение закрыло FP, сохранив все +5 tp (labels не двинулись). Гвоздь TestChevronCitationNotFlagged. Р4-потолок ~0.22 by construction (24 безатрибутивные реплики).

#6 — заглавная латиница/маркеры (checkers.go lintLatinResidue). (а) Посылка ВЕРНА (Cultivation/BANK слепы). (б) Кандидат: caps-aware ⇒ +4 tp, ИЗМЕРЕННАЯ precision 0.971 (1 fp «Qidian»=бренд). (в) Построено: снят reject-по-заглавной; легит-бренды → per-project allowlist (case-insensitive). ⚠ Честно (находка ревью-агента): precision 1.0 достижима, ТОЛЬКО если книга заносит бренд в style_allowlist — ни один боевой конфиг gu-zhenren этого сейчас НЕ делает, так что честное число = 0.971, не 1.0. Гвоздь: checkers_pack13_test.go.

k4_inverse — inner_marker-вето-на-тире (cheapgates.go lintDialogueDash). (а) Посылка (D39.64 §5.5): тире-строка ВСЕГДА корректна, мысль-на-тире невидима. (б) Замер: +3 tp, recall 0.75. (в) Построено (уточнено после ревью): маркер ищется в АТРИБУЦИИ (после первого [,.!?…] — join), НЕ по всей строке. ⚠ Ревью-агент нашёл FP моей первой версии (маркер по всей строке): «— Повтори это про себя, — сказал учитель» (законная РЕЧЬ, лишь УПОМИНАЕТ «про себя») ловилась. Скоуп на атрибуцию закрыл FP, сохранив +3 tp. Гвоздь TestInverseMarkerDashError (вкл. adversarial-FP + multi-clause кейс).

#8 — 两/兩 → cheng_re (данные dc-checkers.txt). (а) Посылка ВЕРНА (两 в cjk_numeral/shichen_re, нет в cheng_re). (б) Нужность на labels = 0: 两成 в acceptance:10:0/minirun:10:0 замаскировано супрессором #1 (там есть «процент»). (в) Построено как ДАННЫЕ (batch): 两/兩 в оба класса cheng_re + 兩=2 в cjk_numeral (парс-полнота). Правомерно как generality/consistency-фикс (санкция D39.63 «данные, батчем»); 0 измеренного эффекта — честно.

#1 (половина) — Р2-контракт hard/soft (cheapgates.go). (а) Посылка (D39.63): жёсткий флаг только за неверное ЗНАЧЕНИЕ; неконвертированная форма = мягкий счётчик. (б) 5 из 6 k5c-fp = верное значение/форма-дробь. (в) Построено: UnitScaleHard()={DC1 — сверяет ruNum≠2n · NumberMagnitude — слово-магнитуда неверного ПОРЯДКА, 三万→«три миллиона»} / UnitScaleSoft()={DC2 千万→«тысячи» гипербола-неоднозначна · PercentScale верное значение в форме-дроби}. ⚠ NumberMagnitude→HARD по находке ревью-агента (файрит на реальной ошибке значения, не только форме — исходно был в soft). Total() НЕ тронут ⇒ голден-нейтрально. Классификация — вокабуляр для report/postcheck_gate.

Строка 79 (первые два компонента + magnitude-гейт): (а) Посылки ВЕРНЫ (§8 карты D39.60). (в) Построено, generality, 0 эффекта на zh→ru: isCyrLetterc.isTargetWordLetter (wordScript) в lintRegisterLexicon + repair.go DC1-трим; lintNumberMagnitude гейтится sourceHasDenseScript() (объявленное письмо источника). Гвоздь: TestNumberMagnitudeSourceScriptGate (Han/ja фаерит, Latin инертен). Побочно закрыл находку ведра C-2 (register-boundary на не-кириллической цели вырождался в подстрочный матч — GENERALITY_RESEARCH §3.3). ⚠ Третий компонент (граница ПЛОТНОСТИ cjkScriptNames) — НЕ в скоупе, остаётся строке 79.

Рефрен-alignment (минимум $0): editor.md + editor-mono.md — вписано исключение «повтор в параллельных позициях исходника = авторский рефрен, сохраняй». Двигает PromptSHA256 боевого пака (перекупок нет, D39.63); голден-фикстура на синтет-промтах ⇒ prompt_sha256 голдена НЕ двинулся.

Закрыто с обоснованием («не чинить»)

#5 — K5a 数/几-магнитуды. (б) Нужность = 0: единственный реальный дефект магнитуды на всём корпусе (数十万人→«десятки тысяч», rerun2-mistral:2:0) УЖЕ пойман DC2 (K5b, recall 1.0). Расширение 数-коэффициента ловит 0 НОВЫХ единиц. Закрыто (на других корпусах может понадобиться — но текущая эмпирика не оправдывает).

#7 — порог minLatinResidueLen=3. (б) Замер: THRESHOLD=2 даёт 0 изменений (recall 0.75→0.75). Гомоглиф «гy» (K2-мотив #7) — это MIXED-скрипт токен (1 латинская руна), не длина-порог; ловится существующим детектором tk.mixed (см. ниже). Закрыто; 3 записан как Р4-потолок в контракте правила.

Гомоглиф-детектор tk.mixed — приёмка (D39.64 §5.5). Замер: detectBrokenWords ловит «гy» (Cyrillic г + Latin y) как homoglyph. Единственный гомоглиф корпуса (acceptance:24:1) пойман. Гвоздь: TestHomoglyphDetectorAcceptance. Приёмка пройдена.

Omission-бэкстоп (R4). УЖЕ построен — стеммер (declinedFormPresent, примитив C банк-пака) в пост-чеке ЕСТЬ лемма-матч по {dst, decl.forms}. Замерено: стеммер сам починил 2 K6-fp (凡人/甲等). Уроки softsign соблюдены (только флаггер; «ь»-класс не тронут; finding-1 закрыт на сид-формах A, движковый C загейчен D39.76). Пробел: target-алиасы в матч не заведены — сид-концерн, не код. Закрыто (переиспользован, измерен).

DC2 word↔word дроби (rule_b1/b2). (б) 分之-дроби есть в корпусе (8 юнитов), НО ни одного РАЗМЕЧЕННОГО дефекта класса нет → precision/recall неизмеримы. Строить вслепую = против мандата. Закрыто; рекомендация — сперва разметить 分之-срез, потом строить.

research/22 §2 №5 (char-freq-degeneration, control-code-loss). Классов НЕТ в размеченном наборе → не подтверждены на данных. Закрыто (строить только если labels подтвердят).

Строгий OffLanguage. Оговорка 36а: «甲等 → класс Цзя» строгой формой НЕ ловится. Не заявляю выигрышем; остаётся deferred.

На владельца (см. §6)

DC7 grade/role — approved grade-строки ЕСТЬ (класс А/Б/В/Г), но КОЛЛИЗИЯ с draft «разряд X». Нужна канон-подпись «класс» vs «разряд» ПРЕЖДЕ стройки (PACK11_CONT:195 — дизайн + вопрос, не стройка вслепую).


§4. Голден-протокол (пере-захват ОДИН раз в конце)

TM_UPDATE_GOLDEN=1 go test ./internal/pipeline/ -run TestGoldenDeterminism — маскированный дифф (hex≥12→HEX + cheapgate-vN→vX) — ПУСТ.

  • Единственная содержательная ось: style_check_version cheapgate-v6…cheapgate-v7-checkerpack-attribution+latincaps+p2split+combmark в двух снапшот-payload'ах (бамп CheapGateVersion — ратифицирован промтом).
  • Каскад: snapshot_draft/snapshot_edit (фолдят payload) → все final_hash (АДРЕС авторитетного чекпойнта, chunkstatus.go:31, не хеш текста).
  • НЕ двинулись (побайтно): content_hash, disp, flag, cost, attempts, escalated, detail, stage_text, memory_version, prompt_sha256, embedded_version, render_format_version, все dispositions/finish. Вердикт-нейтрально: новые детекции не файрят на ja-фикстуре голдена (там нет паттернов #3/#6/inner-marker). Перекупок нет (D39.63).

§5. Приёмка и самопроверка (author≠reviewer исполнением)

  • go build ./... · go vet ./...зелёные. go test -race ./...зелёные все пакеты (единственный ожидаемый двиг — голден, пере-захвачен раз).
  • Майнер-парити EXACT (TM_MINER_PARITY=1).
  • Мутационные тесты на новые классы: mempostcheck_test.go (#10 single/multi-Han), checkers_generality_test.go (SourceScripts-гейт, гомоглиф, inner_marker), checkers_pack13_test.go (caps-latin+allowlist).
  • Общность: свип ДОБАВЛЕННЫХ engine-Go-строк на pair/book/lang-литералы — пусто. unicode.Han в #10/magnitude-гейте = скрипт-структурный (любой CJK-источник), не пара/книга. «Пара не из репо заведётся без правки Go» держится.
  • Самопроверка исполнением: каждый фикс замерен на labels ДО стройки (кандидат-харнесс); каждый двиг вскрыт глазами (≥1 единица с каждой стороны); #10 проверен И харнессом (модель p.Src), И прямым продакшн-тестом (p.Via). Базлайн воспроизведён двумя независимыми путями счёта.

Адверсариальное агентское ревью (3 refute-biased агента) — по вопросу владельца, ПОСЛЕ лендинга

Соло-замер на labels недостаточен: корпус мог не содержать адверсариальных форм. Три агента (корректность · честность харнесса/метрик · общность+стиль) читали код и ГОНЯЛИ харнесс. Итог: 2 корректностных FP найдено и ИСПРАВЛЕНО ДО приёмки (оба — observability, не диспозиция), 1 honesty-правка, 1 Р2-реклассификация, DRY + подрезка комментариев. Манифактуренной сходимости НЕ найдено; харнесс подтверждён честным ЗАПУСКОМ (byte-for-byte metrics.json, «before» реконструированы из git). Именно это — ценность мандата: лейбл-замер показал 0 fp, адверсариал вскрыл реальные:

  1. k4_inverse FP: lineHasInnerMarker искал маркер по ВСЕЙ строке → законная речь, УПОМИНАЮЩАЯ «про себя», ловилась. Фикс (уточнён D39.78): сегмент атрибуции ограничен с ДВУХ сторон — ведущий спокен-клауз отсечён (первый [,.!?…] — join), И (постфиксом) хвостовой клауз отсечён на СЛЕДУЮЩЕМ [,.!?…] (продолжение после «. —» / нарративный хвост «. Про себя…» без второго тире); lineHasInnerMarker — по границе слова («в уме» ≠ «в умении»). +3 tp сохранены (3/0/1/71), 4 контрпримера закрыты гвоздём (TestInverseMarkerDashError).
  2. #3 chevron FP: «опциональная запятая» ловила плоскую цитату «X» — с глаголом в другом предложении. Фикс: принимать только «X», — или «X!/?/…» — (sentence-final перед »), отвергать плоскую. +5 tp сохранены. Гвоздь.
  3. Р2 NumberMagnitude → HARD: файрит на слове-магнитуде неверного порядка = ошибка значения (был ошибочно в soft).
  4. K2 честность: «precision 1.0 с allowlist» — спин; измеренное = 0.971, боевой конфиг бренд не заносит. Исправлено во всех формулировках.
  5. DRY + стиль: lang.IsDenseScript (единый реестр плотных скриптов) для sourceHasDenseScript; подрезаны 4 doc-простыни (метрики → отчёт) по норме владельца 26.07.

Все правки re-замерены (labels не двинулись: k4b 10/1/36/99, k4_inverse 3/0/1/71 сохранены), голден остался вердикт-нейтрален (пере-захвата НЕ потребовал — фиксы не файрят на ja-фикстуре).


§6. ВОПРОСЫ ВЛАДЕЛЬЦУ (отдельным блоком)

  1. DC7 grade/role: approved-строки грейда ЕСТЬ, но канон коллизирует — approved «乙等→класс Б / 丁等→класс Г / 丙等→класс В / 甲等→класс А» ПРОТИВ draft «甲等→разряд А / 丙等→разряд В / 丁等→разряд Г». Какой ряд канон — «класс X» или «разряд X»? DC7 нельзя строить без этого решения (иначе чекер флагует по неверному эталону). Реком: подписать «класс X» (уже approved), демотировать «разряд»-draft, тогда DC7 = data-driven серия-чекер.
  2. #8 兩 (традиционные иероглифы): добавил 兩=2 в cjk_numeral и cheng_re для generality (симпл-корпус их не содержит). Подтвердить, что traditional-Chinese поддержка данными желательна сейчас (0 стоимости), или откатить до появления traditional-книги.
  3. Р2 hard/soft: HARD={DC1, NumberMagnitude} (ошибка значения), SOFT={DC2 гипербола, PercentScale форма}. Полноценный HARD-value-чек для 成 (PercentScale) требует ru-numeral-word-данных (Р4-потолок записан). Строить value-детектор для 成 сейчас или держать soft-наблюдаемость до postcheck_gate (строка 12)?
  4. register_neg в ПАР-паке: лексемы «терем…» (target-ru свойство) живут в zh-ru/dc-checkers.txt. Инвариант «без правки Go» держится (новая пара кладёт свой dc-checkers), но ja-ru продублирует список. Перенести register_neg в target-данные (общий для всех ru-целей) — отдельным дата-паком? (Не блокер; наблюдение.)

§7. Итог (в PROGRESS §Бэкенд)

Пакет-чекеров ($0): харнесс labels пересобран В GIT (env-гейт, 2 пути счёта), metrics.json воспроизведён ПОБАЙТНО (12 ключей — k4a добавлен маркер-онли D39.78), k5c-конвенция названа (codeconv=фиделити кода / unit=цель Р2). Построено: #10 (пост-чек однознак. Han → observability, K6 fp 14→6, fn=0) · #3 (атрибуция +5 tp, K4b r0.11→0.22, Р4-потолок в контракт) · #6 (заглавная латиница +allowlist, K2 r0.75→0.85) · k4_inverse (inner_marker-на-тире, +3 tp, p1.0) · #8 (两/兩 данные, 0 эффекта — generality) · Р2 hard/soft split · строка 79 (isCyrLetter→wordScript · DC1-трим · magnitude SourceScripts-гейт, закрыла и ведро C-2 register-boundary) · рефрен editor.md/mono. Закрыто с обоснованием: #5 (DC2-покрыт) · #7 (порог=0-эффект; гомоглиф=tk.mixed, приёмка пройдена) · DC2 word↔word (нет размеченного дефекта) · research/22 (не на labels) · omission-бэкстоп (уже стеммером) · строгий OffLanguage (36а). На владельца: DC7 grade/role (коллизия канона класс/разряд). Голден: пере-захват раз, маскированный дифф ПУСТ (двинулся только style_check_version v6→v7 + хеш-каскад; вердикты байт-идентичны). build/vet/-race зелёные, майнер-парити EXACT.

Обязанность лендинга: актуализировать якоря «строка 25»/#10 в docs/architecture/13-tech-debt-anchors.md (memory.go/mempostcheck.go сдвинулись; #10 помечен исполненным D-номером) — сделано отдельной правкой.


§8. Пост-фикс пакета (D39.78 — адверсариал-ревью оркестратора, 0 блокеров / 5 major + minors, $0)

Приёмка оркестратора вернула 5 major + minors к починке ДО лендинга. Все закрыты; CheapGateVersion НЕ бампнут (v7 не коммичен); labels-цифры не двинулись (k4b 10/1/36/99 · k4_inverse 3/0/1/71 · k2 34/1/6/51 · K6 1/6/0/251 · k4a 0/0/0/348 добавлен); голден — маскированный дифф проверен.

  1. k4_inverse скоуп (major): speechAttribution теперь режет сегмент атрибуции с ДВУХ сторон (первый [,.!?…] — join → следующий [,.!?…]), lineHasInnerMarker — по границе слова. 4 контрпримера (продолжение речи после «. —», нарратив-хвост, гомоглиф «про себя»=«о себе», «в уме»⊂«в умении») закрыты гвоздём. Р4-потолок ~0.22 вписан inline в chevronSpeechShape.
  2. repair латинский близнец (major): latinResidueCandidates синхронизирован с #6-lint (снят caps-reject, roman/allowlist case-insensitive) — «BANK»/«Cultivation» теперь дают кандидат, а не 0. Ложные комменты repair.go:16-20/144-146 поправлены; гвоздь TestLatinResidueCandidateCapsSynced + caps-строка в TestRepairCandidatesAgreeWithLints.
  3. candidate-тест самоинвалидация (major): labelcandidates_test.go BASE звал переписанный продакшн (BASE==EXT). Заморожен pre-#3 chevronSpeechShapeCommaOnly локально → «ДО» 5/1/41/99 воспроизводится из дерева; отвергнутый chevronSpeechShapeExt снесён (коммент :26-27 опровергнут).
  4. Р4-потолки в контракт (major): minLatinResidueLen (THRESHOLD=2=0-изменений; 3=потолок) и chevronSpeechShape (~0.22, 24 безатрибутивные) — числа inline, не пойнтером.
  5. пост-чек контракт/комменты (major+minors): «B6 tokenizer» = строка 81 (не 12); «multi-rune keeps a word span» → честное «статистически сильнее; Han границами не проверяется, memory.go:536»; контракт PostcheckResult дописан про ДВЕ Unverified-популяции (для демотированной «entitled to reject» ложно); добавлен PostcheckMiss.Demoted (omitempty, голден-нейтрально) — снимает противоречие disp:"confirmed" при confirmed=0; негатив-гвоздь TestSingleNonHanKeyMissStaysConfirmed (одно-руновый НЕ-Han остаётся Confirmed).
  6. харнесс-честность: k4a воспроизведён (12/12); k4b-конвенция = предикатная (не mixing, 0 расхождений); «36 миссов» = 24 безатрибутивных + 12 с глаголом вне speech_verb; примеры #3 заменены реальными tp; «fn=0 класс-вакуумен» оговорено.
  7. isSpokenChevronLine скоуп (опц., вердикт-тройка → ОТЛОЖЕНО): citation+stray-verb FP-класс имеет 0 инстансов в корпусе (единственный K4b fp — запятая-мысль, иная форма); скоуп тронул бы фрозен-путь спекулятивно → загейчен нотой (нужен ёлочный экстрактор атрибуции + корпус-замер ПРЕЖДЕ стройки).

СТОП — приёмка оркестратора.