diff --git a/docs/BACKEND_SMALLPACK_TAILS_SESSION_PROMPT.md b/docs/BACKEND_SMALLPACK_TAILS_SESSION_PROMPT.md index 52c96008..86f75763 100644 --- a/docs/BACKEND_SMALLPACK_TAILS_SESSION_PROMPT.md +++ b/docs/BACKEND_SMALLPACK_TAILS_SESSION_PROMPT.md @@ -13,7 +13,7 @@ - `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`): правки = комменты/тесты/gofmt/стенд-данные/книжный конфиг; `CheapGateVersion` НЕ бампать. Голден дёрнулся → СТОП+пинг с маскированным диффом. Байты пар-пака (`dc-checkers.txt`) двигают `LangpackVersion` — на этой фазе это ок (перекупок нет, D39.63), но голден-фикстура пак не грузит и стоять обязана. +- **Голден: ожидание = НЕ движется ВООБЩЕ** (`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. Карта чтения (по якорям, целиком доки НЕ читать) @@ -24,10 +24,12 @@ CLAUDE.md → этот промт → по ходу пунктов: ревью- ### 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-коммент**: repair.go:349 «counts leaked lowercase Latin tokens» — ложь после #6 (caps считаются). Поправь. +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). @@ -35,7 +37,7 @@ CLAUDE.md → этот промт → по ходу пунктов: ревью- ### B. Строка 89 — остаток ведра D карты общности + сверка ведра B -- Дубль `isHeaderContentRune` (chunk/chunker.go:215) ↔ `isHeaderSeparator` (chunk/ingest.go:172-175): консолидировать или задокументировать различие — вердикт-тройкой. +- Дубль `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»); вероятный исход «не чинить», зафиксируй. @@ -51,13 +53,13 @@ CLAUDE.md → этот промт → по ходу пунктов: ревью- ### D. Строка 83 — F4: бэкап + integrity_check (ПОДТЯНУТА D39.79) -**Продукт-требование:** платный прогон стенд-книги НЕ начинается без свежего бэкапа SQLite-файла книги и зелёного `PRAGMA integrity_check` (SPOF: тихая потеря банка и подписей владельца). **Рекомендуемая форма (вердикт-тройкой уточняй, не раздувай):** tmctl-верб `backup` (VACUUM INTO в `~/books/<книга>/backups/.db` + integrity_check) И автоматический pre-flight в БОЕВОМ (не fake-provider) пути прогона: integrity-провал = громкий отказ старта. Fake-провайдер/голден-пути НЕ трогаются (детерминизм, ноль новых файлов в тестах). Durable-дом строго `~/books` (норма «персист, не scratch»). Гвозди: юнит на верб (temp-БД), тест «fake-путь бэкапов не создаёт». +**Продукт-требование:** платный прогон стенд-книги НЕ начинается без свежего бэкапа SQLite-файла книги и зелёного `PRAGMA integrity_check` (SPOF: тихая потеря банка и подписей владельца). **Рекомендуемая форма (вердикт-тройкой уточняй, не раздувай):** tmctl-верб `backup` (VACUUM INTO в `~/books/<книга>/backups/.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); банк coldrun-a ПУСТ (прогон встал на банк-стопе); «разряд»-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) получают 兩 (обе группы, если численных две); 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` (последний боевой; исторические прогон-конфиги НЕ трогать; в отчёте перечисли, какие 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?» +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. Чего НЕ делать @@ -65,4 +67,4 @@ CLAUDE.md → этот промт → по ходу пунктов: ревью- ## §5. Отчёт и стоп -`docs/archive/reports/SMALLPACK_TAILS_2026-08-02.md`: эхо-шапка · вердикт-тройки ВСЕХ пунктов (вкл. «не чинить») · таблицы вёдер B/D · числа Q1-замера · labels-фриз и голден-«не двинулся» — числами · git-список тронутого (только своё). Краткий итог — в `docs/PROGRESS.md` §Бэкенд (бэклог-таблицу и CURRENT-STATE НЕ трогать). D-номер лендинга проставит оркестратор — в своих пометках пиши «D-номер проставит оркестратор». **СТОП в конце — приёмка оркестратора.** +`docs/archive/reports/SMALLPACK_TAILS_2026-08-02.md`: эхо-шапка · вердикт-тройки ВСЕХ пунктов (вкл. «не чинить») · таблицы вёдер B/D · числа Q1-замера · labels-фриз и голден-«не двинулся» — числами · git-список тронутого (только своё). Краткий итог — в `docs/PROGRESS.md`, стоячая секция `## Бэкенд` в хвосте журнала (найдёшь grep `"^## Бэкенд"`; допиши СВЕРХУ секции, новых секций не заводи; бэклог-таблицу и CURRENT-STATE НЕ трогать). D-номер лендинга проставит оркестратор — в своих пометках пиши «D-номер проставит оркестратор». **СТОП в конце — приёмка оркестратора.** diff --git a/docs/PROGRESS.md b/docs/PROGRESS.md index 61037588..333183b6 100644 --- a/docs/PROGRESS.md +++ b/docs/PROGRESS.md @@ -105,7 +105,7 @@ | 94 | **Продукт-механика входа и прогона** (V2, ПТ-16..18): абьюз/misuse-прескрин дёшево и точно ДО трат токенов (H8) + UI-контракт отказа (проект-решение D39.80) · лимит размера входа настройкой (H7) · продукт-кнопки «стоп/продолжить» поверх построенных graceful stop и redrive, абьюзивный прогон НЕ продолжать (H10) | бэкенд | когда-нибудь (лимит — к пилоту Ф2.5; остальное — Ф3-бриф) | отдельный пак при Ф3-препе | START_PROMT V2, H7/H8/H10, D39.80 | ## Оркестратор №9 — ОНБОРДИНГ-ОВЕРХОЛ ДОКОВ ПО ФИДБЕКУ НОВОЙ СЕССИИ (D39.80), 02.08 -По санкции владельца («делаем максимально по красоте»). Триггер: две записки фронт-сессии — все проверяемые утверждения подтверждены исполнением, включая два моих (README не входил в процедуру лендинга — застрял на D39.77 с мёртвой ссылкой; статус-дубль в README разошёлся с CURRENT-STATE). Сделано: README = чистая карта без чисел головы и статуса (единственный носитель состояния — CURRENT-STATE здесь) · НОВЫЕ `product-requirements.md` (реестр ПТ-1..ПТ-32 (+25а) из START_PROMT V0–V5 + H6–H18, статусы сверены кодом; SEO/прескрин/лимит/стоп получили носителей — строка 94, дописки 71/90; строка 30в закрыта) и `glossary.md` · норма лендинга «двигаешь файлы — обнови README тем же коммитом» · бэклог: ID стабильны навсегда + жирные лиды · puml → `backend/docs/` (зонный сдвиг: диаграмма правится с кодом; 30а перевешена на бэкенд) · починены ВСЕ битые относительные ссылки архива + норма глубины в archive/README · роль «Фронт» и глоссарий в онбординг-пути CLAUDE.md · счётчик ролей канонизирован. +По санкции владельца («делаем максимально по красоте»). Триггер: две записки фронт-сессии — все проверяемые утверждения подтверждены исполнением, включая два моих (README не входил в процедуру лендинга — застрял на D39.77 с мёртвой ссылкой; статус-дубль в README разошёлся с CURRENT-STATE). Сделано: README = чистая карта без чисел головы и статуса (единственный носитель состояния — CURRENT-STATE здесь) · НОВЫЕ `product-requirements.md` (реестр ПТ-1..ПТ-32 (+25а) из START_PROMT V0–V5 + H6–H18, статусы сверены кодом; SEO/прескрин/лимит/стоп получили носителей — строка 94, дописки 71/90; строка 30в закрыта) и `glossary.md` · норма лендинга «двигаешь файлы — обнови README тем же коммитом» · бэклог: ID стабильны навсегда + жирные лиды · puml → `backend/docs/` (зонный сдвиг: диаграмма правится с кодом; 30а перевешена на бэкенд) · починены ВСЕ битые относительные ссылки архива + норма глубины в archive/README · роль «Фронт» и глоссарий в онбординг-пути CLAUDE.md · счётчик ролей канонизирован. Тем же заходом смолпак-промт прошёл ВТОРОЙ холодный аудит (агент-симуляция, 16 якорей исполнением): 3 major вправлены (голден-ожидание при боевых Go-правках сформулировано честно · факт-состояние BANK-FULL.tsv/note-полей сида дописано против ложного СТОПа · дискриминатор боевого пути F4 получил констрейнт «без магических строк провайдеров в Go») + 6 миноров (границы скоупа 36а/分之, множество book.yaml, адрес секции отчёта и др.). ## Оркестратор №9 + бэкенд — СТОПГЭП ЗАЛЕНДЕН, FINDING-1 ЗАКРЫТ (D39.77), 02.08