diff --git a/CLAUDE.md b/CLAUDE.md
index 091fc009..f272e32d 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -18,6 +18,7 @@ Go-бэкенд издательского художественного пер
| **Бэкенд** | `backend/` | читать можно; расхождения — пингом оркестратору в `docs/PROGRESS.md` |
| **Полигон (eval)** | `eval/` + `docs/experiments/` | то же |
| **Оркестратор** | `docs/` (architecture/research/PROGRESS), ревью чужого кода read-only | ратифицирует решения, пишет хендофф-промты |
+| **Фронт** | `frontend/` | то же; продуктовые требования — `docs/product-requirements.md`, НЕ из памяти |
Координация — журнал `docs/PROGRESS.md` (секции «Бэкенд»/«Полигон»/«Память»/«Голос и состояние»/«Ридер-IDE»; сверху CURRENT-STATE). Записывай туда краткие итоги своей сессии. Закрытые хроники вынесены в слайсы `docs/archive/PROGRESS-*.md` — НЕ читать при онбординге, только по конкретной ссылке. Параллельные сессии — норма: чужие незакоммиченные файлы в дереве не трогать; сессия считается ЖИВОЙ, пока владелец не сказал обратное.
@@ -26,6 +27,7 @@ Go-бэкенд издательского художественного пер
1. **`docs/architecture/05-decisions-log.md`** — ратифицированный контракт; при конфликте с любым другим доком побеждает он; сверху файла — карта актуальности (что чем superseded), свежая голова — С ХВОСТА файла. **Правило чтения (онбординг-диета 25.07): карта + живая голова (эра D39.x); корпус D1–D38 = справочник — по ссылкам/grep по D-номеру, целиком НЕ читать.**
2. `docs/experiments/00-provider-quirks.md` — wire-квирки провайдеров (читать ПЕРЕД правкой адаптеров/вызовами провайдеров).
3. `docs/architecture/09-target-architecture.md` (7 слоёв; статус стройки — шапка-таблица) · `12-go-style-notes.md` (норматив общности §0) · `10-prompt-architecture.md` (промпт-тема).
+3а. `docs/product-requirements.md` — реестр «что продукт обязан уметь» (производный от ЖИВОГО брифа владельца `START_PROMT.MD` V0–V5 + находок H6–H18; статусы сверены кодом, актуализирует оркестратор при лендингах). Новые V-идеи владельца разбираются сюда, не остаются невидимыми.
4. `docs/architecture/01-decisions.md` (Р1–Р10), `02-mvp-plan.md`, `04-unhappy-paths.md`, `06-memory-risk-registry.md` — тела исторические, читать через ⚠-баннеры 25.07.
5. `docs/research/*` — фактура; часть под ⚠ superseded/построено-баннерами — читай баннер прежде содержимого.
6. `docs/archive/` — история: закрытые промты (`prompts/`) · отчёты паков с ревью-шапками (`reports/`) · исполненные арх-доки (`architecture/`: 07 стратревью · 08 синк-ледджер · 11 план пака-11).
@@ -43,6 +45,6 @@ Go-бэкенд издательского художественного пер
## Онбординг новой сессии (порядок чтения)
-1. Этот файл → `docs/README.md` (карта) → CURRENT-STATE в `docs/PROGRESS.md`.
+1. Этот файл → `docs/README.md` (карта) → CURRENT-STATE в `docs/PROGRESS.md`. Непонятный жаргон/сокращения — `docs/glossary.md`.
2. `docs/architecture/05-decisions-log.md`: карта актуальности (шапка) + живая голова (D39.x). Целиком НЕ читать — корпус D1–D38 по ссылкам/grep по мере надобности.
-3. По роли: Бэкенд — `backend/README.md` + `03-implementation-notes.md` (через баннер) + `12-go-style-notes.md`; Полигон — `eval/README.md` + `experiments/00` + `09-pilot-protocol.md`; всем — шапка-таблица `09-target-architecture.md` (статус слоёв).
+3. По роли: Бэкенд — `backend/README.md` + `03-implementation-notes.md` (через баннер) + `12-go-style-notes.md`; Полигон — `eval/README.md` + `experiments/00` + `09-pilot-protocol.md`; Фронт/продукт — `docs/product-requirements.md` + `research/16` (через ревью-шапку); всем — шапка-таблица `09-target-architecture.md` (статус слоёв).
diff --git a/docs/architecture/components.puml b/backend/docs/components.puml
similarity index 100%
rename from docs/architecture/components.puml
rename to backend/docs/components.puml
diff --git a/docs/architecture/pipeline.puml b/backend/docs/pipeline.puml
similarity index 100%
rename from docs/architecture/pipeline.puml
rename to backend/docs/pipeline.puml
diff --git a/docs/ORCHESTRATOR_SESSION_PROMPT.md b/docs/ORCHESTRATOR_SESSION_PROMPT.md
index 3dddb101..f2361abf 100644
--- a/docs/ORCHESTRATOR_SESSION_PROMPT.md
+++ b/docs/ORCHESTRATOR_SESSION_PROMPT.md
@@ -2,9 +2,9 @@
## ХЕНДОФФ №8 → №9 (26.07.2026, вечер)
-**Позиция:** пак-20 закрыт ЦЕЛИКОМ (D39.41–53: терминолог · `--verify-bank` · двухсекционная инъекция · точечная ре-редактура · языковой экран · дисциплина банкноты; жанровый словарь отменён как класс D39.47). Полигон-пакеты 6/7/8 закрыты (D39.39–52). Доки актуализированы под D39.53; **ЕДИНЫЙ БЭКЛОГ = секция «Бэклог» в PROGRESS.md — единственный трекер** (78+ строк, каждая с весом/источником/чем-закрывается). Состояние ЗДЕСЬ не дублируется — онбординг стандартный (CLAUDE.md → README → CURRENT-STATE → голова D-лога).
+> **Счётчик ролей — канонический ОДИН:** «оркестратор №N» (сейчас №9). «Передача роли №6» в заголовке файла и «ХЕНДОФФ №8→№9» — исторические номера эстафеты документа, текущим счётчиком НЕ являются (фидбек новой сессии 02.08).
-**Первые задачи №9 по очереди:** (1) владелец релеит МАЛУЮ ПАЧКУ 14а+14б (скоупы полностью в строках бэклога: ingest x/net/html + вырезание промпт-комментариев с SHA по канонической форме) — принять исполнением; (2) релей ПАК-19 (промт готов, актуализирован пост-D39.53) — фаза 1 дизайн → СТОП → ратификация; (3) ХОЛОДНЫЙ мини-прогон (вопросы: бэклог строки 16–24; пустой сид, ОТДЕЛЬНАЯ БД, ≤$0.23); (4) пак-21 «чекеры» — до его дизайна нужны ответы владельца Р1/Р2/Р4 (строка 1 бэклога).
+**Позиция и первые задачи хендоффа №8→№9 (26.07) — ИСТОРИЧНЫ И ИСПОЛНЕНЫ** (малая пачка 14а+14б → D39.54 · пак-19 → D39.55/56 · холодный мини-прогон → D39.58 · пак-21 «чекеры» → растворён D39.62, исполнен пакетом D39.78) — здесь не пересказываются (историзировано D39.80: файл нёс протухшую очередь как второй носитель состояния). **ЕДИНЫЙ БЭКЛОГ = секция «Бэклог» в PROGRESS.md — единственный трекер.** Текущее состояние и очередь — ТОЛЬКО PROGRESS CURRENT-STATE; онбординг стандартный (CLAUDE.md → README → CURRENT-STATE → голова D-лога).
**Дельта норм от №8 (сверх §1–11, всё уже в D-логе):** нормы замеров D39.46/47 — в каждый промт (арм-без-фактора · дедуп+декой · критик полноты на КАЖДУЮ фазу · право сессии сказать «этого делать не надо»); приёмка = execute-first воркфлоу-верификаторами, деньги сверяются из сырья несколькими путями, своя мутация ВНЕ списка сессии — второй рубеж; цитаты только дословные (овер-атрибуция — типовой провал ресёрчей И приёмок); **глаз владельца на артефакт — рабочий рубеж**: его «а это нормально?» дважды за 26.07 вскрывало пропущенное двумя рубежами (жанровый словарь как класс; утечка промпт-комментариев на провод) — прайми его артефактами, не пересказом. Мультисессионный git: стейдж по содержимому; мутации — только на закоммиченном дереве; в Bash — абсолютные пути (три ложные тревоги №8 были скриптовыми ошибками, не дефектами кода).
@@ -42,7 +42,7 @@
- **Двухступенчатая верификация:** промты сессий несут мандат самопроверки ИСПОЛНЕНИЕМ (код+запросы+результаты); твоя пост-хок адверсариальная верификация при лендинге — второй рубеж, author≠reviewer, воркфлоу-инструментом, по СЫРЬЮ с пере-выводом чисел. Эра №6: рубеж-2 поймал CRITICAL-артефакт (окно судьи HEAD_CHARS) и спас контракт от трёх ложных заголовков — не ослабляй.
- **Пре-рег дисциплина полигона:** фриз коммитом ДО платных вызовов (единственный коммит сессии); изменения после = новый experiment-ID; девиации — явно в отчёте; стоп-гейты по бюджету легитимны; «если не влезает — стоп и пинг, не резать молча».
-- **Лендинг:** микро-дефекты доков чинишь сам с пометкой «испр. оркестратором»; отчёты получают ревью-шапку; код не правишь — находки в фикс-лист; коммиты скоуп-раздельные, стейджинг пофайловый; `git status` перед каждым коммитом (в дереве бывают ≥2 живые сессии) + **`git diff --cached` перед `commit`** — коммит уносит ВЕСЬ индекс: чужой staged `git mv` уедет в твой коммит (инцидент 77dd9b8); `add` общего файла сметает чужую секцию — diff-контент/`add -p`.
+- **Лендинг:** микро-дефекты доков чинишь сам с пометкой «испр. оркестратором»; отчёты получают ревью-шапку; код не правишь — находки в фикс-лист; коммиты скоуп-раздельные, стейджинг пофайловый; `git status` перед каждым коммитом (в дереве бывают ≥2 живые сессии) + **`git diff --cached` перед `commit`** — коммит уносит ВЕСЬ индекс: чужой staged `git mv` уедет в твой коммит (инцидент 77dd9b8); `add` общего файла сметает чужую секцию — diff-контент/`add -p`. **Лендинг, двигающий файлы или состав активных промтов, обновляет `docs/README.md` тем же коммитом** (норма D39.80; урок 02.08: README объявлял заленденный пак «можно запускать» с мёртвой ссылкой — поймал не процесс, а новая сессия). Статус/голову README не несёт вовсе — единственный носитель состояния = PROGRESS CURRENT-STATE.
- **Findings-ledger процесс (концерн 5):** каждая находка — явная диспозиция до закрытия; вопросы «к бэкенду» из ресёрчей маршрутизируются обратно; completeness-critic на границах фаз.
- **Ратификация:** D-блоки (образцы D39.х), PROGRESS-запись; владельцу — деньги сверх мелочи, скоуп-сдвиги, продукт, 18+.
- **Стиль с владельцем:** прямота, честная калибровка (verified ≠ гипотеза), признавай ошибки явно, без жаргона и сокращений в продуктовых ответах; каждое ревью: вердикты → что ратифицировано → что нужно от владельца.
@@ -75,7 +75,7 @@
### Верификация и петли (дополнение 25.07, ратифицировано владельцем — по переписи 180 инцидентов рассинка из летописи проекта; статистика: отчёт-по-памяти 62 · ошибки координационного слоя 51 (orchestrator-error 25 + док↔код 26) · промт-недоконтекст всего 5; ловят приёмка 93 + самопроверка 39, не поймано вовремя — 1)
7. **Заявление = команда.** Каждое числовое/категорическое утверждение отчёта сессии сопровождается командой, которой оно получено; приёмка РЕ-РАНИТ эти команды (скриптованный манифест, не проза). Прямой удар по доминирующему каналу (62/180).
-8. **Трекер открытых петель.** Каждый вопрос сессии / аск владельца получает явную диспозицию: решено / отложено-с-записью / отклонено. Живёт в PROGRESS CURRENT-STATE §«Открытые петли», ведёт оркестратор; петля без диспозиции = твой долг (класс NEVER_CLOSED — 18 находок 08-аудита, H18).
+8. **Трекер открытых петель.** Каждый вопрос сессии / аск владельца получает явную диспозицию: решено / отложено-с-записью / отклонено. Живёт диспозициями в ЕДИНОМ БЭКЛОГЕ PROGRESS (секции «Открытые петли» больше нет — испр. D39.80), ведёт оркестратор; петля без диспозиции = твой долг (класс NEVER_CLOSED — 18 находок 08-аудита, H18).
9. **Фантом-гард на себя.** При лендинге каждая цитируемая D-ссылка грепается по D-логу — блок обязан существовать (цена прецедента «D35.7 ✅» при несуществующем блоке = целый арх-ресет).
10. **Эхо-протокол старта.** Первый деливерабл любой сессии — ≤10 строк «что я понял: скоуп / инварианты / не-делать» ДО работы; расхождение чинится на минуте пять, не на приёмке.
diff --git a/docs/PROGRESS.md b/docs/PROGRESS.md
index a0751d05..61037588 100644
--- a/docs/PROGRESS.md
+++ b/docs/PROGRESS.md
@@ -1,68 +1,67 @@
# Журнал прогресса
-> **⟶ ТЕКУЩЕЕ СОСТОЯНИЕ** (на 2026-08-02, голова D39.79). **Источник истины по РЕШЕНИЯМ — `architecture/05-decisions-log.md` (D1–D39.77); этот файл — ЖУРНАЛ.**
+> **⟶ ТЕКУЩЕЕ СОСТОЯНИЕ** (на 2026-08-02, голова D39.80). **Источник истины по РЕШЕНИЯМ — `architecture/05-decisions-log.md`; этот файл — ЖУРНАЛ.**
> - **Сделано (сводно; детали — D-лог и архив-слайсы):** Ф0 ✅ · Ф1-инфра ✅ · арх-ресет D39 (7 слоёв, паки 11–16) ✅ · паки 17 «канал B» · 18 «долги» · 19 «голос/состояние» · 20 «банк+терминолог» ✅ (D39.26–28/31/41–56) · мини-прогон (D39.37) и ХОЛОДНЫЙ прогон (D39.58: recall банка 0.918/0.980, банк приходит переведённым) приняты · полигон-пакеты 5–8, ToS-речек (D39.57), Р6+P4 (D39.61) закрыты · **карта языковой привязки движка (D39.60): 149 сайтов/45 файлов, книго-ось чиста (4), ja→ru безопасно без правки Go, en→ru — нет** · Р1–Р4 закрыты целиком (D39.63: Р2 = ЗНАЧЕНИЕ, Р4 = норма потолка recall) · **ФАЗА 2 ОБЩНОСТИ ✅ (D39.64: П0 эмбед-хеш · П1 цель-шов · П2 скрипт-шов, ko-баг закрыт · П3 нарезка · П4 манифест-по-каналам; голден вердикт-нейтрален 0/172, майнер-парити EXACT)** · жанровый словарь отменён как класс (D39.47) · петля ремонта построена и НЕ включена (D39.38).
-> - **Курс (D39.59–78): ОБЩНОСТЬ ✅ → КАЧЕСТВО БАНКА ✅ (D39.69/75/77) → ПАКЕТ-ЧЕКЕРОВ ✅ (D39.78: строка 25 целиком; харнесс labels В GIT 12/12; K2 r0.85 · K4b r0.22 · K6 fp 14→6; Р2 hard/soft + Р4-потолки в контрактах).** **Текущее: МЕЛКАЯ ПАЧКА ХВОСТОВ в работе (строки 89·93·53·83 + решения D39.79, промт `BACKEND_SMALLPACK_TAILS_SESSION_PROMPT.md`); вопросы §6 РЕШЕНЫ делегированием (D39.79: канон «класс X» · 兩 в numeral-классах · value-чек 成 загейчен строкой 12 · register_neg → книжный слой); ре-проба flash (строка 74) — по слову владельца; finding-1 ЗАКРЫТ (D39.77).** ⚠ **DeepSeek-V4-Flash-0731: платные прогоны СТОП до ре-пробы (строка 74; там же 6/6-порог классификатора и слоты Q2/Q7). Перекупок нет (D39.63).**
+> - **Курс (D39.59–78): ОБЩНОСТЬ ✅ → КАЧЕСТВО БАНКА ✅ (D39.69/75/77) → ПАКЕТ-ЧЕКЕРОВ ✅ (D39.78: строка 25 целиком; харнесс labels В GIT 12/12; K2 r0.85 · K4b r0.22 · K6 fp 14→6; Р2 hard/soft + Р4-потолки в контрактах).** **Текущее: МЕЛКАЯ ПАЧКА ХВОСТОВ в работе (строки 89·93·53·83 + решения D39.79, промт `BACKEND_SMALLPACK_TAILS_SESSION_PROMPT.md`); вопросы §6 РЕШЕНЫ делегированием (D39.79: канон «класс X» · 兩 в numeral-классах · value-чек 成 загейчен строкой 12 · register_neg → книжный слой); ре-проба flash (строка 74) — по слову владельца; finding-1 ЗАКРЫТ (D39.77); онбординг-оверхол доков исполнен (D39.80: реестр требований `product-requirements.md` · глоссарий · README = чистая карта без дублей состояния · puml → `backend/docs/`).** ⚠ **DeepSeek-V4-Flash-0731: платные прогоны СТОП до ре-пробы (строка 74; там же 6/6-порог классификатора и слоты Q2/Q7). Перекупок нет (D39.63).**
> - **Горизонт (D39.62/67):** ре-проба flash (74; + платный порог 6/6 классификатора + пробы 36б-замера Q2/эмиссии Q7 по слову) → **ДОБОР ИДЕАЛА** (первым прогоном: оси голоса 24 · авто-режим · итерация №2 редакторов 65 · цена 16 · веса K1–K12 13а · вне-претрейн чекпоинт 55) → ВТОРАЯ ПАРА живьём (ja→ru; преп 81) → МАСШТАБ → пилот Ф2.5 (гейт резюме-строки 80; строки 62–68, 85) → Ф3 ридер-IDE (69–71). **Стоячие:** ToS-триггер 25.10 · Ш-2 до go1.27 · строка 74 перед любым платным прогоном.
> - **Стек:** draft deepseek-v4-flash thinking-ON (+банкнота) **⚠0731** → терминолог (та же модель, батчи, экран `target_script`) → editor deepseek-v4-pro БИЛИНГВ ИНТЕРИМ (вендором НЕ тронут; glm-5 резерв) → судья gemini (Ф2, полигон); канал B Mistral+grok; ~$0.85/ранобэ (D30.4) — пере-калибровка после развилки 74.
> - **ЕДИНЫЙ БЭКЛОГ — секция «Бэклог» ниже** (одна таблица, единственный трекер; каждая петля обязана иметь диспозицию: решено / отложено-с-записью / отклонено; ведёт оркестратор).
> - Архивы хроники: `archive/PROGRESS-2026-07-04-10.md` (D31) · `-10-13` (D39.6-гигиена) · `-13-25` (стройка паков 11–16, rerun2) · **`-25-31` (паки 17–20 · мини-прогон · полигон-пакеты 5–8 · ToS · холодный прогон; D39.26–58)**. Записи ниже — живой хвост (эра D39.59+).
-## Бэклог (ЕДИНЫЙ, собран 26.07, актуализация 01.08; правки — только через оркестратора)
+## Бэклог (ЕДИНЫЙ, собран 26.07, актуализация 02.08 D39.80; правки — только через оркестратора)
-Закрытые строки здесь НЕ хранятся — они уходят в D-лог с номером решения. Вес: «блокер-очереди» = мешает текущему шагу · «скоро» = ближайшие 1–2 касания · «когда-нибудь» = записано, не потеряно.
+Закрытые строки здесь НЕ хранятся — они уходят в D-лог с номером решения. **ID строки стабилен навсегда** (не перенумеровывается и не переиспользуется — на «строку N» ссылаются доки и промты, D39.80). Вес: «блокер-очереди» = мешает текущему шагу · «скоро» = ближайшие 1–2 касания · «когда-нибудь» = записано, не потеряно. Длинная строка начинается жирным лидом — таблица сканируется по лидам.
| ID | Хвост (одной фразой) | Зона | Вес | Чем закрывается | Источник |
|---|---|---|---|---|---|
| **— ВИСИТ НА ВЛАДЕЛЬЦЕ —** | | | | | |
| 2 | Четыре вопроса границы «алгоритмического идеала» (Annotator · семантический судья · ja→ru §B5 · ru-target до/после) | владелец | скоро (гейт «добора идеала» перед МАСШТАБОМ) | отдельное решение | D39.33, D39.38 |
-| 4 | Ре-чек ToS по триггерам — первый ИСПОЛНЕН 31.07, дельт вердиктов нет (D39.57); предмет Google-мониторинга перевешен на цепочку договора (PUP · Additional ToS · Google APIs ToS); следующие: квартал 25.10.2026 · первая лейблованная книга · любая правка `accepts_labels` | владелец/полигон | скоро (следующий триггер 25.10.2026) | отдельное решение (правило) | D39.32, D39.57 |
-| 5 | Судья-с-декоем/36б «второе мнение» — бэкенд-стройка ЗАКРЫТА дизайном (D39.69): маршрут = полигон-ЗАМЕР нужности рецензента-другого-семейства ПОВЕРХ §1+§2 (Q2); переживёт замер → тонкая колонка наблюдаемости, не гейт | полигон | скоро (санкция Q2 D39.70 — слотом при ре-пробе 74) | полигон-замер → решение | D39.50 п.6, D39.58, D39.69 |
-| 6 | Строка Gemini в `accepts_labels` — ждёт слова владельца о подписи интерпретации сужения как разрешения; ре-чек 31.07 понизил приоритет: подпись даёт ПРАВО, но не судью 18+ (фильтр неконфигурируем D22.6 + обход запрещён договором) — возвращаться при вопросе, требующем именно права | владелец | когда-нибудь | отдельное решение | D39.32, D39.57 |
+| 4 | **Ре-чек ToS по триггерам** — первый ИСПОЛНЕН 31.07, дельт вердиктов нет (D39.57); предмет Google-мониторинга перевешен на цепочку договора (PUP · Additional ToS · Google APIs ToS); следующие: квартал 25.10.2026 · первая лейблованная книга · любая правка `accepts_labels` | владелец/полигон | скоро (следующий триггер 25.10.2026) | отдельное решение (правило) | D39.32, D39.57 |
+| 5 | **Судья-с-декоем/36б «второе мнение»** — бэкенд-стройка ЗАКРЫТА дизайном (D39.69): маршрут = полигон-ЗАМЕР нужности рецензента-другого-семейства ПОВЕРХ §1+§2 (Q2); переживёт замер → тонкая колонка наблюдаемости, не гейт | полигон | скоро (санкция Q2 D39.70 — слотом при ре-пробе 74) | полигон-замер → решение | D39.50 п.6, D39.58, D39.69 |
+| 6 | **Строка Gemini в `accepts_labels`** — ждёт слова владельца о подписи интерпретации сужения как разрешения; ре-чек 31.07 понизил приоритет: подпись даёт ПРАВО, но не судью 18+ (фильтр неконфигурируем D22.6 + обход запрещён договором) — возвращаться при вопросе, требующем именно права | владелец | когда-нибудь | отдельное решение | D39.32, D39.57 |
| 7 | Q2 «редактор под `sexually-explicit`» (grok-4.3 интерим · glm-5 после сверки ToS Z.AI · mistral вон) | владелец | когда-нибудь (перед первой explicit-книгой) | отдельное решение | D39.27 п.7 |
| 8 | D22.7 пер-чанковый L3-скрин — неснятое предусловие первой erotica-книги в проде, отдельный гейт | владелец | когда-нибудь | отдельное решение | D22.7, CURRENT-STATE (оркестратор) |
| 9 | Промпт-слой под лейблом: лейбл не доезжает до промпта — должны ли переводчик/редактор знать о свойстве контента | владелец | когда-нибудь | отдельное решение | CURRENT-STATE (владелец, из пака-17) |
| 10 | Дата создания аккаунта OpenAI (низкий приоритет, OpenAI вне цепочки) + применимость OpenAI Sharing & publication policy 2022 (quirks:128) | владелец | когда-нибудь | отдельное решение | D39.32 |
| 11 | Флип coverage-гейта (`enabled:false`, D12-Q4) — за подписью владельца ; при флипе решить судьбу v1.1 quote-absorption (D12-Q1, Python-first лок-степ) | владелец | когда-нибудь | отдельное решение | D39.34(2) |
-| 12 | `postcheck_gate` в hard-gate — требует пере-замера recall (recall чекеров измерен и низок); ⚠ «fn=0» демоции #10 класс-вакуумен на labels (ноль одно-Han-позитивов, D39.78) — пере-замер обязан добрать одно-Han-позитивы, на «fn=0» не опираться; одно-Han-класс при gate-on вне гейта (Unverified+Demoted); тем же решением строится HARD-value-детектор 成/万 (Q3 §6 — честный hard-gate требует value-чека; либо раньше при ненулевом потоке value-дефектов добора, D39.79) | владелец | когда-нибудь (после фазы 2) | отдельное решение | D39.34(2), D24.4+D28.1, D39.39, D39.78, D39.79 |
-| 13 | Включение платной петли ремонта + per-class исходы ремонта (схемное решение принимается вместе) — вернуться при расширении классов детекторов и ненулевом остатке; ⚠ при включении: репэйр-гард №5 после #10 слеп на одно-Han-дифференциал (демоция в обоих прогонах ⇒ 0>0 — репэйр, стёрший верно отрендеренный одно-Han-термин, не ветируется; D39.78-ревью) | владелец | когда-нибудь | отдельное решение | D39.38, D39.39(а), D39.78, CURRENT-STATE |
+| 12 | **`postcheck_gate` в hard-gate** — требует пере-замера recall (recall чекеров измерен и низок); ⚠ «fn=0» демоции #10 класс-вакуумен на labels (ноль одно-Han-позитивов, D39.78) — пере-замер обязан добрать одно-Han-позитивы, на «fn=0» не опираться; одно-Han-класс при gate-on вне гейта (Unverified+Demoted); тем же решением строится HARD-value-детектор 成/万 (Q3 §6 — честный hard-gate требует value-чека; либо раньше при ненулевом потоке value-дефектов добора, D39.79) | владелец | когда-нибудь (после фазы 2) | отдельное решение | D39.34(2), D24.4+D28.1, D39.39, D39.78, D39.79 |
+| 13 | **Включение платной петли ремонта + per-class исходы ремонта** (схемное решение принимается вместе) — вернуться при расширении классов детекторов и ненулевом остатке; ⚠ при включении: репэйр-гард №5 после #10 слеп на одно-Han-дифференциал (демоция в обоих прогонах ⇒ 0>0 — репэйр, стёрший верно отрендеренный одно-Han-термин, не ветируется; D39.78-ревью) | владелец | когда-нибудь | отдельное решение | D39.38, D39.39(а), D39.78, CURRENT-STATE |
| 13а | Веса рубрики K1–K12 не выбраны (Q1: «по данным фазы B»; фаза B прошла на BWS без весов — выбор нужен к агрегатной приёмке качества книги) | владелец | когда-нибудь (к пилоту) | Ф2.5 / отдельное решение | D39.44 Q1, D39.46 |
-| 13б | `speech-cue.txt` zh НЕ шипить до замера голос-флаггера на холодном прогоне (данные для недоказанного детектора = инерция; вывод обсуждения 31.07): оси пустые → файл не нужен, оси ловят → решение владельца о шипе (байты двигают `LangpackVersion`) | владелец | отложено-до-замера | первый прогон добора идеала (оси голоса, строка 24) → отдельное решение | D39.56, PACK19_BUILD §7.2, чат 31.07 |
-| 14 | Четыре data-инженерных флага фазы-2 общности, каждый с рекомендованным дизайном (§5 отчёта): ё-фолд → target-данные (`char_fold`; смена сигнатуры core-примитива через вердикт-несущий банк, сдвиг `memory_version`) · segmentation-фолбэк громким (ломает контракт corridor-фолбэка `pipeline.go:839-848` + голден-фикстура на нём; лечение — объявить блок в голден-yaml) · `Fertility` per-script map (калибровка ждёт боевого токенизатора) · `source-encoding.txt` + Go-реестр декодеров | владелец | когда-нибудь (следующий пак общности) | отдельное решение | D39.64, GENERALITY_PHASE2 §5.1–5.4 |
-| 86 | Мелкие открытые решения одним списком (свип D39.66): echo-семантика дропнутого c-lite-члена (D39.18 — оставить pre-c-lite?) · magnitude-кап тяжёлой CJK-утечки (D38.3 п.4в; сейчас strip+flag) | владелец | когда-нибудь | отдельные решения | D39.66, D39.69(feed_cap закрыт §1) |
+| 13б | **`speech-cue.txt` zh НЕ шипить до замера голос-флаггера на холодном прогоне** (данные для недоказанного детектора = инерция; вывод обсуждения 31.07): оси пустые → файл не нужен, оси ловят → решение владельца о шипе (байты двигают `LangpackVersion`) | владелец | отложено-до-замера | первый прогон добора идеала (оси голоса, строка 24) → отдельное решение | D39.56, PACK19_BUILD §7.2, чат 31.07 |
+| 14 | **Четыре data-инженерных флага фазы-2 общности, каждый с рекомендованным дизайном** (§5 отчёта): ё-фолд → target-данные (`char_fold`; смена сигнатуры core-примитива через вердикт-несущий банк, сдвиг `memory_version`) · segmentation-фолбэк громким (ломает контракт corridor-фолбэка `pipeline.go:839-848` + голден-фикстура на нём; лечение — объявить блок в голден-yaml) · `Fertility` per-script map (калибровка ждёт боевого токенизатора) · `source-encoding.txt` + Go-реестр декодеров | владелец | когда-нибудь (следующий пак общности) | отдельное решение | D39.64, GENERALITY_PHASE2 §5.1–5.4 |
+| 86 | **Мелкие открытые решения одним списком** (свип D39.66): echo-семантика дропнутого c-lite-члена (D39.18 — оставить pre-c-lite?) · magnitude-кап тяжёлой CJK-утечки (D38.3 п.4в; сейчас strip+flag) | владелец | когда-нибудь | отдельные решения | D39.66, D39.69(feed_cap закрыт §1) |
| **— ХВОСТЫ ХОЛОДНОГО ПРОГОНА (исполнен достаточно, D39.58; Р7 владельца) —** | | | | | |
| 16 | Полная цена холодного старта: edit-волна не гонялась (Р7); измерено всё ДО редактуры (драфт+банкнота $0.0247/волна · терминолог $0.006–0.013/проход) | бэкенд | когда-нибудь (первый прогон добора идеала) | добор идеала | D39.58 |
-| 18 | Эмиссия головы 蛊: сид-половина = чек-лист (определяющий терм книги сидится `allow_short`, D39.50); эмиссия-КАНАЛ демотирован до ИЗМЕР-ГЕЙТА (Q7): полигон-замер «меняет ли эмиссия головы рендер композитов» — строить ТОЛЬКО по эффекту и ПОСЛЕ #10 (однознаковый пост-чек чинится чекер-паком); перед стройкой резолвить K-гейт и KWIC-грязь одиночной головы | полигон → бэкенд | скоро (санкция Q7 D39.70 — после #10, очередью с ре-пробой) | полигон-замер → решение | D39.58, D39.60, D39.69 |
-| 24 | Остаток: авто-режим флага (проект Б не гонялся) · оси голоса A–D (профили не подписаны; черновик готов — `coldrun-a/SIGN-PACKAGE.md` §3) ; + слот инъекции голоса и решение gates.voice при ненулевых осях (D39.55/D21 п.2) · слой-2 voice не строим до доказательства слоя-1 · сверить until_ch 白凝冰 при курации сида (D19.3в) | бэкенд | когда-нибудь (первый прогон добора идеала) | добор идеала | D39.40, D39.58 |
+| 18 | **Эмиссия головы 蛊**: сид-половина = чек-лист (определяющий терм книги сидится `allow_short`, D39.50); эмиссия-КАНАЛ демотирован до ИЗМЕР-ГЕЙТА (Q7): полигон-замер «меняет ли эмиссия головы рендер композитов» — строить ТОЛЬКО по эффекту и ПОСЛЕ #10 (однознаковый пост-чек чинится чекер-паком); перед стройкой резолвить K-гейт и KWIC-грязь одиночной головы | полигон → бэкенд | скоро (санкция Q7 D39.70 — после #10, очередью с ре-пробой) | полигон-замер → решение | D39.58, D39.60, D39.69 |
+| 24 | **Остаток: авто-режим флага** (проект Б не гонялся) · оси голоса A–D (профили не подписаны; черновик готов — `coldrun-a/SIGN-PACKAGE.md` §3) ; + слот инъекции голоса и решение gates.voice при ненулевых осях (D39.55/D21 п.2) · слой-2 voice не строим до доказательства слоя-1 · сверить until_ch 白凝冰 при курации сида (D19.3в) | бэкенд | когда-нибудь (первый прогон добора идеала) | добор идеала | D39.40, D39.58 |
| **— ТЕКУЩАЯ ОЧЕРЕДЬ (D39.59) —** | | | | | |
| 74 | ⚠ **DeepSeek-V4-Flash-0731: боевая черновая форма покупает пустые ответы — блокер ПЛАТНЫХ прогонов.** Оперативное состояние = «(в) ждать» (D39.63; фаза-2 всё равно $0-код). Перед следующим платным прогоном — ре-проба flash за копейки → если не устаканилось, выбор: (а) флор 16000 (сдвиг request_hash безболезнен — перекупок на этой фазе нет; хвост не закрывает, упор 2/5) или (б) слать `reasoning_effort` явно (вендорская модель, дешевле ~22%; но амендмент `echoMineViolation`, эхо ~6% и качество черновика при `low` не судилось — нужен замер ~$0.05; тогда же предмет для постинструкции/префилла); включение ручки #77 (ре-ген эха перед эскалацией, построена D39.64, дефолт 0) — тем же решением; при включении помнить общий счётчик attempt с length-ре-геном + рост `maxTokensForAttempt`; остаток §12.7 (8 несудимых fidelity-пар ≈$0.10 · ja-вход ≈$0.005 · prefill-continuation research/21 §1.17) — вернуться при предмете wiring; ⚠ cap 8000 бьёт и СТАДИЮ ТЕРМИНОЛОГА (reasoning 8063/батч, D39.65) — резолюция обязана накрыть терминолога; тем же заходом: платный порог приёмки §2 классификатора (6/6 harm-набор, ~$0.01, D39.69) + полигон-слоты Q2 (36б-замер) и Q7 (эмиссия головы, после #10) | владелец (по ре-пробе) | перед следующим платным прогоном | ре-проба → решение | D39.61, D39.63, D39.64, POLYGON_PROMPTLANG_ANTIECHO §12.4 |
-| 78 | Леджер денег = НИЖНЯЯ граница: «2xx body decode failed (call IS billed)» — провайдер списал, исходная попытка в `request_log` НЕ попадает (≤$0.009/сессия); дизайн фикса ГОТОВ (GENERALITY_PHASE2 §5.6: `BilledDecodeFails` + per-billed-attempt settle с `Estimated=true`), но это money/ledger-путь — не $0-хастл | бэкенд | когда-нибудь (money-паком) | отдельное решение (дизайн §5.6) | D39.61, D39.64 |
-| 79 | Граница ПЛОТНОСТИ письма для серий: `enabled` через Go-константу `cjkScriptNames` — новый плотный скрипт требует правки Go (head-finality уже в данных script-series.txt; пре-существующая граница, D39.75). Первые два компонента строки (isCyrLetter→`isTargetWordLetter` · magnitude `SourceScripts`-гейт) исполнены пакетом-чекеров, D39.78 | бэкенд | когда-нибудь | следующий пак общности / касание чекеров | D39.64, D39.78 |
-| 89 | Остатки карты общности D39.60 без носителя (пропуск свипа, D39.72); СУЖЕНО D39.78 — checkers-срез ведра D исполнен пакетом (6 указателей `checkers_zh_ru.go` + ложная шапка checkers.go). Остаток: дубль isHeaderContentRune↔isHeaderSeparator · minerPackVersion «zh-universal-v1» · глифы ⟨проверить⟩ tmctl/render · вес palladius miner.go (дюжину сверить по карте §3) + сверка ведра B (6 «пар-модуль без гейта») против фазы-2 | бэкенд | в работе (промт выдан D39.79) | `BACKEND_SMALLPACK_TAILS_SESSION_PROMPT.md` | D39.60, D39.66, D39.72, D39.78 |
-| 90 | Ф2-кандидаты 02-mvp-плана без носителя (свип-хвост, D39.73): CometKiwi/T-index метрики судьи · Batch API судьи (экономия) · llama-server-интеграция локали · стриминг — взять/закрыть при пилот-препе | полигон/бэкенд | когда-нибудь (Ф2.5) | пилот-преп-промт (с 85) | 02-mvp-plan, D39.66, D39.73 |
+| 78 | **Леджер денег = НИЖНЯЯ граница**: «2xx body decode failed (call IS billed)» — провайдер списал, исходная попытка в `request_log` НЕ попадает (≤$0.009/сессия); дизайн фикса ГОТОВ (GENERALITY_PHASE2 §5.6: `BilledDecodeFails` + per-billed-attempt settle с `Estimated=true`), но это money/ledger-путь — не $0-хастл | бэкенд | когда-нибудь (money-паком) | отдельное решение (дизайн §5.6) | D39.61, D39.64 |
+| 79 | **Граница ПЛОТНОСТИ письма для серий**: `enabled` через Go-константу `cjkScriptNames` — новый плотный скрипт требует правки Go (head-finality уже в данных script-series.txt; пре-существующая граница, D39.75). Первые два компонента строки (isCyrLetter→`isTargetWordLetter` · magnitude `SourceScripts`-гейт) исполнены пакетом-чекеров, D39.78 | бэкенд | когда-нибудь | следующий пак общности / касание чекеров | D39.64, D39.78 |
+| 89 | **Остатки карты общности D39.60 без носителя** (пропуск свипа, D39.72); СУЖЕНО D39.78 — checkers-срез ведра D исполнен пакетом (6 указателей `checkers_zh_ru.go` + ложная шапка checkers.go). Остаток: дубль isHeaderContentRune↔isHeaderSeparator · minerPackVersion «zh-universal-v1» · глифы ⟨проверить⟩ tmctl/render · вес palladius miner.go (дюжину сверить по карте §3) + сверка ведра B (6 «пар-модуль без гейта») против фазы-2 | бэкенд | в работе (промт выдан D39.79) | `BACKEND_SMALLPACK_TAILS_SESSION_PROMPT.md` | D39.60, D39.66, D39.72, D39.78 |
+| 90 | **Ф2-кандидаты 02-mvp-плана без носителя** (свип-хвост, D39.73): CometKiwi/T-index метрики судьи · Batch API судьи (экономия) · llama-server-интеграция локали · стриминг — взять/закрыть при пилот-препе; + H16 самоулучшение (V3-п.2, ПТ-26): дизайн петли по данным судьи — тем же препом | полигон/бэкенд | когда-нибудь (Ф2.5) | пилот-преп-промт (с 85) | 02-mvp-plan, D39.66, D39.73, D39.80 |
| **— НАХОДКИ СВИПА ПОЛНОТЫ (D39.66: 951 обязательство проверено, потери возвращены в трекер) —** | | | | | |
-| 80 | Резюме-слой памяти — проза-суммарайзер ЗАКРЫТ (D39.69); строка = ГЕЙТ ПИЛОТА Ф2.5: первый деливерабл пилота — «допускает ли автономная нарратив-состояние-строка ДЕТЕРМИНИРОВАННЫЙ верификатор (source-anchored) — или это D1-компаундинг со схемой»; не-покрытые классы (source-anchored reveal · арк-колбэки без ключа) реальны, но не измерены как дефект | Ф2.5 (Q3 подтверждён D39.70) | когда-нибудь (пилот) | Ф2.5 пре-рег | D25 п.8–9, D39.66, D39.69 |
-| 81 | ja-преп B6-ja (сужено пост-сверкой D39.66): Поливанов-валидатор (`translit_policy` = «Phase 2»-заглушка, migrate.go:186/194) + kana-омограф POS/known-word гейтинг / B6-токенизатор (memory.go:1048); чек-лист kana-алиасов сида УЖЕ построен (backend/README §ja + `AttachRubyAliasesToManual`) — остаток в нём только дизамбигуация двойных чтений (тот же B6) | бэкенд | когда-нибудь (перед ja→ru) | ja→ru-пак (рядом 35) | D16.4, D17.1, D18, D39.66 |
-| 82 | Морфо-гейт РОДА (C3: русский глагол прош. вр. при gender=hidden = механический спойлер-канал; «жалоба №1 читателей MTL»; python-сайдкар/pymorphy, связка с морфопроходом Decl из 73) | бэкенд | когда-нибудь (Ф2-гейты) | отдельный пак (с 52) | 06-реестр C3, research/12, D39.66 |
-| 83 | F4: бэкап + integrity_check SQLite-файла книги перед платным прогоном (VACUUM INTO; SPOF — тихая потеря банка и подписей владельца); ПОДТЯНУТА D39.79 с «до МАСШТАБА» на «до платных прогонов добора идеала» | бэкенд | в работе (промт выдан D39.79) | `BACKEND_SMALLPACK_TAILS_SESSION_PROMPT.md` | 06-реестр F4, D39.66, D39.79 |
-| 85 | Пилот-преп добор (к переупаковке PACKAGE4): Bertalign GOLD-пары + zh→ru spot-check (D29.2в; GPL-тулинг отдельно) · fidelity-каскад R2 shadow с корпус-подготовкой (D25.2) · exp08 v3 пере-съём COGS до фиксации budget_usd (D21.8) | полигон | когда-нибудь (Ф2.5) | пилот-преп-промт | D25, D29, D21.8, D39.66 |
+| 80 | **Резюме-слой памяти** — проза-суммарайзер ЗАКРЫТ (D39.69); строка = ГЕЙТ ПИЛОТА Ф2.5: первый деливерабл пилота — «допускает ли автономная нарратив-состояние-строка ДЕТЕРМИНИРОВАННЫЙ верификатор (source-anchored) — или это D1-компаундинг со схемой»; не-покрытые классы (source-anchored reveal · арк-колбэки без ключа) реальны, но не измерены как дефект | Ф2.5 (Q3 подтверждён D39.70) | когда-нибудь (пилот) | Ф2.5 пре-рег | D25 п.8–9, D39.66, D39.69 |
+| 81 | **ja-преп B6-ja (сужено пост-сверкой D39.66)**: Поливанов-валидатор (`translit_policy` = «Phase 2»-заглушка, migrate.go:186/194) + kana-омограф POS/known-word гейтинг / B6-токенизатор (memory.go:1048); чек-лист kana-алиасов сида УЖЕ построен (backend/README §ja + `AttachRubyAliasesToManual`) — остаток в нём только дизамбигуация двойных чтений (тот же B6) | бэкенд | когда-нибудь (перед ja→ru) | ja→ru-пак (рядом 35) | D16.4, D17.1, D18, D39.66 |
+| 82 | **Морфо-гейт РОДА** (C3: русский глагол прош. вр. при gender=hidden = механический спойлер-канал; «жалоба №1 читателей MTL»; python-сайдкар/pymorphy, связка с морфопроходом Decl из 73) | бэкенд | когда-нибудь (Ф2-гейты) | отдельный пак (с 52) | 06-реестр C3, research/12, D39.66 |
+| 83 | **F4: бэкап + integrity_check SQLite-файла книги перед платным прогоном** (VACUUM INTO; SPOF — тихая потеря банка и подписей владельца); ПОДТЯНУТА D39.79 с «до МАСШТАБА» на «до платных прогонов добора идеала» | бэкенд | в работе (промт выдан D39.79) | `BACKEND_SMALLPACK_TAILS_SESSION_PROMPT.md` | 06-реестр F4, D39.66, D39.79 |
+| 85 | **Пилот-преп добор** (к переупаковке PACKAGE4): Bertalign GOLD-пары + zh→ru spot-check (D29.2в; GPL-тулинг отдельно) · fidelity-каскад R2 shadow с корпус-подготовкой (D25.2) · exp08 v3 пере-съём COGS до фиксации budget_usd (D21.8) | полигон | когда-нибудь (Ф2.5) | пилот-преп-промт | D25, D29, D21.8, D39.66 |
| **— ПАК-21 «чекеры»: РАСТВОРЁН (D39.62); шестёрка исполнена 2/6 фазой 2 (D39.64: #11 · строка 26), остаток — ниже —** | | | | | |
-| 93 | Хвосты пакета-чекеров (минорки двухраундового ревью D39.78 — комменты/гвозди/данные одним касанием): строгий OffLanguage (36а, deferred) · разметить 分之-срез прежде стройки DC2 word↔word (полигон) · substring-вето `isSpokenChevronLine` → whole-word (второй call-site маркер-листа; гасит mixing-клэш на «в умении») · recall-трейд двустороннего отсечения `speechAttribution` вписать в контракт (маркер после внутренней запятой/многоточия в атрибуции = FN правила, не данных) · негатив-ассерт Demoted=false на ambiguous-популяции · stale-коммент `repair.go` LatinResidueCount «lowercase» · CAND k4_inverse в labelcandidates = опровергнутый whole-line вариант (заморозить/пометить по образцу фикса-3) · конвенции «..»-vs-«…» и thin-space джойна (код↔коммент) · кана-оговорка в обосновании Han-only демоции (класс открыт до B6, строка 81) · target-алиасы пост-чек-матча (сид-концерн) | бэкенд/полигон | в работе (промт выдан D39.79; 分之-разметка остаётся полигону) | `BACKEND_SMALLPACK_TAILS_SESSION_PROMPT.md` | D39.78 |
+| 93 | **Хвосты пакета-чекеров** (минорки двухраундового ревью D39.78 — комменты/гвозди/данные одним касанием): строгий OffLanguage (36а, deferred) · разметить 分之-срез прежде стройки DC2 word↔word (полигон) · substring-вето `isSpokenChevronLine` → whole-word (второй call-site маркер-листа; гасит mixing-клэш на «в умении») · recall-трейд двустороннего отсечения `speechAttribution` вписать в контракт (маркер после внутренней запятой/многоточия в атрибуции = FN правила, не данных) · негатив-ассерт Demoted=false на ambiguous-популяции · stale-коммент `repair.go` LatinResidueCount «lowercase» · CAND k4_inverse в labelcandidates = опровергнутый whole-line вариант (заморозить/пометить по образцу фикса-3) · конвенции «..»-vs-«…» и thin-space джойна (код↔коммент) · кана-оговорка в обосновании Han-only демоции (класс открыт до B6, строка 81) · target-алиасы пост-чек-матча (сид-концерн) | бэкенд/полигон | в работе (промт выдан D39.79; 分之-разметка остаётся полигону) | `BACKEND_SMALLPACK_TAILS_SESSION_PROMPT.md` | D39.78 |
| 28 | Банк-линт латиницы в dst или строгая форма языкового предиката (7 строк утечки алфавита проходят экран) | бэкенд | когда-нибудь (добор идеала — носитель «свежий мини-прогон» растворён D39.67, актуализация D39.79) | касание чекеров при данных добора (помнить оговорку 36а: «甲等 → класс Цзя» строгой формой не ловится) | D39.52, D39.62, D39.64, D39.79 |
-| 28а | Prompt-injection-проба входного текста ($0): сепаратор ⟦TM-BANK-v1⟧ и якорь-подобные маркеры В ТЕКСТЕ КНИГИ — поведение среза/парсера/инъекции (книга = недоверенные данные; инструментов у моделей нет, но канал банкноты читает вывод по маркеру) | бэкенд/полигон | когда-нибудь | малая проба | сводка-ревью 26.07 |
+| 28а | **Prompt-injection-проба входного текста** ($0): сепаратор ⟦TM-BANK-v1⟧ и якорь-подобные маркеры В ТЕКСТЕ КНИГИ — поведение среза/парсера/инъекции (книга = недоверенные данные; инструментов у моделей нет, но канал банкноты читает вывод по маркеру) | бэкенд/полигон | когда-нибудь | малая проба | сводка-ревью 26.07 |
| **— СВИП ГИПОТЕЗ —** | | | | | |
-| 30а | Перерисовка puml-диаграмм под пост-пак-20 пайплайн (терминолог, банкнота отдельным файлом); PUML НЕ рендерить (гардрейл) | оркестратор | когда-нибудь | док-пасс | аудит доков 26.07 |
-| 30в | Идеи START_PROMT не разобраны: V4 п.4–5 (сборка глоссария — частично закрыта паком-20; ЯЗЫК промпт-запросов по паре) → в свип; V5 (фронт веб-первый, SEO) → Ф3; ru/en-срез языка промптов ЗАКРЫТ отрицательно (D39.61) | оркестратор/владелец | скоро | свип гипотез + полигон-пакет + Ф3 | START_PROMT.MD V4/V5, D39.58 |
+| 30а | **Перерисовка puml-диаграмм под пост-пак-20 пайплайн** (терминолог, банкнота отдельным файлом); дом диаграмм теперь `backend/docs/` — правятся одним коммитом с кодом (D39.80); PUML НЕ рендерить (гардрейл) | бэкенд | когда-нибудь | ближайший пак, касающийся pipeline | аудит доков 26.07, D39.80 |
| **— ОТДЕЛЬНЫЕ ПАКИ/РЕШЕНИЯ (бэкенд, добор идеала) —** | | | | | |
| 31 | Слой-2: извлечение дискурс-норм/few-shot из ТЕЛ промтов (форсинг = ja→ru) | бэкенд | когда-нибудь | отдельный пак (идеал D39.33) | CURRENT-STATE, D39.33 |
-| 33 | native-Gemini судья (Ф2-механизм) ; до прод-заводки: $0.01-проба thinking⊆max_tokens на боевом слаге (D22.3) + включить sanitizer в pipeline-c2 при оживлении (D33.4б) | бэкенд | когда-нибудь | отдельный пак (идеал) | CURRENT-STATE, D39.33 |
-| 34 | Генеральность нарезки — ОСТАТОК после фазы 2: сами per-script коэффициенты (`est_out` ja завышен ~1.7× МОЛЧА · `EstimateTokens` недосчитывает кириллицу); консолидация класса письма СДЕЛАНА (один дом `DenseScript`, D39.64) — лечение = `Fertility`-map (строка 14) + офлайн-калибровка при боевом токенизаторе | бэкенд | когда-нибудь | строка 14 + отдельный пак (с ja→ru) | D39.37(5), D39.64 |
-| 34а | Экран кодировки не видит `` без XML-объявления (епаб с gb18030-метой прочтётся как UTF-8) — до-паковая дыра, сознательно не тронута пачкой 14а (паритет со старым ридером) | бэкенд | когда-нибудь | отдельное решение | D39.54, SMALLPACK §8 |
-| 35 | Не-CJK майнер/банк: en-детектора не существует (hanRuns=0), ja с zh-таблицами активно неверен (0/10); нужен второй ДЕТЕКТОР (прототип `mine_nonhan.py`) + G1–G10 требования generic-майнера (вкл. квадратичность G9 ≈4.6 ч) | бэкенд | когда-нибудь | отдельный пак generic-майнера (с ja→ru) | D39.37(8), D39.43, D39.50 п.8, POLYGON_PREMEASURE §6 |
+| 33 | **native-Gemini судья** (Ф2-механизм) ; до прод-заводки: $0.01-проба thinking⊆max_tokens на боевом слаге (D22.3) + включить sanitizer в pipeline-c2 при оживлении (D33.4б) | бэкенд | когда-нибудь | отдельный пак (идеал) | CURRENT-STATE, D39.33 |
+| 34 | **Генеральность нарезки** — ОСТАТОК после фазы 2: сами per-script коэффициенты (`est_out` ja завышен ~1.7× МОЛЧА · `EstimateTokens` недосчитывает кириллицу); консолидация класса письма СДЕЛАНА (один дом `DenseScript`, D39.64) — лечение = `Fertility`-map (строка 14) + офлайн-калибровка при боевом токенизаторе | бэкенд | когда-нибудь | строка 14 + отдельный пак (с ja→ru) | D39.37(5), D39.64 |
+| 34а | **Экран кодировки не видит `` без XML-объявления** (епаб с gb18030-метой прочтётся как UTF-8) — до-паковая дыра, сознательно не тронута пачкой 14а (паритет со старым ридером) | бэкенд | когда-нибудь | отдельное решение | D39.54, SMALLPACK §8 |
+| 35 | **Не-CJK майнер/банк**: en-детектора не существует (hanRuns=0), ja с zh-таблицами активно неверен (0/10); нужен второй ДЕТЕКТОР (прототип `mine_nonhan.py`) + G1–G10 требования generic-майнера (вкл. квадратичность G9 ≈4.6 ч) | бэкенд | когда-нибудь | отдельный пак generic-майнера (с ja→ru) | D39.37(8), D39.43, D39.50 п.8, POLYGON_PREMEASURE §6 |
| 36 | Кластеризация майнера глотает родовые титулы (族长/学堂家老 в кластере 葛家) — закрыто на границе сборки входа, сама кластеризация не чинилась | бэкенд | когда-нибудь | отдельное решение | D39.43, D39.45 |
-| 36б | Второе мнение по банку: рецензент ДРУГОЙ моделью, несогласия — отдельной колонкой подписной таблицы (судья-с-декоем в роли рецензента; решает владелец, D39.46-ограничение не бьёт) | бэкенд/полигон | когда-нибудь | отдельный дизайн (Р4) | D39.58, D39.51 п.4 |
-| 36г | Проводной формат каналов пересказан прозой в каждом пар-промпте, парсер в Go, связи нет — формат в шаблон движка (`{{banknote_format}}`); линты держат класс, дублирование остаётся | бэкенд | когда-нибудь (со следующей правкой промптов) | отдельное решение (Р5) | D39.58 |
-| 37 | Квадратичности: `AttachKWIC` (16.8 с / 2000 кандидатов; фикс — многошаблонный поиск) + src-правило банкноты при промахе чанк-пути (строка × длина книги; на 10 главах не видна) | бэкенд | когда-нибудь | отдельное решение | D39.45, PACK20_BANK_BUILD §8.5.1, D39.58 |
+| 36б | **Второе мнение по банку**: рецензент ДРУГОЙ моделью, несогласия — отдельной колонкой подписной таблицы (судья-с-декоем в роли рецензента; решает владелец, D39.46-ограничение не бьёт) | бэкенд/полигон | когда-нибудь | отдельный дизайн (Р4) | D39.58, D39.51 п.4 |
+| 36г | **Проводной формат каналов пересказан прозой в каждом пар-промпте, парсер в Go, связи нет** — формат в шаблон движка (`{{banknote_format}}`); линты держат класс, дублирование остаётся | бэкенд | когда-нибудь (со следующей правкой промптов) | отдельное решение (Р5) | D39.58 |
+| 37 | **Квадратичности: `AttachKWIC`** (16.8 с / 2000 кандидатов; фикс — многошаблонный поиск) + src-правило банкноты при промахе чанк-пути (строка × длина книги; на 10 главах не видна) | бэкенд | когда-нибудь | отдельное решение | D39.45, PACK20_BANK_BUILD §8.5.1, D39.58 |
| 38 | Смета не видит пере-покупку прохода терминолога на каждой итерации подписи (роль не пишет `chunk_status`, не видна `projectRebill`) | бэкенд | когда-нибудь | отдельное решение | D39.45, PACK20_BANK_BUILD §8.5.2 |
| 39 | S12 частичен: `malformedSeparatorAt` не ловит подмену слова разделителя и обрыв токена (комментарий обещает) | бэкенд | когда-нибудь | отдельное решение | D39.45, PACK20_BANK_BUILD §8.5.3 |
| 40 | `bankTokenBudget`: worst-case зашит zh→ru (признанная утечка §0; CJK-цель недобирает вдвое) | бэкенд | когда-нибудь | отдельное решение | D39.45, PACK20_BANK_BUILD §8.5.4 |
@@ -74,35 +73,40 @@
| 46 | Гейт черновика: 38/40 дефектов латиницы живут в черновиках вне охвата гейтов (`waverun.go:486`) — отдельный и не срочный вопрос | бэкенд | когда-нибудь | отдельное решение | D39.39(д) |
| 47 | M2-кэш / доктрина Д2 — кандидат на отдельную ратификацию | оркестратор/бэкенд | когда-нибудь | отдельное решение | D39.42 |
| 48 | Направленная банкнота — вернуться по замеру покрытия терминолога | бэкенд | когда-нибудь | отдельное решение | D39.42 |
-| 48а | Серийный шаринг банка — РЕАЛИЗАЦИЯ (экспорт подписанного глоссария как сид-YAML следующей книги серии; спойлер-окна плющатся в since_ch=0); контракт round-trip держится тестом, самой фичи нет | бэкенд | когда-нибудь (перед второй книгой серии) | отдельное решение | D39.42 задел (а), PACK20_BANK_BUILD З-а |
-| 48б | Импорт «оригинал + чужой перевод» как режим данных терминолога (target-агностичный вход есть контрактом; сам режим + провенанс источника + юр-сторона в юр-пакете) | бэкенд/владелец | когда-нибудь | отдельное решение + Ф2.5 (юр) | D39.42 задел (б), PACK20_BANK_BUILD З-б |
-| 49 | Этапы Б+В спеки D15.2 (content-addressed resume / `guard_hash` — D39.31 сознательно не строил) ; этап В = tmctl export-контракт D29.1 (annot-v1 · цвет-мап+rollup · политика красных fail-closed) + операторский протокол-документ релиза гендер-твиста (D5.1): сам механизм УЖЕ построен — until_ch-правка → точечный re-edit со сметой и $0-пере-пином (`repin.go`/`rebill.go`, D39.42 п.5/D39.45) | бэкенд | когда-нибудь | отдельное решение | D39.34(4), D33 п.5 |
-| 49а | ALTER-шаги миграций v8–v14 не идемпотентны вопреки шапке `migrate.go:9-11` (полу-применённая БД не сходится; счётчик версий скрывает) — находка критика полноты пака-19 | бэкенд | когда-нибудь | отдельное решение | D39.56, PACK19_BUILD §6.9 |
+| 48а | **Серийный шаринг банка** — РЕАЛИЗАЦИЯ (экспорт подписанного глоссария как сид-YAML следующей книги серии; спойлер-окна плющатся в since_ch=0); контракт round-trip держится тестом, самой фичи нет | бэкенд | когда-нибудь (перед второй книгой серии) | отдельное решение | D39.42 задел (а), PACK20_BANK_BUILD З-а |
+| 48б | **Импорт «оригинал + чужой перевод» как режим данных терминолога** (target-агностичный вход есть контрактом; сам режим + провенанс источника + юр-сторона в юр-пакете) | бэкенд/владелец | когда-нибудь | отдельное решение + Ф2.5 (юр) | D39.42 задел (б), PACK20_BANK_BUILD З-б |
+| 49 | **Этапы Б+В спеки D15.2** (content-addressed resume / `guard_hash` — D39.31 сознательно не строил) ; этап В = tmctl export-контракт D29.1 (annot-v1 · цвет-мап+rollup · политика красных fail-closed) + операторский протокол-документ релиза гендер-твиста (D5.1): сам механизм УЖЕ построен — until_ch-правка → точечный re-edit со сметой и $0-пере-пином (`repin.go`/`rebill.go`, D39.42 п.5/D39.45) | бэкенд | когда-нибудь | отдельное решение | D39.34(4), D33 п.5 |
+| 49а | **ALTER-шаги миграций v8–v14 не идемпотентны вопреки шапке `migrate.go:9-11`** (полу-применённая БД не сходится; счётчик версий скрывает) — находка критика полноты пака-19 | бэкенд | когда-нибудь | отдельное решение | D39.56, PACK19_BUILD §6.9 |
| 50 | F3-остаток идемпотентности | бэкенд | когда-нибудь | отдельное решение | D39.34(4) |
| 51 | `human_override` LOCK (D29 п.1г, в коде 0 вхождений) | бэкенд | когда-нибудь | отдельное решение | D39.34(4) |
-| 52 | Ф2-гейты вне идеала: морфо-гейты канцелярита + L1-лемматизация (python-сайдкар) · полный OpenCC · опциональный пре-перевод гейт ; состав явно: канцелярит + РОД (строка 82) + класс Ф2-гейтов карты 04-unhappy (обсцен-гейт/феминитивы/время сцены — состав решить паком) ; + класс идиоматики (свип-хвост, D39.73): сехоуюй-словарь · вэньянь-классификатор (zh) · васэй-эйго ложные друзья (к ja-паку 81) — данные пары или закрытие «банк книги покрывает» тем же паком | бэкенд | когда-нибудь | отдельное решение | D39.34(4) |
-| 53 | Мелкие хвосты качества одним паком: ledger-очередь LOW/NOTE (D39.4) · остаток фикс-листов D23 п.4 / D28 п.3(б) · `editor-mono.md` DORMANT · gofmt-нит `llm.go` (+3 теста) ; + внутрифайловый дубль ключа pair-файла → громкая ошибка (PACK15 §Внутрифайловый) | бэкенд | в работе (промт выдан D39.79) | `BACKEND_SMALLPACK_TAILS_SESSION_PROMPT.md` | D39.34(5), D39.45 |
+| 52 | **Ф2-гейты вне идеала**: морфо-гейты канцелярита + L1-лемматизация (python-сайдкар) · полный OpenCC · опциональный пре-перевод гейт ; состав явно: канцелярит + РОД (строка 82) + класс Ф2-гейтов карты 04-unhappy (обсцен-гейт/феминитивы/время сцены — состав решить паком) ; + класс идиоматики (свип-хвост, D39.73): сехоуюй-словарь · вэньянь-классификатор (zh) · васэй-эйго ложные друзья (к ja-паку 81) — данные пары или закрытие «банк книги покрывает» тем же паком | бэкенд | когда-нибудь | отдельное решение | D39.34(4) |
+| 53 | **Мелкие хвосты качества одним паком**: ledger-очередь LOW/NOTE (D39.4) · остаток фикс-листов D23 п.4 / D28 п.3(б) · `editor-mono.md` DORMANT · gofmt-нит `llm.go` (+3 теста) ; + внутрифайловый дубль ключа pair-файла → громкая ошибка (PACK15 §Внутрифайловый) | бэкенд | в работе (промт выдан D39.79) | `BACKEND_SMALLPACK_TAILS_SESSION_PROMPT.md` | D39.34(5), D39.45 |
| 54 | Масштаб целой книги: волны/каденс/потолки/ETA на сотнях глав (гоняли максимум 10; книга 7,78 млн симв., ~2284 раздела) | бэкенд | когда-нибудь (последним по курсу) | МАСШТАБ | D39.33, CURRENT-STATE |
| **— ПОЛИГОН (кандидаты пакетов) —** | | | | | |
-| 55 | `dialogue_dash` мерить только на невиданном тексте (подогнан под 蛊真人; цифры мини-прогона аргументом не считаются) ; расширено до вне-претрейн чекпоинта целиком: r-коэффициенты exp01/08 · precision чекеров · частота эха · чистовик exp15-выводов ; + arity-полоса паспорта (D29.2г): решить — dialogue_dash покрывает диалоговую половину или мерить (D39.73) | полигон | скоро | полигон-пакет | D39.37(4), D39.40, D39.46 |
+| 55 | **`dialogue_dash` мерить только на невиданном тексте** (подогнан под 蛊真人; цифры мини-прогона аргументом не считаются) ; расширено до вне-претрейн чекпоинта целиком: r-коэффициенты exp01/08 · precision чекеров · частота эха · чистовик exp15-выводов ; + arity-полоса паспорта (D29.2г): решить — dialogue_dash покрывает диалоговую половину или мерить (D39.73) | полигон | скоро | полигон-пакет | D39.37(4), D39.40, D39.46 |
| 56 | Ёфикатор/санитайзер-классы не размечены (§6.5 отчёта пакета-6) | полигон | когда-нибудь | полигон-пакет | D39.46, CURRENT-STATE |
| 57 | Пере-замер «контексты — главный рычаг» на трудной выборке пакета-7 с боевой сборкой (до него kwic не трогать) — напряжение с D39.46 названо, не отменено | полигон | когда-нибудь | полигон-пакет | D39.50 |
-| 58 | Не покрыто пакетом-8: вторая книга/пара/модель · строка `drafts:` · ось `batch_runes` · разметчики-модели (не люди) · precision роли на «расширенном, но осмысленном» материале ; + контрастивный регрессионный сьют по каталогам режимов отказа (12-*) · чистовик exp15-выводов | полигон | когда-нибудь | полигон-пакет | POLYGON_PREMEASURE §1.8/§2.5/§3.5/§7.6 |
-| 59 | Вендор-чек префикс-кэша ZAI/GLM (на нём стоит вся кэш-экономика W1/Q2c) ; + GLM context-overflow гард (finish=model_context_window_exceeded — NOT-do пака-12 без решения) ; + Mistral-strip гейт message-builder (research/21 §1.1: extra_forbidden на reasoning-поля; ЛАТЕНТЕН при нашем single-shot wire — гейт перед прод-путём mistral в канале B / любым multi-turn; D39.74) | полигон | когда-нибудь (до МАСШТАБА) | полигон-пакет | D39.34(6) |
+| 58 | **Не покрыто пакетом-8**: вторая книга/пара/модель · строка `drafts:` · ось `batch_runes` · разметчики-модели (не люди) · precision роли на «расширенном, но осмысленном» материале ; + контрастивный регрессионный сьют по каталогам режимов отказа (12-*) · чистовик exp15-выводов | полигон | когда-нибудь | полигон-пакет | POLYGON_PREMEASURE §1.8/§2.5/§3.5/§7.6 |
+| 59 | **Вендор-чек префикс-кэша ZAI/GLM** (на нём стоит вся кэш-экономика W1/Q2c) ; + GLM context-overflow гард (finish=model_context_window_exceeded — NOT-do пака-12 без решения) ; + Mistral-strip гейт message-builder (research/21 §1.1: extra_forbidden на reasoning-поля; ЛАТЕНТЕН при нашем single-shot wire — гейт перед прод-путём mistral в канале B / любым multi-turn; D39.74) | полигон | когда-нибудь (до МАСШТАБА) | полигон-пакет | D39.34(6) |
| 60 | Scheduler-aware волны под peak-valley DeepSeek (прямой COGS-рычаг) | полигон/бэкенд | когда-нибудь (до МАСШТАБА) | отдельное решение | D39.34(6) |
-| 61 | Прайс/wire-гигиена: продление `prices_checked` без правки чисел · гейтнутые платные армы (edit-единица >3200 и др.) · wire-probe temperature в thinking-канале DeepSeek | полигон | когда-нибудь | полигон-пакет | D39.34(6) |
+| 61 | **Прайс/wire-гигиена**: продление `prices_checked` без правки чисел · гейтнутые платные армы (edit-единица >3200 и др.) · wire-probe temperature в thinking-канале DeepSeek | полигон | когда-нибудь | полигон-пакет | D39.34(6) |
| **— Ф2.5 / ПИЛОТ / ПРОД —** | | | | | |
| 62 | Билингв-якорь (D25 п.9 Q1) | владелец | когда-нибудь | Ф2.5 | D25 п.9, CURRENT-STATE |
| 63 | Контаминация корпуса (D27 п.4) | владелец/полигон | когда-нибудь | Ф2.5 | D27 п.4, CURRENT-STATE |
| 64 | Судья-дублёр (D22.6) | бэкенд | когда-нибудь | Ф2.5 | D22.6, CURRENT-STATE |
-| 65 | Планка запуска ≤2 не пройдена rerun2 — итерация №2 редакторского экспа отложена (dspro ИНТЕРИМ, glm-5 резерв) ; инструментарий слепого чтения = D39.8(3) + гигиена D39.20 | владелец | когда-нибудь (первый прогон добора идеала) | добор идеала / отдельное решение | D39.20, D39.22, CURRENT-STATE |
+| 65 | **Планка запуска ≤2 не пройдена rerun2** — итерация №2 редакторского экспа отложена (dspro ИНТЕРИМ, glm-5 резерв) ; инструментарий слепого чтения = D39.8(3) + гигиена D39.20 | владелец | когда-нибудь (первый прогон добора идеала) | добор идеала / отдельное решение | D39.20, D39.22, CURRENT-STATE |
| 66 | Пилотные D25-гейты: publishable/waiver (п.1) · FN-bound L3 (п.4) | владелец | когда-нибудь | Ф2.5 | D25, CURRENT-STATE |
-| 67 | Прод-гигиена: юр-пакет · провенанс 12-*-доков · xAI-ключ off перед продом (D27) ; + юрисдикционные annex-ре-чеки при новых рынках (D39.29) + поле «версия исходника» book.yaml на интейке (04-unhappy §5) | владелец | когда-нибудь | Ф2.5 | D27, CURRENT-STATE |
+| 67 | **Прод-гигиена: юр-пакет · провенанс 12-*-доков · xAI-ключ off перед продом** (D27) ; + юрисдикционные annex-ре-чеки при новых рынках (D39.29) + поле «версия исходника» book.yaml на интейке (04-unhappy §5) | владелец | когда-нибудь | Ф2.5 | D27, CURRENT-STATE |
| 68 | Residual-тачпойнты exp16, не влитые в сид-дельту: мини-голд алиасов · precision@30 (`books/gu-zhenren/exp16/`) | полигон | когда-нибудь | Ф2.5 / полигон-пакет | CURRENT-STATE |
| **— Ф3 / ПРОДУКТ —** | | | | | |
| 69 | Gemini API «под-18» обязательство на конечный продукт (независимо от лейблов) | владелец | когда-нибудь | Ф3 / отдельное решение | D39.32, D39.34(7) |
| 70 | Action-security gate перед выдачей tools/webfetch (D25 п.5) | бэкенд | когда-нибудь | Ф3 | D39.34(7) |
-| 71 | Планы research/22: epub-tag-rewrite · Q7-леджер ; + F3-brief из D29.3 (chat-edit · Not-useful-петля · cost-of-fix) + Ф3-скоуп 02-mvp-plan (TMX/TBX · Bertalign · дистилляция 7–14B) | бэкенд | когда-нибудь | Ф3 | D39.34(7) |
+| 71 | **Планы research/22**: epub-tag-rewrite · Q7-леджер ; + F3-brief из D29 п.3 (chat-edit · Not-useful-петля · cost-of-fix) + Ф3-скоуп 02-mvp-plan (TMX/TBX · Bertalign · дистилляция 7–14B); + V5: фронт ВЕБ-ПЕРВЫЙ, SEO/ранжирование (куки · страницы-сироты · актуальные алгоритмы Google) — определяет выбор фреймворка (SSR vs SPA), в Ф3-дизайн ДО выбора стека (ПТ-23) | бэкенд | когда-нибудь | Ф3 | D39.34(7), START_PROMT V5, D39.80 |
+| 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 · счётчик ролей канонизирован.
+
## Оркестратор №9 + бэкенд — СТОПГЭП ЗАЛЕНДЕН, FINDING-1 ЗАКРЫТ (D39.77), 02.08
Мини-касание принято: мн. парадигма «Винного червя» в сиде (формы «Фан Юань» там уже были с 24.07 — честное уточнение сессии), гвоздь Линь/линий + позитив-тест «Фан Юаню» (2 тест-файла, ядро/голден не тронуты). Находка сессии: coldrun был СИДЛЕСС ⇒ прод-разрыв ещё меньше отчётного. Политика подписи уточнена (D39.77): банк — автономен без подписи (в силе); в сиде подпись владельца только за ВКУСОВЫМИ полями, детерминированная морфология — приёмкой оркестратора. Строка 91 закрыта.
diff --git a/docs/README.md b/docs/README.md
index 260d3cef..fa23c25d 100644
--- a/docs/README.md
+++ b/docs/README.md
@@ -1,27 +1,24 @@
# TextMachine — документация
-Проект: бэкенд (позже — фронтенд-IDE) художественного перевода крупных текстов (книги, ранобэ, вебновеллы; zh/ja/en→ru) через мультиагентный пайплайн поверх LLM API. Стартовый бриф: [../START_PROMT.MD](../START_PROMT.MD). Онбординг Claude-сессий: [../CLAUDE.md](../CLAUDE.md).
+Проект: издательский художественный перевод крупных текстов (книги, ранобэ, вебновеллы; zh/ja/en→ru) мультиагентным пайплайном поверх LLM API. Go-бэкенд + веб-фронт ридер-IDE (Ф3). Цели и мерило — канон в [../CLAUDE.md](../CLAUDE.md); онбординг сессий — там же. Стартовый бриф владельца: [../START_PROMT.MD](../START_PROMT.MD) — **живой документ**, его V-идеи разобраны в реестр требований (ниже).
-Ключевые цели:
-1. Максимальное художественное качество — победить «нехудожественность» AI-переводов.
-2. Низкая себестоимость: пайплайн из дешёвых моделей + редкие адресные вызовы дорогих.
-3. Банк памяти / глоссарий на всю книгу — консистентность имён, терминов, стиля.
-4. Обработка 18+ с учётом цензуры провайдеров (мультипровайдерность).
-5. Телеметрия токенов/стоимости/качества с первого дня.
+**Состояние проекта НЕ здесь.** Очередь, курс, бэклог — CURRENT-STATE в шапке [PROGRESS.md](PROGRESS.md); решения — [architecture/05-decisions-log.md](architecture/05-decisions-log.md) (при конфликте с любым доком побеждает он). Эта страница — только карта «что где лежит».
-## Структура
+## Карта
-- `architecture/` — синтез. **Источник истины по решениям — [`05-decisions-log.md`](architecture/05-decisions-log.md) (D1–D39.77); при конфликте с любым доком он выше.**
- - `01-decisions.md` — принципы Р1–Р10; `02-mvp-plan.md` — фазы и приёмка (v3, 09.07); `03-implementation-notes.md` — контракты Фазы 0; `04-unhappy-paths.md` — ~70 режимов отказа → механизм; `06-memory-risk-registry.md` — реестр рисков банка памяти; **[`09-target-architecture.md`](architecture/09-target-architecture.md) — целевая 7-слойная архитектура (D39; статус стройки — шапка-таблица; инвариант общности §0.1)** · [`10-prompt-architecture.md`](architecture/10-prompt-architecture.md) — консолидированная промпт-заметка (концерн 4) · [`12-go-style-notes.md`](architecture/12-go-style-notes.md) — норматив общности §0 + Go-ответы · [`13-tech-debt-anchors.md`](architecture/13-tech-debt-anchors.md) — якоря техдолга (справочник к бэклогу, НЕ трекер). **Исполненные (архив 25.07, санкция владельца, → `archive/architecture/`):** [`07-strategic-review.md`](archive/architecture/07-strategic-review.md) (стратаудит 09.07 — курс исполнен) · [`08-sync-audit-ledger.md`](archive/architecture/08-sync-audit-ledger.md) (ледджер синк-аудита — отработан) · [`11-implementation-plan.md`](archive/architecture/11-implementation-plan.md) (план пака-11 — исполнен целиком); `components.puml`/`pipeline.puml` — диаграммы (перерисованы 25.07 под пост-пак-16 реальность: волновой исполнитель, пакетный сплит пака-15, repair-петля за `enabled:false`, generic content-labels D39.25; владелец смотрит PlantUML-расширением VS Code; вручную НЕ рендерить).
-- `experiments/` — эмпирика «Полигона»: `00-provider-quirks` (читать перед любым вызовом провайдера), `01-token-calibration`, `02-refusal-benchmark`, `03-local-stand`, `04-editor-quality`, `06-local-extraction`, `07-coverage-precision`, `08-cost-model-v2` (актуальная денежная модель), `09-pilot-protocol` (пилот Ф2.5 + поправки D13), `10-explicit-benchmark` (18+ violence-рука канала B), `11-erotica-benchmark` (erotica по трём парам/регистрам — закрытие D14.4, D22), `12-quality-diagnosis`/`13-translator-bakeoff`/`14-quality-empirics`/`14b-meaning-battery` (дуга качества «мерить→строить», закрыты → D30/D32/D37/D38), `15-segmentation-empirics` (exp15: когезия под floor-шумом, фертильность — закрыт → D39.7/D39.8), `16-bank-mining` (exp16: WHICH/WHAT банк-майнинга — закрыт → D39.10).
-- `research/` — фактура исследований 04–05.07: `01–10` базовые, `11-gap-*` добор критиком, `12-*` режимы отказа/отзывы/таксономии (+ два внешних материала с провенанс-шапками), `13` валидация памяти, `14` адаптивная память, `15` голос и состояние (принят, D21), **`16` ридер-IDE (принят с ревью-шапкой, D29)**, **`17` внешняя критика GPT-5.6 (принят с ревью-шапкой, D25)** — у 16/17 читать шапку прежде тела. **`18` рычаги качества (два отчёта, D36)** · **`19` нарезка+когезия+контракт t/e (D39.1)** · **`20` банк-майнинг W1.5 (D39.6)** · **`21` обзор LLM-транспорта чужих харнессов (23.07: наш транспорт опережает/вровень со всеми 11)** · **`22` доменные харнессы перевода (24.07: калибрующий — ядро подтверждено, впереди COGS/18+/общность/измеренность, позади Q4-выпуск и gate+repair-петля; сиквел `02`/`05`)** — у всех ревью-шапки. ⚠ Часть под superseded-баннерами (01/02/03/04/05/09 и gap-1/2/5) — **читай баннер прежде содержимого**.
-- `PROGRESS.md` — **журнал** (CURRENT-STATE сверху, ниже хронология; НЕ источник решений).
-- **Активные хендофф-промты (01.08; всё остальное — в `archive/prompts/` с баннерами-исходами):** [`ORCHESTRATOR_SESSION_PROMPT.md`](ORCHESTRATOR_SESSION_PROMPT.md) (роль/нормы; состояние НЕ дублирует) · [`BACKEND_CHECKER_PACKAGE_SESSION_PROMPT.md`](BACKEND_CHECKER_PACKAGE_SESSION_PROMPT.md) (**ТЕКУЩИЙ бэкендный**: пакет-чекеров против labels + чистка ведра D — фикс-пак заленден, МОЖНО ЗАПУСКАТЬ) · [`POLYGON_PACKAGE4_SESSION_PROMPT.md`](POLYGON_PACKAGE4_SESSION_PROMPT.md) (residual-трекер пилота/18+/echo, отложен; P4-хвост из него закрыт D39.61). Закрытые 30.07–01.08 (промты в `archive/prompts/`, отчёты с ревью-шапками в `archive/reports/`): пак-19 «голос/состояние» (D39.54–56) · холодный мини-прогон (D39.58) · ToS-речек (D39.57) · ресёрч общности фаза 1 (D39.60) · полигон Р6+P4 (D39.61) · **фаза 2 общности (D39.64)** · **полигон «сырьё арки банка»+пробы (D39.65)** · **качество банка, оба этапа (D39.69)** · **фикс-пак банка (D39.75)**.
-- `archive/` — `prompts/`: закрытые сессионные промты (только история, инструкции оттуда не исполнять) · `reports/`: отчёты паков/ресёрч-сессий с ревью-шапками (живая фактура приёмок — на них ссылаются D-лог и активные промты) · `architecture/`: исполненные арх-доки (07 стратревью · 08 синк-ледджер · 11 план пака-11) · четыре слайса хроники `PROGRESS-2026-07-{04-10,10-13,13-25,25-31}.md`.
-
-## Статус (2026-08-01, голова D39.77 — эра «общность → качество банка»)
-
-Полная карта состояния НЕ здесь: фазы/курс/очередь/горизонт — в шапке [`PROGRESS.md`](PROGRESS.md) (CURRENT-STATE + единый бэклог), решения — в [`architecture/05-decisions-log.md`](architecture/05-decisions-log.md) (карта актуальности; свежая голова — с хвоста файла). Коротко: Ф0/Ф1 ✅ · арх-ресет D39 (паки 11–16) ✅ · паки 17–20 ✅ · мини-прогон и холодный прогон приняты (D39.37/58) · карта языковой привязки движка снята (D39.60: книго-ось чиста; ja→ru безопасна без правки Go, en→ru — нет) · Р1–Р4 закрыты (D39.63) · пак-21 растворён (D39.62) · **фаза 2 общности принята (D39.64: цель/скрипт-швы по данным, эмбед-хеш, манифест-по-каналам; голден вердикт-нейтрален)**. Полигон-ветка закрыта D39.65 (строки 21/22, фиксы 36а/36в проверены живьём). Банк готов целиком (D39.69 ядро + D39.75 фикс-пак; вопросы §9 закрыты D39.70). Текущее: пакет-чекеров — можно запускать; finding-1 закрыт (D39.77). Свип полноты исполнен и пост-сверен кодом (D39.66: 951 обязательство, потери возвращены; якоря — architecture/13). ⚠ DeepSeek-0731 сменил веса под слагом — платные прогоны СТОП до ре-пробы (бэклог-строка 74). Дальше: стройка банка ∥ пакет-чекеров → ре-проба flash → ДОБОР ИДЕАЛА (мини-прогон и свип гипотез влиты, D39.67) → вторая пара (ja→ru) → МАСШТАБ → пилот Ф2.5 → Ф3 ридер-IDE.
+- [glossary.md](glossary.md) — жаргон и сокращения (D-номер, паки, банк, голден, K/DC/H/L…) одним экраном.
+- [product-requirements.md](product-requirements.md) — реестр «что продукт обязан уметь»: START_PROMT V0–V5 + находки H6–H18, статусы сверены кодом.
+- `architecture/` — синтез и контракты:
+ - [05-decisions-log.md](architecture/05-decisions-log.md) — **источник истины по решениям**. Читать: карта актуальности (шапка) + живая голова (с хвоста); корпус D1–D38 — справочник по ссылкам/grep, целиком не читать.
+ - [09-target-architecture.md](architecture/09-target-architecture.md) — целевая 7-слойная архитектура (статус стройки — шапка-таблица; §3 — карта находок H/L) · [10-prompt-architecture.md](architecture/10-prompt-architecture.md) — промпт-слой · [12-go-style-notes.md](architecture/12-go-style-notes.md) — норматив общности §0 · [13-tech-debt-anchors.md](architecture/13-tech-debt-anchors.md) — якоря техдолга (справочник к бэклогу, НЕ трекер).
+ - Исторические, читать через ⚠-баннеры: [01-decisions.md](architecture/01-decisions.md) (Р1–Р10) · [02-mvp-plan.md](architecture/02-mvp-plan.md) · [03-implementation-notes.md](architecture/03-implementation-notes.md) · [04-unhappy-paths.md](architecture/04-unhappy-paths.md) · [06-memory-risk-registry.md](architecture/06-memory-risk-registry.md).
+- `experiments/` — эмпирика полигона: [00-provider-quirks.md](experiments/00-provider-quirks.md) — **читать перед любым вызовом провайдера**; [08-cost-model-v2.md](experiments/08-cost-model-v2.md) — денежная модель; [09-pilot-protocol.md](experiments/09-pilot-protocol.md) — пилот Ф2.5; остальные 01–16 — отчёты закрытых экспериментов (судьба — в баннерах/D-логе).
+- `research/` — фактура ресёрчей 01–22; у принятых — ревью-шапки, часть тел под ⚠ superseded: **читай баннер прежде содержимого**. Ключевые для навигации: 15 голос · 16 ридер-IDE · 17 внешняя критика · 18 рычаги качества · 19 нарезка · 20 банк-майнинг · 21 обзор транспорта · 22 доменные харнессы.
+- [PROGRESS.md](PROGRESS.md) — журнал: CURRENT-STATE + **ЕДИНЫЙ БЭКЛОГ** (единственный трекер) + живой хвост хроники. НЕ источник решений.
+- Активные хендофф-промты сессий (состав обновляется при каждом лендинге — норма D39.80): [ORCHESTRATOR_SESSION_PROMPT.md](ORCHESTRATOR_SESSION_PROMPT.md) (роль/нормы; состояния не дублирует) · [BACKEND_SMALLPACK_TAILS_SESSION_PROMPT.md](BACKEND_SMALLPACK_TAILS_SESSION_PROMPT.md) (текущий бэкендный) · [POLYGON_PACKAGE4_SESSION_PROMPT.md](POLYGON_PACKAGE4_SESSION_PROMPT.md) (полигон, отложен).
+- `archive/` — история ([правила архива](archive/README.md)): закрытые промты (`prompts/`) · отчёты с ревью-шапками (`reports/` — на них ссылаются приёмки) · исполненные арх-доки (`architecture/`) · слайсы хроники `PROGRESS-*.md`. Инструкции оттуда не исполнять.
+- Диаграммы: [../backend/docs/components.puml](../backend/docs/components.puml) · [../backend/docs/pipeline.puml](../backend/docs/pipeline.puml) — дом рядом с кодом (D39.80), правятся бэкендом одним коммитом с кодом; вручную НЕ рендерить (владелец смотрит PlantUML-расширением VS Code).
## Доступные ключи от моделей
+
DEEPSEEK_API_KEY, ZAI_API_KEY, KIMI_API_KEY, OPENAI_API_KEY, GEMINI_API_KEY, XAI_API_KEY, MISTRAL_API_KEY
diff --git a/docs/architecture/05-decisions-log.md b/docs/architecture/05-decisions-log.md
index dfc793d5..10f84f75 100644
--- a/docs/architecture/05-decisions-log.md
+++ b/docs/architecture/05-decisions-log.md
@@ -1,7 +1,7 @@
-# Журнал решений оркестратора — контракт D1–D39.79 (развязки 04.07 · пакеты 09–10.07 · приёмка/качество-первым/пивот/эмпирика 11–12.07 · арх-ресет+стройка пере-прогонного стека 13–19.07)
+# Журнал решений оркестратора — контракт D1–D39.80 (развязки 04.07 · пакеты 09–10.07 · приёмка/качество-первым/пивот/эмпирика 11–12.07 · арх-ресет+стройка пере-прогонного стека 13–19.07)
> **⟶ КАРТА АКТУАЛЬНОСТИ (ревизия D31, продлена до D38.2 [12.07]; исторические записи ниже НЕ переписываются — дисциплина D23.3).** Читая контракт целиком, держи под рукой, что чем перекрыто:
-> ⚠ **Навигация (актуализация 01.08):** карта ниже детально покрывает D1–D39.28; решения D39.29–63 живут хронологически в теле файла, **свежая голова — С ХВОСТА** (новые ноты аппендятся вниз). Сводка текущей головы и очередь — CURRENT-STATE в `../PROGRESS.md`.
+> ⚠ **Навигация (актуализация 01.08):** карта ниже детально покрывает D1–D39.28; решения D39.29+ живут хронологически в теле файла, **свежая голова — С ХВОСТА** (новые ноты аппендятся вниз). Сводка текущей головы и очередь — CURRENT-STATE в `../PROGRESS.md`.
> - **Полностью superseded:** **D1 (моно-редактор) → D17 → D30.1 (редактор БИЛИНГВ)** · D9 (ja-приёмка) → D18 (蛊真人 zh→ru; ja — второй прогон) · D17 → D30.1 · скобка D19.4 «ключ без data-sharing» и D20.3 «чистый ключ = блокер пилота» → **D27** (единый ключ С data-sharing, отключение перед продом) · exp04-дефолт «editor grok-4.3» (D3) → D30.1 (grok reasoning-off из редакторских ролей СНЯТ — no-op; кандидат glm-5-билингв; gemini — премиум-эскалация только за санитайзером D30.3).
> - **Частично амендировано:** D3 (канал B → D14.1/D19.1 + оговорки D22.5/D22.6; апекс-слаг `-preview` — D22.4; draft под вопросом exp13 — D30.6) · D6 («off/minimal для draft/edit» эродирован: draft thinking-ON принудительно, editor-off снят D30.1; живы per-роль принцип и D6.2-буфер) · D10 (+D24.2 alias-слепое пятно, истинная консистентность ≈99.5%) · D11-числа → exp08 → **D30.4** (флип D1 = +15–25%, ~$0.85/ранобэ; «$1.5–2» = неподписанная опция Б) · D12 (+D24.3 флоры max_tokens; +D29.1в rollup — амендмент вердикт-правила) · D13.1-арм из решающего → ПОДТВЕРЖДАЮЩИЙ (D30.1); +D25.3 prefix-анализ судьи · D14.2 закрыт D19.1/D22.4; D14.4 закрыт D22.1 · D15.3 исполнен; спека D15.2: v2→v3→v3.1 (D22.2), реализация = текущий пакет (D30.9) · D24.4 +D28.1 (precision/recall-трейдофф; hard-gate требует пере-замера) · порядок D24.5 отложен D26.1 (этап B — после читаемых 25 глав).
> - **Живое ядро без изменений:** D2 (+новый гейт-класс D30.3), D4, D5, D7, D8, D10-механизм, D12-таксономия отказов, D16, D18, D19.1–19.2, D21 (Ф2-механизмы voice/address/reveal), D22.5–22.7, D23 (golden = инвариант №8), D24–D39.28 — действующая голова контракта (**D39.28 = ПАК-17 ЗАКРЫТ ЦЕЛИКОМ: третье действие `allow` (assert-only) построено ⇒ ратифицированная ПАРА `violence`/`sexually-explicit` выразима ДАННЫМИ; тройка `route|allow|terminal` несёт ОДИН инвариант и различается остальным; `accepts_labels` пусты = верное fail-closed до ФАКТОВ ToS по первоисточникам (пер-лейблу, зона полигона)**; **D39.27 = пак-17 фаза 2 ПРИНЯТ и залендён [механизм построен по всем 15 «ровно так»; golden байт-в-байт, парити EXACT, `-race`, ценз 433→451 диффом имён; мои три мутации пойманы именованными тестами]; форма добора B = гейт над резолвнутой моделью НЕЗАВИСИМО от `off` + generic-предупреждение `sourceEchoExposure`; **вокабуляр владельца = ПАРА `violence`/`sexually-explicit`** (сохраняет D14 п.1 и dspro-редактора) ⇒ обязательная дельта: третье значение `action` assert-only; Q2 редактор ОТЛОЖЕН с записью (связывает только explicit-книги); новая петля: лейбл НЕ доезжает до промпта — промпт-слой решается отдельно**; **D39.26 = дизайн пака-17 «generic content-labels × provider-capabilities» ратифицирован В РЕДАКЦИИ §14 отчёта [лейблы НЕ входят ни в один хеш — назначенный слой D20.2-Q3 = резолвнутая модель стадии пер-стадийно/пер-волново · резолв ДО валидации, «достижимое» лейбл-зависимо · один хоп `chain[0]`, `len>1` громко, `budget_usd>0` обязателен · Q1 = книга по аргументу ГАРАНТИИ · вокабуляр `content_labels`(книга)/`accepts_labels`(модель, `*[]string` только сужает) · `permissive`+`Stage.Channel`+enum+блок D4.1 отставляются ОДНИМ диффом · `failover.go` удаляется · отказы за `forWrite`, резолв всегда]; добор оркестратора: единый лейбл «adult» схлопывает violence-развязку D14 п.1 → вокабуляр владельцу · `reasoning:"off"` — тихий выход из аддитивного И эхо-гейта на xai (обобщение D19.1 п.2 в данные не доехало) · рейт-гард деградирует молча; НА ВЛАДЕЛЬЦЕ: вокабуляр лейблов + Q2 редактор; D22.7 паком НЕ снимается**; **D39.25 = в движке НЕТ понятия 18+ [generic content-labels × provider-capabilities, refusal причино-агностичен, «adult» = значение данных; §0 п.6]**; **D39.24 = дизайн пака-16 diff-редактора ратифицирован с перестановкой: $0-части (позиционная детекция · read-only скан · фиксы ru_hours_re/半个时辰) строим, платная машинерия §D3–D5+§15.2 под enabled:false, включение = решение владельца по замеру остатка пост-профилактики; поправки §15.2 (позитивный ре-гейт+анти-удаление · счётчики из role='repair' без миграции · отбрасывание пересечений · reserve-деградация · classify-гард); ru-target-долг = ограничение**; **D39.23 = пак-15 «структура+форма» ратифицирован [хойст text/value-базы → сплит miner/checks/membank/chunk по ИЗМЕРЕННОЙ связности (прил. A пака-14 с поправкой ревью-шапки) · форм-фиксы Export/RequestHash/resolveChunkState · конфиг-слой пары (пар-калибровки из ран-конфигов, промпт-резолв конвенцией) · overlay-хвосты, unionStringMap-коллизия = громкая ошибка; §1 12-go-style амендирован; байт-точность+парити EXACT; crush-масштаб НЕ эмулируем]**; **D39.22 = эксп пере-прогона ЗАКРЫТ решением владельца; итерация №2 ОТЛОЖЕНА [её вопросы — довесок следующего платного прогона]; редактор = deepseek-v4-pro ИНТЕРИМ [судья №1 · проза/глоссарий · дефекты чинибельны · ×2 дешевле], glm-резерв, дефолт-конфиг при лендинге пака-13; курс = разработка бэкенда [масштаб книги · канал B · Ф2-механизмы · ja→ru §B5]**; **D39.21 = стайл-решения владельца: меры → единицы языка читателя [时辰=2ч] · generic-«гу» СРЕДНИЙ род, именные — по-термово из банка · стихи СМЫСЛОМ · 资质=«талант»; + директива аудита полноты банк-инъекции**; **D39.20 = ПЕРЕ-ПРОГОН исполнен+прочитан [операционка вся живьём: $0-резюм драфта ×3 арма · echo 0 · $6.63<$15; судья dspro 0.679>glm 0.589>>mistral 0.232 при floor-шуме 0; слепые чтения ×2: сводные выборы разошлись, чисто-художественные ИДЕНТИЧНЫ = mistral 4/5 → анти-корреляция гладкость↔верность доказана трижды]; планка ≤2 НЕ пройдена → пилот не открыт; mistral ИСКЛЮЧЁН как несущий редактор [критические смысловые вне гейтов; голос = north-star промпта]; dspro-vs-glm НЕ ратифицирован [зазор ~шум] → итерация №2 после механизации [драфт $0]; дефект-классы→механика: 时辰-юнит-чекер · число-масштабы · broken-word/latin · заголовок-шаблон · банк-дельта 元/资质/赤城 · mined_delta-крэш-фикс [пак-13]; решения владельца: род «гу»/меры/стихи/春秋蝉; полигон: авто-QA ключевать слепыми метками**; **D39.19 = пере-прогон-преп ЗАЛЕНДЕН [6 фиксов: R1-FL-A CLI-exit-3 · R1-FL-B reject-set-livelock-закрыт · R1-FL-C x/text-в-Ш-2 · echo-сплит · read-model-naming · ниты]; golden version-only [masked=0]; парити EXACT; §8-манифест полон; gender-signoff закрыт; бэкенд готов к пере-прогону**; **D39.18 = blast-radius edit-единицы: c-lite (редактура чистого остатка вместо бланка всей единицы; вариант владельца (c)+fallback (b)) залендён `488c8d4`, no-flag путь байт-идентичен; + 4 read-модель-фикса пост-лендинг-ревью [quality-echo/status-first-flagged/export-pairs/detail], открытое решение владельцу = echo-метрика семантика; R1-FL-A/B/C deferred в пере-прогон-преп**; **D39.17-errata = runWave parent-cancellation баг [мой рубеж-2 пропустил, 2-я сессия поймала], фикс `5fc4860`**; **D39.17 = R1 драйвер-свитч ЗАЛЕНДЕН [волновой исполнитель черновик∥→банк-майнинг-стоп→редактура∥; редактор не пере-рендерит draft; Ш-1/Ш-2; golden-рерайт; read-модели per-unit]; полный рубеж-2 [5 линз вкл. синк-с-ресёрчем] = clean bill по несущим осям, 3 MINOR/NOTE-фикса (R1-FL-A CLI-exit-код · R1-FL-B mining-стоп-reject · R1-FL-C x/text-версия) в стенд-only mining-пути → пере-прогон-преп; ПАК-11 ЗАВЕРШЁН**; **D39.16 = арх-проход ЗАЛЕНДЕН: майнер-данные (百家姓/Палладий/частицы/суффиксы) вынесены в `internal/lang`+`configs/langpacks/` [граница компиль-enforced, байт-точно — парити EXACT, golden байт-идентичен]; FL-1/2/3+тест-путь; РАТИФИЦИРОВАНЫ 3 дивергенции: language.Tag ОТВЕРГНУТ [CLDR-инстабильность в вердиктах], DC-чекеры+снапшот-фолд DEFER [майнер offline/нейтральность]; общность структурно доказана; промт отработан→архив**; **D39.15 = директива владельца: изоляция языковых данных из `pipeline/` [движок общий · `internal/lang/`+`configs/langpacks/` данными-файлами · `x/text/language.Tag` вместо `isRuTarget` · снапшот-folded как промпты · алгоритмы не трогать]; архитектурный проход ПЕРЕД R1 [ре-секвенс]; поведенчески нейтрально zh→ru [golden байт-стабилен]; не минор-хант/не rewrite-ради-rewrite; промт `BACKEND_ARCH_CLEANUP_SESSION_PROMPT.md` 5-фазный [ресёрч→синтез→фикс-лист→исполнение→ревью]; ja→ru = тест общности §B5 позже**; **D39.14 = пак-11 continuation ПРИНЯТ и залендён [R2 майнер паритет-EXACT · R3 банкнота 12-точек · R4 DC-чекеры+export--pairs · R5 арм-конфиги · R1-аддитив; рубеж-2 D39.13-долга погашен: 3 MINOR/PARTIAL-находки [FL-1 bankTokenBudget-фолд · FL-2 banknote-телеметрия-резюм · FL-3 emission-top-N-кап], все латентны → R1-продолжение; R1 драйвер-свитч резидуал; clean bill по деньгам/wire/порту]**; **D39.13 = пак-11 Block A ПРИНЯТ и залендён [WS2 целиком (вкл. src→dst-блок редактора = закрытие D30.1) + WS1a/b/c-инфра + WS4-ядро; 2 девиации ратифицированы; резидуал R1–R5 в PACK11_REPORT; промт остаётся активным; рубеж-2 приёмки — долг]**; **D39.12 = план `architecture/11-implementation-plan.md` РАТИФИЦИРОВАН [три рубежа: ревью-2 F1–F11 → 7-агентный адверсариал → подтверждающий пас; пер-волновой снапшот + инвариант секвенирования = «переоплата ОДНА»; EditCeilingOut=3200; лемматизатор дефолт B; 4 гейтнутых арма]; бэкенд-пак ЕДИНОЙ сессией — `BACKEND_PLAN11_SESSION_PROMPT.md`**; **D39.11 = директива владельца: стройка ТОЛЬКО после дизайн-синтез сессии с верифицированными алгоритмами; хендофф №5**; **D39.10 = exp16: WHICH подтверждена [V-C recall 0.97, $0] / WHAT→банкнота+Палладий [canon-recovery <70%], 9B-споттер не нужен, Z1→облако, ре-аудит exp14b чист [errata не требуется]; исследовательская программа ЗАВЕРШЕНА → бэкенд-пак слоёв 1+4**; **D39.9 = Q4a: верность НЕ на translate-стадии [flash уже верен, pro ×3.67 не ратифицирован], смысл ломает glm-РЕДАКТОР [свап-арм приоритетен], DET-пол 0.261; exp14b-правила дефектны → $0-ре-аудит в exp16**; **D39.8 = слепое чтение: планка не пройдена никем, дефекты распределены [читатель подтвердил floor-null], битва качества → дефект-классы [时辰-юниты, числа, gender-enforce, стих, регистр]**; **D39.7 = exp15 залендён REV.2: «граница вредит» отозван [артефакт окна судьи], все когезия-эффекты под floor 0.126, «sequential нигде не лучше» LOO-stable [не ратифицированный зелёный свет], фертильность 1.20/0.39, $12.79/$15; гейт = слепое чтение владельца**; **D39.6 = research/20 банк-майнинг залендён [детектор-лестница V-A/B/C, алиас-ярусы, banknote-v1 с 12 гейт-точками, §B5 плагины P1–P6, §D-пре-рег]; полигон-стадия после exp15**; **D39.5 = пак-1.5+F1–F9 залендены [tmctl export с manifest/drift-гардами · fold-first санитайзер · bounded глосс · пример zh-ru]; экстракция полигона впредь через tmctl export**; **D39.4 = адверсариал-долг ПОГАШЕН [8 осей: 0 CRIT/1 HIGH/6 MED], пак-1.5 придержан под фикс-лист F1–F9 в §T4**; **D39.3 = пакет банк-майнинга W1.5 [диспозиция H15/V4-п4] ратифицирован, research/20-промт с HOLD до фриза exp15**; **D39.2 = трек-A пак-1 залендён `d3f6b34`: trust-gated suppressor [терм-дрейф закрыт в КОДЕ] + export-contract нормализация + pair-сеам + реестры + quality-report; адверсариал-долг за 529**; **D39.1 = research/19 залендён: конфликт exp14↔research/18 разрешён [эмиссия≠окно≠связность], Go-спека чанкера+когезии, волновая архитектура W0–W3 [вводная владельца: параллелизм], пре-рег эмпирики Q0–Q5; оркестратор-ревью снято владельцем**; **D39 = АРХ-РЕСЕТ: синк-аудит сломанного телефона [65 находок, 0 refuted, `08-sync-audit-ledger.md`] + целевая 7-слойная архитектура [`09-target-architecture.md`] + фазовый план [трек A build-now ∥ трек B ресёрч, пере-прогон после]; формализует фантомный «D35.7» как цель слоя 1; терм-дрейф код-корень жив [сид-воркэраунд]; редактор 4-мандата-full-regen = причина инверсий**; D35 = пивот качество-первым; D36 = приёмка research/18; D37 = приёмка exp14: претензия-1=промпт-рычаг; D38 = приёмка exp14b: «только gpt-5.4» ОПРОВЕРГНУТО [mistral/deepseek-pro чинят], фронтир в дефолт НЕ нужен, корень терм-дрейфа = статус-draft сида; **D38.1 = слепой h2h P1a↔F-disc залендён [ChatGPT «фронтир сильнее» / Claude «near-parity» расходятся, СХОДЯТСЯ: дефекты = инфра] → РАЗВОРОТ «мерить→строить», выдан BACKEND_INFRA_PACK; D38.2 = консолидация/док-гигиена: спент exp-скрипты в `eval/exp12|13|14|14b/`, статус-доки+.puml актуализированы; D38.3 = инфра-пак читаемости залендён (санитайзер-классы strip+export + число/omission-гард), верифицирован исполнением [build/vet/test зелёные, 3 span-дефекта запинены]; D38.4 = аудит полноты exp14/14b: чэнъюй-рычаг забыт near-term→дописан в дискурс-промпт; inversion-гард D37 §2г не строился (число/omission ≠ полярность)→editor-swap = защита от инверсий (приоритет↑); нарезка = re-run-арм; гард-тумблер вкл. при resnapshot; D38.5 = компоненты resnapshot залендены+верифицированы [reseed-сид eb409f2 · дискурс+чэнъюй editor v3 0ac5f7a с few_shot-тумблером] → следующий шаг единый resnapshot + пере-прогон**).
@@ -1235,3 +1235,7 @@ API-529-долг закрыт: 8-осевой refute-by-default воркфлоу
## D39.78 — ПАКЕТ-ЧЕКЕРОВ ПРИНЯТ И ЗАЛЕНДЕН (строка 25 ЦЕЛИКОМ + первые два компонента строки 79; $0 — только фейк-провайдер; двухраундовая приёмка: 10-агентный адверсариал-воркфлоу → 5 CONFIRMED major → постфикс той же сессией ДО коммита → 3-агентный дельта-раунд: 0 major; `CheapGateVersion` v7 бампнут ОДИН раз): **харнесс labels пересобран В GIT** (env-гейт `TM_CHECKER_LABELS=1`, checks+membank+candidates; `metrics.json` пакета-6 воспроизведён ПОБАЙТНО 12/12 классов — k4a добавлен маркер-онли постфиксом; 2 независимых пути счёта; манифактуренной сходимости НЕТ — джойн-конвенции независимо пересчитаны ревью-агентом из сохранённых эра-вердиктов). **ПОСТРОЕНО:** #10 демоция одно-руновых Han-миссов в Unverified + `PostcheckMiss.Demoted` (K6 fp 14→6, fn=0 — ⚠ КЛАСС-ВАКУУМЕН: в labels ноль одно-Han-позитивов, recall-цена демоции НЕ измерена — hard-gate строки 12 на «fn=0» не опираться; репэйр-гард №5 ослеп на одно-Han-дифференциал — оговорка в строке 13; кана-класс открыт до B6, строка 81) · #3 атрибуция ёлочки «X!»/«X?»/«X…» с отказом плоской цитате sentence-final-гейтом (K4b recall 0.109→0.217; Р4-потолок ~0.22 inline в контракте) · #6 caps-латиница + case-insensitive allowlist (K2 recall 0.75→0.85, честная precision 0.971) + синк репэйр-твина (caps-утечки адресуемы актуатору) · k4_inverse маркер-в-атрибуции (3/0/1/71; сегмент режется с ДВУХ сторон, маркеры whole-word) · #8 两/兩 данными (0 эффекта — generality) · Р2 hard/soft split (`UnitScaleHard`={DC1, NumberMagnitude} / `Soft`={DC2, PercentScale}; `Total` не тронут) · строка-79: `isCyrLetter`→`isTargetWordLetter` + DC1-трим + magnitude `SourceScripts`-гейт через единый `lang.IsDenseScript` (закрыто и ведро C-2) · рефрен-исключение editor.md/mono (PromptSHA256 двигается, перекупок нет D39.63). **ЗАКРЫТО с обоснованием:** #5 (единственный дефект магнитуды DC2-покрыт) · #7 (THRESHOLD=2 = 0 изменений; 3 = Р4-потолок inline; гомоглиф = `tk.mixed`, приёмка пройдена) · DC2 word↔word (ноль размеченных дефектов — сперва разметить 分之-срез) · research/22 §2№5 (не подтверждены labels) · omission-бэкстоп (уже стеммером D39.75) · строгий OffLanguage (36а deferred) · fix-8 скоуп verb-гейта (ЗАГЕЙЧЕН контрактом checkers.go: ёлочный экстрактор атрибуции + корпус-замер ПРЕЖДЕ стройки). **Приёмка оркестратора исполнением:** labels-ячейки перепрогнаны лично, фрозен-ДО #3 5/1/41/99 воспроизводится из дерева · голден: независимый маскированный дифф ПУСТ дважды (двинулся только `style_check_version` v6→v7 + хеш-каскад; постфикс-перезахват = байт-идентичный no-op) · build/vet/-race/майнер-парити зелёные · общность: ноль пар/книго-ветвлений, Han-предикат #10 скрипт-структурен. Раунд-1-находки (скоуп k4_inverse = весь хвост строки · 2 ложных «вскрытых» примера #3 в отчёте · BASE==EXT кандидат-теста · рассинхрон репэйр-твина · Р4-потолки не в контракте) ВСЕ закрыты постфиксом §8. Остаточные минорки раунда-2 → строка 93; вопросы владельцу (§6 + жанр-ось register_neg «xianxia» в пар-шаблоне + асимметрия 兩-батча) → строка 92. Лендинг-штамп: «D39.76» постфикса → фактический D39.78 (отчёт + 2 код-коммента; механическая нумерация — сессия номера не знала). Строка 25 ЗАКРЫТА · 79 сужена до cjkScriptNames-границы · 89 сужена (checkers-срез ведра D исполнен). Незаявленные в дерево-списке отчёта файлы (langpack.go — коммент-указатели ведра D; memdecl_test.go — gofmt) тривиальны, проверены (02.08.2026, оркестратор №9). ✅
## D39.79 — МЕЛКАЯ ПАЧКА ХВОСТОВ САНКЦИОНИРОВАНА + РЕШЕНИЯ §6 ПАКЕТА-ЧЕКЕРОВ ПРИНЯТЫ ДЕЛЕГИРОВАНИЕМ (владелец 02.08: «давай сделаем» по пачке 89+93+53+83; по строке 92 — «подумай как это сделать и реши за меня; интересует качество подходов и работающего решения»): **(1) Пачка** = строка 89 (остаток ведра D + сверка ведра B) + 93 (хвосты чекер-ревью) + 53 (мелкие хвосты качества) + **83/F4 ПОДТЯНУТА** с «до МАСШТАБА» на «до платных прогонов добора идеала» (SPOF: тихая потеря банка и подписей владельца; VACUUM INTO дёшев) — один промт `BACKEND_SMALLPACK_TAILS_SESSION_PROMPT.md`, $0, голден-ожидание = НЕ движется. **(2) Q1 канон грейда = «класс X»** (approved-ряд банка побеждает draft «разряд X»; демоция draft-рядов = операция над стенд-данными, приёмка оркестратора — выбор среди уже-подписанного, не новый вкус); **DC7-чекер вслепую НЕ строить**: сперва $0-замер нужности на боевых финалах labels-корпуса; ≥1 реальный дефект → минимальный data-driven чекер по образцу DC1; 0 → закрыть с обоснованием и gated-триггером «первая книга с живой грейд-серией». **(3) Q2: 兩 ПОДТВЕРЖДЁН в numeral-классах** (консистентность: cjk-section уже нёс 兩 — ровно класс дефекта #8) и ДОВЕРШАЕТСЯ в числовой группе `shichen_re`; **probe-ЛИТЕРАЛЫ (时辰/千万/数十万) остаются simplified-only** до первой traditional-книги — тогда цельным дата-батчем (спекулятивные варианты паттернов без книги = инерция, норма 13б); NB-граница в файл данных. **(4) Q3: PercentScale остаётся SOFT, HARD-value-детектор 成/万 НЕ строить** — нужность = 1 инстанс на корпус, механизм без носителя качества/денег; реопен ДВУМЯ триггерами: перевод `postcheck_gate` в hard-gate (строка 12 — честный HARD потребует value-чека) ЛИБО ненулевой поток value-дефектов с добора идеала. **(5) Q4: register_neg ПЕРЕЕЗЖАЕТ из пар-пака в КНИЖНЫЙ слой** — дом `StyleAllowlist` (book-config → `CheapGateConfig`), DC6-алгоритм не меняется, «терем»-список → стенд-конфиг gu-zhenren, пар-файл zh-ru остаётся чисто пар-фактами, жанро-литералов в Go НЕТ; **жанровый shared-слой НЕ строим** — gated-триггер «≥2 книги одного жанра» (зеркало C-триггера D39.76). Ревью-вопрос общности расширен: к «пара без правки Go» добавлен «ВТОРАЯ КНИГА той же пары — без ложных флагов и без правки Go». **(6) Q7 (эмиссия головы, 18) и 36б-замер (5) подтверждены полигон-слотами при ре-пробе 74** — стройка только по эффекту, без изменений. Строка 92 ЗАКРЫТА (решения здесь); 28 вес актуализирован (носитель «свежий мини-прогон» растворён D39.67 → добор идеала) (02.08.2026, оркестратор №9, по делегированию владельца). ✅
+
+## D39.80 — Онбординг-оверхол доков по фидбеку новой сессии: один носитель состояния, реестр продуктовых требований, глоссарий, зонный сдвиг диаграмм (02.08)
+
+Триггер: две записки фронт-сессии 02.08; все проверяемые утверждения подтверждены исполнением (README застрял на D39.77 с мёртвой ссылкой на заархивированный промт — обновление README не входило в процедуру лендинга; статус-абзац README дублировал и обгонял CURRENT-STATE; битые относительные ссылки в архиве; «три слайса» при четырёх; SEO-требование V5 не всплыло за день фронт-дизайна — реестра требований не существовало). Диагноз записки принят: доки писались под роль с непрерывностью памяти и враждебны холодной сессии. Ратифицировано: **(1) Один носитель состояния** — PROGRESS CURRENT-STATE; `docs/README.md` не несёт ни головы, ни статуса, ни дублей целей — только карту «что где лежит» (дубль числа = гарантированное расхождение). **(2) Норма лендинга:** лендинг, двигающий файлы или состав активных промтов, обновляет README тем же коммитом (вписано в ORCHESTRATOR_SESSION_PROMPT §Лендинг). **(3) `docs/product-requirements.md`** — производный реестр «что продукт обязан уметь»: ПТ-1..ПТ-32 (+25а) из START_PROMT V0–V5 (живой бриф) + владельческих находок H6–H18, статусы сверены кодом; новые V-идеи владельца разбираются туда при первом касании; при конфликте D-лог выше. Требования без носителя получили его: НОВАЯ строка 94 (абьюз-прескрин H8 · лимит входа H7 · продукт-кнопки стоп/продолжить H10 поверх построенных graceful stop/redrive) · дописка 71 (V5 веб-первый/SEO — в Ф3-дизайн ДО выбора фреймворка, SSR-вопрос) · дописка 90 (H16 самоулучшение при пилот-препе). Строка 30в ЗАКРЫТА (разбор START_PROMT исполнен реестром). **(4) `docs/glossary.md`** — жаргон и сокращения одним экраном, в онбординг-пути. **(5) Бэклог:** ID строки стабилен навсегда (не перенумеровывается, не переиспользуется — внешние ссылки «строка N» остаются валидными, включая backend/README), длинные строки получили жирные лиды (43 строки, механический скрипт). **(6) Зонный сдвиг:** `components.puml`/`pipeline.puml` → `backend/docs/` — диаграмма и код правятся одним коммитом бэкендом (строка 30а перевешена; гардрейл «PUML не рендерить» в силе); how-it-works доки подсистем строятся ПО ТРЕБОВАНИЮ фазы (дом `backend/docs/`, образец — backend/README §Инварианты), впрок не строить. **(7) Архив:** норма глубины относительных ссылок в archive/README; починены все битые ссылки (слайс 04–10: 12 промт-ссылок · отчёты PACK20_DELTA/POLYGON_TERM_RESEARCH_A: `../../backend` → `../../../backend` · PACK20_BANKNOTE_DESIGN: repo-root пути · STRATEGIC_REVIEW-промт); заявленные новичком «44» были подстрочным овер-каунтом (греп ловил `../../backend` внутри корректных `../../../`) — реальный список установлен экзистенс-чеком, содержимое записей не менялось, только пути. **(8) Роль «Фронт»** (зона `frontend/`) в CLAUDE.md; онбординг дополнен глоссарием и реестром; счётчик ролей канонизирован — «оркестратор №N», номера эстафеты промт-файла историчны (02.08.2026, оркестратор №9, санкция владельца «делаем максимально по красоте»). ✅
diff --git a/docs/archive/PROGRESS-2026-07-04-10.md b/docs/archive/PROGRESS-2026-07-04-10.md
index 7f920f38..a6f91cbf 100644
--- a/docs/archive/PROGRESS-2026-07-04-10.md
+++ b/docs/archive/PROGRESS-2026-07-04-10.md
@@ -55,11 +55,11 @@
## 2026-07-09 — Стратегическое ревью + консолидация доков (оркестратор)
-- **Стратегическое ревью выполнено** → [`architecture/07-strategic-review.md`](../architecture/07-strategic-review.md) (коммит b1d54b6). Метод: 14 сборщиков (8 репо-аудиторов + 6 SOTA-веб) → 9 адверсариальных верификаторов (8 CONFIRMED / 1 PARTIAL; 6 находок воспроизведены исполнением временных Go-тестов). Вердикт: **архитектура end-to-end цела**, наука-2026 подтверждает C1-схему/чанки+гейты/терминологию/DeepSeek-draft; детерминированному пути памяти аналогов не найдено. Топ-находки: D1-моноредактор получил внешне измеренный налог верности (2605.13368, вкл. en→ru); `--resnapshot` = переоплата книги (блокер онгоинга); 4 дыры границ доверия памяти (одна — ложно отсеяна 44-агенткой 0/3); слепота exp04 структурно сломана (ключ в артефакте при оценке); memory_eval контаминирован эхом глоссария; 18+ — ноль замеров (critical); DeepSeek выбыл из explicit-канала B по ToS 27.03.2026.
+- **Стратегическое ревью выполнено** → [`architecture/07-strategic-review.md`](architecture/07-strategic-review.md) (коммит b1d54b6). Метод: 14 сборщиков (8 репо-аудиторов + 6 SOTA-веб) → 9 адверсариальных верификаторов (8 CONFIRMED / 1 PARTIAL; 6 находок воспроизведены исполнением временных Go-тестов). Вердикт: **архитектура end-to-end цела**, наука-2026 подтверждает C1-схему/чанки+гейты/терминологию/DeepSeek-draft; детерминированному пути памяти аналогов не найдено. Топ-находки: D1-моноредактор получил внешне измеренный налог верности (2605.13368, вкл. en→ru); `--resnapshot` = переоплата книги (блокер онгоинга); 4 дыры границ доверия памяти (одна — ложно отсеяна 44-агенткой 0/3); слепота exp04 структурно сломана (ключ в артефакте при оценке); memory_eval контаминирован эхом глоссария; 18+ — ноль замеров (critical); DeepSeek выбыл из explicit-канала B по ToS 27.03.2026.
- **Роль оркестратора передана этой сессии (решение владельца 09.07).** Владелец подтвердил курс: Rust-переписывание — НЕТ до пост-пилота (Р1/Go остаётся); архив + онбординг-доки — одобрены.
- **Ратифицированы D13–D17** ([05-decisions-log](../architecture/05-decisions-log.md)): D13 поправки пилота (арм моно-vs-билингв, гетерогенные кандидаты C2, панель 2–3 семейства × 11+ повторов, починка харнесса ДО прогона); D14 канал B (минус DeepSeek-explicit, плюс проба Mistral, xAI-опора = AUP); D15 resume/онгоинг (комментарии-фиксы + status/redrive сейчас, content-addressed reuse — гейт онгоинга); D16 фиксы границ памяти; D17 D1 понижен до «дефолт Ф1, оспорен — решает пилот».
- **Консолидация доков:** `02-mvp-plan` → v3 (мёртвые пороги сняты, интерим-18+ переписан, фазы синхронизированы); обе `*.puml` → v3 (минус Opus/BYOK/«≤2×», плюс ре-гейт эскалации, три класса отказов D12, человек в петле, фазовые пометки); superseded-баннеры на `research/01/02/03/04/09`; провенанс-шапки на два внешних `12-*`-дока; закрытые промты → `docs/archive/prompts/`; онбординг: корневой `CLAUDE.md` + `backend/README.md` + `eval/README.md` + обновлённый `docs/README.md`.
-- **Хендофф-промты выданы (09.07):** [`BACKEND_SESSION_PROMPT_REVIEW_FIXES.md`](BACKEND_SESSION_PROMPT_REVIEW_FIXES.md) — гигиена (комментарии resume, prompt_version-бамп) → фиксы памяти D16 → `tmctl status`/`redrive` → спека content-addressed resume (D15.2) → reasoning-буфер additive (D13.6) → перепроверка отсевов 44-агентки; [`POLYGON_SESSION_PROMPT_PILOT_HARNESS.md`](POLYGON_SESSION_PROMPT_PILOT_HARNESS.md) — memory_eval (эхо-контроль, полные выходы, fidelity, M0–M3, синк с Go) → гигиена оценочных артефактов → протокол пилота v2 (D13) → проба Mistral (⚠ нужен `MISTRAL_API_KEY` от владельца) → kana-precision → подготовка вебновелл-среза. ⚠ Порядок запуска: бэкенд-сессию первой или одновременно — полигон синкает зеркало памяти с кодом ПОСЛЕ D16-фиксов (в промте оговорено).
+- **Хендофф-промты выданы (09.07):** [`BACKEND_SESSION_PROMPT_REVIEW_FIXES.md`](prompts/BACKEND_SESSION_PROMPT_REVIEW_FIXES.md) — гигиена (комментарии resume, prompt_version-бамп) → фиксы памяти D16 → `tmctl status`/`redrive` → спека content-addressed resume (D15.2) → reasoning-буфер additive (D13.6) → перепроверка отсевов 44-агентки; [`POLYGON_SESSION_PROMPT_PILOT_HARNESS.md`](prompts/POLYGON_SESSION_PROMPT_PILOT_HARNESS.md) — memory_eval (эхо-контроль, полные выходы, fidelity, M0–M3, синк с Go) → гигиена оценочных артефактов → протокол пилота v2 (D13) → проба Mistral (⚠ нужен `MISTRAL_API_KEY` от владельца) → kana-precision → подготовка вебновелл-среза. ⚠ Порядок запуска: бэкенд-сессию первой или одновременно — полигон синкает зеркало памяти с кодом ПОСЛЕ D16-фиксов (в промте оговорено).
### 2026-07-09 (вечер) — Внешнее ревью и приёмка обоих пакетов (оркестратор)
@@ -73,12 +73,12 @@
- **D18 ратифицирован (решение владельца):** приёмка Фазы 1 — на **蛊真人 zh→ru** (полная книга ~2.5k глав от владельца лежит на стенде: `/home/ubuntu/books/gu-zhenren/guzhenren-gb18030.txt`, GB18030+CRLF — проверено декодом; текст и производные ВНЕ git); ja→ru — второй прогон при появлении ja-epub (форсирующая функция D9 по ruby уже выполнена кодом). Полный текст — D-лог D18.
- **18+ блокер снят владельцем:** explicit-фрагменты берутся из 蛊真人 (dark/violence; покрытие l2-erotica полигон оценит честно — возможно понадобится второй источник).
-- **Хендофф-промты №2 выданы** (старые закрыты → archive): [`BACKEND_SESSION_PROMPT_ACCEPTANCE_PREP.md`](BACKEND_SESSION_PROMPT_ACCEPTANCE_PREP.md) — fix-лист ревью (homophone first-wins и др.) → GB18030-ingest → дешёвые гейты Ф1 → спека D15.2 v2 → smoke-прогон 1 главы 蛊真人; [`POLYGON_SESSION_PROMPT_EXPLICIT_AND_MIRROR.md`](POLYGON_SESSION_PROMPT_EXPLICIT_AND_MIRROR.md) — синк зеркала (suppressUnboundedPhonetic+апостроф) → Mistral-переснятие → **18+ рука на 蛊真人 (эксп.10)** → сид-глоссарий приёмки → терсный precision. Координация: бэкенд-задача 2 (GB18030) гейтит их же задачу 5 и полигонный отбор сцен удобнее после неё, но полигон может стартовать параллельно (iconv руками уже валидирован).
+- **Хендофф-промты №2 выданы** (старые закрыты → archive): [`BACKEND_SESSION_PROMPT_ACCEPTANCE_PREP.md`](prompts/BACKEND_SESSION_PROMPT_ACCEPTANCE_PREP.md) — fix-лист ревью (homophone first-wins и др.) → GB18030-ingest → дешёвые гейты Ф1 → спека D15.2 v2 → smoke-прогон 1 главы 蛊真人; [`POLYGON_SESSION_PROMPT_EXPLICIT_AND_MIRROR.md`](prompts/POLYGON_SESSION_PROMPT_EXPLICIT_AND_MIRROR.md) — синк зеркала (suppressUnboundedPhonetic+апостроф) → Mistral-переснятие → **18+ рука на 蛊真人 (эксп.10)** → сид-глоссарий приёмки → терсный precision. Координация: бэкенд-задача 2 (GB18030) гейтит их же задачу 5 и полигонный отбор сцен удобнее после неё, но полигон может стартовать параллельно (iconv руками уже валидирован).
- Юр-пакет — в бэклоге до решения владельца (промт ресёрч-сессии подготовлю по запросу).
-- **Передача роли оркестратора (09.07 ночь, решение владельца — контекст сессии заполнился):** выдан [`ORCHESTRATOR_SESSION_PROMPT.md`](ORCHESTRATOR_SESSION_PROMPT.md) — преемник наследует зону docs/, методологию внешнего ревью (адверсариальные воркфлоу исполнением), право ратификации D-блоками и очередь: ревью research/15 по отчёту → приёмка полигона-erotica → промт бэкенд-пакета №3 (fix-лист D20.4 + D15.2 v3 + D3-цепочка) → промт приёмочной сессии Ф1. Параллельно выдан [`POLYGON_SESSION_PROMPT_EROTICA.md`](POLYGON_SESSION_PROMPT_EROTICA.md) (ja-книга владельца + 金瓶梅 + Fifty Shades → l2-erotica по трём парам, конвейер exp10, fix-лист D19.5, финализация сида gender=hidden) — закрывает D14.4. Промты пакетов №2 → архив.
+- **Передача роли оркестратора (09.07 ночь, решение владельца — контекст сессии заполнился):** выдан [`ORCHESTRATOR_SESSION_PROMPT.md`](../ORCHESTRATOR_SESSION_PROMPT.md) — преемник наследует зону docs/, методологию внешнего ревью (адверсариальные воркфлоу исполнением), право ратификации D-блоками и очередь: ревью research/15 по отчёту → приёмка полигона-erotica → промт бэкенд-пакета №3 (fix-лист D20.4 + D15.2 v3 + D3-цепочка) → промт приёмочной сессии Ф1. Параллельно выдан [`POLYGON_SESSION_PROMPT_EROTICA.md`](prompts/POLYGON_SESSION_PROMPT_EROTICA.md) (ja-книга владельца + 金瓶梅 + Fifty Shades → l2-erotica по трём парам, конвейер exp10, fix-лист D19.5, финализация сида gender=hidden) — закрывает D14.4. Промты пакетов №2 → архив.
- **Бэкенд-пакет №2 принят и залендён (b51ac4c) после внешнего ревью** (5 ревьюеров исполнением/мутациями; smoke-деньги сверены по БД до микроцента; заглушка D19.6 подтверждённо убрана и мутационно защищена). **Ратифицирован D20**: спека D15.2 — направление принято, реализация после двух v3-правок (role в guard_hash; правило editor-каскада в dry-run-проекции); ответы §13 (пер-стадийная гранулярность wire-снапшота; `--accept-rebill[=usd]` c порогом min($0.50, 5%); Adult нейтрален + конфиг-линт); **приёмка Ф1 допустима на glm-5-редакторе; пилот требует боевой grok-4.3 → чистый xAI-ключ = блокер пилота, не приёмки**; fix-лист №3 (README v7, cheap-gates v2 против 3 FP, NUL-гард на не-UTF8 путях декода, minors). До полной приёмки на 蛊真人: финализация сида (gender=hidden — одно поле, полигон), заводка D3-цепочки, приёмочная сессия. ⚠ В дереве черновик `research/15-voice-and-state.md` (сессия «Голос и состояние» в полёте) — не трогать до её отчёта.
- **Полигон-пакет №2 принят и залендён (3d183bc) после внешнего ревью** (4 ревьюера исполнением: mirror ACCEPT; explicit/seed/coord ACCEPT_WITH_FIXES — все фактические микро-дефекты доков исправлены оркестратором при лендинге). **Ратифицирован D19**: канал B v2 (Mistral-переводчик / grok-4.3 reasoning-ON эскалация / abliterated-скрининг / судьи Grok+Gemini), эхо-класс «reasoning-off + плотный CJK» обобщён, сид-развязки (перевод имён гу; «Гуюэ» слитно; 白凝冰 → gender=hidden), гигиена xAI пост-фактум + выделенный NSFW-ключ до пилота. Остаток D14.4: **только erotica-источник от владельца**. ⚠ Срочный пинг бэкенду в D19 п.6 (заглушка contested() в их незакоммиченном memseed.go).
-- **Промт ресёрч-сессии «Голос и состояние» выдан** (запрос владельца 09.07): [`VOICE_STATE_RESEARCH_SESSION_PROMPT.md`](VOICE_STATE_RESEARCH_SESSION_PROMPT.md) → `research/15-voice-and-state.md`. Мандат: голоса персонажей (voice exemplars vs дескрипторы — проверить клейм antipattern-дока; RP/game-loc прайор-арт; дешёвый детектор отклонения), scene/epistemic-state инъекция + скоуп Annotator Ф2, валидированный промптинг литперевода (формат/позиция инъекций, анти-галлюцинационные приёмы, «двухпроходность в одном вызове»), параметры запроса (temp-свип как ТЗ полигону), прайор-арт-проверка наших «уникальных» механизмов (спойлер-окна и др.), креатив с обязательной привязкой к слотам архитектуры. Пробы ≤$3 на SFW-чанках 蛊真人. Выход приземляется к Фазе 2 (Annotator, voice-профили) и в армы пилота. Параллелится с пакетами №2, ничего не блокирует.
+- **Промт ресёрч-сессии «Голос и состояние» выдан** (запрос владельца 09.07): [`VOICE_STATE_RESEARCH_SESSION_PROMPT.md`](prompts/VOICE_STATE_RESEARCH_SESSION_PROMPT.md) → `research/15-voice-and-state.md`. Мандат: голоса персонажей (voice exemplars vs дескрипторы — проверить клейм antipattern-дока; RP/game-loc прайор-арт; дешёвый детектор отклонения), scene/epistemic-state инъекция + скоуп Annotator Ф2, валидированный промптинг литперевода (формат/позиция инъекций, анти-галлюцинационные приёмы, «двухпроходность в одном вызове»), параметры запроса (temp-свип как ТЗ полигону), прайор-арт-проверка наших «уникальных» механизмов (спойлер-окна и др.), креатив с обязательной привязкой к слотам архитектуры. Пробы ≤$3 на SFW-чанках 蛊真人. Выход приземляется к Фазе 2 (Annotator, voice-профили) и в армы пилота. Параллелится с пакетами №2, ничего не блокирует.
### 2026-07-09 (ночь) — Приёмка research/15 «Голос и состояние» + D21 (оркестратор-преемник)
@@ -97,14 +97,14 @@
- **Владелец детализировал план фронта** (VS Code-паттерн): дерево глав · две панели оригинал|перевод · панель команд/чат-редактирования · цветная статус-полоса с ползунком (зелёный/жёлтый/красный из детерминированных вердиктов). Открытые вопросы: якорение соответствия (не «страница в страницу»), UX редакторов, прайор-арт конкурентов.
- **Оценка влияния на бэкенд (оркестратор):** read-model уже есть (chunk_status/паспорта/вердикты — D12 строил `--json` «для CI/IDE»); новая работа мала и read-only: персист/экспорт якорей чанков, `annotations.json`, сборка перевода с политикой красных чанков, возможно дешёвый флаггер абзацной парности. Контрактно-опасен один кусок — **human_override** (пост-правка человека против redrive/resume/TM — пересечение со snapshot-дисциплиной, думать вместе с D15.2). Веб-сервер/SSE НЕ строим (Ф3, D12-caution в силе). Кандидат-скоуп бэкенд-пакета №4 — после ресёрча.
-- **Выдан промт** [`READER_IDE_RESEARCH_SESSION_PROMPT.md`](READER_IDE_RESEARCH_SESSION_PROMPT.md) → `research/16-reader-ide-alignment.md`: прайор-арт HITL-редактуры (CAT/Mantra/фан-стек/PE-исследования), якорение (гипотеза «чанк/абзац, страницы виртуальны»), визуализация доверия, контракт бэкенд→фронт; $0-проба парности абзацев на сохранённых выходах. Живые LLM-вызовы: $0.
+- **Выдан промт** [`READER_IDE_RESEARCH_SESSION_PROMPT.md`](prompts/READER_IDE_RESEARCH_SESSION_PROMPT.md) → `research/16-reader-ide-alignment.md`: прайор-арт HITL-редактуры (CAT/Mantra/фан-стек/PE-исследования), якорение (гипотеза «чанк/абзац, страницы виртуальны»), визуализация доверия, контракт бэкенд→фронт; $0-проба парности абзацев на сохранённых выходах. Живые LLM-вызовы: $0.
### 2026-07-10 — Приёмка пакетов «бэкенд №3» и «полигон-erotica» + D22 (оркестратор)
- **Внешнее ревью обоих пакетов** (8 ревьюеров, всё исполнением: go test/race + 11 мутаций в scratchpad-копии; exp11 пересчитан из сырья поштучно независимой репликой классификатора — 15/15 ячеек и все судейские числа сошлись; Fisher-статистика клеймов; цены по вендор-страницам). **Оба ACCEPT_WITH_FIXES → залендены (e1fcee4, 3551997), ратифицирован D22.**
- **Топ-находки ревью:** (1) спека v3 на оси SourceLang/TargetLang была СЛАБЕЕ текущей защиты (исполненный stale-hit) → два обязательных v3.1-амендмента до реализации; (2) дублёра-судью 18+ ратифицировать нельзя (gpt-5-mini не мерен; D13.3-коллизия: grok-эскалированные 18+ чанки без померенного судьи) → проба-гейт; (3) register-клейм сужен до «архаика ломает МИТИГАЦИЮ reasoning-ON» (p=0.008 vs совр. zh; «регистр» = гипотеза до контрольных ячеек); (4) кодовая ветка content-filter полигона мертва на фактическом составном wire-формате (счёт отчёта верен через ручной finish_reason); (5) ja/en-fidelity сняты под zh-рамкой судейского промпта — индикатив; (6) полигон случайно стёр заголовок чужой записи в журнале — восстановлен; правило transient-прогонов в чужой зоне кодифицировано (D22.10).
- **D3-текст исправлен** (`gemini-3.1-pro-preview`; голый слаг 404 — квирк 04.07, синк живых доков perl-grep'ом); цена Mistral $0.5/$1.5 закрыта тройной сходимостью; квирк-строки (register-оговорка, additive_total) дописаны.
-- **Промты выданы (по заданию владельца):** [`GPT_EXTERNAL_ASCENT_PROMPT.md`](GPT_EXTERNAL_ASCENT_PROMPT.md) (внешняя критика GPT-5.6, анти-якорный трёхфазный протокол) и [`BACKEND_SESSION_PROMPT_REFACTOR.md`](BACKEND_SESSION_PROMPT_REFACTOR.md) (пакет №4: код-хелс + golden-гард детерминизма). Закрытые промты №3/erotica — в архив.
+- **Промты выданы (по заданию владельца):** [`GPT_EXTERNAL_ASCENT_PROMPT.md`](prompts/GPT_EXTERNAL_ASCENT_PROMPT.md) (внешняя критика GPT-5.6, анти-якорный трёхфазный протокол) и [`BACKEND_SESSION_PROMPT_REFACTOR.md`](prompts/BACKEND_SESSION_PROMPT_REFACTOR.md) (пакет №4: код-хелс + golden-гард детерминизма). Закрытые промты №3/erotica — в архив.
- **Приёмка Ф1 разблокирована полностью** (D22.11): следующий деливерабл оркестратора — промт приёмочной сессии.
### 2026-07-10 (вечер) — Приёмка рефакторинг-пакета №4 + D23 (оркестратор)
@@ -359,7 +359,7 @@ keep-alive (Ф1–2), инъекция глоссария (`selective`), пор
- **Q2 (эхо — ретрай/эскалация или флаг?):** согласен — эхо должно ЭСКАЛИРОВАТЬ, не просто флажок. `cjk_artifact` ДЕТЕРМИНИРОВАН (та же модель → то же эхо) → same-model retry бессмыслен (переэхнёт, переплатит) → в classify он **non-retryable именно поэтому**. При заводке эскалации (шаг 7) `cjk_artifact` уходит на ФОЛБЭК-ЧЕРНОВИК (другая модель) — это и есть «эскалация, не флаг» (интент записан в Вехе 2). Сейчас флаг — цикла эскалации ещё нет.
- **Q3 (live-conformance):** ДА, и Python-оракул Полигона = приёмочный ГЕЙТ перед фиксацией адаптеров. Мои Go-тесты — httptest wire-контракты (быстрые, детерминированные, CI без ключей) — живые эхо/`reasoning_content`/алиасы/503 не воспроизводят by design. Разделение: **Python-оракул (зона Полигона)** = кросс-провайдерный live-гейт «каждый адаптер бьёт живого, получает валидный перевод без эха/пусто/обрезки»; **Go live-интеграционные тесты (зона бэкенда, build-tag `live`/env-gated, вне CI)** = per-adapter wire+parse на живых ключах. Оба; оракул — гейт.
-Фикс (эскалация `cjk_artifact`→фолбэк-черновик + coverage-гейт вырезания + live-conformance) — **отдельная сессия**, онбординг-промт: [BACKEND_SESSION_PROMPT_SILENT_REFUSALS.md](archive/prompts/BACKEND_SESSION_PROMPT_SILENT_REFUSALS.md). Не блокирует шаг 3.
+Фикс (эскалация `cjk_artifact`→фолбэк-черновик + coverage-гейт вырезания + live-conformance) — **отдельная сессия**, онбординг-промт: [BACKEND_SESSION_PROMPT_SILENT_REFUSALS.md](prompts/BACKEND_SESSION_PROMPT_SILENT_REFUSALS.md). Не блокирует шаг 3.
### 2026-07-04 — Сессия 5: Веха 2.5 (старт) — DeepSeek эхо-мина зафиксирована регресс-гейтом
diff --git a/docs/archive/README.md b/docs/archive/README.md
index a61d5a6d..33e5f2c4 100644
--- a/docs/archive/README.md
+++ b/docs/archive/README.md
@@ -2,6 +2,8 @@
Закрытые сессионные промты и мёртвые документы. Хранится как история решений/передач — **инструкции отсюда не исполнять**: контракты могли быть переопределены. Актуальные источники истины — `../architecture/05-decisions-log.md` и `../README.md`.
-Состав: `prompts/` — закрытые сессионные промты · `reports/` — отчёты паков/ресёрч-сессий с ревью-шапками (живая фактура приёмок) · `architecture/` — исполненные арх-доки (перенесены 25.07, санкция владельца: `07-strategic-review` курс исполнен · `08-sync-audit-ledger` аудит отработан · `11-implementation-plan` план пака-11 исполнен целиком) · `PROGRESS-*.md` — три слайса хроники журнала (04–10 · 10–13 · 13–25.07).
+Состав: `prompts/` — закрытые сессионные промты · `reports/` — отчёты паков/ресёрч-сессий с ревью-шапками (живая фактура приёмок) · `architecture/` — исполненные арх-доки (перенесены 25.07, санкция владельца: `07-strategic-review` курс исполнен · `08-sync-audit-ledger` аудит отработан · `11-implementation-plan` план пака-11 исполнен целиком) · `PROGRESS-*.md` — слайсы хроники журнала (счёт не дублируем — смотри список файлов).
Правило пополнения: сюда переносится документ, чьи задачи полностью закрыты (промты) или чьё содержимое целиком заменено/исполнено (доки — со статус-баннером, объясняющим чем). Частично устаревший research НЕ переносится — получает ⚠ superseded-баннер на месте (ссылки file:line из журнала/архитектуры не ломаем).
+
+**Норма глубины ссылок (D39.80):** при переносе дока в архив относительные пути ПЕРЕ-ГЛУБЛЯЮТСЯ (из `reports/`/`prompts/` до корня репо — `../../../`); док, рождающийся сразу в архиве, пишет пути той же глубины. Урок 02.08: десятки битых `../../backend/…` жили незамеченными с переноса отчётов.
diff --git a/docs/archive/prompts/STRATEGIC_REVIEW_SESSION_PROMPT.md b/docs/archive/prompts/STRATEGIC_REVIEW_SESSION_PROMPT.md
index e3eed7e0..01659871 100644
--- a/docs/archive/prompts/STRATEGIC_REVIEW_SESSION_PROMPT.md
+++ b/docs/archive/prompts/STRATEGIC_REVIEW_SESSION_PROMPT.md
@@ -9,10 +9,10 @@
Go-бэкенд (позже — фронтенд-IDE) **издательского художественного перевода крупных текстов** (ранобэ / вебновеллы, zh/ja/en→ru) через мультиагентный LLM-API пайплайн. Цели: (1) макс. худкачество — победить translationese; (2) низкий COGS; (3) банк памяти на всю книгу (консистентность имён/терминов/стиля); (4) 18+ с учётом цензуры провайдеров; (5) телеметрия денег/качества. Работа идёт параллельными сессиями: **Бэкенд → `backend/`**, **Полигон → `eval/` + `docs/experiments/`**, оркестратор — доки/ревью; координация — `docs/PROGRESS.md`. Ролевой стек (по издательскому процессу): черновик (DeepSeek) → редактор (grok-4.3) → судья/апекс (Gemini); эскалация каналами A/B; Anthropic выброшен за дороговизну.
## Пять направлений — это и есть твоя миссия
-1. **Корни / видение.** Что владелец задумал изначально — [`START_PROMT.MD`](../START_PROMT.MD) (37 буллетов). Точка отсчёта: куда целились и почему.
+1. **Корни / видение.** Что владелец задумал изначально — [`START_PROMT.MD`](../../../START_PROMT.MD) (37 буллетов). Точка отсчёта: куда целились и почему.
2. **Что уже реализовано (актуальное состояние).** Ратифицированные конкретные решения и построенный код — что РЕАЛЬНО существует сейчас в `backend/` и на полигоне. Источник истины по решениям — `docs/architecture/05-decisions-log.md` (D1–D12); что построено и с какими вердиктами — `PROGRESS.md` + сам код + `docs/experiments/00-09`.
3. **Направление.** Куда идём: цель (издательское качество, банк памяти серии, 18+, низкий COGS), фазы MVP (`02-mvp-plan`), пилот выбора ядра пайплайна (Ф2.5).
-4. **Правильно ли уже реализованное?** — ГЛАВНЫЙ вопрос ревью. Архитектурно ли здоров построенный стек и подход; реализует ли код ядро C1 и замысел диаграмм ([`components.puml`](architecture/components.puml) + [`pipeline.puml`](architecture/pipeline.puml)); где структурный дрейф, где слабая ставка, где решение стоит пересмотреть. *(Диаграммы — day-0, стек в них местами устарел; конфиг местами отстаёт от ратифицированного — это известный лаг, чинится отдельно, НЕ выдавай за архитектурный дефект.)*
+4. **Правильно ли уже реализованное?** — ГЛАВНЫЙ вопрос ревью. Архитектурно ли здоров построенный стек и подход; реализует ли код ядро C1 и замысел диаграмм ([`components.puml`](../../../backend/docs/components.puml) + [`pipeline.puml`](../../../backend/docs/pipeline.puml)); где структурный дрейф, где слабая ставка, где решение стоит пересмотреть. *(Диаграммы — day-0, стек в них местами устарел; конфиг местами отстаёт от ратифицированного — это известный лаг, чинится отдельно, НЕ выдавай за архитектурный дефект.)*
5. **Академические труды / SOTA.** Свежий глубокий survey (веб-ресёрч, НЕ только переиспользовать research/01-14 от 04.07): новые работы 2026 по agentic/document-level MT, translationese/anti-MT-artifact, память и консистентность серии, **надёжность LLM-судьи**, длинный контекст vs RAG-глоссарий, литперевод CJK→ru. По **каждой известной боли индустрии** — решает ли её наш стек, **где мы позади SOTA, где мимо готового решения.** Ссылки на источники обязательны.
**Синтез → стратегический вердикт:** цела ли архитектура end-to-end; ранжированные топ-риски/пробелы; курс-коррекции до масштабирования; что обязательно подтвердить пилотом.
diff --git a/docs/archive/reports/PACK20_BANKNOTE_DESIGN_2026-07-26.md b/docs/archive/reports/PACK20_BANKNOTE_DESIGN_2026-07-26.md
index c716dc70..9b33b2da 100644
--- a/docs/archive/reports/PACK20_BANKNOTE_DESIGN_2026-07-26.md
+++ b/docs/archive/reports/PACK20_BANKNOTE_DESIGN_2026-07-26.md
@@ -48,21 +48,21 @@
| # | Утверждение полигона | Адрес в коде | Вердикт |
|---|---|---|---|
-| 1 | Роль отвечает по-английски, и конвейер это банкует (§3.4) | [terminology.go:842-892](backend/internal/terminology/terminology.go#L842-L892) `ParseReply`, [:576-588](backend/internal/terminology/terminology.go#L576-L588) `wellFormedLemma` | **Подтверждаю ИСПОЛНЕНИЕМ.** Боевой `ParseReply` на строках `修行→cultivation`, `元海→Primordial Sea`, `转→realm`, `是为→is`: **принято 5 из 5, bad_lines = 0**. Ни один счётчик не шевельнулся |
-| 2 | Якорь ⟦TM-CANON⟧ — де-факто якорь целевого ЯЗЫКА, и он пуст на холодном старте | [terminologist.go:307-316](backend/internal/pipeline/terminologist.go#L307-L316), [terminology.go:714-765](backend/internal/terminology/terminology.go#L714-L765) `CanonFor` | **Подтверждаю чтением.** `CanonFor` берёт только APPROVED-строки; их ноль до первой подписи. Пустой якорь → `renderPairs` даёт `""` → сообщение не отправляется вовсе |
-| 3 | Эхо-гейт не ловит английский | [terminology.go:885](backend/internal/terminology/terminology.go#L885) | **Подтверждаю чтением.** Проверка `normalize(dst) == key` ловит эхо ИСХОДНИКА; английское слово исходником не является |
-| 4 | `《咏梅》` и `咏梅` — две разные строки карты подписи | [norm.go:136-156](backend/internal/text/norm.go#L136-L156), [banknote.go:288](backend/internal/pipeline/banknote.go#L288) | **Подтверждаю ИСПОЛНЕНИЕМ.** `key(《咏梅》)="《咏梅》"` против `key(咏梅)="咏梅"`, не равны. NFKC книжные кавычки не снимает — они не совместимостные |
-| 5 | `蛊`/`转` подписаны и не доезжают ни одним каналом | [memory.go:276](backend/internal/membank/memory.go#L276), [norm.go:252-263](backend/internal/text/norm.go#L252-L263), [miner_emit.go:27,33](backend/internal/miner/miner_emit.go#L27) | **Подтверждаю ИСПОЛНЕНИЕМ.** `SignificantLen(蛊)=1`, `SignificantLen(转)=1`, `SignificantLen(蛊师)=2` — ровно порог `minKeyLenHan=2` |
-| 6 | Банкнота — носитель покрытия (5/6 кандидатов) | [mining.go:87-120](backend/internal/pipeline/mining.go#L87-L120), [terminology.go:128-214](backend/internal/terminology/terminology.go#L128-L214) `Merge` | **Подтверждаю чтением и УТОЧНЯЮ:** в живом слое это ещё и означает, что ~84% кандидатов несут строку `drafts:` — то есть целевой язык уже стоит в запросе. Замер §3 его снял («черновых вариантов нет») и потому меряет риск языка в его ХУДШЕЙ точке. Дыру это не отменяет (см. §2.0) |
-| 7 | Частотного экрана для банкноты не существует (§5.1) | [miner_emit.go:27](backend/internal/miner/miner_emit.go#L27) `emitMinFreq` | **Подтверждаю и присоединяюсь.** Порога, разделяющего `少年` (1149) и `光阴之河` (15), нет. Своё предложение частотного порога полигон снял сам — это образцовая работа, и повторять её я не буду |
-| 8 | kwic-дефолт 3×40 достаточен | [terminologist.go:57-61](backend/internal/pipeline/terminologist.go#L57-L61) | **Принимаю вердикт, оспариваю его перенос.** Достаточность измерена на ЛЁГКОЙ выборке без строки `drafts:` (§3.3 сам называет три различия). Практический вывод — «поднимать нечем» — от этого не страдает, и я не предлагаю поднимать |
-| 9 | `kwic_width` в рунах — утечка пары в общий слой (§6.3) | [terminology.go:331-346](backend/internal/terminology/terminology.go#L331-L346) `window` | **Подтверждаю чтением.** Окно режется в рунах, константа одна на все пары |
-| 10 | Эмиссия банкноты — лотерея прогона (Жаккар 0.077–0.40) | [glossary.go:258-299](backend/internal/store/glossary.go#L258-L299) (PK `book_id,chapter,chunk_idx`), [banknote.go:330-379](backend/internal/pipeline/banknote.go#L330-L379) | **Подтверждаю чтением и УТОЧНЯЮ механизм:** внутри ОДНОЙ базы повтор невозможен — чекпойнт реиграет тот же текст, и `bankProposalsJSON` пересчитывается из него ([stagerun.go:415](backend/internal/pipeline/stagerun.go#L415)). Разъезд возникает только когда черновики РЕАЛЬНО перекупаются; тогда `UPSERT` по PK **затирает** прошлые предложения — объединение теряется |
+| 1 | Роль отвечает по-английски, и конвейер это банкует (§3.4) | [terminology.go:842-892](../../../backend/internal/terminology/terminology.go#L842-L892) `ParseReply`, [:576-588](../../../backend/internal/terminology/terminology.go#L576-L588) `wellFormedLemma` | **Подтверждаю ИСПОЛНЕНИЕМ.** Боевой `ParseReply` на строках `修行→cultivation`, `元海→Primordial Sea`, `转→realm`, `是为→is`: **принято 5 из 5, bad_lines = 0**. Ни один счётчик не шевельнулся |
+| 2 | Якорь ⟦TM-CANON⟧ — де-факто якорь целевого ЯЗЫКА, и он пуст на холодном старте | [terminologist.go:307-316](../../../backend/internal/pipeline/terminologist.go#L307-L316), [terminology.go:714-765](../../../backend/internal/terminology/terminology.go#L714-L765) `CanonFor` | **Подтверждаю чтением.** `CanonFor` берёт только APPROVED-строки; их ноль до первой подписи. Пустой якорь → `renderPairs` даёт `""` → сообщение не отправляется вовсе |
+| 3 | Эхо-гейт не ловит английский | [terminology.go:885](../../../backend/internal/terminology/terminology.go#L885) | **Подтверждаю чтением.** Проверка `normalize(dst) == key` ловит эхо ИСХОДНИКА; английское слово исходником не является |
+| 4 | `《咏梅》` и `咏梅` — две разные строки карты подписи | [norm.go:136-156](../../../backend/internal/text/norm.go#L136-L156), [banknote.go:288](../../../backend/internal/pipeline/banknote.go#L288) | **Подтверждаю ИСПОЛНЕНИЕМ.** `key(《咏梅》)="《咏梅》"` против `key(咏梅)="咏梅"`, не равны. NFKC книжные кавычки не снимает — они не совместимостные |
+| 5 | `蛊`/`转` подписаны и не доезжают ни одним каналом | [memory.go:276](../../../backend/internal/membank/memory.go#L276), [norm.go:252-263](../../../backend/internal/text/norm.go#L252-L263), [miner_emit.go:27,33](../../../backend/internal/miner/miner_emit.go#L27) | **Подтверждаю ИСПОЛНЕНИЕМ.** `SignificantLen(蛊)=1`, `SignificantLen(转)=1`, `SignificantLen(蛊师)=2` — ровно порог `minKeyLenHan=2` |
+| 6 | Банкнота — носитель покрытия (5/6 кандидатов) | [mining.go:87-120](../../../backend/internal/pipeline/mining.go#L87-L120), [terminology.go:128-214](../../../backend/internal/terminology/terminology.go#L128-L214) `Merge` | **Подтверждаю чтением и УТОЧНЯЮ:** в живом слое это ещё и означает, что ~84% кандидатов несут строку `drafts:` — то есть целевой язык уже стоит в запросе. Замер §3 его снял («черновых вариантов нет») и потому меряет риск языка в его ХУДШЕЙ точке. Дыру это не отменяет (см. §2.0) |
+| 7 | Частотного экрана для банкноты не существует (§5.1) | [miner_emit.go:27](../../../backend/internal/miner/miner_emit.go#L27) `emitMinFreq` | **Подтверждаю и присоединяюсь.** Порога, разделяющего `少年` (1149) и `光阴之河` (15), нет. Своё предложение частотного порога полигон снял сам — это образцовая работа, и повторять её я не буду |
+| 8 | kwic-дефолт 3×40 достаточен | [terminologist.go:57-61](../../../backend/internal/pipeline/terminologist.go#L57-L61) | **Принимаю вердикт, оспариваю его перенос.** Достаточность измерена на ЛЁГКОЙ выборке без строки `drafts:` (§3.3 сам называет три различия). Практический вывод — «поднимать нечем» — от этого не страдает, и я не предлагаю поднимать |
+| 9 | `kwic_width` в рунах — утечка пары в общий слой (§6.3) | [terminology.go:331-346](../../../backend/internal/terminology/terminology.go#L331-L346) `window` | **Подтверждаю чтением.** Окно режется в рунах, константа одна на все пары |
+| 10 | Эмиссия банкноты — лотерея прогона (Жаккар 0.077–0.40) | [glossary.go:258-299](../../../backend/internal/store/glossary.go#L258-L299) (PK `book_id,chapter,chunk_idx`), [banknote.go:330-379](../../../backend/internal/pipeline/banknote.go#L330-L379) | **Подтверждаю чтением и УТОЧНЯЮ механизм:** внутри ОДНОЙ базы повтор невозможен — чекпойнт реиграет тот же текст, и `bankProposalsJSON` пересчитывается из него ([stagerun.go:415](../../../backend/internal/pipeline/stagerun.go#L415)). Разъезд возникает только когда черновики РЕАЛЬНО перекупаются; тогда `UPSERT` по PK **затирает** прошлые предложения — объединение теряется |
| 11 | Роль выдумывает dst 77–82% на расширенном хвосте | — | **Принимаю; предмета для кода нет** (расширение не строится) |
| 12 | Условие фолбэка «судья-с-декоем» наступило | — | **Принимаю.** Считаю деньгами в §3.4 |
**Побочная находка ревью (не скоуп-крип, а мой собственный хвост D39.47):** в
-[pipeline.go:255-261](backend/internal/config/pipeline.go#L255-L261) doc-комментарий `TerminologyGate`
+[pipeline.go:255-261](../../../backend/internal/config/pipeline.go#L255-L261) doc-комментарий `TerminologyGate`
всё ещё обещает роли «its genre glossary». Механизма нет с D39.47 — осталась строка документации.
Правка на одну строку, кладу в стройку этого пакета, отдельного решения не прошу.
@@ -81,7 +81,7 @@
- `CanonConflicts` молчит — конфликтовать не с чем, якорь пуст.
Дальше строка едет по штатному маршруту: `ParseReply` → `attachConsolidatedDst`
-([terminologist.go:384-396](backend/internal/pipeline/terminologist.go#L384-L396)) → `status: draft` →
+([terminologist.go:384-396](../../../backend/internal/pipeline/terminologist.go#L384-L396)) → `status: draft` →
авто-банк → инъекция редактора с ⟨проверить⟩. То есть **`修行 → cultivation` становится рабочим каноном
книги**, и единственное, что стоит между ним и текстом, — глаз владельца на стопе, которого в авто-режиме
нет по определению.
@@ -109,7 +109,7 @@ offLanguage(dst, script) := (letters(dst) > 0) && (hits(dst, script) == 0)
```
**Общность.** Письмо приезжает в `terminology` ЗНАЧЕНИЕМ (`*unicode.RangeTable`), как уже приезжает
-`Conformance func(dst, typ) float64` ([terminology.go:351-361](backend/internal/terminology/terminology.go#L351-L361)).
+`Conformance func(dst, typ) float64` ([terminology.go:351-361](../../../backend/internal/terminology/terminology.go#L351-L361)).
Ни имени языка, ни имени письма в пакете нет. Таблица резолвится по ИМЕНИ из `unicode.Scripts` —
стандартная таблица Go, покрывающая любое письмо. Ревью-вопрос «заработает ли на паре, которой в репо
ещё нет, без правки Go?» — **да**: новая пара объявляет своё письмо строкой конфига.
@@ -125,7 +125,7 @@ offLanguage(dst, script) := (letters(dst) > 0) && (hits(dst, script) == 0)
Ложных срабатываний нет ни одного, включая пограничные: `гу` (2 буквы), `9` (букв нет — не трогаем),
кавычки и двойной пробел.
-**Где стоит.** Ровно там, где уже стоит эхо-проверка — [terminology.go:885](backend/internal/terminology/terminology.go#L885),
+**Где стоит.** Ровно там, где уже стоит эхо-проверка — [terminology.go:885](../../../backend/internal/terminology/terminology.go#L885),
и по той же логике: «ответ, который есть исходник, — не перевод» ↔ «ответ, который написан не на языке
цели, — не перевод». Строка считается плохой (`bad`), термин остаётся неконсолидированным
(`status: auto`, инертен). Ни одна выдумка в банк не попадает.
@@ -136,13 +136,13 @@ offLanguage(dst, script) := (letters(dst) > 0) && (hits(dst, script) == 0)
сторону — решение, а не недосмотр.
**Наблюдаемость (обязательна, иначе экран сам становится тихой деградацией).** Отдельный счётчик
-`OffLanguage` в `terminologyResult` ([terminologist.go:65-81](backend/internal/pipeline/terminologist.go#L65-L81))
+`OffLanguage` в `terminologyResult` ([terminologist.go:65-81](../../../backend/internal/pipeline/terminologist.go#L65-L81))
— НЕ слияние с `BadLines`: «модель ответила не на том языке» и «модель сломала формат» требуют разных
действий. Батч, где доля не-целевых строк ≥ ½, логируется `Warn` с именами строк: это ровно сигнатура
срыва §3.4 (22 из 40), и она должна быть видна оператору в тот же момент, а не в отчёте через сутки.
**Тот же предикат — на втором входе.** Черновая банкнота тоже несёт dst в банк
-([banknote.go:330-379](backend/internal/pipeline/banknote.go#L330-L379)), и `是为 → is` в §2.6 показывает,
+([banknote.go:330-379](../../../backend/internal/pipeline/banknote.go#L330-L379)), и `是为 → is` в §2.6 показывает,
что канал не иммунен. Фильтр ставится в СВЁРТКЕ (`bankObservedByKey`) и на записи
(`bankProposalsJSON`), а не в парсере — почему именно так, см. оси в §3.1.
@@ -178,14 +178,14 @@ offLanguage(dst, script) := (letters(dst) > 0) && (hits(dst, script) == 0)
|---|---|
| **Деньги стройки** | $0 (детерминированный предикат, ни одного вызова) |
| **Деньги в проде** | $0 навсегда |
-| **Снапшот движка** | НЕ двигается: предикат читает ОТВЕТ, байты запроса не меняются; `gates.terminology` в снапшот не фолдится ([pipeline.go:263-268](backend/internal/config/pipeline.go#L263-L268)) |
+| **Снапшот движка** | НЕ двигается: предикат читает ОТВЕТ, байты запроса не меняются; `gates.terminology` в снапшот не фолдится ([pipeline.go:263-268](../../../backend/internal/config/pipeline.go#L263-L268)) |
| **Батчи терминолога** | НЕ перекупаются (адрес батча — байты запроса) |
| **Книга без англоязычных строк в банке** | путь байт-в-байт прежний, не перебилливается |
| **Книга, у которой такая строка в авто-банке ЕСТЬ** | строка исчезает → обогащённая версия банка сдвигается → **редакторская волна перебилливается ОДИН раз**. Это штатный путь «банк изменился», а не `--resnapshot` движка |
-| **Конфиг** | новый ключ `gates.terminology.target_script` (имя письма). Обязателен при `enabled: true`, проверяется на ЗАГРУЗКЕ по идиоме [pipeline.go:986-1003](backend/internal/config/pipeline.go#L986-L1003) — гейт, который не может отработать, отвергается до денег |
+| **Конфиг** | новый ключ `gates.terminology.target_script` (имя письма). Обязателен при `enabled: true`, проверяется на ЗАГРУЗКЕ по идиоме [pipeline.go:986-1003](../../../backend/internal/config/pipeline.go#L986-L1003) — гейт, который не может отработать, отвергается до денег |
**Почему конфиг, а не пар-данные langpack.** Файл в `configs/langpacks/<пара>/` фолдится в
-`Pack.Version()` → `LangpackVersion` → **обе волны** ([snapshot.go:428](backend/internal/pipeline/snapshot.go#L428))
+`Pack.Version()` → `LangpackVersion` → **обе волны** ([snapshot.go:428](../../../backend/internal/pipeline/snapshot.go#L428))
→ полная перепокупка книги. Платить перепокупкой черновой волны за объявление письма — несоразмерно.
`gates.terminology` не фолдится вообще, поэтому там объявление стоит $0. Общность при этом сохранена:
значение — данные, не Go.
@@ -241,8 +241,8 @@ offLanguage(dst, script) := (letters(dst) > 0) && (hits(dst, script) == 0)
| Место | Что чинит | Цена |
|---|---|---|
-| **(Q1) свёртка `bankObservedByKey` + запись `bankProposalsJSON`** ← **рекомендую** | ключи сходятся, 4 строки карты подписи становятся 2, ретроактивно для уже оплаченных прогонов | **$0.** `retrieval_state` не wire-load-bearing ([migrate.go:316-327](backend/internal/store/migrate.go#L316-L327)); снапшот не двигается |
-| (Q2) парсер `parseBanknote` | то же | `bankParserVersion` фолдится ([snapshot.go:113-130](backend/internal/pipeline/snapshot.go#L113-L130)) → `--resnapshot` → **перепокупка всей черновой волны** каждой книги с включённым каналом |
+| **(Q1) свёртка `bankObservedByKey` + запись `bankProposalsJSON`** ← **рекомендую** | ключи сходятся, 4 строки карты подписи становятся 2, ретроактивно для уже оплаченных прогонов | **$0.** `retrieval_state` не wire-load-bearing ([migrate.go:316-327](../../../backend/internal/store/migrate.go#L316-L327)); снапшот не двигается |
+| (Q2) парсер `parseBanknote` | то же | `bankParserVersion` фолдится ([snapshot.go:113-130](../../../backend/internal/pipeline/snapshot.go#L113-L130)) → `--resnapshot` → **перепокупка всей черновой волны** каждой книги с включённым каналом |
| (Q3) `text.NormalizeSourceKey` | то же + совпадение с ключами банка памяти | `NormVersion` → `memoryVersion` → **обе волны**; плюс смена семантики матчинга для всей памяти |
Q2 и Q3 платят волной за косметику. Q1 даёт тот же результат бесплатно и вдобавок лечит УЖЕ записанные
@@ -259,7 +259,7 @@ Q2 и Q3 платят волной за косметику. Q1 даёт тот
### §3.2 Агрегация по прогонам: объединение вместо затирания
**Что ломается сегодня.** `retrieval_state` имеет PK `(book_id, chapter, chunk_idx)` и UPSERT
-([glossary.go:258-299](backend/internal/store/glossary.go#L258-L299)). Пока черновики резюмятся из
+([glossary.go:258-299](../../../backend/internal/store/glossary.go#L258-L299)). Пока черновики резюмятся из
чекпойнтов — предложения воспроизводятся байт-в-байт. Как только черновик РЕАЛЬНО перекуплен (снапшот
сдвинулся), новая строка затирает старую, и предложения прошлого сэмпла исчезают навсегда, хотя
чекпойнт с их текстом лежит в базе.
@@ -267,7 +267,7 @@ Q2 и Q3 платят волной за косметику. Q1 даёт тот
**Вариант A1 (рекомендуемый): объединение выводится из ЧЕКПОЙНТОВ, нового долговечного состояния нет.**
Свёртка читает не текущие `retrieval_state`, а все чекпойнты книги переводческой роли, и разбирает из
них блоки ⟦TM-BANK-v1⟧ тем же кодом, которым это уже делается на резюме
-([stagerun.go:415](backend/internal/pipeline/stagerun.go#L415)). Нужен один новый store-запрос
+([stagerun.go:415](../../../backend/internal/pipeline/stagerun.go#L415)). Нужен один новый store-запрос
(`checkpoints JOIN jobs ON job_id WHERE book_id=? AND role=?`), с исключением производных
(`finish_reason='banknote_export'` — там блок уже срезан) и с тем же гейтом `finish=="stop"`.
@@ -283,7 +283,7 @@ Q2 и Q3 платят волной за косметику. Q1 даёт тот
не выводимое из чекпойнтов, миграция, и первый же баг записи становится неисправимым — против дисциплины
всего этого хранилища.
-**Обязательство, которое я обязан доказать тестом, а не заявить.** [mining.go:108-120](backend/internal/pipeline/mining.go#L108-L120)
+**Обязательство, которое я обязан доказать тестом, а не заявить.** [mining.go:108-120](../../../backend/internal/pipeline/mining.go#L108-L120)
прямо предупреждает: если дельта отличается между прогоном 1 и прогоном 2, сдвигается редакторская
волна и книга перебилливается ни за что. Объединение это ужесточает. Инвариант: **прогон, который не
купил ни одного нового черновика, обязан дать байт-идентичную карту подписи.** Он держится по
@@ -307,7 +307,7 @@ Q2 и Q3 платят волной за косметику. Q1 даёт тот
**Сигнал.** Частота в тексте отвергнута замером. Но в свёртке уже лежит другое число: `Chunks` — в
скольких ЧАНКАХ переводчик независимо предложил эту поверхность
-([banknote.go:351-356](backend/internal/pipeline/banknote.go#L351-L356)). Это не частота в тексте, а
+([banknote.go:351-356](../../../backend/internal/pipeline/banknote.go#L351-L356)). Это не частота в тексте, а
**повторяемость решения**: сколько раз независимый чтец, глядя на разные куски, счёл строку достойной
объявления термином. Ставлю гипотезу на отношение
@@ -341,7 +341,7 @@ consistency := Σ chunks(предложившие поверхность) / (ч
**Цена одного кандидата.** Улика судьи — та же, что у терминолога: исходник + контексты + предложенный
dst. Мой собственный замер на боевой сборке: **223 токена на кандидата** при kwic 3×40. Выход вердикта
-≈10 токенов. Цены `deepseek-v4-flash` из [models.yaml](backend/configs/models.yaml): $0.14/$0.28 за 1M.
+≈10 токенов. Цены `deepseek-v4-flash` из [models.yaml](../../../backend/configs/models.yaml): $0.14/$0.28 за 1M.
| Статья | Токенов | $ |
|---|---|---|
@@ -383,10 +383,10 @@ dst. Мой собственный замер на боевой сборке: **
**Вариант A (рекомендуемый): необязательный пар-файл + инженерный фолбэк.**
`configs/langpacks/<пара>/terminology.txt` с парами `ключ значение` (`kwic_width 40`, при нужде
`kwic_per_term 3`), читается идиомой `readOptional` — **ровно как `heading.txt` и `dc-checkers.txt`**
-([langpack.go:196-225](backend/internal/lang/langpack.go#L196-L225)): отсутствует → фича инертна и
+([langpack.go:196-225](../../../backend/internal/lang/langpack.go#L196-L225)): отсутствует → фича инертна и
`Version()` побайтно стабилен; присутствует → байты фолдятся, правка = громкий `--resnapshot`.
Приоритет резолвинга в одном месте (`terminologyOpts`,
-[terminologist.go:99-112](backend/internal/pipeline/terminologist.go#L99-L112)): **явный конфиг книги →
+[terminologist.go:99-112](../../../backend/internal/pipeline/terminologist.go#L99-L112)): **явный конфиг книги →
пар-данные → инженерный фолбэк**.
**Для zh-ru файл НЕ шипуем.** Измеренное значение совпадает с фолбэком, значит файл не купил бы ничего,
@@ -395,7 +395,7 @@ dst. Мой собственный замер на боевой сборке: **
шипует свой файл со своим значением, и на ней ничего перекупать не надо — там ещё ничего не куплено.
**Вариант Б: мерить окно не в рунах, а в предложениях источника** (`sentence-terminator.txt` в паке
-уже есть, [langpack.go:139-151](backend/internal/lang/langpack.go#L139-L151)). Единица становится
+уже есть, [langpack.go:139-151](../../../backend/internal/lang/langpack.go#L139-L151)). Единица становится
пар-осмысленной по построению. **Не рекомендую сейчас:** это меняет БАЙТЫ контекстов → перекупку батчей
терминолога, а сетка §3.1 показала, что ни одна форма подачи не отличима от другой. Менять то, что
измеренно не влияет, — трата без гипотезы. Называю как опцию на случай, если пере-замер на трудной
@@ -410,12 +410,12 @@ dst. Мой собственный замер на боевой сборке: **
## §5 `allow_short` для `蛊`/`转` — данные, но НЕ бесплатные
Механизм подтверждён исполнением: `SignificantLen(蛊)=1` при пороге 2, обход — `allow_short: true` в
-строке сида, Go не трогается ([memory.go:276](backend/internal/membank/memory.go#L276)). Пока согласен
+строке сида, Go не трогается ([memory.go:276](../../../backend/internal/membank/memory.go#L276)). Пока согласен
с полигоном. Дальше — три вещи, которых в §1.5 нет, и они меняют вывод «просто добавь строку».
1. **Это перепокупка ВСЕЙ книги.** `AllowShort` фолдится в хеш строки банка
- ([memory.go:368](backend/internal/membank/memory.go#L368)), а `蛊` — строка с `source: seed`, то есть
- входит в БАЗОВУЮ версию банка ([snapshot.go:264-271](backend/internal/pipeline/snapshot.go#L264-L271)).
+ ([memory.go:368](../../../backend/internal/membank/memory.go#L368)), а `蛊` — строка с `source: seed`, то есть
+ входит в БАЗОВУЮ версию банка ([snapshot.go:264-271](../../../backend/internal/pipeline/snapshot.go#L264-L271)).
Базовая версия — это снапшот ЧЕРНОВОЙ волны. Правка данных, но цена — заново купленная книга.
2. **Ключ из одного иероглифа сидит внутри своих же составных.** `蛊` — подстрока `蛊师`, `蛊虫`,
`力量蛊`. Он начнёт срабатывать в каждом таком чанке, а разрешение вложенности уйдёт на
@@ -520,7 +520,7 @@ dst. Мой собственный замер на боевой сборке: **
4. **«Агрегация из чекпойнтов затащит мусор отвергнутых попыток».** Верно, объявил решением. Отвергнутый
черновик — плохой ТЕКСТ; его банкнота от этого не становится неправдой, а подписи всё равно нет.
5. **«Агрегация нарушает детерминизм между прогонами и перебиллит волну».** Самое серьёзное возражение;
- [mining.go:108-112](backend/internal/pipeline/mining.go#L108-L112) предупреждает об этом прямым
+ [mining.go:108-112](../../../backend/internal/pipeline/mining.go#L108-L112) предупреждает об этом прямым
текстом. Ответ: множество чекпойнтов меняется ТОЛЬКО когда куплены новые черновики, то есть волна и
так перекупалась. Но рассуждения мало — поэтому инвариант вынесен в обязательство приёмки (§3.2).
6. **«Кавычки надо чинить в `NormalizeSourceKey`, там место нормализации».** Соблазнительно и почти
diff --git a/docs/archive/reports/PACK20_DELTA_2026-07-26.md b/docs/archive/reports/PACK20_DELTA_2026-07-26.md
index 327813b8..5767bdf7 100644
--- a/docs/archive/reports/PACK20_DELTA_2026-07-26.md
+++ b/docs/archive/reports/PACK20_DELTA_2026-07-26.md
@@ -54,7 +54,7 @@
- **Снапшоты книг и волны НЕ двигаются.** Проверил прогоном на копии шиппингового пака: файл был вне
`pack.Version()`, поэтому его удаление даёт **побайтно ту же версию** (`langpack-v2-a28ed743c99c` до и после
восстановления файла в каталог пары). `LangpackVersion` — единственный вход пака в снапшот
- ([snapshot.go:428](../../backend/internal/pipeline/snapshot.go#L428)), значит ни один юнит ни одной книги не
+ ([snapshot.go:428](../../../backend/internal/pipeline/snapshot.go#L428)), значит ни один юнит ни одной книги не
пере-оплачивается и `--resnapshot` не нужен. Проба-скрипт удалён после замера.
- **Пере-покупаются только батчи терминолога.** Байты промпта роли и отрендеренный якорь входят в
request-hash вызовов класса `terminologist`; per-stage `PromptSHA256` терминолога не видит (он не стадия, а
@@ -82,7 +82,7 @@
Связывающее ограничение теперь одно: **эмиссия**. `修行` ×326 не увидит никто, потому что
`emissionEligible` требует тип ∈ {name, place, title}, а у доменного понятия паттерна нет
-([miner_emit.go:302-313](../../backend/internal/miner/miner_emit.go#L302-L313)).
+([miner_emit.go:302-313](../../../backend/internal/miner/miner_emit.go#L302-L313)).
### 2.0 Находка чтением кода, которая меняет форму вопроса: потребителей у эмиссии ТРИ, а потолок один
@@ -92,15 +92,15 @@ G7 сформулирован как «показ владельцу ≠ под
| # | потребитель | что ему нужно | где в коде |
|---|---|---|---|
| **C1** | лист на ПОДПИСЬ владельцу | объём, который человек физически подпишет (17 строк — да, 15 418 — нет) | `signatureMapPath()`, стоп-таблица |
-| **C2** | АВТО-банк (D39.42 п.3): строки ⟨проверить⟩, которые едут в редактора и в следующие черновики | покрытие; подпись НЕ требуется | `writeAutoBank` → `seedGlossary` ([mining.go:176-181](../../backend/internal/pipeline/mining.go#L176-L181)) |
+| **C2** | АВТО-банк (D39.42 п.3): строки ⟨проверить⟩, которые едут в редактора и в следующие черновики | покрытие; подпись НЕ требуется | `writeAutoBank` → `seedGlossary` ([mining.go:176-181](../../../backend/internal/pipeline/mining.go#L176-L181)) |
| **C3** | вход ТЕРМИНОЛОГА | покрытие; цена = токены | `buildBankCandidates` → `runTerminologist` |
**И вот что важно для решения: расширять один только вход роли (C3) почти ничего не даёт.** Проверено чтением
потока: консолидация приклеивается перебором строк ДЕЛЬТЫ с поиском по ключу
-([terminologist.go:384-396](../../backend/internal/pipeline/terminologist.go#L384-L396), вызов —
-[mining.go:141](../../backend/internal/pipeline/mining.go#L141)), поэтому dst кандидата, которого в `mined`
+([terminologist.go:384-396](../../../backend/internal/pipeline/terminologist.go#L384-L396), вызов —
+[mining.go:141](../../../backend/internal/pipeline/mining.go#L141)), поэтому dst кандидата, которого в `mined`
нет, **в банк не попадает**: он виден только в сайдкар-таблице стопа (она рендерится из полного `cands`,
-[mining.go:253-266](../../backend/internal/pipeline/mining.go#L253-L266)) и умирает вместе с прогоном — ни в
+[mining.go:253-266](../../../backend/internal/pipeline/mining.go#L253-L266)) и умирает вместе с прогоном — ни в
инъекцию редактору, ни в следующий черновик, ни в лист подписи. Значит recall лечится только расширением
того, что попадает в `mined`, то есть C2, а C1 обязан остаться человеческого размера. Правильная формулировка
оси, по-моему, не «показ ≠ подача», а **«что БАНКУЕТСЯ без подписи ≠ что кладётся НА ПОДПИСЬ»**; подача роли
@@ -130,7 +130,7 @@ precision спот-чек по C ≈ **0.15** (один разметчик).
годен как **катастроф-экран** (разрыв до декоя 1.27–1.42 против межарменного 0.20). Это ровно задача
«отсечь грубый мусор, не ранжируя тонкое». То есть при провале критерия ответ известен и не нов.
- **Инженерная цена, названная честно:** кластеризация алиасов — `proposeAliasEdges`, полный перебор пар
- ([miner_alias.go:80-82](../../backend/internal/miner/miner_alias.go#L80-L82)). 200 кандидатов = 19 900 пар,
+ ([miner_alias.go:80-82](../../../backend/internal/miner/miner_alias.go#L80-L82)). 200 кандидатов = 19 900 пар,
13 246 = **87.7 млн** пар, часть с посентенсным сканом текста. Полигон прогонял абляцию на 25 главах, значит
это терминируется; на 100 главах и на приёмочной книге (где детектор сам квадратичен, A3.7) **не мерено ни
разу**. Чинится дёшево, если подача роли собирается ДО кластеризации (роли нужны поверхности с контекстами,
diff --git a/docs/archive/reports/POLYGON_TERM_RESEARCH_A_2026-07-26.md b/docs/archive/reports/POLYGON_TERM_RESEARCH_A_2026-07-26.md
index dd2eccc6..849aacfa 100644
--- a/docs/archive/reports/POLYGON_TERM_RESEARCH_A_2026-07-26.md
+++ b/docs/archive/reports/POLYGON_TERM_RESEARCH_A_2026-07-26.md
@@ -51,10 +51,10 @@
**Пять находок, каждая с сырьём.**
-1. **WHICH-канал боевого майнера не видит жанровых терминов — измерено.** Recall против ПОДПИСАННОГО владельцем банка книги: **0.069–0.103** (три среза), по классам: `name` 0.231 · `title` 0.077–0.154 · **`place` 0.000** · **`term` 0.040**. Самый частый термин книги — 蛊, 8700 вхождений в 50 главах, заглавное понятие романа — **не предлагается никогда**. Механизм — не тюнинг, а конструкция: `emissionEligible` требует типа `name|place|title` и длины ≥2 рун ([miner_emit.go:241-252](../../backend/internal/miner/miner_emit.go#L241-L252)). §A3.3.
+1. **WHICH-канал боевого майнера не видит жанровых терминов — измерено.** Recall против ПОДПИСАННОГО владельцем банка книги: **0.069–0.103** (три среза), по классам: `name` 0.231 · `title` 0.077–0.154 · **`place` 0.000** · **`term` 0.040**. Самый частый термин книги — 蛊, 8700 вхождений в 50 главах, заглавное понятие романа — **не предлагается никогда**. Механизм — не тюнинг, а конструкция: `emissionEligible` требует типа `name|place|title` и длины ≥2 рун ([miner_emit.go:241-252](../../../backend/internal/miner/miner_emit.go#L241-L252)). §A3.3.
2. **Абляция говорит, ЧТО именно стоит recall.** Снятие потолка `emitRankCap=200` → recall 0.089→**0.429**; дополнительно снятие фильтра типа → **0.875**; дополнительно одноиероглифные → **0.911**. Цена: эмиссия 17 → 624 → 13 246 → 15 418 строк при precision спот-чека ≈0.15. То есть **recall в ранжированном МНОЖЕСТВЕ есть, его отдаёт слой ЭМИССИИ** — ровно за подписываемый объём. §A3.4.
3. **Покрытие банка не растёт с длиной книги — оно колеблется и теряет уже найденное.** 10 глав → 15 термов, 25 → 17, 50 → **12**, 100 → 14. `学堂家老` — терм, который владелец подписал на мини-прогоне (D39.37) — на 50 главах исчезает из дельты, будучи проглочен алиас-кластером фамилии `葛家` вместе с родовым титулом `族长`. §A3.5.
-4. **Генеральность: движок сегодня физически не может майнить не-ханьские книги, и это ГРОМКО, но с одной тихой дырой.** `lang.Load` для `ja`/`en` падает с явной ошибкой (D39.15 работает). Но если книгу с не-ханьским текстом провести под zh-паком — на английском майнер отдаёт **0 термов и стоп молча авто-продолжает** ([mining.go:70-73](../../backend/internal/pipeline/mining.go#L70-L73)), а на японском отдаёт **8 термов, из них верных 0**, причём эмитируемая строка не существует в книге (`範囲`→`范囲`, `馬鹿`→`马鹿`: trad→simp-фолд нормализатора). §A3.6.
+4. **Генеральность: движок сегодня физически не может майнить не-ханьские книги, и это ГРОМКО, но с одной тихой дырой.** `lang.Load` для `ja`/`en` падает с явной ошибкой (D39.15 работает). Но если книгу с не-ханьским текстом провести под zh-паком — на английском майнер отдаёт **0 термов и стоп молча авто-продолжает** ([mining.go:70-73](../../../backend/internal/pipeline/mining.go#L70-L73)), а на японском отдаёт **8 термов, из них верных 0**, причём эмитируемая строка не существует в книге (`範囲`→`范囲`, `馬鹿`→`马鹿`: trad→simp-фолд нормализатора). §A3.6.
5. **Масштаб: майнер квадратичен.** Пять замеров, лог-лог-фит по одной книге: `t ≈ e^-22.23 · chars^2.013`. Экстраполяция на приёмочную книгу (7.78 млн символов) — **≈4.6 часа** одного офлайн-прохода и RSS, растущий с 70 МБ до 365 МБ на 1.9 млн. §A3.7.
**Плюс два ресёрч-результата.**
@@ -373,7 +373,7 @@ M3 один dst → несколько src: 1 {'культивация': {'修
Не предлагается НИКОГДА, при таких частотах в 50 главах: `蛊` 8700× (заглавное понятие книги) · `转` 2171× · `蛊师` 1429× · `蛊虫` 978× · `真元` 471× · `古月` 451× (родовое имя главного героя!) · `修行` 326× · `南疆` 189×.
-**Механизм — код, а не тюнинг** ([miner_emit.go:241-252](../../backend/internal/miner/miner_emit.go#L241-L252)):
+**Механизм — код, а не тюнинг** ([miner_emit.go:241-252](../../../backend/internal/miner/miner_emit.go#L241-L252)):
```go
func emissionEligible(c scoredCand, subsumed, seedSurfaces map[string]bool, pack *lang.Pack) bool {
@@ -472,7 +472,7 @@ t ≈ exp(-22.231) · chars^2.013
Показатель **2.013** — чистая квадратичность. Экстраполяция на приёмочную книгу (7.78 млн символов): **≈4.6 часа** одного офлайн-прохода майнинга, RSS по тренду — единицы гигабайт. Это не деньги, это время и память, и это **вход в решение о МАСШТАБЕ** (D39.33: масштаб последним). Экстраполяция помечена как экстраполяция: замеров выше 1.9 млн символов нет.
-Кандидаты источника квадратичности видны в коде и НЕ проверены исполнением (профиля не снимал): `subsumedCandidates` перебирает по длинам все пары кандидатов ([miner_detect.go:80-103](../../backend/internal/miner/miner_detect.go#L80-L103)); `computeCValue` для каждого кандидата перечисляет все его подстроки ([miner_detect.go:38-75](../../backend/internal/miner/miner_detect.go#L38-L75)); `countOccurrences`/`entitySinceCh` сканируют весь текст на кандидата.
+Кандидаты источника квадратичности видны в коде и НЕ проверены исполнением (профиля не снимал): `subsumedCandidates` перебирает по длинам все пары кандидатов ([miner_detect.go:80-103](../../../backend/internal/miner/miner_detect.go#L80-L103)); `computeCValue` для каждого кандидата перечисляет все его подстроки ([miner_detect.go:38-75](../../../backend/internal/miner/miner_detect.go#L38-L75)); `countOccurrences`/`entitySinceCh` сканируют весь текст на кандидата.
### A3.8 Находка 6: классы терминов по языкам и жанрам
diff --git a/docs/glossary.md b/docs/glossary.md
new file mode 100644
index 00000000..865cfa65
--- /dev/null
+++ b/docs/glossary.md
@@ -0,0 +1,39 @@
+# Глоссарий — жаргон и сокращения проекта (один экран)
+
+Читать при онбординге по мере надобности; термин непонятен → сюда. Пополняет оркестратор.
+
+## Роли и фазы
+
+- **Оркестратор / Бэкенд / Полигон / Фронт** — роли сессий с зонами записи (CLAUDE.md §Роли). «Оркестратор №N» — канонический счётчик преемственности роли (текущий N — в шапке ORCHESTRATOR_SESSION_PROMPT).
+- **Хендофф(-промт)** — передача роли новой сессии файлом-промтом; аддендумы к бегущей сессии доезжают только релеем владельца.
+- **Владелец** — человек; ратифицирует деньги, скоуп-сдвиги, продукт, 18+; связной между сессиями.
+- **Ф0–Ф3** — фазы: Ф0 скелет · Ф1 инфраструктура · Ф2 качество (судья/гейты) · Ф2.5 пилот · Ф3 продукт (веб-фронт, ридер-IDE).
+- **Полигон** — eval-зона платных/бесплатных экспериментов (`eval/`, отчёты exp01–exp16).
+
+## Решения и документы
+
+- **D-номер (D39.x)** — ратифицированная запись в `architecture/05-decisions-log.md`; **голова** — последний номер; **эра** — куст решений одного курса; **лендинг** — коммит работ сессии оркестратором после приёмки.
+- **Р-номер — ДВА смысла по контексту:** Р1–Р10 = десять ранних принципов (`01-decisions.md`, историчны); Р1–Р7 в записях эры D39.5x–6x = вопросы/решения владельца по банку и промптам (D39.63 и соседние) — «Р2 = ЗНАЧЕНИЕ» из CURRENT-STATE не про принцип Р2. **H1–H18 / L1–L8** — находки стратегического аудита (`09-target-architecture.md` §3); H — HIGH, в т.ч. незакрытые владельческие требования.
+- **Q1–Qn** — нумерованные вопросы КОНКРЕТНОГО пакета/отчёта — контекст локален, Q2 пака-19 ≠ Q2 чекер-пака.
+- **V0–V5** — секции идей владельца в `START_PROMT.MD` (живой бриф; разобраны в `product-requirements.md`).
+- **Ш-1/Ш-2** — стоячие трипваеры голден-дрейфа стандартной библиотеки; Ш-2 = пересмотр `unicode.Version`-зависимых мест (memnorm/classifier/style + chunker/estimator) до перехода на go1.27 (детали — grep «Ш-2» по D-логу).
+- **PD-классика** — public-domain тексты из претрейна моделей; эмпирика на них предварительна до вебновелл-среза (CLAUDE.md §Дисциплина).
+- **Харнесс** — обвязка исполнения (наш пайплайн-транспорт или конкурентные agent-обвязки; калибровка — research/21–22).
+- **⚠-баннер** — шапка «тело superseded, чему верить»; **ревью-шапка** — вердикты приёмки поверх отчёта в `archive/reports/`.
+- **Пак** — пакет работ одной сессии; **свип** — полная перепроверка обязательств (D39.66: 951 позиция); **добор идеала** — очередь качества после ре-пробы flash; **МАСШТАБ** — прогон целой книги.
+- **Строка N** — стабильный ID строки единого бэклога (PROGRESS §Бэклог; не перенумеровывается); **вес** — блокер-очереди / скоро / когда-нибудь; **носитель** — артефакт, в котором обязательство живёт; **хвост** — незакрытый остаток; **петля** — вопрос, обязанный получить диспозицию; **слот** — зарезервированное место в будущем пакете/замере.
+- **Гвоздь** — регрессионный тест, прибивающий контракт (негативный гвоздь — тест на ОТСУТСТВИЕ поведения).
+
+## Пайплайн и код
+
+- **Волны** — waveDraft (черновик) → терминолог → waveEdit (редактура); имена только полные, аббревиатуры W0/W1 запрещены (решение владельца 19.07).
+- **Чанк** — единица нарезки книги; будущий якорь синхронизации фронта.
+- **Банк (памяти)** — термины/имена/голоса книги на весь прогон; **сид** — стартовый банк книги (YAML; подпись владельца — только вкусовые поля, D39.77); **бриф** — книжные вводные; **банкнота** — канал выноса кандидатов из ответа переводчика; **майнер** — $0-извлечение кандидатов из исходника; **KWIC** — конкорданс-контекст кандидата; **терминолог** — роль перевода/подписи терминов батчами.
+- **Гейты** — детерминированные $0-проверки перевода; **чекеры K1–K12** — классы дефектов рубрики; **DC1–DC7** — data-driven чекеры на данных пары; **репэйр** — платная петля ремонта (построена, выключена — строка 13).
+- **Судья** — Ф2-оценка качества (gemini); **канал B** — путь чувствительного контента (Mistral+grok); **лейблы (labels)** — размеченный корпус для precision/recall чекеров, метрики заморожены числами в приёмках.
+- **Голден** — байт-фиксированный снапшот прогона; **маскированный дифф** — сверка голдена с маской hex/версий; **CheapGateVersion (CGVER)** — версия контракта гейтов; **парити** — `TM_MINER_PARITY=1` EXACT-сверка майнера.
+- **Эхо-мина** — DeepSeek без thinking эхоит вход вместо перевода; гейт `echoMineViolation` принуждает thinking-ON.
+- **Langpack / пар-файл** — данные языковой пары (`backend/configs/langpacks/`); книжное в пар-слое = утечка; **общность** — ревью-вопрос «заработает ли пара/вторая книга без правки Go».
+- **Ведро B/D** — корзины триажа карты общности D39.60 (B «пар-модуль без гейта» · D «удалить»).
+- **tmctl** — CLI бэкенда (translate / report / status / export / redrive / seed-lint).
+- **COGS** — себестоимость перевода; **ре-проба** — дешёвый повторный замер провайдера после аномалии (строка 74).
diff --git a/docs/product-requirements.md b/docs/product-requirements.md
new file mode 100644
index 00000000..6cbdaffc
--- /dev/null
+++ b/docs/product-requirements.md
@@ -0,0 +1,73 @@
+# Реестр продуктовых требований — «что продукт обязан уметь»
+
+> Единый список требований владельца к продукту. Источники: `../START_PROMT.MD` (ЖИВОЙ бриф, идеи V0–V5) + владельческие находки H6–H18 (`architecture/09-target-architecture.md` §3). Статусы сверены кодом и D-логом при D39.80 (02.08.2026). **При конфликте с D-логом побеждает D-лог.** Правила: новую V-секцию владельца разбирает сюда оркестратор при первом касании; статус правится при лендинге пака, который его меняет; требование без носителя не оставлять.
+>
+> Статусы: ✅ построено · 🔶 частично · ⭕ не построено · ❌ снято (отменено владельцем ИЛИ закрыто отрицательным замером — с D-ссылкой) · 🔒 открытый вопрос владельца.
+
+## Ядро перевода
+
+| ID | Требование (источник) | Статус | Носитель / доказательство |
+|---|---|---|---|
+| ПТ-1 | Издательское художественное качество, победить translationese (V0 гл. цель; канон §1) | 🔶 | пайплайн draft→терминолог→editor→гейты→судья построен, адресная эскалация дорогой моделью есть (`pipeline/escalation.go`); качество добирается курсом «добор идеала» (D39.62/67, бэклог 24·65; 16 — непрогнанная edit-волна того же курса). Выводы-п.2 брифа (редкий узкий вызов за смыслами вне книги) — поглощён этим курсом, отдельный механизм не строится без замера |
+| ПТ-2 | Пары zh/en/ru/ja ВО ВСЕ СТОРОНЫ (V0-п.11; V4-п.5: в zh→en русский не участвует); движок общий, пара = данные (канон §2) | 🔶 | построено только →ru: zh→ru боевая; ja→ru безопасна без правки Go, en→ru — нет (карта D39.60); не-ru target = антицель §0.1 в 09; носители: строки 81 (ja-преп) · 35 (не-CJK майнер) · 34 |
+| ПТ-3 | Книга ЦЕЛИКОМ (эталон 7,78 млн симв., ~2284 раздела) | 🔶 | гоняли ≤10 глав; волны/потолки/ETA на сотнях глав = строка 54 (МАСШТАБ) |
+| ПТ-4 | Референсы: предыдущие части серии / чужой перевод как контекст (V0-п.13–14) | 🔶 | серийный шаринг банка = строка 48а; импорт «оригинал+чужой перевод» = 48б (юр-сторона — 67) |
+| ПТ-5 | Неологизмы/выдуманные автором слова переводятся консистентно (V1-п.6) | 🔶 | банк+майнер держат термины книги; замер на вне-претрейн тексте = строка 55 |
+| ПТ-6 | Структурные традиции целевого языка (короткие zh-абзацы → читаемые ru-структуры) (V1-п.4) | 🔶 | редакторские мандаты в пар-промптах; спец-замера структуры нет — добор идеала |
+| ПТ-7 | Слабый оригинал: подправлять ли художественно — вопрос владельца не решён (V1-п.5) | 🔒 | канал вопросов; сейчас пайплайн верен оригиналу |
+
+## Память и консистентность
+
+| ID | Требование (источник) | Статус | Носитель / доказательство |
+|---|---|---|---|
+| ПТ-8 | Банк памяти на всю книгу, «крайне точный» (V0-п.7–8; Выводы-п.1) | ✅ | D39.69/75/77/78; recall банка 0.918/0.980 на холодном прогоне (D39.58). Смежный остаток H6 (running-summary): carryover закрыт замером (D39.7/8), проза-суммарайзер закрыт (D39.69), нарратив-состояние = строка 80 (гейт пилота Ф2.5) |
+| ПТ-9 | Глоссарий автосборкой: модель переводит термины с контекстом/жанром (V4-п.4, H15) | ✅ | терминолог пака-20 (D39.41–53), KWIC-контексты, подписной цикл |
+| ПТ-10 | Веб-фетч для терминов без культурного контекста (V0-п.16, V4-п.4) | ⭕ | гейт action-security = строка 70 (Ф3); до него — сид/бриф |
+| ПТ-11 | Голоса персонажей консистентны на книгу (V1-п.2; канон §1) | 🔶 | схема голосов построена (пак-19, D39.55/56); оси не подписаны — замер добора (строки 24 · 13б) |
+
+## Деньги и телеметрия
+
+| ID | Требование (источник) | Статус | Носитель / доказательство |
+|---|---|---|---|
+| ПТ-12 | Низкий COGS: дешёвые модели + адресные дорогие вызовы (V0-п.3/12; канон §5) | ✅ | ~$0.85/ранобэ (D30.4); пере-калибровка после ре-пробы (строка 74) |
+| ПТ-13 | Телеметрия токенов/стоимости с первого вызова, БД (V0-п.25/31) | ✅ | SQLite `request_log`/леджер/смета; ⚠ леджер = нижняя граница (строка 78) |
+| ПТ-14 | Потолки бюджета и явное согласие на пере-оплату (канон §5) | ✅ | reserve/settle, потолки, `projectRebill`; щель терминолога = строка 38 |
+
+## Чувствительный контент
+
+| ID | Требование (источник) | Статус | Носитель / доказательство |
+|---|---|---|---|
+| ПТ-15 | 18+/агрессивный контент при цензуре провайдеров, мультипровайдерность (V0-п.9–10) | 🔶 | канал B построен (пак-17), лейблы/ToS-мониторинг (строка 4); per-chunk L3-скрин = строка 8; explicit-редактор = строка 7 |
+
+## Управление прогоном (продукт)
+
+| ID | Требование (источник) | Статус | Носитель / доказательство |
+|---|---|---|---|
+| ПТ-16 | Абьюз/misuse-прескрин: дёшево, точно, до трат токенов, минимум false positive (V2-п.1, H8) | ⭕ | строка 94; UI-контракт отказа — проект-решение D39.80 к Ф3-брифу (вывод оркестратора, не цитата брифа) |
+| ПТ-17 | Лимит размера входа настройкой (V2-п.3, H7) | ⭕ | строка 94 |
+| ПТ-18 | Стоп и продолжение пайплайна; абьюзивный прогон НЕ продолжать (V2-п.2, H10) | 🔶 | graceful stop по сигналу (`cmd/tmctl/main.go` NotifyContext) + чекпойнты/redrive; продукт-кнопки и связка с прескрином = строка 94 |
+| ПТ-19 | Скорость: «очень быстрый перевод книги — киллерфича» (V4-п.1, H9); видимый прогресс/ETA — из Ф3-видения ридер-IDE (цветная полоса статуса), не из V4 | 🔶 | волны параллельны по чанкам; замер скорости и ETA на целой книге = строка 54 (МАСШТАБ) |
+
+## Фронт (Ф3)
+
+| ID | Требование (источник) | Статус | Носитель / доказательство |
+|---|---|---|---|
+| ПТ-20 | Ридер-IDE: VS Code-подобный фронт агентного перевода (V0-п.20/23) | ⭕ | research/16 принят (D29); строки 69–71; F3-brief — D29 п.3 |
+| ПТ-21 | Параллельное чтение двух текстов с выравниванием по смыслам (V0-п.21) | ⭕ | якорь = чанк пайплайна (решено); реализация Ф3 |
+| ПТ-22 | Настройки от человека: 18+, жанр и т.п. (V0-п.22) | 🔶 | `book.yaml` (labels/жанр) данными; UI = Ф3 |
+| ПТ-23 | Веб-ПЕРВЫЙ фронт; SEO/ранжирование Google — куки, страницы-сироты, актуальные алгоритмы (V5-п.2); дальний прицел — натив/Windows (V0-п.26) | ⭕ | строка 71 (Ф3-бриф); ⚠ SEO определяет выбор фреймворка (SSR vs SPA) — обязан войти в Ф3-дизайн ДО выбора стека; порядок веб→натив тоже влияет на стек |
+| ПТ-24 | Цикл согласования глоссария с профпереводчиком/редактором (V0-п.23) | 🔶 | подписной цикл терминолога в бэкенде есть; UI = Ф3 |
+
+## Качество процесса и самоулучшение
+
+| ID | Требование (источник) | Статус | Носитель / доказательство |
+|---|---|---|---|
+| ПТ-25 | Валидация влияния каждого решения на качество, вкл. пагубное (V1-п.3, V3-п.1; Выводы) | ✅ | методология полигона (exp01–16, labels, судья, пре-рег); держится нормами D39.46/47 |
+| ПТ-25а | Онлайн- и оффлайн-замер КАЧЕСТВА прогона (V0-п.31, H5 in-loop signal) | 🔶 | детерминированный $0-слой в петле построен (гейты/чекеры, телеметрия качества — слой 5 в 09); семантический in-loop сигнал = Ф2 (судья, строки 33 · 13а · 90-метрики) |
+| ПТ-26 | Самоулучшение пайплайна по данным больших прогонов (V3-п.2, H16) | ⭕ | строка 90 (дизайн петли по данным судьи — при пилот-препе Ф2.5); AB-способность бэкенда — дальний хвост V1 (двойное хеджирование владельца), тем же дизайном |
+| ПТ-27 | Без-LLM анализ книги в помощь переводу/валидации (V1-п.1/п.9) | ✅ | майнер, $0-гейты/чекеры, экраны, KWIC — весь детерминированный слой |
+| ПТ-28 | Фронтир-модель внутри пайплайна / «судья над судьёй» (V3-п.3) | ❌ | отменено владельцем (V4-п.2) |
+| ПТ-29 | Полный проход книги наперёд перед переводом (V0-п.33) | ❌ | отклонено брифом V4-п.3 (вопросительная форма, отдельной ратификации в D-логе нет); контекст-вперёд несут сид/банк/бриф |
+| ПТ-30 | Язык промптов = язык цели/оригинала (V4-п.5) | ❌ | ru/en-срез закрыт отрицательно ЗАМЕРОМ (D39.61; там же оговорка «не закрыт окончательно», N=12); реопен только с новой парой по данным |
+| ПТ-31 | Локальная модель ради экономии (V0-п.6) | 🔶 | стенд есть (ollama/llama.cpp, память `textmachine-local-stand`); в пайплайне не задействована = строка 90 (llama-server) |
+| ПТ-32 | Рынок/юридика: анализ рынка, право на перевод и распространение (V0-п.29, преамбула) | 🔶 | ToS-мониторинг ✅ (строка 4, D39.57); юр-пакет к проду = строка 67; рыночный анализ — ресёрчи 04.07 |
diff --git a/eval/README.md b/eval/README.md
index 94fbe5f0..2459b13c 100644
--- a/eval/README.md
+++ b/eval/README.md
@@ -2,7 +2,7 @@
Зона сессии «Полигон»: эмпирическая валидация допущений архитектуры (мерить, а не верить). Отчёты — `docs/experiments/NN-*.md` (методика + цифры + честные ограничения). `backend/` только читать; расхождения с architecture/research — пингом оркестратору в `docs/PROGRESS.md`. **`.env` не читать; `data/refusal_corpus/*` не открывать без прямой задачи владельца; 18+ уровень 3 (несовершеннолетние в сексуальном контексте) — не обрабатывать и не анализировать ни в каком виде** (гардрейл владельца; вынесен сюда из CLAUDE.md 01.08 — специфика зоны 18+-корпусов).
-> **Очередь полигона (освежено оркестратором 01.08, пост-D39.64):** исследовательская программа дуги качества ЗАВЕРШЕНА (exp12–16 закрыты; rerun2 закрыт D39.22); полигон-пакеты 5–8, ToS-речек (D39.57, следующий триггер 25.10) и Р6+P4 «язык промптов/анти-эхо» (D39.61, харнесс `eval/promptlang/`) ЗАКРЫТЫ. **Курс проекта — бэкенд (общность закрыта D39.64 → качество банка, термин D39.67); полигон работает ТОЛЬКО по выданным промтам** (актуальный — список в `docs/README.md`), платные пробы — по слову владельца. Редактор = **deepseek-v4-pro ИНТЕРИМ** (D39.22; glm-5 резерв; `mistral` ИСКЛЮЧЁН как несущий — анти-корреляция гладкость↔верность ×3); итерация №2 редакторов — первым прогоном добора идеала (D39.67).
+> **Очередь полигона (освежено оркестратором 02.08, D39.80):** исследовательская программа дуги качества ЗАВЕРШЕНА (exp12–16 закрыты; rerun2 закрыт D39.22); полигон-пакеты 5–8, ToS-речек (D39.57, следующий триггер 25.10) и Р6+P4 «язык промптов/анти-эхо» (D39.61, харнесс `eval/promptlang/`) ЗАКРЫТЫ. **Текущий курс проекта здесь НЕ дублируется — PROGRESS CURRENT-STATE; полигон работает ТОЛЬКО по выданным промтам** (актуальный — список в `docs/README.md`), платные пробы — по слову владельца. Редактор = **deepseek-v4-pro ИНТЕРИМ** (D39.22; glm-5 резерв; `mistral` ИСКЛЮЧЁН как несущий — анти-корреляция гладкость↔верность ×3); итерация №2 редакторов — первым прогоном добора идеала (D39.67).
>
> ⚠ **DeepSeek-V4-Flash-0731 (31.07): веса сменились ПОД ТЕМ ЖЕ СЛАГОМ — боевая черновая форма покупает пустые ответы; эхо стохастично по вызову. Платные прогоны/докупки СТОП до ре-пробы (бэклог-строка 74); детали и развилка — `00-provider-quirks.md` секция катовера + D39.61.**
>