Ratify D39.80: onboarding overhaul with product requirements registry, glossary, single state carrier, archive link repairs, stable backlog IDs, and puml diagrams moved next to backend code

This commit is contained in:
Claude (backend session) 2026-08-01 23:50:04 +03:00
parent dfff53390c
commit 87a0124eae
16 changed files with 251 additions and 130 deletions

View file

@ -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); корпус D1D38 = справочник — по ссылкам/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` V0V5 + находок H6H18; статусы сверены кодом, актуализирует оркестратор при лендингах). Новые 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). Целиком НЕ читать — корпус D1D38 по ссылкам/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` (статус слоёв).

View file

@ -2,9 +2,9 @@
## ХЕНДОФФ №8 → №9 (26.07.2026, вечер)
**Позиция:** пак-20 закрыт ЦЕЛИКОМ (D39.4153: терминолог · `--verify-bank` · двухсекционная инъекция · точечная ре-редактура · языковой экран · дисциплина банкноты; жанровый словарь отменён как класс D39.47). Полигон-пакеты 6/7/8 закрыты (D39.3952). Доки актуализированы под 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) ХОЛОДНЫЙ мини-прогон (вопросы: бэклог строки 1624; пустой сид, ОТДЕЛЬНАЯ БД, ≤$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 (сверх §111, всё уже в 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 строк «что я понял: скоуп / инварианты / не-делать» ДО работы; расхождение чинится на минуте пять, не на приёмке.

View file

@ -1,68 +1,67 @@
# Журнал прогресса
> **⟶ ТЕКУЩЕЕ СОСТОЯНИЕ** (на 2026-08-02, голова D39.79). **Источник истины по РЕШЕНИЯМ — `architecture/05-decisions-log.md` (D1D39.77); этот файл — ЖУРНАЛ.**
> **⟶ ТЕКУЩЕЕ СОСТОЯНИЕ** (на 2026-08-02, голова D39.80). **Источник истины по РЕШЕНИЯМ — `architecture/05-decisions-log.md`; этот файл — ЖУРНАЛ.**
> - **Сделано (сводно; детали — D-лог и архив-слайсы):** Ф0 ✅ · Ф1-инфра ✅ · арх-ресет D39 (7 слоёв, паки 1116) ✅ · паки 17 «канал B» · 18 «долги» · 19 «голос/состояние» · 20 «банк+терминолог» ✅ (D39.2628/31/4156) · мини-прогон (D39.37) и ХОЛОДНЫЙ прогон (D39.58: recall банка 0.918/0.980, банк приходит переведённым) приняты · полигон-пакеты 58, 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.5978): ОБЩНОСТЬ ✅ → КАЧЕСТВО БАНКА ✅ (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.5978): ОБЩНОСТЬ ✅ → КАЧЕСТВО БАНКА ✅ (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 · веса K1K12 13а · вне-претрейн чекпоинт 55) → ВТОРАЯ ПАРА живьём (ja→ru; преп 81) → МАСШТАБ → пилот Ф2.5 (гейт резюме-строки 80; строки 6268, 85) → Ф3 ридер-IDE (6971). **Стоячие:** 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` (стройка паков 1116, rerun2) · **`-25-31` (паки 1720 · мини-прогон · полигон-пакеты 58 · ToS · холодный прогон; D39.2658)**. Записи ниже — живой хвост (эра D39.59+).
## Бэклог (ЕДИНЫЙ, собран 26.07, актуализация 01.08; правки — только через оркестратора)
## Бэклог (ЕДИНЫЙ, собран 26.07, актуализация 02.08 D39.80; правки — только через оркестратора)
Закрытые строки здесь НЕ хранятся — они уходят в D-лог с номером решения. Вес: «блокер-очереди» = мешает текущему шагу · «скоро» = ближайшие 12 касания · «когда-нибудь» = записано, не потеряно.
Закрытые строки здесь НЕ хранятся — они уходят в D-лог с номером решения. **ID строки стабилен навсегда** (не перенумеровывается и не переиспользуется — на «строку N» ссылаются доки и промты, D39.80). Вес: «блокер-очереди» = мешает текущему шагу · «скоро» = ближайшие 12 касания · «когда-нибудь» = записано, не потеряно. Длинная строка начинается жирным лидом — таблица сканируется по лидам.
| 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а | Веса рубрики K1K12 не выбраны (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.15.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.15.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.0060.013/проход) | бэкенд | когда-нибудь (первый прогон добора идеала) | добор идеала | D39.58 |
| 18 | Эмиссия головы 蛊: сид-половина = чек-лист (определяющий терм книги сидится `allow_short`, D39.50); эмиссия-КАНАЛ демотирован до ИЗМЕР-ГЕЙТА (Q7): полигон-замер «меняет ли эмиссия головы рендер композитов» — строить ТОЛЬКО по эффекту и ПОСЛЕ #10 (однознаковый пост-чек чинится чекер-паком); перед стройкой резолвить K-гейт и KWIC-грязь одиночной головы | полигон → бэкенд | скоро (санкция Q7 D39.70 — после #10, очередью с ре-пробой) | полигон-замер → решение | D39.58, D39.60, D39.69 |
| 24 | Остаток: авто-режим флага (проект Б не гонялся) · оси голоса AD (профили не подписаны; черновик готов — `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 | **Остаток: авто-режим флага** (проект Б не гонялся) · оси голоса AD (профили не подписаны; черновик готов — `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 п.89, 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 п.89, 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 п.45 (сборка глоссария — частично закрыта паком-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а | Экран кодировки не видит `<meta charset>` без XML-объявления (епаб с gb18030-метой прочтётся как UTF-8) — до-паковая дыра, сознательно не тронута пачкой 14а (паритет со старым ридером) | бэкенд | когда-нибудь | отдельное решение | D39.54, SMALLPACK §8 |
| 35 | Не-CJK майнер/банк: en-детектора не существует (hanRuns=0), ja с zh-таблицами активно неверен (0/10); нужен второй ДЕТЕКТОР (прототип `mine_nonhan.py`) + G1G10 требования 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а | **Экран кодировки не видит `<meta charset>` без XML-объявления** (епаб с gb18030-метой прочтётся как UTF-8) — до-паковая дыра, сознательно не тронута пачкой 14а (паритет со старым ридером) | бэкенд | когда-нибудь | отдельное решение | D39.54, SMALLPACK §8 |
| 35 | **Не-CJK майнер/банк**: en-детектора не существует (hanRuns=0), ja с zh-таблицами активно неверен (0/10); нужен второй ДЕТЕКТОР (прототип `mine_nonhan.py`) + G1G10 требования 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-шаги миграций v8v14 не идемпотентны вопреки шапке `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-шаги миграций v8v14 не идемпотентны вопреки шапке `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 · дистилляция 714B) | бэкенд | когда-нибудь | Ф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 · дистилляция 714B); + 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 V0V5 + H6H18, статусы сверены кодом; 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 закрыта.

View file

@ -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) (D1D39.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/` — фактура исследований 0405.07: `0110` базовые, `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.0701.08 (промты в `archive/prompts/`, отчёты с ревью-шапками в `archive/reports/`): пак-19 «голос/состояние» (D39.5456) · холодный мини-прогон (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 (паки 1116) ✅ · паки 1720 ✅ · мини-прогон и холодный прогон приняты (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 V0V5 + находки H6H18, статусы сверены кодом.
- `architecture/` — синтез и контракты:
- [05-decisions-log.md](architecture/05-decisions-log.md) — **источник истины по решениям**. Читать: карта актуальности (шапка) + живая голова (с хвоста); корпус D1D38 — справочник по ссылкам/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; остальные 0116 — отчёты закрытых экспериментов (судьба — в баннерах/D-логе).
- `research/` — фактура ресёрчей 0122; у принятых — ревью-шапки, часть тел под ⚠ 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

File diff suppressed because one or more lines are too long

View file

@ -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 остаётся); архив + онбординг-доки — одобрены.
- **Ратифицированы D13D17** ([05-decisions-log](../architecture/05-decisions-log.md)): D13 поправки пилота (арм моно-vs-билингв, гетерогенные кандидаты C2, панель 23 семейства × 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, M0M3, синк с 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, M0M3, синк с 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 (Ф12), инъекция глоссария (`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 эхо-мина зафиксирована регресс-гейтом

View file

@ -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`три слайса хроники журнала (0410 · 1013 · 1325.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/…` жили незамеченными с переноса отчётов.

View file

@ -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` (D1D12); что построено и с какими вердиктами — `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; ранжированные топ-риски/пробелы; курс-коррекции до масштабирования; что обязательно подтвердить пилотом.

View file

@ -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.0770.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.0770.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 7782% на расширенном хвосте | — | **Принимаю; предмета для кода нет** (расширение не строится) |
| 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`, там место нормализации».** Соблазнительно и почти

View file

@ -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.271.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) **не мерено ни
разу**. Чинится дёшево, если подача роли собирается ДО кластеризации (роли нужны поверхности с контекстами,

View file

@ -51,10 +51,10 @@
**Пять находок, каждая с сырьём.**
1. **WHICH-канал боевого майнера не видит жанровых терминов — измерено.** Recall против ПОДПИСАННОГО владельцем банка книги: **0.0690.103** (три среза), по классам: `name` 0.231 · `title` 0.0770.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.0690.103** (три среза), по классам: `name` 0.231 · `title` 0.0770.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: классы терминов по языкам и жанрам

39
docs/glossary.md Normal file
View file

@ -0,0 +1,39 @@
# Глоссарий — жаргон и сокращения проекта (один экран)
Читать при онбординге по мере надобности; термин непонятен → сюда. Пополняет оркестратор.
## Роли и фазы
- **Оркестратор / Бэкенд / Полигон / Фронт** — роли сессий с зонами записи (CLAUDE.md §Роли). «Оркестратор №N» — канонический счётчик преемственности роли (текущий N — в шапке ORCHESTRATOR_SESSION_PROMPT).
- **Хендофф(-промт)** — передача роли новой сессии файлом-промтом; аддендумы к бегущей сессии доезжают только релеем владельца.
- **Владелец** — человек; ратифицирует деньги, скоуп-сдвиги, продукт, 18+; связной между сессиями.
- **Ф0Ф3** — фазы: Ф0 скелет · Ф1 инфраструктура · Ф2 качество (судья/гейты) · Ф2.5 пилот · Ф3 продукт (веб-фронт, ридер-IDE).
- **Полигон** — eval-зона платных/бесплатных экспериментов (`eval/`, отчёты exp01exp16).
## Решения и документы
- **D-номер (D39.x)** — ратифицированная запись в `architecture/05-decisions-log.md`; **голова** — последний номер; **эра** — куст решений одного курса; **лендинг** — коммит работ сессии оркестратором после приёмки.
- **Р-номер — ДВА смысла по контексту:** Р1Р10 = десять ранних принципов (`01-decisions.md`, историчны); Р1Р7 в записях эры D39.5x6x = вопросы/решения владельца по банку и промптам (D39.63 и соседние) — «Р2 = ЗНАЧЕНИЕ» из CURRENT-STATE не про принцип Р2. **H1H18 / L1L8** — находки стратегического аудита (`09-target-architecture.md` §3); H — HIGH, в т.ч. незакрытые владельческие требования.
- **Q1Qn** — нумерованные вопросы КОНКРЕТНОГО пакета/отчёта — контекст локален, Q2 пака-19 ≠ Q2 чекер-пака.
- **V0V5** — секции идей владельца в `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/2122).
- **⚠-баннер** — шапка «тело superseded, чему верить»; **ревью-шапка** — вердикты приёмки поверх отчёта в `archive/reports/`.
- **Пак** — пакет работ одной сессии; **свип** — полная перепроверка обязательств (D39.66: 951 позиция); **добор идеала** — очередь качества после ре-пробы flash; **МАСШТАБ** — прогон целой книги.
- **Строка N** — стабильный ID строки единого бэклога (PROGRESS §Бэклог; не перенумеровывается); **вес** — блокер-очереди / скоро / когда-нибудь; **носитель** — артефакт, в котором обязательство живёт; **хвост** — незакрытый остаток; **петля** — вопрос, обязанный получить диспозицию; **слот** — зарезервированное место в будущем пакете/замере.
- **Гвоздь** — регрессионный тест, прибивающий контракт (негативный гвоздь — тест на ОТСУТСТВИЕ поведения).
## Пайплайн и код
- **Волны** — waveDraft (черновик) → терминолог → waveEdit (редактура); имена только полные, аббревиатуры W0/W1 запрещены (решение владельца 19.07).
- **Чанк** — единица нарезки книги; будущий якорь синхронизации фронта.
- **Банк (памяти)** — термины/имена/голоса книги на весь прогон; **сид** — стартовый банк книги (YAML; подпись владельца — только вкусовые поля, D39.77); **бриф** — книжные вводные; **банкнота** — канал выноса кандидатов из ответа переводчика; **майнер** — $0-извлечение кандидатов из исходника; **KWIC** — конкорданс-контекст кандидата; **терминолог** — роль перевода/подписи терминов батчами.
- **Гейты** — детерминированные $0-проверки перевода; **чекеры K1K12** — классы дефектов рубрики; **DC1DC7** — 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).

View file

@ -0,0 +1,73 @@
# Реестр продуктовых требований — «что продукт обязан уметь»
> Единый список требований владельца к продукту. Источники: `../START_PROMT.MD` (ЖИВОЙ бриф, идеи V0V5) + владельческие находки H6H18 (`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-п.1314) | 🔶 | серийный шаринг банка = строка 48а; импорт «оригинал+чужой перевод» = 48б (юр-сторона — 67) |
| ПТ-5 | Неологизмы/выдуманные автором слова переводятся консистентно (V1-п.6) | 🔶 | банк+майнер держат термины книги; замер на вне-претрейн тексте = строка 55 |
| ПТ-6 | Структурные традиции целевого языка (короткие zh-абзацы → читаемые ru-структуры) (V1-п.4) | 🔶 | редакторские мандаты в пар-промптах; спец-замера структуры нет — добор идеала |
| ПТ-7 | Слабый оригинал: подправлять ли художественно — вопрос владельца не решён (V1-п.5) | 🔒 | канал вопросов; сейчас пайплайн верен оригиналу |
## Память и консистентность
| ID | Требование (источник) | Статус | Носитель / доказательство |
|---|---|---|---|
| ПТ-8 | Банк памяти на всю книгу, «крайне точный» (V0-п.78; Выводы-п.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.4153), 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-п.910) | 🔶 | канал 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); строки 6971; 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; Выводы) | ✅ | методология полигона (exp0116, 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 |

View file

@ -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):** исследовательская программа дуги качества ЗАВЕРШЕНА (exp1216 закрыты; rerun2 закрыт D39.22); полигон-пакеты 58, 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):** исследовательская программа дуги качества ЗАВЕРШЕНА (exp1216 закрыты; rerun2 закрыт D39.22); полигон-пакеты 58, 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.**
>