textmachine/docs/archive/prompts/BACKEND_SMALLPACK_TAILS_SESSION_PROMPT.md

20 KiB
Raw Blame History

Промт бэкенд-сессии: МЕЛКАЯ ПАЧКА ХВОСТОВ (строки 89 · 93 · 53 · 83 + решения D39.79; $0)

АРХИВ (02.08.2026): исполнен и ПРИНЯТ — D39.82. Отчёт с ревью-шапкой приёмки: ../reports/SMALLPACK_TAILS_2026-08-02.md. Инструкции отсюда не исполнять.

Выдан 02.08.2026, оркестратор №9; санкция владельца 02.08 («давай сделаем») + решения §6 пакета-чекеров, принятые делегированием владельца и ратифицированные D39.79. Ты — бэкенд-сессия TextMachine. Зона: backend/ (+ configs/langpacks/, стенд-данные ~/books/gu-zhenren/) + свой отчёт в docs/archive/reports/. НЕ коммитить — лендит оркестратор. Первый деливерабл — эхо-блок ≤10 строк (первым сообщением ДО работы: как понял скоуп/стоп-точки/$0/зону; продублируй шапкой отчёта; подтверждения не жди — СТОП только в конце). Денег НОЛЬ: ни одного вызова провайдеров, только код/тесты/данные/фейк-провайдер.

§0. Рамка

Глобальный критерий владельца (дословно): «Мультиязычный бэкенд перевод с чистой архитектурой и современными подходами к переводу опережающий конкурентов по харнесс решениям». Механизм строится только там, где несёт качество/деньги. Ревью-вопросы общности — ОБА обязательны: «заработает ли пара, которой в репо ещё НЕТ, без правки Go?» и (расширение D39.79) «ВТОРАЯ КНИГА той же пары — без ложных флагов и без правки Go?».

Мандат ревизии посылок: каждому пункту — вердикт-тройка (а: посылка верна? б: нужность на данных? в: форма/исход) ДО кода; «не чинить, закрыть с обоснованием» — легитимный и уважаемый исход; если твой замер бьёт по ПОСЫЛКЕ пункта — СТОП и пинг оркестратору, не формальный артефакт. Самопроверка исполнением обязательна (решение владельца 12.07): ревью своего кода + прогонов + результатов; в конце — адверсариальный проход author≠reviewer (агентом/вторым взглядом) по СВОИМ правкам; найденное чинить до отчёта.

§1. Инварианты приёмки (проверяй ИСПОЛНЕНИЕМ в конце, числа — в отчёт)

  • go build ./... · go vet ./... · go test -race ./... — зелёные.
  • Майнер-парити EXACT: TM_MINER_PARITY=1 go test ./internal/miner/ -run Parity. Правки майнер-зоны (§3-B) НЕ должны двигать выходы — двинулись → СТОП+пинг.
  • Labels-фриз (TM_CHECKER_LABELS=1 go test ./internal/checks/ ./internal/membank/ -run Label -v): 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 — ни одна ячейка не движется (искл.: если построишь DC7 по §3-E1б — он добавляет НОВЫЙ класс замера, старые не трогает).
  • Голден: ожидание = НЕ движется ВООБЩЕ (go test ./internal/pipeline/ -run TestGoldenDeterminism) — и это НЕСМОТРЯ на то, что пак правит боевой Go (A1 · C3 · D · E-Q4): голден-фикстура эти пути не дёргает (fake-провайдер; пар-пак фикстура не грузит; pre-flight D в fake-пути запрещён этим же промтом). CheapGateVersion НЕ бампать. Голден дёрнулся → это дефект ТВОЕЙ правки, не «ожидаемое от Go-правок» — СТОП+пинг с маскированным диффом. Байты пар-пака (dc-checkers.txt) двигают LangpackVersion — на этой фазе это ок (перекупок нет, D39.63), но голден-фикстура пак не грузит и стоять обязана.
  • Чужое в дереве НЕ трогать: START_PROMT.MD, frontend/, platform/ — параллельные сессии/владелец.

§2. Карта чтения (по якорям, целиком доки НЕ читать)

CLAUDE.md → этот промт → по ходу пунктов: ревью-шапка и §8 отчёта archive/reports/CHECKER_PACKAGE_2026-08-02.md (контекст хвостов §3-A) · карта §3 docs/archive/reports/GENERALITY_RESEARCH* (вёдра B/D для §3-B) · docs/architecture/12-go-style-notes.md (норматив общности §0). D-корпус целиком НЕ читать.

§3. Пункты (каждому — вердикт-тройка в отчёте)

A. Строка 93 — хвосты двухраундового ревью чекеров (комменты/гвозди/контракты)

Из бэклог-строки 93 сюда НЕ входят: строгий OffLanguage (36а, deferred) и 分之-разметка (полигон) — не втаскивай.

  1. substring-вето → whole-word: checkers.go:643-645 (isSpokenChevronLine глушит spoken по strings.Contains маркера — «в уме» ⊂ «в умении» гасит РЕАЛЬНЫЙ mixing-клэш). Переиспользуй containsWholeWordPhrase (cheapgates.go); гвоздь: ёлочная реплика с «в умении» + тире-строка в чанке → mixing фаерит. Labels стоят (в корпусе 0 инстансов).
  2. Recall-трейд отсечения — в контракт: speechAttribution (cheapgates.go:299-306) подан только как закрытие FP; допиши: маркер ПОСЛЕ внутренней запятой/многоточия внутри атрибуции («— X, — сказал он, про себя ругаясь») = невидимый дефект — потолок ПРАВИЛА, не данных (симметрично Р4-записи #3).
  3. Негатив-ассерт Demoted: мутант m.Demoted = true в default-ветке Postcheck (mempostcheck.go:127) сейчас переживает сьют — добавь ассерт «ambiguous-мисс несёт Demoted=false» (mempostcheck_test.go).
  4. Stale-коммент: internal/checks/repair.go:349 (не перепутай с pipeline/repair.goу того тоже есть строка 349) «counts leaked lowercase Latin tokens» — ложь после #6 (caps считаются). Поправь.
  5. CAND k4_inverse = опровергнутый вариант: labelcandidates_test.go:76 меряет whole-line-substring правило, отвергнутое ревью, и лог читается как прод-числа. По образцу фикса-3: пометь REJECTED/замени замером боевого правила — лог не должен врать.
  6. Конвенции код↔коммент: sentenceFinalBefore (cheapgates.go:391-392) принимает ДВЕ ascii-точки при комменте «...» — приведи к одному (что именно — вердикт-тройкой; labels стоят); thin-space U+2009 в isInlineSpace — код НЕ расширять (унаследованная HEAD-конвенция), одну оговорку в коммент.
  7. Кана-оговорка: mempostcheck_test.go:52-54 «Han alone lacks segmentation» — неточно (kana тоже не boundary-checked, memory.go:536); переформулируй честно: демоция Han-only = ратифицированный скоуп до B6 (бэклог-строка 81).
  8. Target-алиасы пост-чек-матча: НЕ строить — одна NB-строка в контракт dstFormPresent: алиасы = сид-концерн.

B. Строка 89 — остаток ведра D карты общности + сверка ведра B

  • Дубль isHeaderContentRune (chunk/chunker.go:215) ↔ isHeaderSeparator (chunk/ingest.go:172-175): консолидировать или задокументировать различие — вердикт-тройкой; рядом третье похожее имя isHeadingSeparator (chunker.go:218) — сверь все три, не сравни не ту пару.
  • minerPackVersion = "zh-universal-v1" (miner/miner_patterns.go:19): имя лжёт про универсальность? Если строка фолдится в выход/снапшот/парити — НЕ переименовывать, честный коммент; иначе вердикт-тройка.
  • Глифы ⟨проверить⟩: данные (lang/data/injection.txt:6,9) легитимны (target-данные); грепни ЖЁСТКИЕ вхождения в Go/tmctl (status.go:98 — коммент; было заявление «tmctl/render» в карте) — литерал target-глифа в Go = утечка слоя; по находкам — вердикт-тройка (возможный исход: «уже ушло в данные, закрыто»).
  • Вес palladius (miner/miner.go:52) — коммент уже честный («retained for parity; off in default B»); вероятный исход «не чинить», зафиксируй.
  • Дюжина ведра D по карте §3 GENERALITY_RESEARCH: пройди СПИСОК ЦЕЛИКОМ, каждой позиции строка-вердикт «сделано (чем/где) / не нужно (почему) / чинится здесь». Часть ушла фазой-2 (D39.64) и чекер-паком (D39.78) — не переделай сделанное.
  • Ведро B (6 «пар-модуль без гейта») — сверка против пост-D39.64 состояния: таблица «позиция → закрыта чем / жива где (носитель)». Живое без носителя → пинг оркестратору (не заводи строк сам).

C. Строка 53 — мелкие хвосты качества

  • gofmt: gofmt -l . ИЗ backend/ (не от корня — от корня зацепишь чужую зону eval/) сейчас = internal/llm/llm.go + internal/pipeline/miningstop_join_test.go + internal/terminology/classify_test.go + internal/terminology/series_test.go; после тебя — пусто.
  • editor-mono.md DORMANT: пометки в файле НЕТ (grep пуст) — вердикт-тройка: где читатель должен узнать, что файл спит; помни — байты промпта двигают PromptSHA256 соответствующего пака, проверь, боевой ли он (если правка двигает боевой SHA — честно скажи в отчёте; перекупок нет, D39.63).
  • Внутрифайловый дубль ключа pair-файла → громкая ошибка (parseDCCheckers, lang/langpack.go; исходник PACK15 §Внутрифайловый) + тест.
  • Ledger-очередь LOW/NOTE (D39.4) и остаток фикс-листов D23 п.4 / D28 п.3(б): найди их по D-номерам (grep по 05-decisions-log), каждому пункту вердикт-тройка; «не чинить/уже сделано» — ок, главное диспозиция.

D. Строка 83 — F4: бэкап + integrity_check (ПОДТЯНУТА D39.79)

Продукт-требование: платный прогон стенд-книги НЕ начинается без свежего бэкапа SQLite-файла книги и зелёного PRAGMA integrity_check (SPOF: тихая потеря банка и подписей владельца). Рекомендуемая форма (вердикт-тройкой уточняй, не раздувай): tmctl-верб backup (VACUUM INTO в ~/books/<книга>/backups/<timestamp>.db + integrity_check) И автоматический pre-flight в БОЕВОМ (не fake-provider) пути прогона: integrity-провал = громкий отказ старта. Fake-провайдер/голден-пути НЕ трогаются (детерминизм, ноль новых файлов в тестах). Дискриминатор «боевого» пути — реши вердикт-тройкой, с констрейнтом: магические строки имён провайдеров в прод-Go запрещены (утечка тест-конвенции, общность §0) — гейт вешай на уровень боевой команды/конфига, обход — только тестовой обвязкой. Durable-дом строго ~/books (норма «персист, не scratch»). Гвозди: юнит на верб (temp-БД), тест «fake-путь бэкапов не создаёт».

E. Решения D39.79 (данные + малый шов)

  1. Q1 — канон грейда «класс X» (D39.79): (а) факт-фиксация носителя канона, БЕЗ правок прогон-БД: tmctl-верба банк-инспекции НЕТ — смотри read-only (sqlite3/BANK-FULL.tsv/сид). Известное состояние (верифицировано 02.08): подписанный сид guzhenren-seed-v2.yaml УЖЕ чист (0 «разряд» в dst; 7 вхождений в note:-полях — комментарии, НЕ носитель, не считать опровержением); банк coldrun-a ПУСТ (прогон встал на банк-стопе); coldrun-a/BANK-FULL.tsv (151 строка, 6 «разряд») = экспорт майнер-ЧЕРНОВИКОВ на подпись — «разряд» там ОЖИДАЕМ, канона не несёт; «разряд»-draft-ряды живут только в ЗАМОРОЖЕННЫХ исторических прогон-БД (acceptance/rerun/diag) — их НЕ трогать (история, не носитель). Твоя работа: подтвердить это состояние, зафиксировать канон «класс X» в отчёте; если найдёшь «разряд» в ЖИВОМ носителе (сид/эталонный конфиг) — пинг. (б) $0-замер нужности DC7 на боевых финалах labels-корпуса (в corpus.jsonl ~28 вхождений «разряд» — замер осмыслен): сколько грейд-рендеров ≠ канон? ≥1 реальный дефект → построй МИНИМАЛЬНЫЙ data-driven DC7 по образцу DC1 (данные в dc-checkers.txt, алгоритм generic, observability-класс, замер до/после в отчёт; тянет >~50 строк Go → СТОП+пинг с дизайном). 0 → закрой с обоснованием (gated-триггер: первая книга с живой грейд-серией).
  2. Q2 — 兩 довершить консистентно: числовая группа shichen_re (dc-checkers.txt:42; группа одна) получает 兩; cheng_re (:66) уже несёт 兩 в обеих группах — НЕ трогать; probe-ЛИТЕРАЛЫ (时辰/千万/数十万 и родня) НЕ трогать; NB-коммент границы в файл: «traditional-поддержка = numeral-классы; паттерн-литералы simplified до первой traditional-книги (D39.79)».
  3. Q4 — register_neg → книжный слой: списки register_neg (dc-checkers.txt:29-35) и жанро-несущий msg dc6_register (:81, «xianxia») уезжают из ПАР-файла в КНИЖНЫЙ конфиг — дом StyleAllowlist (config/book.go:56-59; та же lower-fold дисциплина :232-238) → CheapGateConfig → DC6-алгоритм БЕЗ изменения семантики. Жанро/книго-литералов в Go НЕТ (жанр в detail — из конфига книги, если нужен; допустим generic-английский diagnostic в Go, как у прочих гейтов). «Терем»-список переезжает в книжный конфиг стенда: множество для обновления РОВНО два — ~/books/gu-zhenren/coldrun-a/book.yaml (последний боевой) + backend/example/book.yaml (шаблон новой книги — покажи пример секции); исторические прогон-конфиги и голден-фикстуру internal/pipeline/testdata/golden/book.yaml НЕ трогать; в отчёте перечисли обновлённые. Пар-файл zh-ru остаётся чисто пар-фактами. ⚠ Известные обязательные Go-швы переноса (не удивляйся громкому фейлу): langpack.go:957-958 требует НЕПУСТОЙ register_neg в пар-файле, а required-msg список checkers.go:204 включает dc6_registerоба стать ОПЦИОНАЛЬНЫМИ (пар-файл без register-таблиц легален). Пустой конфиг = инертность (контракт «inert without data»). Тесты DC6 → на конфиг-источник. Ревью-вопрос приёмки: «вторая книга zh-ru другого жанра — НОЛЬ ложных DC6 и НОЛЬ правок Go?»

§4. Чего НЕ делать

CheapGateVersion НЕ бампать · боевой editor.md НЕ трогать · thin-space/«..»-ПОВЕДЕНИЕ кода не менять без доказанного вердикт-тройкой дефекта (labels-фриз) · minerPackVersion не переименовывать, если двигает парити/снапшот · Р2/Р4-контракты (D39.63) обязательны: потолки — В КОНТРАКТ правила, не пойнтером · провайдеров не звать вовсе.

§5. Отчёт и стоп

docs/archive/reports/SMALLPACK_TAILS_2026-08-02.md: эхо-шапка · вердикт-тройки ВСЕХ пунктов (вкл. «не чинить») · таблицы вёдер B/D · числа Q1-замера · labels-фриз и голден-«не двинулся» — числами · git-список тронутого (только своё). Краткий итог — в docs/PROGRESS.md, стоячая секция ## Бэкенд в хвосте журнала (найдёшь grep "^## Бэкенд"; допиши СВЕРХУ секции, новых секций не заводи; бэклог-таблицу и CURRENT-STATE НЕ трогать). D-номер лендинга проставит оркестратор — в своих пометках пиши «D-номер проставит оркестратор». СТОП в конце — приёмка оркестратора.