diff --git a/docs/PROGRESS.md b/docs/PROGRESS.md index 53e958d..d73b712 100644 --- a/docs/PROGRESS.md +++ b/docs/PROGRESS.md @@ -1,9 +1,10 @@ # Журнал прогресса -> **⟶ ТЕКУЩЕЕ СОСТОЯНИЕ** (обновляемый блок; на 2026-07-05). **Источник истины по РЕШЕНИЯМ — `architecture/05-decisions-log.md` (D1–D12); этот файл — ЖУРНАЛ, не спека.** -> - **Фаза:** 0 (каркас) завершена; машинерия Фазы 1 в основном построена — банк памяти v2, чанкер + txt/epub импорт, disposition/coverage-гейт/эскалация, durable resume, глоссарий→редактор. Следующее: реальный ja→ru прогон end-to-end + пилот Ф2.5. -> - **Стек (2026-07-05):** черновик DeepSeek V4 Flash · редактор **grok-4.3** (thinking-OFF через ЯВНЫЙ `reasoning_effort:none` — дефолт grok = `low`) · судья/апекс Gemini 3.1 Pro (mandatory thinking) · эскалация A: DeepSeek V4 Pro → GLM-5.1 → Gemini · канал B (18+): Grok. **Anthropic выброшен (за дороговизну), OpenAI оставлен.** 6 ключей. -> - **Экономика:** `experiments/08-cost-model-v2.md` (~$0.69 ранобэ / ~$10.94 вебновелла-500) — заменяет старые пороги $0.6 / $5 / $30. +> **⟶ ТЕКУЩЕЕ СОСТОЯНИЕ** (обновляемый блок; на 2026-07-09). **Источник истины по РЕШЕНИЯМ — `architecture/05-decisions-log.md` (D1–D17); этот файл — ЖУРНАЛ, не спека.** +> - **Фаза:** 0 (каркас) завершена; машинерия Фазы 1 в основном построена — банк памяти v2, чанкер + txt/epub импорт, disposition/coverage-гейт/эскалация, durable resume, глоссарий→редактор. **Проведено стратегическое ревью (`architecture/07-strategic-review.md`, 09.07): архитектура end-to-end цела; ратифицирован пакет пост-ревью решений D13–D17.** Следующее: пакет фиксов D15/D16 (бэкенд) + починка пилот-харнесса D13 (полигон) → реальный ja→ru прогон end-to-end → пилот Ф2.5. +> - **Стек (2026-07-05, подтверждён ревью):** черновик DeepSeek V4 Flash · редактор **grok-4.3** (thinking-OFF через ЯВНЫЙ `reasoning_effort:none` — дефолт grok = `low`; D1-монолингв оспорен внешним замером — решает пилот-арм D13.1/D17) · судья/апекс Gemini 3.1 Pro (mandatory thinking) · эскалация A: DeepSeek V4 Pro → GLM-5.1 → Gemini · канал B (18+): Grok + локальная abliterated (**DeepSeek для explicit ЗАПРЕЩЁН его ToS — D14.1; Mistral — кандидат-фолбэк после пробы, D14.2**). Anthropic выброшен, OpenAI оставлен. 6 ключей. +> - **Экономика:** `experiments/08-cost-model-v2.md` (~$0.69 ранобэ / ~$10.94 вебновелла-500) — заменяет старые пороги $0.6 / $5 / $30. ⚠ Resume: любой `--resnapshot` = переоплата книги — онгоинг гейтится D15.2. +> - **Ждём от владельца:** 3–5 глав реальных вебновелл (вся текущая эмпирика — классика из претрейна) + explicit-фрагменты для 18+ руки (единственный critical ревью) + провенанс двух внешних 12-*-доков. > - Записи ниже — хронология; РАННИЕ (день-0, 04.07) содержат устаревшие цифры/решения (COGS $2–4, BYOK, Anthropic-Sonnet), переопределённые позже — см. блок выше и 05-decisions-log. ## 2026-07-04 — Старт проекта (MVP-сессия) @@ -47,7 +48,7 @@ - в план добавлены режим онгоинга и series-bible-lite (сегмент «ИИ-фабрик» и проверка рода/ты-вы). ### Следующие шаги -- [~] Фаза 0 (каркас) ЗАВЕРШЕНА; машинерия Фазы 1 в основном построена — сессия «Бэкенд» (промт: `prompts/done/BACKEND_SESSION_PROMPT.md`; шаг 0 — перевалидация решений, финал фаз — агентное селфревью). Осталось: полный стек-wiring, автопопуляция глоссария, реальный ja→ru прогон. Оркестратор делает внешнее ревью её кода. +- [~] Фаза 0 (каркас) ЗАВЕРШЕНА; машинерия Фазы 1 в основном построена — сессия «Бэкенд» (промт: `archive/prompts/BACKEND_SESSION_PROMPT.md`; шаг 0 — перевалидация решений, финал фаз — агентное селфревью). Осталось: полный стек-wiring, автопопуляция глоссария, реальный ja→ru прогон. Оркестратор делает внешнее ревью её кода. - [x] Параллельная сессия «Полигон» запущена (эксперименты 01–03 идут). - [ ] Сессия «Редакция» (промпты ролей) — после фиксации формата конфига в Фазе 0. - [x] Сессия «Валидация банка памяти» — завершена (вердикт GO на схему+гейты; реестр `architecture/06`; ставка гейтится in-house eval'ом в пилоте Ф2.5). @@ -55,6 +56,14 @@ - Роли сессий: «Бэкенд» → `backend/`; «Полигон» → `eval/` + `docs/experiments/`; оркестратор → доки, ревью, синхронизация, дозаправки ресёрча. - [x] **Дозаправка ресёрча выполнена (04.07, оркестратор)**: 5 документов `research/12-*.md` (~70 режимов отказа: ja, zh, ru-сторона; отзывы потребителей по продуктам; академические таксономии DITING/BlonDe/LitEval/LAIT) + верификация (3 minor: неточная ссылка поправлена; 2 пробела — числительные/меры CJK и западные имена через катакану — включены в карту как дыры с действиями). Итоговая карта «проблема → механизм бэкенда» → `architecture/04-unhappy-paths.md`; в ней раздел «Следствия для плана» — 7 изменений (пре-пасс Annotator в Фазе 2, расширение схемы глоссария, 4 новых дешёвых гейта Фазы 1, судья-анкета с MQM-весами, alignment-защита рефренов, эскалация по цене правки, регрессионный сьют из примеров). +## 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. +- **Роль оркестратора передана этой сессии (решение владельца 09.07).** Владелец подтвердил курс: Rust-переписывание — НЕТ до пост-пилота (Р1/Go остаётся); архив + онбординг-доки — одобрены. +- **Ратифицированы D13–D17** ([05-decisions-log](architecture/05-decisions-log.md)): D13 поправки пилота (арм моно-vs-билингв, гетерогенные кандидаты C2, панель 2–3 семейства × 11+ повторов, починка харнесса ДО прогона); D14 канал B (минус DeepSeek-explicit, плюс проба Mistral, xAI-опора = AUP); D15 resume/онгоинг (комментарии-фиксы + status/redrive сейчас, content-addressed reuse — гейт онгоинга); D16 фиксы границ памяти; D17 D1 понижен до «дефолт Ф1, оспорен — решает пилот». +- **Консолидация доков:** `02-mvp-plan` → v3 (мёртвые пороги сняты, интерим-18+ переписан, фазы синхронизированы); обе `*.puml` → v3 (минус Opus/BYOK/«≤2×», плюс ре-гейт эскалации, три класса отказов D12, человек в петле, фазовые пометки); superseded-баннеры на `research/01/02/03/04/09`; провенанс-шапки на два внешних `12-*`-дока; закрытые промты → `docs/archive/prompts/`; онбординг: корневой `CLAUDE.md` + `backend/README.md` + `eval/README.md` + обновлённый `docs/README.md`. +- **Следующее (оркестратор):** хендофф-промты сессиям «Бэкенд» (пакет D15.3/D16 + выборочная перепроверка отсевов) и «Полигон» (харнесс D13.5 + проба Mistral + kana-precision) — по запросу владельца. + ## Бэкенд ### 2026-07-04 — Сессия 1: шаг 0 (перевалидация) завершён @@ -235,7 +244,7 @@ keep-alive (Ф1–2), инъекция глоссария (`selective`), пор > 4. ⚠ **DeepSeek-черновик «эхал» оригинал** на высоко-CJK фрагменте (эксп.04, 3/3) — тихий отказ = оригинал вместо перевода. CJK-гейт Фазы 1 обязан это ловить (уже в плане); плюс фолбэк-черновик как у полигона. > **Ещё две вводные бэкенду (04.07):** -> 5. **Схему памяти v2 (твой шаг 4) держи до реестра рисков от сессии «Валидация банка памяти».** Владелец выделил банк памяти (главная точка отказа пайплайна) в отдельную адверсариальную сессию (промт `docs/MEMORY_RESEARCH_SESSION_PROMPT.md`, финализирован); её выход — `architecture/06-memory-risk-registry.md` — вход, по которому ты фиксируешь схему store/глоссария. Шаги 1–3 (runner-loop / snapshotID / чанкер) от схемы памяти не зависят — иди по ним, шаг 4 гейтит валидация. snapshotID под память (D5.2) проектируй с запасом, но финальную схему полей не морозь. +> 5. **Схему памяти v2 (твой шаг 4) держи до реестра рисков от сессии «Валидация банка памяти».** Владелец выделил банк памяти (главная точка отказа пайплайна) в отдельную адверсариальную сессию (промт `docs/archive/prompts/MEMORY_RESEARCH_SESSION_PROMPT.md`, финализирован); её выход — `architecture/06-memory-risk-registry.md` — вход, по которому ты фиксируешь схему store/глоссария. Шаги 1–3 (runner-loop / snapshotID / чанкер) от схемы памяти не зависят — иди по ним, шаг 4 гейтит валидация. snapshotID под память (D5.2) проектируй с запасом, но финальную схему полей не морозь. > 6. **Коррекция контура (владелец): EU-SaaS, прямые ключи, BYOK отменён** — в коде это НИЧЕГО не меняет (бэкенд всегда был на прямых ключах; BYOK был продуктовым концептом Р8/Р9, не кодом). Обновлены только Р5/Р8/Р9/Р10 в `01-decisions.md`. Дефолт редактора Фазы 1 — `grok-4.3` (эксп.04) — в `pipeline-c1.yaml` edit-стадию на него (xAI, thinking OFF, capability: temperature шлётся). > **Ответ оркестратора на 4 вопроса Фазы 1 (04.07) → полностью в [05-decisions-log.md D8–D11](architecture/05-decisions-log.md).** Онбординг-поправки ратифицированы (grok-editor не Kimi; deepseek-v4-pro резолвить через /models, не хардкодить; gemini `-preview` несущий; models.yaml обновляешь сам; F4 в A, F3 явно). A/B/C-план принят. Ответы: @@ -300,7 +309,7 @@ keep-alive (Ф1–2), инъекция глоссария (`selective`), пор - **Q2 (эхо — ретрай/эскалация или флаг?):** согласен — эхо должно ЭСКАЛИРОВАТЬ, не просто флажок. `cjk_artifact` ДЕТЕРМИНИРОВАН (та же модель → то же эхо) → same-model retry бессмыслен (переэхнёт, переплатит) → в classify он **non-retryable именно поэтому**. При заводке эскалации (шаг 7) `cjk_artifact` уходит на ФОЛБЭК-ЧЕРНОВИК (другая модель) — это и есть «эскалация, не флаг» (интент записан в Вехе 2). Сейчас флаг — цикла эскалации ещё нет. - **Q3 (live-conformance):** ДА, и Python-оракул Полигона = приёмочный ГЕЙТ перед фиксацией адаптеров. Мои Go-тесты — httptest wire-контракты (быстрые, детерминированные, CI без ключей) — живые эхо/`reasoning_content`/алиасы/503 не воспроизводят by design. Разделение: **Python-оракул (зона Полигона)** = кросс-провайдерный live-гейт «каждый адаптер бьёт живого, получает валидный перевод без эха/пусто/обрезки»; **Go live-интеграционные тесты (зона бэкенда, build-tag `live`/env-gated, вне CI)** = per-adapter wire+parse на живых ключах. Оба; оракул — гейт. -Фикс (эскалация `cjk_artifact`→фолбэк-черновик + coverage-гейт вырезания + live-conformance) — **отдельная сессия**, онбординг-промт: [BACKEND_SESSION_PROMPT_SILENT_REFUSALS.md](prompts/done/BACKEND_SESSION_PROMPT_SILENT_REFUSALS.md). Не блокирует шаг 3. +Фикс (эскалация `cjk_artifact`→фолбэк-черновик + coverage-гейт вырезания + live-conformance) — **отдельная сессия**, онбординг-промт: [BACKEND_SESSION_PROMPT_SILENT_REFUSALS.md](archive/prompts/BACKEND_SESSION_PROMPT_SILENT_REFUSALS.md). Не блокирует шаг 3. ### 2026-07-04 — Сессия 5: Веха 2.5 (старт) — DeepSeek эхо-мина зафиксирована регресс-гейтом @@ -557,7 +566,7 @@ keep-alive (Ф1–2), инъекция глоссария (`selective`), пор - [x] Эталон DeepSeek + llama.cpp 30b-a3b (13.5 tok/s) — в 03. - [~] **explicit-часть refusal-бенчмарка** — владелец даёт фрагмент реальной вебновеллы («Мастер Гу», жёсткая сцена) → полигон заведёт в корпус и прогонит через провайдеров (кто откажет/вырежет/переведёт). Проверка ставки «Grok = NSFW-канал». - [x] ~~Проверка ru-агрегаторов~~ — **СНЯТА** (BYOK отменён владельцем, см. коррекцию выше). -- [—] **Банк памяти (задача 5 + шире)** — по решению владельца выносится в **отдельную сессию «Валидация банка памяти»** (главная точка отказа пайплайна; не бросаться в код без разбора опасных сценариев). Полигон подготовил черновик промта → `docs/MEMORY_RESEARCH_SESSION_PROMPT.md`; **оркестратору вычитать/финализировать**, затем владелец запускает. Замер эмбеддингов (bge-m3 vs Qwen3-Embedding vs LaBSE) — часть мандата той сессии. +- [—] **Банк памяти (задача 5 + шире)** — по решению владельца выносится в **отдельную сессию «Валидация банка памяти»** (главная точка отказа пайплайна; не бросаться в код без разбора опасных сценариев). Полигон подготовил черновик промта → `docs/archive/prompts/MEMORY_RESEARCH_SESSION_PROMPT.md`; **оркестратору вычитать/финализировать**, затем владелец запускает. Замер эмбеддингов (bge-m3 vs Qwen3-Embedding vs LaBSE) — часть мандата той сессии. - [ ] Довалидация токен-калибровки на 3–5 главах реальных вебновелл (файлы владельца). - [~] Задача 4 (пилот выбора ядра, Фаза 2.5): протокол BWS + панель LLM-судей — **протокол готов** ([experiments/09](experiments/09-pilot-protocol.md)) + харнесс `eval/pilot/`; решающий прогон ждёт корпус владельца (см. Сессия 3). - [x] **Валидация precision coverage-гейта — гейтит боевой флип** (D12 Q4) → [experiments/07](experiments/07-coverage-precision.md): 0 FP/57, флип по precision безопасен, порог ≥2 флага/главу; вебновелл-срез ждёт корпус владельца (см. Сессия 3). Бэкенд-мини-набор (выпиленные предложения) проверяет recall (≥90%); флип `gates.coverage.enabled:true` упирается в **false-positive rate** на легитимно диалого-плотных главах (сегментация наивная, quote-absorbing §3.7 в v1.1 — на диалогах `sent_cov` может ложно проседать). Прогони гейт (пороги эксп.02: zh-ru<2.2/ja-ru<1.4/en-ru<0.70, sent_cov<0.75) на реальных чанках zh/ja→ru, замерь долю ложных excision_suspect. Оракул = `eval/refusal_bench.py::classify_output` (тот же, что порт в Go — держать в синхроне). Выход: доля ложных флагов по типам глав → оркестратор/владелец ставит порог N допустимых флагов и решает флип. @@ -649,7 +658,7 @@ keep-alive (Ф1–2), инъекция глоссария (`selective`), пор > **[ДОБАВЛЕНО после закрытия] Локалка × банк памяти — экстракция терминов, ВЕРИФИЦИРОВАННЫЙ бенчмарк (дыра G1)** → [experiments/06-local-extraction.md](experiments/06-local-extraction.md), `eval/extract_bench.py`. 13 моделей × 12 кейсов (zh/ja/en + эдж: катакана-запад, буддийские имена, алиасы), запросы через `refusal_bench.call_provider`+`providers.json` (квирки верны: deepseek thinking-ON+max_tokens 8000 — прошлый пустой был МОЯ ошибка бюджета, не свойство модели), **каждый ответ health-верифицирован** (пустой/echo не засчитан как recall 0). Итог: **(1) СПОТ сущностей решён у всех, локаль вкл.** (recall ~0.98 на всех языках, 0 галлюцинаций). **(2) РЕНДЕР dst — разрыв с ЯЗЫКОВЫМ градиентом у локали:** en 0.82 / ja 0.53 / **zh 0.26** (阿Q→«Ах-Чу», 赵太爷→«Тяо Тай-Я» — Палладий-мусор → **эмпирика для B6**); облако-топ zh 0.75/ja 0.98/en 1.0. **(3) бо́льшая локаль не помогает** (30b render 0.55≈8b, ×3 медленнее). **(4) deepseek thinking помогает рендеру** (0.85 vs 0.58 off; на экстракции thinking-off здоров — echo бьёт перевод, не JSON). Рендер-value: **gemini-2.5-flash** (0.92/1.4с). **Дизайн-следствие (уточняет Р4/G1):** спот=дешёвая 8b (все языки); рендер dst язык-зависим — zh обязательно облако/человек + таблица Палладия (B6), en локаль потянет. ruadapt ненадёжен (5/12 health). -> **[В ОЧЕРЕДИ, 05.07] Исследование «Адаптивный/обучающийся слой памяти»** — промт `docs/ADAPTIVE_MEMORY_RESEARCH_PROMPT.md` (подготовлен сессией валидации по запросу владельца). Вопрос: стоит ли гибрид «детерминированный банк + слой, обучающийся по ходу книги», и как смёржить под контур (локаль-first, дешёвое API ок, флагман без логитов → kNN-MT/frontier-LoRA заблокированы; обучаемое — только на локали, роль support, не переводчик). Центр — арбитраж «кто побеждает» (логика + VRAM 8ГБ). БАР: обязан бить eval-валидированный детерминированный базис на zh/ja→ru, иначе не мёржить. Тайминг: Фаза 2+, целить в реальные дыры (после in-house eval банка). Запускает владелец отдельной сессией. +> **[В ОЧЕРЕДИ, 05.07] Исследование «Адаптивный/обучающийся слой памяти»** — промт `docs/archive/prompts/ADAPTIVE_MEMORY_RESEARCH_PROMPT.md` (подготовлен сессией валидации по запросу владельца). Вопрос: стоит ли гибрид «детерминированный банк + слой, обучающийся по ходу книги», и как смёржить под контур (локаль-first, дешёвое API ок, флагман без логитов → kNN-MT/frontier-LoRA заблокированы; обучаемое — только на локали, роль support, не переводчик). Центр — арбитраж «кто побеждает» (логика + VRAM 8ГБ). БАР: обязан бить eval-валидированный детерминированный базис на zh/ja→ru, иначе не мёржить. Тайминг: Фаза 2+, целить в реальные дыры (после in-house eval банка). Запускает владелец отдельной сессией. ### 2026-07-05 — Сессия «Адаптивный слой памяти» ЗАВЕРШЕНА → [research/14-adaptive-memory.md](research/14-adaptive-memory.md) diff --git a/docs/architecture/02-mvp-plan.md b/docs/architecture/02-mvp-plan.md index c500a1a..23ea834 100644 --- a/docs/architecture/02-mvp-plan.md +++ b/docs/architecture/02-mvp-plan.md @@ -1,63 +1,72 @@ -# План MVP (v2, 2026-07-04) +# План MVP (v3, 2026-07-09) -Цель MVP (бриф, п. 24): **бэкенд переводит целую книгу целиком** — консистентно, дёшево, с учётом стоимости. Интерфейс — CLI; HTTP API закладываем как тонкий слой (Фаза 3), IDE-фронт — после бэкенда. v2 — после адверсариального ревью: фазы перебалансированы, приёмка сделана проверяемой, добавлены интерим-правила для 18+ и спецификации, блокировавшие старт кодинга. Реалистичный горизонт — **10–11 недель** (было «8», критики показали, что пилот не влезал). +Цель MVP (бриф, п. 24): **бэкенд переводит целую книгу целиком** — консистентно, дёшево, с учётом стоимости. Интерфейс — CLI; HTTP API закладываем как тонкий слой (Фаза 3), IDE-фронт — после бэкенда. +v2 (04.07) — после адверсариального ревью синтеза. **v3 (09.07) — синхронизация с контрактом [`05-decisions-log.md`](05-decisions-log.md) (D1–D17) после стратегического ревью [`07-strategic-review.md`](07-strategic-review.md)**: сняты мёртвые приёмочные пороги, переписан интерим-18+, фазовые списки приведены к фактам. При конфликте этого плана с D-логом — **источник истины D-лог**. ## Дорожка данных (параллельно всем фазам, владелец + сессия «Полигон») -Закупка/подбор лицензионных изданий для золотого набора, выравнивание, глоссарии, отбор 25–35 глав пилота, refusal-корпус 50–100 фрагментов, замеры токенизации. Стартует с недели 1 — к пилоту (Фаза 2.5) данные должны быть готовы. +Лицензионные издания для золотого набора, выравнивание, глоссарии, отбор 25–35 глав пилота, refusal-корпус (вкл. explicit-фрагменты — гейтят 18+ руку), замеры токенизации. +**Чекпоинт (новый, гейтит валидность эмпирики): 3–5 глав реальных вебновелл zh/ja вне претрейна** — довалидация r-коэффициентов (exp01/08), precision гейтов на терсных репликах (exp07), частота эха вне классики. Вся текущая эмпирика снята на PD-классике из претрейна — до вебновелл-среза пороги считаются предварительными. -## Фаза 0 — Каркас (нед. 1–2) +## Фаза 0 — Каркас. ✅ ЗАВЕРШЕНА (04.07, приёмка на живых ключах) -Монорепо Go (`backend/`). Портирование ядра из `vojo/apps/ai-bot`: +Порт ядра vojo (llm/ledger/obs/store), SQLite + идемпотентные миграции, durable jobs + чанк-чекпоинты, translation brief + brief_hash, YAML-конфиги C1/C2 (граница «конфиг vs код» Р2). Приёмка выполнена исполняемо: `tmctl translate` гоняет чанк draft→edit с полным учётом $, повторный запуск из чекпоинтов за $0, kill -9 теряет максимум один вызов, `committed == SUM(checkpoints)`. Anthropic-адаптер остался DEPRECATED-референсом (Р1) — не «к написанию». -- `pkg/llm`: интерфейс LLMClient, OpenAI-совместимый транспорт (retry/backoff), адаптеры DeepSeek/Qwen/GLM/xAI/Gemini/llama-server; **новое**: нативный Anthropic-адаптер (`cache_control`), поддержка prompt caching в структуре запроса. ~~Batch API~~ → Фаза 2. Стриминг: в Фазе 0 — длинные per-роль таймауты (чанки на локальной модели идут 63–278 с); **транспортный стриминг как keep-alive** (агрегация на бэкенде, без SSE-фронта) — Фаза 1–2 по предложению бэкенд-сессии; SSE для IDE — Фаза 3. -- `pkg/ledger`: цены в конфиге (с датой проверки), биллинг по usage (+reasoning-токены), reserve/settle, потолки $ на книгу/день. -- `pkg/obs`: trace_id, структурные логи, request_log (per-книга/глава/чанк/стадия/роль/модель, $, latency, cache-hit, вердикты гейтов). -- `pkg/store`: SQLite (modernc.org/sqlite, без нативных расширений) + идемпотентные миграции; durable jobs (глава×стадия) + **чанк-чекпоинты** (Р6: каждый сырой ответ LLM персистится после settle; snapshot контекста на джобу; kill -9-тест — часть приёмки). -- Конфиг проекта книги = **translation brief** (языковая пара, жанр, аудитория, 18+ да/нет, слайдер Venuti, хонорифики, транскрипция, сноски); `brief_hash` входит в ключ TM. -- **Приложение к фазе: YAML-конфиг ядра C1 (+скелет C2)** — фиксирует границу «конфиг vs раннер» (Р2) до начала Фазы 1. -- Эмпирическая проверка cache-поведения: DeepSeek direct + топ-2 ru-агрегатора (пробрасывают ли cache-hit тарифы) — вход для экономики Р5. +## Фаза 1 — Перевод целой книги (текущая; машинерия в основном построена) -Приёмка: `tmctl translate --config book.yaml` гоняет один чанк draft→edit с полным учётом $ в request_log; kill -9 теряет максимум один вызов. +**Построено** (журнал: PROGRESS, вехи 1–2.5, шаги 3a–4): capability-слой (D3.1) + эхо-мина-гейт DeepSeek; runner-цикл по главам/чанкам + disposition skip/flag/continue (D2, 12 flag_reasons); coverage-гейт (порт Python-оракула, opt-in, precision 0/57 — exp07); single-hop эскалация с ре-гейтом и бюджетом (D12); чанкер v4 + импорт txt/epub + ruby-захват (D9); **банк памяти v2** (нормализация, Aho-Corasick, спойлер-окна, трёхсторонний disposition, decl-aware post-check-флаггер, ruby-сид); монолингвальный редактор с dst-констрейнтами глоссария (D1); snapshotID покрывает память/context-assembly/capability (F1/D5.2/D8). -## Фаза 1 — Перевод целой книги (нед. 3–5) +**Осталось до приёмки Фазы 1:** +- Фиксы границ доверия памяти (D16: полисемия, sticky-disposition, source-граница фонетики, ruby-alias) + лгущие комментарии resume + бамп edit `prompt_version` (D15.3). +- `tmctl status` (read-only проекция + book manifest) и redrive флагнутых чанков (D12/D15.3). +- Дешёвые детерминированные гейты из 04-unhappy §6/§9: линтер тире-диалогов, ёфикатор, блок-лист транслит-междометий, число-гейт 万/億 (в D-логе «missed»-скоуп Фазы 1 — в план внесены v3). +- Автопопуляция глоссария G1 (спот=локаль 8b / рендер=облако — дизайн из exp06) — минимум в объёме, достаточном для приёмочной книги; иначе сид руками + **чек-лист ja-книги: kana-написания сид-имён вносить aliases руками (D16.4)**. +- Реальный **ja→ru прогон end-to-end** (приёмочная книга D9, ~150k токенов) с резюмируемостью. +- Режим онгоинга (`add-chapters`) — **сдвинут в Фазу 1.5**: гейтится resume-экономикой (D15.2 — content-addressed reuse чекпоинтов или селективный redrive; спека в Фазе 1, реализация Ф1.5). До этого онгоинг не продаётся. +- Экспорт txt/epub + отчёт (стоимость по стадиям, паспорт качества главы, журнал вклада, флаги). -- Импорт/чанкинг по спеке: txt/epub; **epub v1 = извлечение текста глав по spine, экспорт простым xhtml** (инлайн-разметка/ruby-фуригана не сохраняются — честное ограничение v1); чанк 1–2k токенов по границам абзацев; перекрытие — **read-only контекст** (повторно не переводится, дедупликации при склейке нет по построению). -- **Банк памяти v1** (SQLite на книгу): глоссарий (схема Р3, авто-`decl` при коммите) с автоэкстракцией кандидатов; **series-bible-lite (gender + матрица ты/вы)**; резюме глава→арка→книга; STM; TM-кэш; селективная инъекция (ключи/алиасы/леммы, без эмбеддингов). Батч-подтверждение терминов раз в главу; в безлюдном режиме auto→approved с журналом. -- Пайплайн C1: Analyst (map-reduce по книге) → Terminologist → per-глава/per-чанк: сборка контекста (кэшируемый префикс по Р5) → Translator (DeepSeek V4 Flash) → Editor → гейты → эскалация в пределах премиум-бюджета → коммит чанка; на границе главы — обновление резюме, подтверждение терминов, телеметрия главы. -- QA-гейты Фазы 1 (Go, без морфологии): CJK-артефакты, глоссарная консистентность (процедура из Р7), **coverage-гейт v1** (регэксп-сегментация предложений, соотношение длин, blacklist refusal-паттернов; валидируется мини-набором 20–30 фрагментов с выпиленными предложениями). В TM коммитится только вывод, прошедший гейты. «Флаг редактору» = секция в отчёте + ненулевой exit code (приёмка допускает N флагов). -- **Интерим-правило 18+ (до NSFW-роутера Фазы 2)**: приёмочный корпус — только SFW; при `18+: да` в brief — Anthropic принудительно исключается из роутинга книги, эскалация без Opus (GLM/Kimi/Gemini), включён regex-детектор отказов перед коммитом в TM. Редактор Фазы 1 по умолчанию — GLM-5/Kimi (Sonnet — только SFW-книги и прямые ключи). -- **Режим онгоинга** (Р9, сегмент «ИИ-фабрик»): `tmctl add-chapters` — дозагрузка новых глав в существующий проект с наследованием глоссария/резюме/series bible. -- Экспорт: txt/epub + отчёт (стоимость по стадиям, cache-hit по стадиям, метрики, журнал творческого вклада, флаги). +**Интерим-правило 18+ (v3, до NSFW-роутера Фазы 2):** приёмочный корпус — только SFW. При `18+: да` в brief: канал B в интеримном составе **Grok 4.3 + локальная abliterated** (DeepSeek для explicit ЗАПРЕЩЁН его ToS — D14.1; Mistral — кандидат после пробы, D14.2); OpenAI/Gemini в explicit-роутинг не включать; refusal-blacklist-гейт перед коммитом в TM обязателен (ветка `content_filter` эмпирически мертва — exp07). -Приёмка: SFW-том ранобэ (~150k токенов) end-to-end за один запуск с резюмируемостью; COGS: стандарт на DeepSeek ≤ **$0.6**, премиум-микс ≤ **$5** (два порога вместо неопределённого «стандарт-микса»); глоссарная консистентность approved-имён ≥98% по процедуре Р7; coverage-гейт ловит ≥90% искусственных пропусков на валидационном мини-наборе. (Род/ты-вы — приёмка Фазы 2, когда появится гейт по series-bible-lite.) +**Приёмка Фазы 1 (v3, по D11/D10/D1.1):** +1. SFW-том ранобэ ja→ru (~150k токенов) end-to-end за один запуск с резюмируемостью; kill -9 → потеря максимум одного вызова. +2. **Деньги:** телеметрия точна (ledger корректно биллит grok reasoning=0 / cache-поля), эскалация уважает конфигурируемый `budget_usd`; мягкий sanity-якорь **~$0.7/ранобэ, ~$11/вебновелла-500** (exp08). Жёсткие пороги $0.6/$5 **сняты** (D11). +3. Глоссарная консистентность **всех approved-терминов** ≥98% по процедуре Р7/D10 (names-only — под-метрика). ⚠ Гейт меряет самосогласованность, НЕ конформность Палладию/Поливанову (B6 — Фаза 2; ruby-reading уже даёт ground-truth для ja — валидатор желателен раньше, см. 07-ревью). +4. Coverage-гейт ловит ≥90% искусственных пропусков на мини-наборе; ноль молчаливых потерь глав (spine-reconciliation). +5. **Честная оговорка (D1.1): приёмка Фазы 1 НЕ содержит критерия верности** — same-length mistranslation до билингвального судьи Фазы 2 не контролирует ничто. Не маскировать coverage-гейтом. -## Фаза 2 — Качество: судья, NSFW, гейты второй очереди (нед. 6–8) +## Фаза 2 — Качество: судья, NSFW, гейты второй очереди -- Judge-роль (шкала Комиссарова, пара судей), режимы C2/C3 как конфиги; Batch API (OpenAI-стиль + Anthropic Message Batches) для батчуемых стадий (Analyst/Terminologist/судья/книжный QA). -- NSFW-роутер: локальный классификатор 0–3, каналы A/B, channel-aware эскалация, refusal-мониторинг с автопереносом, детектор молчаливых вырезаний; refusal-бенчмарк из дорожки данных. -- Интеграция llama-server (скрининг, abliterated-переводчик канала B, эмбеддинги bge-m3 — второй эшелон инъекции). -- Python-сайдкар качества: CometKiwi + морфодетектор канцелярита (pymorphy/Natasha, чек-лист Галь) + гейт ты/вы и рода по series-bible-lite; роли второй очереди: Line Editor, Continuity Editor, анти-translationese пасс. -- Eval-харнесс (паттерн routereval): golden-set реплей, свип порогов эскалации. -- Генерация аннотаций/обвязки главы для заливки (дешёвая фича, паттерн топов Rulate). +⚠ v3: фаза перегружена (~25 механизмов из 04-unhappy + net-new) — при старте пересмотреть горизонт и порезать на вехи; ниже состав по приоритету. -Приёмка: 18+ книга проходит пайплайн без молчаливых потерь (проверено детектором + refusal-бенчмарком); гейт рода/ты-вы работает на series-bible-lite; C2/C3 запускаются конфигом. +- **Judge-роль** (билингвальный, судья-анкета узких вопросов с MQM-весами — паттерн LiTransProQA/DITING, НЕ холистический скор; словарь тегов ошибок в request_log с первого дня фазы), C2/C3 как конфиги (C2 — только гетерогенные кандидаты, D13.2); second-opinion судья чужого семейства на Gemini-эскалированных чанках (self-preference). +- **Пре-пасс Annotator** (04-unhappy «Следствия» п.1: speaker-ID, регистровый трекер, чэнъюй-маски — питает 8+ режимов отказа; в v2-плане отсутствовал — внесён). +- NSFW-роутер: локальный классификатор 0–3 (**требует спеки и метрики приёмки** — false-negative уровня 3 = юридическая экспозиция; сейчас классификатор не специфицирован — 07-ревью), каналы A/B (состав D14), channel-aware эскалация типом, детектор молчаливых вырезаний, refusal-мониторинг. +- Интеграция llama-server (скрининг, abliterated канала B, эмбеддинги bge-m3 — второй эшелон, low-trust A7). +- Python-сайдкар качества: CometKiwi (валидировать на ru-литературе до доверия) + **морфо-гейт рода** (жалоба №1 читателей; pymorphy, вкл. глагол прош. вр. — C3 реестра) + гейт ты/вы по series-bible-lite + канцелярит-чеклист Галь; кандидат: T-index как офлайн-метрика translationese (готовое решение, 0.5B — влезает в стенд). +- **B6: валидатор Палладия/Поливанова** на коммите dst-имён (ruby-reading как ground-truth для ja) — желательно ДО ja-приёмки, обязательно до масштабирования. +- Резюме глава→арка→книга + гейт фактичности резюме (D1 реестра — у резюме нет post-check-аналога); series-bible ты/вы-журнал. +- Batch API (−50% только Gemini-судье/QA — exp08), нативный Gemini-адаптер (safety-контроль судьи, rf-замер), стриминг keep-alive. +- Eval-харнесс (golden-set реплей, свип порогов); регрессионный сьют из чек-листа «особо опасных ошибок» (12-common-failures §16: отрицание, перепутанный субъект, внутренняя речь→прямая). -## Фаза 2.5 — Пилот 4 рук (нед. 8–10, elapsed 2–3 недели) +Приёмка: 18+ книга проходит пайплайн без молчаливых потерь (детектор + refusal-бенчмарк на explicit-корпусе); гейт рода/ты-вы работает; C2/C3 запускаются конфигом; классификатор 0–3 имеет измеренную точность на уровне 3. -По протоколу Р2/gap-3: C0/C1/C2/C3 на 25–35 главах zh/ja/en→ru (данные готовы из дорожки данных), человеческие попарные сравнения (внешние редакторы 20–40 ч) + панель LLM-судей чужих семейств с человеческим переводом как якорем. Решение о ядре пайплайна; 2–3 главы 18+ в корпусе — замер отказов по ролям. +## Фаза 2.5 — Пилот 4 рук (решающая точка) + +Протокол: `experiments/09-pilot-protocol.md` **+ обязательные поправки D13** (арм «моно vs билингв редактор same-model»; C2 на гетерогенных кандидатах; панель 2–3 семейства × 11+ повторов со свапом позиций, Bradley-Terry/медиана, grok не судит grok-выходы; пре-регистрация MDE и N≥3; харнесс чинится до прогона — эхо-стрип memory_eval, полные выходы, fidelity-ось; имена M0–M3 для memory-режимов). Решения пилота: ядро C0–C3, go/no-go ставки памяти (банк vs длинный контекст + adversarial-рука), валидность LLM-судьи (κ vs IAA, s*), think-ON/OFF (вкл. grok после reasoning-буфера в EstimateUSD), D1 моно-vs-билингв, Annotator A/B, flag-rate G2 (первый замер человеческой ёмкости). 2–3 главы 18+ в корпусе — замер отказов по ролям (вкл. пробу Mistral, D14.2). +Побочная ценность: человеческие BWS-данные zh/ja→ru — уникальный актив (академия пары не покрывает, WMT-лит. трек мёртв с 2024). ## Фаза 3 — Продуктовизация (после MVP) -HTTP API + SSE для IDE-фронта; выравнивание Bertalign (параллельное чтение, полноценный импорт reference-переводов прошлых томов; до этого — упрощённый импорт бэк-каталога парами глав); TMX/TBX; BYOK-пресеты агрегаторов; биллинг ЮKassa/СБП; batch-планировщик внепиковых окон DeepSeek; кандидаты из Р2: консультант поп-культуры, tool-calling, webfetch культурного контекста. +HTTP API + SSE для IDE-фронта; выравнивание Bertalign (параллельное чтение, полноценный импорт reference-переводов прошлых томов); TMX/TBX; биллинг **Stripe/Paddle (EU-SaaS, $/€; BYOK/ЮKassa отменены — Р5/Р8)**; batch-планировщик внепиковых окон DeepSeek; кандидаты из Р2: консультант поп-культуры, tool-calling, webfetch культурного контекста; «судья-над-судьёй» — редкий фронтир-аудит отчёта книги (идея владельца V3.3, ратифицирована как кандидат). ## Вне скоупа MVP -IDE-фронтенд (закладываем только API), B2B white-label, дистилляция своей 7–14B модели (логируем long-CoT синтетику с первого дня — рецепт DRT, но не обучаем), ru→en направление (следствие для выручки — см. Р9), автоматическая публикация куда-либо (Р8). +IDE-фронтенд (закладываем только API), B2B white-label, дистилляция своей 7–14B модели (логируем long-CoT синтетику — рецепт DRT/LitMT; в 2026 линия дозрела до «14B ≈ Sonnet на литпереводе» — стратегический бэклог снижения editor-затрат), ru→en направление, автоматическая публикация куда-либо (Р8). **Переписывание бэкенда на другой язык — закрыто до пост-пилота** (решение владельца 09.07; нужен конкретный триггер, где Go упирается). -## Метрики успеха MVP +## Метрики успеха MVP (v3) -1. COGS тома ранобэ: стандарт ≤ $0.6, премиум-микс ≤ $5 (контур прямых ключей; cache-hit — по стадиям, справочно). -2. Глоссарная консистентность approved-терминов ≥98% (процедура Р7); ноль молчаливых пропусков, подтверждено coverage-гейтом, отвалидированным на мини-наборе. -3. Качество: **статистически значимый win rate >50%** (биномиальный тест, α=0.05, ≥150 человеческих попарных сравнений) против **DeepSeek+селективный глоссарий** (честный baseline уровня VseGPT, не соломенный «сырой DeepSeek»); 70% — aspirational-цель, калибруется пилотом. +1. COGS: телеметрия денег точна; эскалация уважает `budget_usd`; sanity-якоря ~$0.7/ранобэ стандарт, ~$11/вебновелла-500, селективный премиум ≤$25 (exp08; жёсткие $-гейты сняты D11). +2. Глоссарная консистентность approved-терминов ≥98% (процедура Р7/D10); ноль молчаливых потерь (coverage + spine-reconciliation). +3. Качество: **статистически значимый win rate >50%** (биномиальный тест, α=0.05, ≥150 человеческих попарных сравнений, пре-регистрация MDE — D13.4) против baseline «DeepSeek+селективный глоссарий» (уровень VseGPT). 4. Резюмируемость: kill -9 в середине главы → продолжение с потерей максимум одного LLM-вызова. +5. 18+: канал B (Grok + abliterated, интерим D14) переводит explicit-корпус без молчаливых вырезаний, подтверждено детектором. diff --git a/docs/architecture/05-decisions-log.md b/docs/architecture/05-decisions-log.md index 7689638..11c0022 100644 --- a/docs/architecture/05-decisions-log.md +++ b/docs/architecture/05-decisions-log.md @@ -1,4 +1,4 @@ -# Журнал решений оркестратора — развязки перед Фазой 1 (2026-07-04) +# Журнал решений оркестратора — развязки перед Фазой 1 (2026-07-04) + пост-ревью D13–D17 (2026-07-09) Ответ на вопросы бэкенд-сессии (PROGRESS §«Вопросы от бэкенда», §«[НУЖНО РЕШЕНИЕ] перед Фазой 1») и полигона (think-режим). Каждое решение прошло адверсариальную панель из 3 критиков (research / экономика / исполнимость в коде Фазы 0); ни одно не отклонено, все уточнены. Это **контракт Фазы 1** — бэкенд исполняет отсюда; при конфликте с буквой 01-decisions/02-mvp-plan — источник истины здесь (потом сольём в основные доки). @@ -156,3 +156,51 @@ grok-4.3 теперь дефолт-редактор → **каждый чанк - Пересчёт премиум-бюджета на Sonnet-free стеке с reasoning-as-output (D3.2), апекс Gemini 3.1 Pro (форсированный thinking). - ~~Проброс cache-hit/batch RU-агрегаторами~~ — **СНЯТО** (коррекция владельца 04.07: EU-SaaS, прямые ключи, BYOK отменён; см. Р5). Вся cache/batch-экономика теперь по прямым ключам без оговорок — это канон. - `budget_usd: 0` в `pipeline-c1.yaml` — заглушка; $-потолок владелец задаёт по ценовому намерению, дефолты $5/$30 держим до пересчёта. + +--- + +# Пост-ревью решения D13–D17 (2026-07-09, оркестратор) + +Ратификация выводов стратегического ревью [`07-strategic-review.md`](07-strategic-review.md) (метод: 14 сборщиков + 9 адверсариальных верификаторов, 8 CONFIRMED / 1 PARTIAL). Владелец подтвердил курс 09.07 (вкл. «Rust — нет, не сейчас»: Р1/Go остаётся; вопрос закрыт до пост-пилота и требует конкретного триггера, где Go упирается). Каждое решение ниже — контракт для следующих сессий «Бэкенд»/«Полигон»; хендофф-промты выдаёт оркестратор. + +## D13. Пилот Ф2.5 — поправки протокола (гейтят валидность главного решения). ✅ + +Дополнения к `experiments/09-pilot-protocol.md` (полигон вносит в док и харнесс ДО пре-регистрации): + +1. **Новый арм: «моно vs билингв редактор на ОДНОЙ модели, простой general-промпт»** — прямой тест D1. Основание (верифицировано по PDF arXiv:2605.13368, вкл. en→ru): monolingual-рефайнмент теряет accuracy с ПЕРВОГО прохода (−2.2…−5.6 MQM у всех 6 моделей), general-рефайнмент С исходником даёт тот же fluency при accuracy ~flat и лучшем overall. Существующий 7-bis (моно-бейкофф МОДЕЛЕЙ) сохраняется — это другой вопрос. +2. **C2 — только с ГЕТЕРОГЕННЫМИ кандидатами** (draft-кандидаты от разных моделей, не N сэмплов одной): на гомогенных селекция ≈ монета (2603.20324: WR 0.512 homogeneous; LitMT 2606.05924: best-of-8+судья — последнее место). Иначе плечо C2 предрешено и жжёт бюджет впустую. +3. **Панель судей — переконфигурация**: (а) 2–3 семейства максимум — 9 судей ≈ 2 эффективных голоса (2605.29800), лучший одиночный ≥ панели; (б) **11+ повторов на вердикт со свапом позиций A/B** — одиночный прогон нестабилен (13.6% флипов, парафраз меняет исход в 25%; 2606.13685); (в) агрегация медианой/Bradley-Terry (JP-TL-Bench-паттерн), не средним; (г) **grok исключён из судейства grok-редактированных выходов** (нарушение собственного анти-self-preference правила §5); (д) валидация судьи — по κ против человеческого IAA + tie-rate/top-1 within-prompt (2603.12520), не по средней корреляции. +4. **Пре-регистрация расширена**: MDE/мощность (число BWS-наборов), N аннотаторов ≥3 (при «минимум владелец» κ неисчислим — тогда честно писать «безκ-режим»), развести имена: C0–C3 = конфигурации ядра, **M0–M3 = режимы терминологии memory-eval** (коллизия имён в exp09 устранена). +5. **Харнесс чинится ДО решающего прогона** (верифицированные дефекты): memory_eval — стрип/запрет эха глоссарий-преамбулы, сохранение ПОЛНЫХ выходов (не out[:160]), реализация fidelity-оси (без неё правило «M3 роняет vs M0» непроверяемо; текущий индикатив ЗАНИЖАЕТ вред неверной инъекции — chunk1-C3 надут эхом); оценочные артефакты — пере-рандомизация меток по фрагментам, ключ/цены ВНЕ артефакта (слепота exp04 была структурно сломана: ключ лежал в том же документе при LLM-оценке). Инструменты: Pearmut (2601.02933) вместо самописного BWS-тулинга — оценить перед постройкой своего. +6. **Think-арм grok-редактора требует reasoning-буфера в `EstimateUSD`** (D6.2) — иначе экономически главный think-вопрос пилот не ответит; бэкенду заложить до прогона. + +## D14. Канал B (18+) — ревизия состава. ✅ + +1. **DeepSeek ВЫВЕДЕН из explicit-части канала B**: ToS DeepSeek (upd 2026-03-27) §3.4(5) прямо запрещает «pornographic, obscene, or sexually explicit (e.g., sexual chatbots)» — верифицировано по первоисточнику. Для violence-фрагментов (не sexually explicit) DeepSeek остаётся допустим. Интерим D3 «DeepSeek офиц. + локальная abliterated» сужается до «локальная abliterated + Grok». +2. **Mistral — кандидат-фолбэк канала B**: Usage Policy (eff. 2026-06-11) не содержит бланкетного запрета adult-текста (только CSAM/NCII/эксплуатация) — верифицировано по первоисточнику. Полигону: прогнать refusal/excision-пробу Mistral на explicit-корпусе, бэкенду — слот в конфиге при положительной пробе. +3. **Обоснование xAI поправлено**: «цитата Маска про R-rated текст» — на деле про Grok Imagine (картинки); опора — сам AUP xAI (нет бланкетного запрета adult-текста; запрещены CSAM и порно реальных лиц). Позиция стабильна на 09.07, но политика xAI волатильна — мониторинг остаётся. +4. **18+ эмпирика — единственный critical ревью**: refusal/excision на explicit-корпусе (Grok/Mistral/abliterated) + качество Grok-судьи 18+ + поведение Gemini-судьи на explicit — обязательная рука exp02/пилота. Гейтится фрагментами от владельца. + +## D15. Resume-экономика и онгоинг. ✅ + +Верифицировано исполнением: `snapshotID` вшит в `RequestHash` → любой `--resnapshot` (флип гейта, append approved-терминов, бамп версии классификатора) переоплачивает ВСЮ книгу, включая байт-идентичные запросы; redrive флагнутых нет. Решения: +1. **Текущий all-or-nothing ПРИЕМЛЕМ для статичной приёмочной книги Ф1** (гейт громкий, расхождений не бывает) — НЕ чинить до приёмки. +2. **Онгоинг-режим (`add-chapters`, сегмент «ИИ-фабрик») ГЕЙТИТСЯ** одним из двух: content-addressed переиспользование чекпоинтов (`msgsContentHash` уже существует — `render.go:233-249`) ИЛИ селективный redrive. Бэкенду: спека-дизайн (не код) в ближайший пакет; реализация — Ф1.5. +3. **Немедленно (в ближайший бэкенд-пакет)**: исправить лгущие комментарии `runner.go:156-160` / `coverage.go:29-33` («re-classify for FREE» верно только внутри неизменного снапшота); `tmctl status` + redrive флагнутых — приоритет D12-хвостов подтверждён (status → redrive → F3); бампнуть edit `prompt_version` (D1-уточнение №3 не исполнено — один лейбл `v0-draft` на два SHA). + +## D16. Банк памяти — фиксы границ доверия (4 верифицированных дыры). ✅ + +Ядро (F1/нормализация/спойлер/детерминизм/инъекция) ревью подтвердило чистым; все находки — на границах доверия, каждая воспроизведена временным Go-тестом: +1. **Полисемия same-src**: две approved-записи (один src, разные sense/dst, пересекающиеся окна) инжектятся ОБЕ как CONFIRMED + post-check даёт гарантированный confirmed-miss (с гейтом ON — детерминированный livelock чанка). Фикс: fail-loud на пересекающихся окнах разных sense в `loadGlossarySeed` ИЛИ даунгрейд обоих совпадений в AMBIGUOUS. (`memory.go:198-204,299-306`; `memseed.go:155-163`) +2. **Sticky-апгрейд**: collision-prone AMBIGUOUS попадает в activeIDs без disposition (`memory.go:323`) → в следующем чанке sticky даёт status-based CONFIRMED, минуя post-check, прямо в редакторские констрейнты. Фикс: наследовать disposition исходного матча в sticky-кэрри (или не класть не-CONFIRMED в activeIDs). ⚠ Это был **ложно-негативный отсев 44-агентного ревью (0/3)** — рациональ «sticky несёт установленный в сцене термин» не проверялась на коллизионном входе; бэкенду выборочно перепроверить остальные отсевы того ревью. +3. **Source-граница для фонетических ключей ≥4**: `rose` (approved) фаерится CONFIRMED внутри `roseanne` — collision-даунгрейд покрывает только ≤3, Aho-Corasick границ не знает, target-сторона границу имеет (асимметрия). Фикс: script/word-граница на source-стороне для фонетических скриптов. +4. **Ruby-чтение не матчится**: для ручных терминов чтение выбрасывается (`memseed.go:217-220`), у auto-кандидатов surfaces строятся только при непустом dst → ja-чанк с именем каной даёт 0 матчей. До реализации B6: ruby-reading → auto-alias ручного термина; интерим — **обязательный пункт чек-листа подготовки ja-книги: kana-написания сид-имён вносить als aliases руками**. +Плюс: kana-precision замер (minKeyLenPhonetic=3 — «консервативный дефолт до замера») — полигону, расширение E1-протокола; C4-автозаполнение `decl` остаётся Ф2, но признаётся условием реалистичности жёсткого postcheck-гейта. + +## D17. D1 (монолингвальный редактор) — статус понижен до «дефолт Ф1, оспорен внешним замером». ✅ + +D1 остаётся дефолтом Фазы 1 (менять конфигурацию до пилота не будем — kalki-риск не опровергнут, а вакуум верности Ф1 уже признан D1.1). Но: (а) сильная форма обоснования («исходник в контексте редактора ⇒ кальки») понижена до гипотезы — подтверждений в литературе 2025–26 нет, кальки документированы как болезнь ДРАФТА; (б) экономический довод слаб (билингв-редактор = +15–20% стандарт-микса ≈ +$0.10–0.14/ранобэ); (в) решает пилот-арм D13.1. Если арм покажет паритет верности при моно — D1 подтверждается дёшево; если налог на верность воспроизведётся — флип на «редактор с исходником, простой промпт» дешевле любой альтернативной митигции. + +## Сопутствующие правки доков (оркестратор, 09.07) + +`02-mvp-plan.md` → v3 (мёртвые пороги/интерим-18+/фазовые списки синхронизированы с D-логом); обе `*.puml` → v3 (убраны Opus/BYOK/«≤2×», дорисованы ре-гейт эскалации, три класса отказов D12, человек в петле, фазовые пометки); superseded-баннеры на `research/01, 02, 03, 04, 09`; провенанс-шапки на `research/12-architecture-as-antipattern.md` и `12-common-failures.md` (происхождение не зафиксировано — до уточнения владельцем числа оттуда не абсорбировать как факты); закрытые промты → `docs/archive/prompts/`; онбординг: корневой `CLAUDE.md` + `backend/README.md` + `eval/README.md`. diff --git a/docs/architecture/06-memory-risk-registry.md b/docs/architecture/06-memory-risk-registry.md index 29c8a48..a1d0429 100644 --- a/docs/architecture/06-memory-risk-registry.md +++ b/docs/architecture/06-memory-risk-registry.md @@ -1,6 +1,6 @@ # Реестр рисков банка памяти (v1, 2026-07-04) -Выход сессии **«Валидация банка памяти»** (промт `docs/MEMORY_RESEARCH_SESSION_PROMPT.md`). Это **вход для бэкенд-сессии перед фиксацией схемы store/глоссария Фазы 1** (шаг 4 «миграция памяти v2» держится до этого реестра — PROGRESS §Память, D7). +Выход сессии **«Валидация банка памяти»** (промт `docs/archive/prompts/MEMORY_RESEARCH_SESSION_PROMPT.md`). Это **вход для бэкенд-сессии перед фиксацией схемы store/глоссария Фазы 1** (шаг 4 «миграция памяти v2» держится до этого реестра — PROGRESS §Память, D7). Метод: многоагентный ресёрч по 7 направлениям + независимая адверсариальная верификация каждой находки по первоисточникам + локальный эмпирический бенчмарк retrieval на реальном PD-корпусе (`eval/retrieval_bench.py`, `eval/data/retrieval_bench/`) + чтение реального кода `backend/`. Полный разбор с источниками и датами — `docs/research/13-memory-bank-validation.md`. Продуктовый код здесь не пишется — реестр описывает требования к нему. diff --git a/docs/architecture/07-strategic-review.md b/docs/architecture/07-strategic-review.md index 337d8f5..480e149 100644 --- a/docs/architecture/07-strategic-review.md +++ b/docs/architecture/07-strategic-review.md @@ -1,6 +1,6 @@ # 07 — Стратегическое ревью архитектуры (2026-07-09) -**Мандат:** `docs/STRATEGIC_REVIEW_SESSION_PROMPT.md` — независимый аудит «от корней к цели» по пяти направлениям. Это ревью о том, держится ли замысел end-to-end, а не о багах в строчках. +**Мандат:** `docs/archive/prompts/STRATEGIC_REVIEW_SESSION_PROMPT.md` — независимый аудит «от корней к цели» по пяти направлениям. Это ревью о том, держится ли замысел end-to-end, а не о багах в строчках. **Метод:** адверсариальный мультиагентный воркфлоу: 14 параллельных сборщиков (8 репо-аудиторов по подсистемам: доки / ресёрч / эксперименты / код пайплайна / код памяти / платформа / eval; 6 веб-ресёрчеров SOTA-2026) → 9 независимых refute-by-default верификаторов на спорных/несущих находках (6 с исполнением временных Go-тестов на реальном коде, 3 по веб-первоисточникам). Итог верификации: **8 CONFIRMED / 1 PARTIAL / 0 REFUTED**. ~2.1M токенов субагентной работы. Каждый несущий вывод заземлён `file:line` / цитатой / URL. **Зоны не тронуты:** `backend/`, `eval/` — только чтение (временные репро-тесты верификаторов удалены, `git status backend/` чист). `.env` не читались, refusal-корпус не открывался. diff --git a/docs/architecture/components.puml b/docs/architecture/components.puml index 1dbca0c..126f576 100644 --- a/docs/architecture/components.puml +++ b/docs/architecture/components.puml @@ -1,74 +1,79 @@ @startuml components -title TextMachine — компоненты бэкенда (MVP, v2 2026-07-04, после ревью) +title TextMachine — компоненты бэкенда (v3 2026-07-09, синхронизировано с 05-decisions-log D1–D17)\nПометки: [OK] = построено · [Ф1*] = остаток Фазы 1 · [Ф2]/[Ф3] = планово skinparam componentStyle rectangle skinparam wrapWidth 200 +actor "Владелец / редактор\n(очередь флагов, подтверждение\nтерминов, BWS-оценка пилота)" as HUMAN + package "Интерфейсы" { - [CLI tmctl] as CLI - [HTTP API\n(для будущей IDE)] as API + component "CLI tmctl: translate / report [OK]\n+ status / redrive [Ф1*]" as CLI + component "HTTP API (IDE) [Ф3]" as API } package "Оркестратор" { - [Проект книги\n(translation brief, конфиг ядра C1/C2/C3)] as PROJ - [Импорт txt/epub\n(сегментация: главы -> чанки)] as IMP - [Durable jobs\n(глава x стадия + чанк-чекпоинты, resume)] as JOBS - [Пайплайн-раннер\n(циклы/ветвления/эскалация = код,\nсостав стадий/модели/пороги = конфиг)] as RUNNER - [Экспорт txt/epub/TMX\n+ отчёт (журнал вклада)] as EXP + component "Проект книги [OK]\n(translation brief, brief_hash,\nконфиг ядра C0/C1/C2/C3)" as PROJ + component "Импорт txt/epub [OK]\n(главы -> чанки, ruby-захват,\nspine-reconciliation fail-loud)" as IMP + component "Durable jobs [OK]\n(чанк-чекпоинты, resume, kill-9-инвариант;\ncontent-addressed reuse — гейт онгоинга [Ф1.5])" as JOBS + component "Пайплайн-раннер [OK]\n(циклы/ретраи/single-hop эскалация\nс РЕ-ГЕЙТОМ = код; состав стадий/модели/\nпороги = конфиг; disposition D2)" as RUNNER + component "Экспорт txt/epub/TMX + отчёт\n(паспорт качества главы) [Ф1*]" as EXP } package "Агентные роли (промпт-конфиги)" { - [Analyst\nbook brief] as ROLE_AN - [Terminologist\nглоссарий + style sheet] as ROLE_TERM - [Translator(ы)\nчерновик / N кандидатов] as ROLE_TR - [Stylist / Editor\nрусский стиль] as ROLE_ED - [Line Editor (Фаза 2+)\nчек-лист Галь] as ROLE_LE - [Continuity Editor (Фаза 2+)\nseries bible] as ROLE_CE - [Judge / Selector\nшкала Комиссарова] as ROLE_JU + component "Translator: черновик [OK]\n(C2: N ГЕТЕРОГЕННЫХ кандидатов [Ф2])" as ROLE_TR + component "Stylist/Editor [OK]\nмонолингвальный D1 (оспорен — пилот-арм D13.1),\ndst-констрейнты CONFIRMED" as ROLE_ED + component "Analyst: book brief [Ф2]" as ROLE_AN + component "Terminologist / автопопуляция\nглоссария [Ф1*/Ф2]\n(спот=локаль, рендер=облако — exp06)" as ROLE_TERM + component "Annotator: пре-пасс [Ф2]\n(speaker-ID, регистр, чэнъюй-маски)" as ROLE_ANN + component "Judge / Selector [Ф2]\n(билингвальный, судья-анкета MQM;\nsecond-opinion чужого семейства\nна эскалированных чанках)" as ROLE_JU + component "Line/Continuity Editor [Ф2+]" as ROLE_LE } package "QA-гейты (без LLM)" { - [Морфодетектор канцелярита] as QA_MORPH - [Детектор CJK-артефактов] as QA_CJK - [Глоссарная консистентность >= 98%] as QA_GLOS - [Полнота покрытия предложений\n(анти-omission / вырезания)] as QA_COV + component "Intrinsic classify [OK]\n(refusal/CJK-echo ДО length, loop-детект)" as QA_CJK + component "Coverage / excision [OK, opt-in]\n(sent_cov + len_ratio, порт оракула)" as QA_COV + component "Глоссарный post-check [OK]\n(decl-aware, CONFIRMED-only;\nфлаггер по умолчанию, гейт opt-in)" as QA_GLOS + component "Дешёвые гейты Ф1 [Ф1*]:\nтире-линтер, ёфикатор,\nтранслит-междометия, число-гейт" as QA_CHEAP + component "Морфо-гейт рода + канцелярит\n+ T-index [Ф2] (Python-сайдкар)" as QA_MORPH + component "Валидатор Палладия/Поливанова B6 [Ф2]\n(ruby-reading = ground truth)" as QA_TRANSLIT } -package "pkg/llm (ядро из vojo + новое)" { - [Роутер роль -> модель] as LLM_RT - [Контент-роутер NSFW\n(каналы A/B, уровень 3 = отказ)] as LLM_NSFW - [Failover local -> cloud\n(circuit breaker)] as LLM_FO - [Адаптеры: DeepSeek / Qwen / GLM /\nGemini / Anthropic / xAI / llama-server] as LLM_AD - [Prompt-cache раскладка префикса\n+ Batch API (Фаза 2, батчуемые стадии)] as LLM_BC +package "pkg/llm" { + component "Роутер роль -> модель [OK]" as LLM_RT + component "Capability-слой [OK]\n(budget_field/temperature/reasoning;\nэхо-мина DeepSeek fail-fast)" as LLM_CAP + component "NSFW-классификатор 0-3 [Ф2]\n(НЕ специфицирован — нужна метрика приёмки;\nуровень 3 = скип чанка + флаг)" as LLM_NSFW + component "Failover [OK, НЕ подключён]\nтолько local->cloud для local-ролей (D4);\nоблачные draft/edit: пауза+resume, НЕ своп" as LLM_FO + component "Адаптеры OpenAI-совместимые [OK]:\nDeepSeek / GLM / Kimi / xAI / OpenAI /\nllama-server; нативный Gemini [Ф2]" as LLM_AD + component "Кэш-раскладка префикса [OK]\n+ Batch (только Gemini-судья/QA) [Ф2]" as LLM_BC } -package "Банк памяти книги (SQLite на книгу)" { - [Глоссарий\n(род, речь, склонения, спойлер-окна)] as MEM_GLOS - [Резюме\nглава -> арка -> книга] as MEM_SUM - [Series bible\n(персонажи, матрица ты/вы)] as MEM_SB - [TM-кэш переводов] as MEM_TM - [Векторный индекс (Фаза 2)\n(BLOB + brute-force KNN, bge-m3;\nбез sqlite-vec — pure-Go драйвер)] as MEM_VEC - [Селективная инъекция\n(детерминированный отбор в промпт)] as MEM_INJ +package "Банк памяти книги (SQLite на книгу) [OK: v2]" { + component "Глоссарий v2 [OK]\n(sense, alias-граф, decl, gender=hidden,\ntranslit_policy, ревизии)" as MEM_GLOS + component "Горячий путь [OK]: Aho-Corasick,\nнормализация NFKC/trad2simp/kana/ignorables,\nспойлер-окна since/until (hard-reject),\ndisposition CONFIRMED/AMBIGUOUS/REJECT,\nsticky; фиксы границ D16 [Ф1*]" as MEM_HOT + component "Ruby-захват [OK] -> сид auto-кандидатов;\nreading как матч-поверхность [Ф1*, D16.4]" as MEM_RUBY + component "retrieval_state per-chunk [OK]\n(наблюдаемость инъекции/вытеснений)" as MEM_RS + component "Резюме глава->арка->книга [Ф2]\n+ гейт фактичности резюме (реестр D1)" as MEM_SUM + component "Series bible: ты/вы-журнал, род [Ф2]" as MEM_SB + component "Векторный слой [Ф2, low-trust A7]\n(bge-m3, только кандидаты на ревью)" as MEM_VEC } -package "Деньги и наблюдаемость" { - [Ledger: reserve/settle,\nпотолки $ на книгу/день] as OBS_LG - [Премиум-бюджет книги\n(<= 2x объёма дорогими моделями)] as OBS_QB - [request_log + trace\n(токены, $, cache-hit, вердикты)] as OBS_TEL +package "Деньги и наблюдаемость [OK]" { + component "Ledger: reserve -> settle+checkpoint\nодной tx, потолки книга/день,\nescalation-бюджет" as OBS_LG + component "Премиум-бюджет: budget_usd =\nclamp(price x (1-margin) - base, 0, cap)\n(D11; жёсткие $-гейты сняты)" as OBS_QB + component "request_log + trace + retrieval_state" as OBS_TEL } -package "Eval (оффлайн)" { - [Golden-set реплей\n(паттерн routereval)] as EV_GS - [CometKiwi сайдкар (Python)] as EV_CK - [Refusal/excision бенчмарк 18+] as EV_RB +package "Eval / Полигон (зона eval/)" { + component "Пилот-харнесс Ф2.5\n(BWS, memory-eval M0-M3, судья-панель;\nчинится до прогона — D13.5)" as EV_PILOT + component "Refusal/excision-бенчмарк\n(18+ часть ждёт explicit-корпус — critical)" as EV_RB } cloud "LLM-провайдеры" { - [DeepSeek V4] as P_DS - [Gemini 3.x] as P_GM - [Anthropic\n(только уровни 0-1)] as P_AN - [xAI Grok\n(канал B)] as P_XA - [OpenRouter / агрегаторы / BYOK] as P_OR - [llama-server\n(GPU 8GB: скрининг, abliterated, эмбеддинги)] as P_LL + component "DeepSeek V4 (draft; thinking ON —\nэхо-мина; для explicit ЗАПРЕЩЁН ToS, D14.1)" as P_DS + component "xAI Grok 4.3 (редактор SFW, канал B,\nсудья 18+; AUP без запрета adult-текста)" as P_XA + component "Gemini 3.1 Pro (апекс/судья [Ф2])" as P_GM + component "GLM / Kimi / OpenAI\n(альтернативы/эскалация)" as P_OTH + component "Mistral — кандидат-фолбэк\nканала B [проба, D14.2]" as P_MI + component "llama-server (GPU 8GB: скрининг,\nabliterated канала B, эмбеддинги,\nСПОТ-экстракция)" as P_LL } database "SQLite" as DB @@ -77,49 +82,54 @@ CLI --> PROJ API --> PROJ PROJ --> IMP IMP --> JOBS -RUNNER --> EXP JOBS --> RUNNER -RUNNER --> ROLE_AN -RUNNER --> ROLE_TERM +RUNNER --> EXP RUNNER --> ROLE_TR RUNNER --> ROLE_ED -RUNNER --> ROLE_LE -RUNNER --> ROLE_CE +RUNNER --> ROLE_AN +RUNNER --> ROLE_TERM +RUNNER --> ROLE_ANN RUNNER --> ROLE_JU -RUNNER --> QA_MORPH +RUNNER --> ROLE_LE RUNNER --> QA_CJK -RUNNER --> QA_GLOS RUNNER --> QA_COV +RUNNER --> QA_GLOS +RUNNER --> QA_CHEAP +RUNNER --> QA_MORPH +RUNNER --> QA_TRANSLIT ROLE_TR --> LLM_RT ROLE_ED --> LLM_RT ROLE_JU --> LLM_RT ROLE_AN --> LLM_RT ROLE_TERM --> LLM_RT -ROLE_LE --> LLM_RT -ROLE_CE --> LLM_RT -LLM_RT --> LLM_NSFW -LLM_NSFW --> LLM_FO -LLM_FO --> LLM_AD -LLM_BC --> LLM_AD +LLM_RT --> LLM_CAP +LLM_CAP --> LLM_AD +LLM_NSFW ..> LLM_RT : выбор канала A/B [Ф2] +LLM_FO ..> LLM_AD : только local-роли (D4) +LLM_BC ..> LLM_AD LLM_AD --> P_DS -LLM_AD --> P_GM -LLM_AD --> P_AN LLM_AD --> P_XA -LLM_AD --> P_OR +LLM_AD --> P_GM +LLM_AD --> P_OTH +LLM_AD --> P_MI LLM_AD --> P_LL -LLM_NSFW ..> P_LL : классификатор 0-3 +LLM_NSFW ..> P_LL : классификатор 0-3 [Ф2] -RUNNER --> MEM_INJ -MEM_INJ --> MEM_GLOS -MEM_INJ --> MEM_SUM -MEM_INJ --> MEM_SB -MEM_INJ ..> MEM_VEC : Фаза 2, не в горячем пути -RUNNER --> MEM_TM : коммит перевода -RUNNER --> MEM_GLOS : новые термины -RUNNER --> MEM_SUM : обновление резюме -RUNNER --> MEM_SB : род, ты/вы +RUNNER --> MEM_HOT +MEM_HOT --> MEM_GLOS +MEM_HOT --> MEM_RS +IMP --> MEM_RUBY +MEM_RUBY --> MEM_GLOS +MEM_HOT ..> MEM_SUM : [Ф2] +MEM_HOT ..> MEM_SB : [Ф2] +MEM_HOT ..> MEM_VEC : [Ф2], не в горячем пути + +HUMAN --> CLI : запуск, флип гейтов (за подписью) +HUMAN <-- EXP : отчёт, паспорт качества, флаги +HUMAN --> MEM_GLOS : подтверждение терминов auto->approved\n(безлюдный режим = осознанный риск G1/G2) +HUMAN <.. EV_PILOT : BWS-оценка (пилот Ф2.5) LLM_RT --> OBS_LG OBS_LG --> OBS_QB @@ -128,14 +138,17 @@ RUNNER --> OBS_TEL JOBS --> DB MEM_GLOS --> DB -MEM_SUM --> DB -MEM_SB --> DB -MEM_TM --> DB -MEM_VEC --> DB +MEM_RS --> DB OBS_TEL --> DB OBS_LG --> DB -EV_GS ..> OBS_TEL : реплей решений -EV_CK ..> OBS_TEL : оценка качества +EV_PILOT ..> OBS_TEL : golden-set реплей [Ф2] EV_RB ..> LLM_NSFW : калибровка роутинга + +note bottom of HUMAN + Петля человека — несущая опора safety + (все защиты кончаются флагом): + ёмкость G2 меряется пилотом (D13), + flag-rate/главу — первый замер. +end note @enduml diff --git a/docs/architecture/pipeline.puml b/docs/architecture/pipeline.puml index a99cc6b..edbbe81 100644 --- a/docs/architecture/pipeline.puml +++ b/docs/architecture/pipeline.puml @@ -1,80 +1,104 @@ @startuml pipeline -title TextMachine — поток перевода книги (v2 2026-07-04, после ревью) +title TextMachine — поток перевода книги (v3 2026-07-09, синхронизировано с D1–D17)\nПометки: [OK] = построено · [Ф1*] = остаток Фазы 1 · [Ф2] = планово skinparam wrapWidth 260 start -:Импорт книги (txt / epub v1: текст глав по spine); -:Сегментация: главы -> чанки 1-2k токенов -(по абзацам, перекрытие = read-only контекст); -:Analyst: чтение всей книги (map-reduce) -> book brief -+ translation brief пользователя (18+, слайдер Venuti, -хонорифики, транскрипция) -> brief_hash в ключ TM; -:Terminologist: автогенерация глоссария и style sheet -ДО перевода (паттерн preparation из TransAgents); +:Импорт книги [OK]: txt / epub по spine, +ruby-захват, spine-reconciliation fail-loud +(тихая потеря главы невозможна); +:Сегментация [OK]: главы -> чанки ~1-2k токенов +(sentence-pack, quote-depth, lossless); +:Сид глоссария [OK]: ручной YAML + ruby-кандидаты +(ja-книга: kana-написания имён — aliases руками, D16.4) +· автопопуляция G1 [Ф1*/Ф2]: +спот=локаль / рендер=облако; +:Analyst: book brief (map-reduce) [Ф2]; +:Terminologist: глоссарий + style sheet до перевода [Ф2]; note right - Analyst / Terminologist / судья / - книжный QA — батчуемые стадии (-50%); - черновик и редактура чанков — - последовательные (STM-зависимость) + snapshotID [OK] пинит: brief, чанкер, план стадий, + capability, память (content-hash), context-assembly. + ЛЮБОЙ resnapshot = переоплата книги (D15) — + до content-addressed reuse онгоинг не продаётся. end note while (Остались главы?) is (да) while (Остались чанки главы?) is (да) - :Сборка контекста чанка: - кэшируемый префикс (system + brief + style sheet - + резюме книги/арки), после кэш-брейкпоинта — - селективный глоссарий + STM + чанк; - :NSFW-классификатор (локальный, 0-3); + :Сборка контекста [OK]: кэш-префикс (system+brief) + + селективная инъекция глоссария + (Aho-Corasick, спойлер-hard-reject, + disposition CONFIRMED/AMBIGUOUS/REJECT, sticky) + + retrieval_state запись; + :NSFW-классификатор 0-3 [Ф2 — требует + спеки и метрики приёмки]; if (Уровень 3: несовершеннолетние?) then (да) - :Чанк НЕ переводится: скип + флаг в отчёте - (глава и книга продолжаются); + :Чанк НЕ переводится: скип + флаг + (книга продолжается); else (нет) - if (Уровень 2?) then (да) - :Канал B: Grok, open-weights, - локальная abliterated - (Anthropic исключён структурно); + if (Уровень 2: explicit?) then (да) + :Канал B [интерим D14]: Grok 4.3 + + локальная abliterated + · Mistral — после пробы + · DeepSeek ЗАПРЕЩЁН (ToS) + · OpenAI/Gemini — нет; else (0-1) - :Канал A: DeepSeek V4 Flash; + :Канал A [OK]: DeepSeek V4 Flash + (thinking ON — эхо-мина); endif - :Translator: черновик - (C2/C3: N кандидатов разных семейств, T=0.6-1.0); - if (Ядро C2/C3: селекция?) then (да) - :Judge-селектор: попарное сравнение кандидатов - (T=0, дешёвый прескрининг CometKiwi/MBR); + :Translator [OK]: черновик + (C2 [Ф2]: N ГЕТЕРОГЕННЫХ кандидатов, D13.2); + if (Ядро C2/C3: селекция? [Ф2]) then (да) + :Judge-селектор: 11+ повторов со свапом + позиций, Bradley-Terry + (кандидаты разных семейств); else (C1) endif - :Stylist/Editor: художественная редактура - (сильнейшая ru-модель канала, диффы, узкий мандат); - :QA-гейты без LLM: CJK-артефакты, - глоссарная консистентность (approved, по decl), - coverage-гейт v1 (сегментация, длины, refusal-blacklist); - if (Гейт сработал?) then (да) - if (Премиум-бюджет книги не исчерпан?) then (да) - :Эскалация channel-aware: - канал A - Opus / Gemini Pro, - канал B - Grok 4.3 / Gemini safety-off; + :Intrinsic classify [OK]: refusal-blacklist, + CJK-echo, empty, loop — ДО length + (усечённый отказ не ретраится платно); + :Coverage-гейт [OK, opt-in]: sent_cov + len_ratio + (только translator-роль); + if (Вердикт чанка?) then (транзиентный: length/empty) + :same-model retry, ось attempt, + бОльший max_tokens (после loop-чека) [OK]; + elseif (контент-провал: echo/excision/refusal) then (детерминированный) + if (escalate_to задан И бюджет есть?) then (да) + :Single-hop эскалация [OK]: на ДРУГУЮ модель + (ровно 1 хоп, editor pinned); + :РЕ-ГЕЙТ фолбэка [OK]: classify + coverage + заново — не прошёл, значит флаг остаётся; else (нет) - :Флаг чанка в отчёт (ненулевой exit code); + :Флаг чанка (skip+flag+continue, D2) [OK]; endif - else (нет) + else (ok) endif - :Чекпоинт чанка: сырой ответ -> store (сразу после settle), - перевод -> TM (коммитится только прошедший гейты); + :Editor [OK]: монолингвальная редактура D1 + (вход = черновик + CONFIRMED dst-констрейнты, + D17: оспорено внешним замером — решает пилот-арм); + :Post-check финала [OK]: decl-aware, + CONFIRMED-only — флаггер по умолчанию, + жёсткий гейт opt-in за подписью владельца; + :Чекпоинт [OK]: settle + checkpoint одной tx + (в TM коммитится только прошедшее гейты); endif endwhile (нет) - :Граница главы: обновить резюме (глава/арка/книга), - батч-подтверждение новых терминов (auto -> approved), - series-bible-lite (род, матрица ты/вы), телеметрия главы; + :Граница главы: телеметрия + паспорт + качества [Ф1*] · батч-подтверждение терминов auto->approved — + ЧЕЛОВЕК или судья чужого семейства [Ф2] — + безлюдный авто-апрув = риск G1 + · резюме главы/арки + гейт фактичности [Ф2]; note right - Фаза 2+: Line Editor (чек-лист Галь), - Continuity Editor, анти-translationese пасс, - CometKiwi-оценка, морфодетектор канцелярита + Outage/системный класс (503-storm, потолок): + circuit-breaker -> ПАУЗА + resume (D4/D12), + НЕ mass-swap провайдера. end note endwhile (нет) -:Книжный QA-проход: консистентность имён/терминов -по всей книге, регрессия ты/вы (батчуемая стадия); -:Экспорт txt/epub/TMX + отчёт (стоимость и cache-hit -по стадиям, флаги, журнал творческого вклада); +:Очередь флагнутых чанков -> человек +· redrive точечно [Ф1*] (сейчас только +--resnapshot ценой всей книги — D15); +:Книжный QA-проход [Ф2]: консистентность по всей +книге, регрессия ты/вы, морфо-гейт рода; +:Экспорт txt/epub + отчёт [Ф1*]: стоимость по стадиям, +флаги, журнал творческого вклада; stop @enduml diff --git a/docs/research/01-market.md b/docs/research/01-market.md index ac02656..c4f2860 100644 --- a/docs/research/01-market.md +++ b/docs/research/01-market.md @@ -1,5 +1,7 @@ # Рынок и спрос на AI-перевод книг, вебновелл и ранобэ +> ⚠ **SUPERSEDED ЧАСТИЧНО (09.07.2026).** Оценка SAM $2.5–18M ARR завышена в 5–20 раз — пересчёт снизу-вверх: `11-gap-5.md` ($0.4–1.5M). После пивота на EU-SaaS (Р5) RU-тиры SAM (60–75% объёма) требуют платёжного механизма — открытый GTM-вопрос (Р9, `../architecture/07-strategic-review.md` риск №6). Фактура по сегментам/якорям остаётся полезной; цифры выручки из этого дока в решения не брать. + Дата исследования: 2026-07-04. Все цифры — из открытых источников, ссылки в конце. Непроверенные оценки помечены «(не проверено)». ## TL;DR diff --git a/docs/research/02-competitors.md b/docs/research/02-competitors.md index 9faa047..f7632ef 100644 --- a/docs/research/02-competitors.md +++ b/docs/research/02-competitors.md @@ -1,5 +1,7 @@ # Конкуренты и существующие решения AI-перевода книг и длинных художественных текстов +> ⚠ **SUPERSEDED ЧАСТИЧНО (09.07.2026).** TL;DR-тезис «русское направление никто не обслуживает» опровергнут `11-gap-4.md` (Rulate AI-раздел 14.4k работ, MLate, VseGPT); «окно 6–12 мес» — непроверенная оценка, реальная угроза — западные сервисы с ru-таргетом (booktranslator.ai) и коммодитизация «глоссария» в нижнем сегменте. Срез рынка на 07.2026 — `../architecture/07-strategic-review.md` §5 (RU стагнирует, EN индустриализуется, Kindle Translate без ru). + Дата исследования: 2026-07-04. Все цифры (звёзды GitHub, цены) проверены на эту дату, если не помечено иначе. ## TL;DR diff --git a/docs/research/03-academic-agentic-mt.md b/docs/research/03-academic-agentic-mt.md index 96dd4a8..000b092 100644 --- a/docs/research/03-academic-agentic-mt.md +++ b/docs/research/03-academic-agentic-mt.md @@ -1,5 +1,7 @@ # Научное состояние мультиагентного и документного художественного машинного перевода (2023–2026) +> ⚠ **SUPERSEDED ЧАСТИЧНО (09.07.2026).** Вывод №1 «ядро — generate-then-select» переопределён: Р2/`11-gap-3` («решает пилот»), и наука-2026 контрсигналит — LitMT (2606.05924): селекция ПОСЛЕДНЯЯ на гомогенных кандидатах; 2603.20324 верифицирована по первоисточнику — перевода в задачах НЕТ, «валидация людьми» — на деле независимыми LLM-судьями. Свежий срез (рефайнмент 2605.13368, судьи, память) — `../architecture/07-strategic-review.md` §4–5 и D13 в `../architecture/05-decisions-log.md`. + Дата обзора: 2026-07-04. Охват: arXiv, ACL/EMNLP/NAACL, ICLR, TACL, WMT. ## TL;DR diff --git a/docs/research/04-api-providers.md b/docs/research/04-api-providers.md index 9d8734c..4d2731f 100644 --- a/docs/research/04-api-providers.md +++ b/docs/research/04-api-providers.md @@ -1,5 +1,7 @@ # LLM API провайдеры для художественного перевода (zh/ja/en/ru): цены, качество, цензура +> ⚠ **SUPERSEDED ЧАСТИЧНО (09.07.2026).** Рекомендации ролей устарели: редактор — grok-4.3 (эксп.04, D3), НЕ GLM/Kimi/Sonnet; Anthropic удалён; grok-4.1-fast ретайрнут. Канал B: DeepSeek для explicit ЗАПРЕЩЁН его ToS (upd 27.03.2026) — D14; Mistral (policy 11.06.2026) — кандидат-фолбэк. Актуальные цены — `../experiments/08-cost-model-v2.md` + `backend/configs/models.yaml`; квирки — `../experiments/00-provider-quirks.md`; стек — D3/Р4. + Дата исследования: **2026-07-04**. Все цены проверены на официальных страницах прайсинга на эту дату (исключения помечены). Валюта — USD за 1M токенов, формат «input / output». ## TL;DR diff --git a/docs/research/09-cost-model.md b/docs/research/09-cost-model.md index 921a0be..317b98b 100644 --- a/docs/research/09-cost-model.md +++ b/docs/research/09-cost-model.md @@ -1,5 +1,7 @@ # 09. Модель стоимости перевода книги через мультиагентный пайплайн и оценка маржи +> ⚠ **SUPERSEDED (09.07.2026).** Денежная модель заменена `../experiments/08-cost-model-v2.md` (стек grok-редактора: ~$0.69/ранобэ, ~$10.94/вебновелла-500; редактор ≈ 90% стоимости). Пороги $0.6/$5/$30 и Sonnet-премиум-микс мертвы (D11); доктрина «caching-first» опровергнута на текущем стеке (кэш ≈ 2% стандарта — рычаг это цена редактора). Отсюда живы только методика и множители токенизации (уточнены exp01). + Дата: 2026-07-04. Все цены проверены по официальным страницам / актуальным агрегаторам на эту дату; отдельные пункты помечены «(не проверено)». Курс для пересчёта: ~80 ₽/$ (допущение, не проверено — уточнить на дату расчёта). ## TL;DR diff --git a/docs/research/13-memory-bank-validation.md b/docs/research/13-memory-bank-validation.md index a95f3ca..c000a6c 100644 --- a/docs/research/13-memory-bank-validation.md +++ b/docs/research/13-memory-bank-validation.md @@ -1,6 +1,6 @@ # Валидация банка памяти книги: вердикт, что менять, обоснование и источники -Дата: 2026-07-04. Сессия **«Валидация банка памяти»** (промт `docs/MEMORY_RESEARCH_SESSION_PROMPT.md`). Предмет — решение **Р3 «Банк памяти книги»** (`architecture/01-decisions.md`) и исследовательская база `research/05-memory-glossary.md`. Мандат: **адверсариально провалидировать** подход до заморозки в коде — не поверить, а попытаться сломать. +Дата: 2026-07-04. Сессия **«Валидация банка памяти»** (промт `docs/archive/prompts/MEMORY_RESEARCH_SESSION_PROMPT.md`). Предмет — решение **Р3 «Банк памяти книги»** (`architecture/01-decisions.md`) и исследовательская база `research/05-memory-glossary.md`. Мандат: **адверсариально провалидировать** подход до заморозки в коде — не поверить, а попытаться сломать. Метод: многоагентный ресёрч по 7 направлениям (Q1–Q7) + независимая адверсариальная верификация каждой находки по первоисточникам + завершающий completeness-критик + **локальный эмпирический бенчмарк retrieval** на реальном PD-корпусе (`eval/retrieval_bench.py`) + чтение реального кода `backend/`. Все вендорские/бенчмарк-числа перепроверены независимо (как MemPalace в research/05); процитированные корректировки — от верификаторов. Реестр рисков (таблица «сценарий → защита → слой → где в коде») — отдельный файл `architecture/06-memory-risk-registry.md` (единственный, что этой сессии разрешено создать в `architecture/`), он же — вход для бэкенда перед фиксацией схемы. diff --git a/docs/research/14-adaptive-memory.md b/docs/research/14-adaptive-memory.md index 5b73c80..70cf7eb 100644 --- a/docs/research/14-adaptive-memory.md +++ b/docs/research/14-adaptive-memory.md @@ -1,6 +1,6 @@ # Адаптивный/обучающийся слой памяти: стоит ли гибрид, огибающая осуществимого, арбитраж -Дата: 2026-07-05. Сессия **«Адаптивный слой памяти»** (промт `docs/ADAPTIVE_MEMORY_RESEARCH_PROMPT.md`). Предмет — вопрос владельца: не будет ли **максимально эффективным гибрид** «отлаженный детерминированный банк памяти (Р3) + слой, обучающийся ПО ХОДУ перевода книги» (in-context / локальный LoRA / kNN-MT / online-retrieval / само-коррекция), и **как именно смёржить под наш жёсткий локально-стоимостный контур**. Мандат — адверсариально проверить, стоит ли оно того, а не поверить в модность. +Дата: 2026-07-05. Сессия **«Адаптивный слой памяти»** (промт `docs/archive/prompts/ADAPTIVE_MEMORY_RESEARCH_PROMPT.md`). Предмет — вопрос владельца: не будет ли **максимально эффективным гибрид** «отлаженный детерминированный банк памяти (Р3) + слой, обучающийся ПО ХОДУ перевода книги» (in-context / локальный LoRA / kNN-MT / online-retrieval / само-коррекция), и **как именно смёржить под наш жёсткий локально-стоимостный контур**. Мандат — адверсариально проверить, стоит ли оно того, а не поверить в модность. Метод (как в валидации банка, `research/13`): многоагентный ресёрч по 6 направлениям (kNN-MT / in-context-демонстрации / adaptive-online-MT / локальный LoRA / adaptive-RAG-петли / свежее 2025–2026) + **независимая адверсариальная верификация каждой несущей находки по первоисточнику** (24 верификатора: 19 CONFIRMED, 5 OVERCLAIM с точной поправкой) + **две исполняемые пробы на нашем стенде/ключах** (`eval/adaptive_probe.py` — доступ к логитам у флагманов; `eval/adaptive_incontext.py` — демонстрации vs глоссарий на реальном zh→ru) + чтение реального кода `backend/` на git HEAD. Все заблокированности проверены **пробой, а не по памяти** (мандат §Жёсткий контур). Прод-код не пишется — только `eval/` и этот документ.