textmachine/docs/architecture/02-mvp-plan.md
Claude (backend session) 9bb00d49f2 Initial commit: documentation, eval polygon, backend step 0 verdict
TextMachine project repository (AI translation of literary books).
Includes: v2 architecture decisions, MVP plan, research 01-12,
polygon experiments 01-03, backend-session revalidation verdict
(03-implementation-notes.md).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-04 06:50:59 +03:00

63 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# План MVP (v2, 2026-07-04)
Цель MVP (бриф, п. 24): **бэкенд переводит целую книгу целиком** — консистентно, дёшево, с учётом стоимости. Интерфейс — CLI; HTTP API закладываем как тонкий слой (Фаза 3), IDE-фронт — после бэкенда. v2 — после адверсариального ревью: фазы перебалансированы, приёмка сделана проверяемой, добавлены интерим-правила для 18+ и спецификации, блокировавшие старт кодинга. Реалистичный горизонт — **1011 недель** (было «8», критики показали, что пилот не влезал).
## Дорожка данных (параллельно всем фазам, владелец + сессия «Полигон»)
Закупка/подбор лицензионных изданий для золотого набора, выравнивание, глоссарии, отбор 2535 глав пилота, refusal-корпус 50100 фрагментов, замеры токенизации. Стартует с недели 1 — к пилоту (Фаза 2.5) данные должны быть готовы.
## Фаза 0 — Каркас (нед. 12)
Монорепо Go (`backend/`). Портирование ядра из `vojo/apps/ai-bot`:
- `pkg/llm`: интерфейс LLMClient, OpenAI-совместимый транспорт (retry/backoff), адаптеры DeepSeek/Qwen/GLM/xAI/Gemini/llama-server; **новое**: нативный Anthropic-адаптер (`cache_control`), поддержка prompt caching в структуре запроса. ~~Batch API~~ → Фаза 2; ~~SSE-стриминг~~ → Фаза 3 (нужен только IDE-фронту).
- `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.
Приёмка: `tmctl translate --config book.yaml` гоняет один чанк draft→edit с полным учётом $ в request_log; kill -9 теряет максимум один вызов.
## Фаза 1 — Перевод целой книги (нед. 35)
- Импорт/чанкинг по спеке: txt/epub; **epub v1 = извлечение текста глав по spine, экспорт простым xhtml** (инлайн-разметка/ruby-фуригана не сохраняются — честное ограничение v1); чанк 12k токенов по границам абзацев; перекрытие — **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-паттернов; валидируется мини-набором 2030 фрагментов с выпиленными предложениями). В 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 по стадиям, метрики, журнал творческого вклада, флаги).
Приёмка: SFW-том ранобэ (~150k токенов) end-to-end за один запуск с резюмируемостью; COGS: стандарт на DeepSeek ≤ **$0.6**, премиум-микс ≤ **$5** (два порога вместо неопределённого «стандарт-микса»); глоссарная консистентность approved-имён ≥98% по процедуре Р7; coverage-гейт ловит ≥90% искусственных пропусков на валидационном мини-наборе. (Род/ты-вы — приёмка Фазы 2, когда появится гейт по series-bible-lite.)
## Фаза 2 — Качество: судья, NSFW, гейты второй очереди (нед. 68)
- Judge-роль (шкала Комиссарова, пара судей), режимы C2/C3 как конфиги; Batch API (OpenAI-стиль + Anthropic Message Batches) для батчуемых стадий (Analyst/Terminologist/судья/книжный QA).
- NSFW-роутер: локальный классификатор 03, каналы 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).
Приёмка: 18+ книга проходит пайплайн без молчаливых потерь (проверено детектором + refusal-бенчмарком); гейт рода/ты-вы работает на series-bible-lite; C2/C3 запускаются конфигом.
## Фаза 2.5 — Пилот 4 рук (нед. 810, elapsed 23 недели)
По протоколу Р2/gap-3: C0/C1/C2/C3 на 2535 главах zh/ja/en→ru (данные готовы из дорожки данных), человеческие попарные сравнения (внешние редакторы 2040 ч) + панель LLM-судей чужих семейств с человеческим переводом как якорем. Решение о ядре пайплайна; 23 главы 18+ в корпусе — замер отказов по ролям.
## Фаза 3 — Продуктовизация (после MVP)
HTTP API + SSE для IDE-фронта; выравнивание Bertalign (параллельное чтение, полноценный импорт reference-переводов прошлых томов; до этого — упрощённый импорт бэк-каталога парами глав); TMX/TBX; BYOK-пресеты агрегаторов; биллинг ЮKassa/СБП; batch-планировщик внепиковых окон DeepSeek; кандидаты из Р2: консультант поп-культуры, tool-calling, webfetch культурного контекста.
## Вне скоупа MVP
IDE-фронтенд (закладываем только API), B2B white-label, дистилляция своей 714B модели (логируем long-CoT синтетику с первого дня — рецепт DRT, но не обучаем), ru→en направление (следствие для выручки — см. Р9), автоматическая публикация куда-либо (Р8).
## Метрики успеха MVP
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-цель, калибруется пилотом.
4. Резюмируемость: kill -9 в середине главы → продолжение с потерей максимум одного LLM-вызова.