34 KiB
Отчёт: МЕЛКАЯ ПАЧКА ХВОСТОВ (строки 93·89·53·83 + решения D39.79; $0)
✅ ПРИНЯТ И ЗАЛЕНДЕН (оркестратор №9, 02.08.2026, D-номер лендинга: D39.82). Приёмка исполнением: батарея пере-прогнана независимо — build/vet/
-race ./...зелёные · парити EXACT-count=1· голден зелёный и фикстура в git НЕ тронута ни байтом · labels 6/6 фрозен-ячеек воспроизведены (вкл. фрозен-ДО#3 5/1/41/99) · gofmt пуст · DC7-замер пере-выведен скриптом (25/93/150 совпали). Второй рубеж — 5-осевой refute-воркфлоу (Q4-общность/хеш · F4-обход · A-фиксы · B-комплементарность · посылка DC7-стопа): 0 блокеров, 0 major ПРОТИВ пакета — omitempty-байт-идентичность доказана пере-выводом brief_hash из фикстуры (c2021b1b…воспроизведён, populated re-пинит), комплементарность header-рун — полным перебором 1 114 112 рун, мутант A3 убит ровно новым ассертом, CAND зовёт прод-символы. Находки поверх: (major CONFIRMED — против РЕКОМЕНДАЦИИ §5-E1, стоп сессии ВЕРЕН) DC7-класс в значительной мере уже покрыт mempostcheck + сид-v2 (грейды 甲/乙/丙/丁等 = approved-записи с decl-формами «класса/классу…»; сидовый прогон флагнёт «разряд» промахом dst) — финалы labels-корпуса до-/вне-сид-v2-канона, потому 25/93 не мерят остаток; DC7 пере-гейчен: замер ОСТАТКА на первом сидовом прогоне добора идеала, дом канона book.yaml ратифицирован (строка 98). (minor)redrive --dry-runобходит pre-flight, аstore.OpenМУТИРУЕТ SPOF-файл (миграции + recoverReservations) — коммент «mutates nothing» неверен → хвост в строку 93 (+stat-скип точной формой fs.ErrNotExist). Ноты-конвенции (дефис-частица «в уме-то» вне whole-word-вето — документированный трейд; CAND-прегейт шире прод-гейта dash+dialogueShape — корпус-нейтрально; ja-формулировка ведра B сжата против двухветвевой карты) — приняты без носителей.
Дата: 02.08.2026 · Сессия: бэкенд · Промт: docs/BACKEND_SMALLPACK_TAILS_SESSION_PROMPT.md.
Зона: backend/ (+ configs/langpacks/zh-ru/, стенд ~/books/gu-zhenren/) + этот отчёт. Деньги: $0 — ни одного вызова провайдеров; только код/тесты/данные/фейк-провайдер. Статус: НЕ закоммичено — лендит оркестратор. D-номер лендинга проставит оркестратор. СТОП в конце — приёмка оркестратора.
ЭХО-БЛОК (как понят скоуп)
- Скоуп: ~20 хирургических хвостов бэклог-строк 93·89·53·83 + D39.79. Каждому пункту — вердикт-тройка (а: посылка · б: нужность на данных · в: форма/исход) ДО кода; «не чинить, закрыть с обоснованием» — легитимный исход; замер бьёт по посылке → СТОП+пинг.
- $0: денег ноль, вызовов провайдеров нет.
- Зона:
backend/+configs/langpacks/+ стенд-данные~/books/gu-zhenren/+ отчёт + краткий итог в PROGRESS §Бэкенд. Не тронуто:START_PROMT.MD,frontend/,platform/, бэклог-таблица, CURRENT-STATE. - Инварианты: build/vet/
-raceзелёные · майнер-парити EXACT · 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 · фрозен-ДО#3 5/1/41/99) · голден НЕ движется (CheapGateVersionНЕ бампнут; brief_hashc2021b1b…неизменен). - Стоп-точки: не коммитить; F4-дискриминатор боевого пути БЕЗ магических строк провайдеров в Go; DC7 при >~50 строк Go или бое по посылке → СТОП+пинг.
§1. Инварианты приёмки — числами
go build ./...·go vet ./...— зелёные.go test -race ./...— все пакеты зелёные.- Майнер-парити EXACT (
TM_MINER_PARITY=1 go test ./internal/miner/ -run Parity) — после удаленияfreqStratumи комментаminerPackVersionвыходы НЕ двинулись. - Labels-фриз (
TM_CHECKER_LABELS=1 go test ./internal/checks/ ./internal/membank/ -run Label): 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 · фрозен-ДО#3 5/1/41/99 — ни одна ячейка не двинулась (assertBaselineхард-ассертит все классы, зелёный). DC7 НЕ построен (см. §5-E1), новых классов замера не добавлено. - Голден (
go test ./internal/pipeline/ -run TestGoldenDeterminism) — зелёный, НЕ двинулся.brief_hash=c2021b1b5e6c…cab0df(замороженный layout D39.26 сохранён:RegisterBlocklistв BriefHash несётomitempty, книга без него байт-идентична).CheapGateVersionНЕ бампнут. Байты пар-пака (dc-checkers.txt) двигаютLangpackVersion— на этой фазе ок (перекупок нет, D39.63); голден-фикстура пар-пак НЕ грузит и стоит. gofmt -l .изbackend/— пусто.
§2. §3-A — строка 93 (хвосты двухраундового ревью чекеров)
Легенда вердикт-тройки: (а) посылка · (б) нужность на labels · (в) форма/исход.
A.1 substring-вето → whole-word (checkers.go isSpokenChevronLine). (а) ВЕРНА: инвертированный strings.Contains по innerMarker глушил spoken по подстроке — «в уме» ⊂ «в умении» гасил РЕАЛЬНЫЙ mixing-клэш (данные target-ru.txt:58 содержат inner_marker в уме). (б) 0 инстансов в корпусе (labels стоят). (в) Сделано: вето переиспользует c.lineHasInnerMarker (→ containsWholeWordPhrase), whole-word; verb-проба остаётся substring (её whole-line-цитатный residual — отдельный DEFERRED-гейт D39.78). Гвоздь TestChevronMixingWholeWordInnerMarker (ёлочная реплика с «в умении» + тире-строка → mixing фаерит; whole-word «про себя» всё ещё вето).
A.2 recall-трейд отсечения — в контракт (cheapgates.go speechAttribution). (а) ВЕРНА. (в) Сделано: дописан RECALL-CEILING в док-коммент — маркер ПОСЛЕ внутренней запятой/многоточия внутри атрибуции («— …гу, — сказал он, про себя ругаясь») невидим = потолок ПРАВИЛА (двусторонний cut), не данных; симметрично Р4-записи #3. Потолок В КОНТРАКТ, не пойнтером.
A.3 негатив-ассерт Demoted (mempostcheck_test.go). (а) ВЕРНА: мутант m.Demoted=true в default-ветке Postcheck (ambiguous-мисс) переживал сьют. (в) Сделано: TestAmbiguousMissNotDemoted — auto-статус (→ Ambiguous), 2-руновый Han-ключ (не #10-демоция) → default-ветка → Unverified с Demoted=false, Disp="ambiguous". Мутант убит.
A.4 stale-коммент (checks/repair.go LatinResidueCount). (а) ВЕРНА: lintLatinResidue считает токены ЛЮБОГО регистра после #6 (caps-reject снят), коммент лгал «lowercase». (в) Сделано: коммент честен — «any case; BANK/Cultivation count alongside lowercase». (Не перепутан с pipeline/repair.go:349.)
A.5 CAND k4_inverse = опровергнутый вариант (labelcandidates_test.go). (а) ВЕРНА: CAND мерил whole-line-substring (hasInnerMarker), отвергнутый ревью, а лог читался как прод-числа (на корпусе совпадает 3/0/1/71 — divergence адверсариальна, не размечена). (в) Сделано (образец фикса-3): CAND = боевое правило (attribution-scoped speechAttribution+lineHasInnerMarker); отвергнутый whole-line оставлен ЯВНО помеченным REJECTED (helper hasInnerMarkerWholeLine), с нотой «идентичен на корпусе, потому FP взял адверсариал, не labels». Лог не врёт.
A.6 конвенции «..»/thin-space (cheapgates.go). (а) ВЕРНА (два расхождения код↔коммент). (в) Сделано, БЕЗ смены поведения (labels-фриз, §4): sentenceFinalBefore — коммент приведён к коду («TWO+ ascii-точки, инспектируются последние две; «..» и «...» проходят»); isInlineSpace — одна оговорка в коммент, что thin-space U+2009 сознательно НЕ включён (унаследованная HEAD-конвенция, известное непокрытие). Код «..»/thin-space не тронут.
A.7 кана-оговорка (mempostcheck_test.go). (а) ВЕРНА: «Han alone lacks segmentation» неточно — кана ТОЖЕ не boundary-checked (memory.go:536 дословно «Han/kana are NOT boundary-checked»). (в) Сделано: переформулировано честно — демоция Han-only = ратифицированный СКОУП до B6 (строка 81), одиночная кана = равно слабая улика, но демоция на неё пока не расширена (не «кана сегментирована»).
A.8 target-алиасы пост-чек-матча (mempostcheck.go dstFormPresent). (в) НЕ строить: одна NB-строка в контракт — множество = база dst ∪ decl-формы; альтернативный target-рендер (синоним/прозвище) НЕ матчится, это СИД-концерн (сидить как decl-форму/алиас), не код; на той же ноге, что inflection_gap.
Из строки 93 НЕ втащено (по промту): строгий OffLanguage (36а, deferred) · 分之-разметка (полигон).
§3. §3-B — строка 89 (остаток ведра D + сверка ведра B)
Ведро D (карта §3 GENERALITY_RESEARCH §3.4) — построчный вердикт
| Позиция (карта) | Диспозиция |
|---|---|
render.go:89,485 ⟨проверить⟩ глифы |
чинится здесь (коммент): операторские English-строки НАЗЫВАЮТ ru-маркер (не wire-строка модели — канон в injection.txt/embedded.UnverifiedMarker); ограниченная утечка (не-ru цель показала бы ru-глиф в help-тексте) заанкорена комментом; плюмбить пер-target-маркер в две help-строки непропорционально. status.go:98 и др. — комменты (не утечка). |
dc-checkers.txt:7-17 cjk_numeral третья копия |
не нужно здесь: дублирование данных = ведро-A класс (отдельно); пар-пак ТРЕБУЕТ cjk_numeral непустым как parse-полноту; внутрифайловый дубль-КЛЮЧ закрыт §3-C (putUniqueDC). |
pipeline-c2.yaml:36 prompt_override |
не нужно (booked): бэклог-строка 42. Документирован комментом :35. |
miner.go:52 вес palladius + miner_patterns.go:19 PackVersion |
PackVersion — чинится здесь (коммент): поле write-only (0 чтений по репо, не фолдится в снапшот/парити — сверено); «-universal-» = channel-schema слой, НЕ универсальность движка (surname/Palladius zh-shaped); значение НЕ трогал (unread version string не churn'ю; удаление dead-поля = альтернатива оркестратору). palladius-вес — не чинить: коммент уже честен («retained for parity; off in default B»), зафиксировано. |
miner_substrate.go:123 dead freq_stratum |
чинится здесь (удалено): 0 вызовов по репо (unexported), удаление парити-безопасно; парити EXACT после. |
chunker.go:222 дубль isHeaderSeparator |
чинится здесь (консолидировано): isHeaderSeparator (ingest.go) = точное булево ДОПОЛНЕНИЕ isHeaderContentRune (chunker.go); переписан как !isHeaderContentRune(r) — один источник рун-классов, behavior-preserving (chunk+golden зелёные). Третье имя isHeadingSeparator (chunker.go) — ОТДЕЛЬНЫЙ узкий whitelist пунктуации (НЕ та пара); кросс-ref-комменты добавлены обеим, чтоб не сравнили не ту пару. |
cheapgates.go:56,125,130+langpack.go:73,135,822 6 указателей на checkers_zh_ru.go |
сделано (D39.78): grep пуст. |
checkers.go:24 ложная шапка (register_neg = пар-таблица) |
сделано (D39.78) → и обновлено здесь E3: после Q4 шапка честно говорит «DC6 register blocklist NOT here — book property». |
prompts/zh-ru/*.md проводной формат прозой |
не нужно (booked): бэклог-строка 36г. |
Ведро B (карта §3.2, 6 «пар-модуль без гейта») — сверка носителей
| Позиция | Живо/закрыто · носитель |
|---|---|
miner_substrate.go:74 генератор N-грамм (scriptio continua) |
ЖИВО · носитель строка 35 (generic не-CJK майнер). |
langpack.go:772 7 обязательных Палладий-категорий |
ЖИВО (жёсткий блокер данных: ja-пак не грузится) · носитель строка 81 (ja-преп, Поливанов-валидатор) + строка 35. |
memseed.go:510 японский furigana-классификатор |
ЖИВО (мёртв на практике) · носитель строка 81 (ja-преп). |
miner_patterns.go:183 порядок имени (фамилия-префикс) |
ЖИВО · носитель строка 35. |
miner_alias.go:93 контейнмент как алиас-признак |
ЖИВО · носитель строка 35. |
miner_palladius.go:115 «слово = макс. ран букв» |
ЖИВО · носитель строка 35. |
Живого без носителя НЕТ → пинга не требуется. Все 6 несут майнерскую zh-привязку (строка 35) либо ja-специфику (строка 81); фаза-2/чекер-пак майнер-зону не трогали.
§4. §3-C — строка 53 (мелкие хвосты качества)
- gofmt:
internal/llm/llm.go+pipeline/miningstop_join_test.go+terminology/classify_test.go+terminology/series_test.goотформатированы (чисто форматирование).gofmt -l .изbackend/теперь пусто. editor-mono.mdDORMANT. (а)(б) ВЕРНЫ (спит — монолингв-вариант под пилот D13.1-арм, не в живом пайплайне; пометки в файле не было). (в) Сделано:<!-- DORMANT (D30.1) … -->в шапку файла — читатель видит статус, но модель НЕ видит (strip 14b,stripPromptComments), и хеш НЕ движется (SHA над comment-free формой,TestPromptSHAIsOverTheCanonicalForm). Боевого PromptSHA256 правка НЕ двигает — файл не грузит ни один живой конфиг (толькоrunner_memory_test.goчитает сырьё; зелёный). Боевойeditor.mdНЕ тронут.- Внутрифайловый дубль ключа пар-файла → громкая ошибка. (а) ВЕРНА:
parseDCCheckersтихо перезаписывал дубль-ключ в 5 map-категориях (Numeral/RuHours/Patterns/Messages/Ratios). (в) Сделано: дженерик-гардputUniqueDC[K,V](least-mechanism, идиома repoqueryAll/retryLoop) — дубль-ключ = fail-loud «duplicate key».register_neg= список (не ключ) → дубли ТЕРПИМЫ (зафиксировано тестом). ТестTestParseDCCheckersRefusesIntraFileDupKey(5 категорий + register_neg-толерантность). Реальный пак грузится (0 дублей). - Ledger-очередь LOW/NOTE (D39.4) и остаток D23 п.4 / D28 п.3(б). Диспозиции (архео по D-номерам, кода не требуют):
- D39.4 ledger-очередь LOW/NOTE: припаркованная 14 LOW + 14 NOTE хвост пака-1.5 адверсариала (Retries-снапшот · pair-fail-loud · trustGateEvent · golden-глосс-ячейка · пунктуационные огрызки); не чинить — легитимно отложено, носитель = D39.4/D39.5 (пересекается с живыми строками 43/78); эта пачка их не втягивает (ledger/edge-полиш вне скоупа).
- D23 п.4:
errTailрун-граница-тест — moot (символerrTailв репо ОТСУТСТВУЕТ; вытеснен рефакторомBilledDecodeError/maxResponseBytes); retryLoop лог-ассерты — уже сделано (httpllm_test.go:261-293, тег(D23.4)); AMBIGUOUS>0 golden — уже сделано (golden_test.go:56документирует как опциональное;ambiguous-счётчик эмитится); snapshotID-payload-тест/kill9 3→5 — опц., не чинить. - D28 п.3(б): provider_local MaxTokens-override-бьёт-флор нота — уже сделано (
escalation.go:28-36, тег⚠ LATENT INTERACTION (D28.3б, note not a defect)).
§5. §3-D (F4) и §3-E (D39.79)
D — F4: бэкап + integrity_check (строка 83)
(а) ВЕРНА (SPOF: тихая потеря подписанного банка/подписей). (б) продукт-требование. (в) Сделано:
internal/store/backup.go—BackupSQLite(dbPath, backupDir, stamp):PRAGMA integrity_check→VACUUM INTO backupDir/<stamp>.db(SQLite-blessed online-бэкап). Не-«ok» → LOUD, бэкап НЕ пишется; missing-source → loud; overwrite → отказ.IntegrityCheck(dbPath)— read-only хелпер. Юнит:store/backup_test.go(валидный restore-point openable как store; corrupt-source отказ без файла; missing+overwrite отказы).cmd/tmctl/backup.go— вербbackup(VACUUM+integrity, печатает путь) +preflightBackup(боевой pre-flight: missing DB = свежая книга, no-op; integrity-провал = LOUD отказ старта). Durable-дом строгоbackups/рядом с ProjectDB (под~/books, «персист, не scratch»).- Дискриминатор боевого пути — вердикт-тройкой, с констрейнтом «без магических строк провайдеров в Go»: pre-flight ВЕШАЕТСЯ на
run()-диспетчер (case "translate"/case "redrive"при не-dry-run), НЕ внутриtranslate()/Runner. Тесты фейк-провайдера зовутtranslate()/Runner НАПРЯМУЮ (golden, rebill_cli) → вrun()не входят → бэкапов НЕ создают. Ноль магических строк провайдеров в прод-Go — обход чисто структурный. ГвоздьTestFakeTranslatePathCreatesNoBackup(фейк-translate()→ нетbackups/),TestPreflightBackup{CreatesRestorePoint,SkipsFreshBook}. Голден (Runner-путь) бэкапов не создаёт — подтверждено (голден зелёный, тестов-файлов не прибавилось).
E1 — Q1 канон грейда «класс X» + замер нужности DC7
(а) Факт-фиксация носителя канона (read-only, БЕЗ правок прогон-БД) — ПОДТВЕРЖДЕНО:
- Подписанный сид
guzhenren-seed-v2.yaml:dst-поля ЧИСТЫ от «разряд» (7 вхождений — все вnote:-комментариях: 3 биографических + 4 грейд-определения[reseed:approved D38.5], где ЯВНО зафиксирован канон «грейд 甲等→«класс А»… Схема 甲乙丙丁 = класс А>Б>В>Г», «было "разряд", draft→approved»). Живой носитель канона = «класс X». coldrun-a/BANK-FULL.tsv(151 строка, 6 «разряд») = экспорт майнер-ЧЕРНОВИКОВ на подпись — «разряд» ОЖИДАЕМ, канона не несёт.- Банк coldrun-a пуст (встал на банк-стопе); «разряд»-draft-ряды — только в замороженных исторических прогон-БД (не трогал).
- «Разряд» в ЖИВОМ носителе (сид/эталонный конфиг) НЕ найден → пинга не требуется. Канон «класс X» зафиксирован.
(б) $0-замер нужности DC7 (боевые ФИНАЛЫ labels-корпуса, labels/raw/corpus.jsonl; скрипт ~/books/gu-zhenren/dc7-measure/measure_grade_render.py — durable, воспроизводимо):
- 91 юнит; 55 несут грейд-терм в источнике (甲/乙/丙/丁等).
- ДЕВИАЦИИ: 25 юнитов / 93 вхождения рендерят грейд как «разряд X» (потолок дефекта ≠ канон «класс X»); канон «класс X» = 150 вхождений. ≥1 реальный дефект.
ДИСПОЗИЦИЯ DC7 — построй по замеру, НО двойной стоп-констрейнт сработал → СТОП+ПИНГ с дизайном (DC7 НЕ построен здесь):
- Посылка «данные в dc-checkers.txt» бьётся мандатом общности. Канон-хедворд грейда («класс» vs «разряд» vs «ранг») — это ПЕР-КНИЖНЫЙ рендер-выбор (сид
[reseed:approved D38.5]), НЕ числовой факт как DC1 (时辰=2h, универсально). DC7 с «класс» в ПАР-паке ложно флагнёт ВТОРУЮ zh→ru книгу другого жанра — прямое нарушение расширения D39.79 «вторая книга без ложных флагов и без правки Go». Правильный дом = КНИЖНЫЙ конфиг (ровно куда E3 переносит register_neg этой же пачкой). Строить DC7 с dc-checkers.txt-домом = немедленно противоречить E3. - Размер. Корректный минимальный DC7 (новый book-config канал грейд-канона + parse + lint + wire + result-поле + тест) = новый класс чекера ≈50–60 строк Go — на/выше порога «>~50 строк → СТОП+пинг с дизайном».
- Оба стоп-условия сработали. Не строю формальный артефакт с утечкой книго-канона в пар-слой. Рекомендация оркестратору: DC7 санкционировать отдельным касанием — грейд-канон в book.yaml (как register_blocklist), generic-алгоритм консистентности-к-канону, observability-класс; замер (25/93 девиаций) оправдывает; триггер (первая книга с живой грейд-серией) наступил.
E2 — Q2: 兩 довершить консистентно
(а) ВЕРНА (兩 в cjk_numeral/cheng_re, но НЕ в числовой группе shichen_re). (в) Сделано: shichen_re группа [0-9一二两三…] → [0-9一二两兩三…] (兩 после 两), консистентно с cheng_re (обе группы уже несли 两兩 — НЕ тронуты) и cjk_numeral (兩 уже был). Probe-ЛИТЕРАЛЫ (时辰/千万/数十万) НЕ тронуты. NB-коммент границы в файл: «traditional = numeral-классы; паттерн-литералы simplified до первой traditional-книги (D39.79)». Замер: 0 движения labels (корпус simplified; нет 兩个时辰). Двигает LangpackVersion (ок, D39.63).
E3 — Q4: register_neg → книжный слой
(а) ВЕРНА (терем-список = target-ru/жанро-свойство, «xianxia» в msg = жанр-литерал — оба в ПАР-паке). (в) Сделано, DC6-алгоритм БЕЗ смены семантики:
- Дом = книжный конфиг: новое поле
book.yaml register_blocklist(config/book.go), та же lower-fold+sort дисциплina, чтоStyleAllowlist→CheapGateConfig.RegisterBlocklist→ DC6. Фолд в BriefHash сomitempty(verdict-affecting → правка re-пинит; книга БЕЗ поля байт-идентична → замороженный layout D39.26 сохранён, golden brief_hashc2021b1b…неизменен). - DC6 = union
c.registerNeg(опциональный пар-уровень; zh-ru теперь шлёт 0) ∪ bookRegisterBlocklist; detail = generic English в Go (пар-пак жанро-несущего msg больше не несёт). Общность: НОЛЬ книго/жанро-литералов в Go (грепом чисто). - Опциональность (оба):
parseDCCheckersбольше не требует непустойregister_neg;mustPairMessagesбольше не требуетdc6_register— пар-файл без register-таблиц легален. - Данные: терем-парадигма (6 форм) переехала в
~/books/gu-zhenren/coldrun-a/book.yaml(последний боевой) + пример-секция вbackend/example/book.yaml(шаблон).dc-checkers.txtregister_neg-строки +dc6_register-msg удалены. Исторические прогон-конфиги и голден-фикстураinternal/pipeline/testdata/golden/book.yamlНЕ тронуты. - Тесты на конфиг-источник:
TestDC6RegisterLexicon(book-blocklist путь + inert-без-blocklist = second-book invariant);TestDC6PairLevelRegisterOptional(опциональный пар-union член);checkers_pairdata_test/TestNoPackStaysInertобновлены под новую сигнатуру; corrupt-pack «no message» переключён наdc2_shushiwan. - Ревью-вопрос приёмки «вторая книга zh-ru другого жанра — НОЛЬ ложных DC6 и НОЛЬ правок Go?» → ДА (нет register_blocklist → DC6 инертен; тест это пинит).
§6. Чего НЕ делал (по промту) / что НЕ построено
CheapGateVersionНЕ бампнут · боевойeditor.mdНЕ тронут · thin-space/«..»-ПОВЕДЕНИЕ кода не менял (только комменты) ·minerPackVersionзначение не переименовано · Р2/Р4-потолки — В КОНТРАКТ, не пойнтером · провайдеров не звал.- DC7 НЕ построен — стоп+пинг с дизайном (§5-E1): книго-канон-дом + >~50 строк.
§7. Git-список тронутого (только своё; НЕ закоммичено)
Новые: internal/store/backup.go · internal/store/backup_test.go · cmd/tmctl/backup.go · cmd/tmctl/backup_test.go.
Изменённые (backend/): cmd/tmctl/main.go · cmd/tmctl/render.go · configs/langpacks/zh-ru/dc-checkers.txt · example/book.yaml · internal/checks/{cheapgates,checkers,repair}.go · internal/checks/{checkers_pairdata,checkers_zh_ru,labelcandidates}_test.go · internal/chunk/{chunker,ingest}.go · internal/config/book.go · internal/lang/langpack.go · internal/lang/langpack_test.go · internal/llm/llm.go (gofmt) · internal/membank/mempostcheck.go · internal/membank/mempostcheck_test.go · internal/miner/{miner_patterns,miner_substrate}.go · internal/pipeline/chunkrun.go · internal/pipeline/miningstop_join_test.go (gofmt) · internal/terminology/{classify,series}_test.go (gofmt) · prompts/zh-ru/editor-mono.md.
Стенд-данные (вне git, ~/books/gu-zhenren/): coldrun-a/book.yaml (register_blocklist) · dc7-measure/measure_grade_render.py (замер).
§8. Самопроверка исполнением + адверсариальное author≠reviewer
Самопроверка исполнением (мандат 12.07): каждый фикс замерен ДО отчёта — A-правки на labels-харнессе (все ячейки §1 неизменны, assertBaseline зелёный), новые тесты прогнаны (TestChevronMixingWholeWordInnerMarker, TestAmbiguousMissNotDemoted, TestParseDCCheckersRefusesIntraFileDupKey, F4-батарея, DC6-конфиг-тесты); E3 golden-нейтральность подтверждена независимо (brief_hash c2021b1b… побайтно); F4-дискриминатор проверен исполнением (фейк-translate() → нет backups/); DC7-замер воспроизводим durable-скриптом.
Адверсариальный author≠reviewer (6-агентный refute-biased воркфлоу по СВОИМ правкам): 6 измерений (A-корректность · E3-общность · F4-дискриминатор · инвариант-честность · общность-сweep B/C · E2+dup-key), каждый ГОНЯЛ проверки исполнением. Итог: 0 блокеров, 0 major. 4 измерения — чисто (F4/инварианты/B-C/E2 — golden/labels/parity/дискриминатор/dup-key подтверждены запуском независимо). 2 CONFIRMED low-severity (диагностика/коммент, тема самой пачки) — исправлены ДО отчёта:
- (minor→fixed)
lintRegisterLexicondetail безусловно называл «the book's register_blocklist», хотя union фаерит и на пар-уровневомc.registerNeg(дормант для zh-ru, но поддержан и тестированTestDC6PairLevelRegisterOptional) → на будущей паре с register_neg диагностика указала бы не тот конфиг. Фикс: source-neutral формулировка. - (nit→fixed) коммент
containsWholeWordPhraseприписывалisWordRune-границу И register-чеку, а тот используетisTargetWordLetter(эффект тот же для кириллицы). Фикс: атрибуция уточнена (тема пачки — коммент↔код).
Пост-фикс перепрогон: build/vet/-race ./... зелёные · golden не двинулся (brief_hash c2021b1b…) · labels фрозен · майнер-парити EXACT · gofmt чист. Манифактуренной сходимости не найдено; инварианты подтверждены независимым запуском ревьюеров.
СТОП — приёмка оркестратора.