textmachine/docs/architecture/01-decisions.md

136 lines
45 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.

# Архитектурные решения (v2, 2026-07-04)
Синтез по итогам исследований `docs/research/01…11-*`. v2 — после адверсариального ревью тремя критиками (техархитектура, экономика, red-team); все найденные противоречия разрешены явно. Формат — ADR-подобный: решение → обоснование → что отвергнуто. Статусы: **принято** (можно кодить), **гипотеза** (нужен пилот/валидация).
---
## Р1. Язык бэкенда — Go. **Принято**
Из [10-vojo-ai-bot-review.md](../research/10-vojo-ai-bot-review.md):
- Из `vojo/apps/ai-bot` прямо переносится ~22,5 тыс. строк проверенной инфраструктуры: OpenAI-совместимый транспорт с retry/backoff, фейловер «локальная GPU → облако» с circuit breaker, прайсинг + reserve/settle-ledger, телеметрия (request_log, трейсы W3C), fail-fast конфиг. Это 36 недель сэкономленной разработки.
- Goroutines/context — идеальная модель для тысяч параллельных LLM-вызовов; один статический бинарь без рантайма — идеально для локального режима у пользователя.
- **Отвергнуто:** C++/userver — ноль переиспользования, производительность здесь не монетизируется (мы ждём сеть, а не CPU), а код пишет Claude, не владелец. Python — только оффлайн-евалы и Python-сайдкар качества (CometKiwi, морфология русского — в Go-экосистеме зрелого лемматизатора нет). TypeScript — для будущего IDE-фронтенда.
План выделения пакетов: `pkg/llm` (llm.go + httpllm.go + адаптеры + failover), `pkg/ledger` (pricing + reserve/settle), `pkg/obs` (trace + logging), `pkg/store` (миграции). Первый новый нативный адаптер — **Gemini** (судья/апекс, нативный контекст-кэш `cachedContent`НЕ anthropic-`cache_control`); нативный Anthropic-адаптер оставлен в коде **DEPRECATED-референсом** (Anthropic выброшен за дороговизну — Р4/D3, git `c7f8a95`), как образец для Gemini-адаптера, а не как код к написанию. Известная ловушка из vojo: per-adapter семантика reasoning-токенов (недоучёт до 3044% расходов).
## Р2. Ядро пайплайна — конфигурируемый граф стадий; выбор ядра решает пилот. **Принято (каркас) / гипотеза (ядро)**
Наука разошлась ([03](../research/03-academic-agentic-mt.md), [11-gap-3](../research/11-gap-3.md)): arXiv:2603.20324 («When Agents Disagree», март 2026 — та самая статья про судью-селектора, но перевода среди её задач нет) говорит «selection бьёт synthesis», а Fusion-of-N (arXiv:2510.00931) и Amazon (arXiv:2605.13368) — что refinement/fusion даёт стабильный прирост, и финальный стиль задаёт модель-**редактор**. На zh→ru / ja→ru никто ничего не мерил.
Решение:
- **Граница «конфиг vs код» фиксирована** (урок ревью: без этого DSL расползается в кривой язык): циклы по главам/чанкам, ветвление по гейтам, эскалация с лимитом бюджета, fan-out кандидатов, ретраи — **фиксированная логика раннера**; конфиг задаёт только состав и порядок стадий, роли→модели, версии промптов и пороги гейтов. Четыре ядра (C0 baseline, C1 draft→editor, C2 generate-then-select, C3 select-then-refine) — четыре YAML-конфига одного раннера. Конкретный YAML-пример C1 пишется до старта Фазы 1 (приложение к плану MVP).
- Ролевая модель — по издательскому процессу ([07](../research/07-translation-methodology.md)): **Analyst** (вся книга → book brief), **Terminologist** (глоссарий + style sheet до перевода — паттерн preparation из TransAgents), **Translator** (черновик/кандидаты; режим «аннотированный подстрочник» — советская модель «подстрочник+поэт»), **Stylist/Editor** (дефолт Фазы 1 — grok-4.3 по лучшему value: ранг-1 верность, ранг-2 стиль, эксп.04; сильнейшая проза gemini-3.1-pro-preview — премиум-эскалация), **Judge** (шкала Комиссарова + Nida-вопрос; пара судей: монолингвальный на художественность + билингвальный на верность). Роли второй очереди (Фаза 2+): **Line Editor** (чек-лист Норы Галь), **Continuity Editor** (series bible), **анти-translationese пасс** (>40% переводов даже GPT-4 содержат кальки).
- Пункты брифа, по которым решение принято явно: **консультант поп-культуры / языковой аналитик** (бриф п.2; прототип — CRAT arXiv:2410.21067) и **tool-calling / переводческие тулзы** (п.32; в vojo tool-calling нет) — вне скоупа MVP, кандидаты Фазы 3; **webfetch за культурным контекстом** (п.16) — post-MVP, только по явному сигналу «незнакомый термин» и с подтверждением через глоссарий (риск многозначности, о котором предупреждал сам бриф).
- У каждого пасса **узкий мандат** (запрет менять чужую зону) и диффы вместо полной перегенерации.
- Приоритет силы моделей: **редактор > черновик** (вывод arXiv:2605.13368 — refinement проецирует текст в распределение редактора).
- Пилот 4 рук: ~2535 глав zh/ja/en→ru; решающий критерий — человеческие попарные сравнения (протокол LAIT; для двух систем это pairwise, не BWS — BWS только с ≥3 объектами, третьим якорем берём человеческий перевод) + панель LLM-судей чужих семейств. Правило: если C2/C3 лучше C1 менее чем на 5 п.п. win rate — берём C1 (в 23 раза дешевле). Бюджет: <$50 API + внешние редакторы 2040 ч; **elapsed 23 недели, отдельная фаза** (см. план MVP v2) — подготовка корпуса стартует параллельно с Фазы 0 (работа владельца + сессия «Полигон»).
## Р3. Банк памяти книги — собственный модуль на SQLite. **Принято (схема+гейты) / ставка — гейтится in-house eval**
Из [05-memory-glossary.md](../research/05-memory-glossary.md), провалидировано сессией «Валидация банка памяти» ([research/13](../research/13-memory-bank-validation.md), реестр рисков [architecture/06](06-memory-risk-registry.md)) — **правки ниже внесены по её пингам**:
- **MemPalace существует, но форкать нельзя**: заявленные метрики измеряли дефолтные эмбеддинги ChromaDB, «contradiction detection» в коде отсутствует. Generic agent-memory (Letta/Mem0/Zep/LangMem) — про чат-память о пользователе; при честной методологии их бьёт ванильный RAG (Mem0: full-context точнее по первоисточнику; Zep 84%→58% в исправленной репродукции). Вендор-числа как доказательство для глоссария не использовать. Банк памяти пишем сами.
- Хранилище: **SQLite (один файл на книгу) + FTS5** (FTS5 — НЕ в горячем пути: unicode61 не сегментирует CJK → молча вернёт ничего). Драйвер — modernc.org/sqlite. **sqlite-vec в MVP не используется — но причина в том, что держим modernc единым драйвером и избегаем WASM-миграции, НЕ «pure-Go не может»** (правка формулировки: CGO-free sqlite-vec существует через ncruces/go-sqlite3 WASM). Brute-force KNN подтверждён эмпирически: <20 мс на 100k×1024-d на порядки внутри нужд одной книги. Эмбеддинги **второй эшелон, Фаза 2, low-trust** (см. ниже).
- **Горячий путь детерминированный multi-pattern матч** (Aho-Corasick / double-array trie по `src`+алиасам над нормализованным чанком; ru/en по леммам/`decl`), НЕ FTS5, НЕ эмбеддинги. Эмпирика сессии: точный многосимвольный подстрочный матч **precision 1.0, 0/4 ложных срабатываний на омографах-ловушках** (送灶///); char-BM25/фаззи все 4 в top-5. Значит одиночные Han/кана как ключ запрет схемы, longest-match, замена целой сущности.
- Спецификация модуля = **SillyTavern World Info / NovelAI lorebook** + иерархические резюме. **DelTA (2410.08143, ICLR 2025) валидирует концепт многоуровневой памяти, но НЕ нашу ставку:** её память LLM-в-цикле per-предложение, а не детерминированный no-LLM горячий путь; LTCR-1 = самосогласованность (не корректность); нет zh/jaru. Её Proper-Noun-Records (first-wins-без-обновления) сам порождает stale/contradiction/drift наивно нельзя. **Наш детерминированный горячий путь академически нов → гейтится in-house eval (ниже).**
- Схема записи глоссария (D7 v1 + добавления реестра): `src, dst, type, aliases (граф с типами), gender (+hidden until_ch), speech, decl, since_ch/until_ch, status, note, translit_policy` **+ новое из валидации: `sense`** (полисемия/омографы), **ось «редакционное время»** отдельно от спойлер-окна (против DelTA first-wins-навсегда), констрейнты `UNIQUE(src,sense,window)` + обратная проверка dst-коллизий, `min_key_len` per-язык + запрет одиночных ключей, **артефакт нормализации** (NFKC + OpenCC упрощ./трад. + kana-folding + ruby-захват симметрично к ключам и тексту; «самый вероятный баг тихо-пусто»). `decl` **safety-механизм грамматичности** (не фича рынка): без него форс формы в косвенный падеж ломает согласование.
- Инъекция **селективная детерминированная** (v1: ключи/алиасы/леммы + sticky, ~100800 токенов). **Принцип «лучше ничего, чем мусор»**: пустой матч норма, не тревога; бюджет допустимо недозаполнить; фильтр по точности ПЕРЕД приоритетом. Реальная тихая деградация не пустота, а **ошибочная инъекция** (модель послушно следует неверной строке, уверенность точность↓) **трёхстороннее решение на каждую запись** (CONFIRMED / AMBIGUOUS+обязательный post-check / REJECT+лог) + per-chunk `retrieval-state` запись (наблюдаемость с первого дня).
- Трёхслойная защита (GalTransl): pre-replace нормализация (только на источнике) мягкий глоссарий в промпте **обязательный post-CHECK** (не опциональный флаггер: soft молча теряет 1736% терминов). **Слепой post-replace форм в русский выход — ЗАПРЕТ** (ломает согласование); форс только при инвариантном термине или полном `decl` с разрешимым падежом, иначе флаг. Спойлер-окно `since_ch/until_ch` **safety-гейт с жёстким reject+лог**, не UX-фича.
- Series bible first-class; series-bible-lite (gender + ты/вы-журнал событий) в MVP.
- Эмбеддинги (Фаза 2): **дефолт bge-m3** (R@5 0.974), challenger **Qwen3-Embedding-0.6B** (переключать только если выиграет на своём held-out zh/jaru); **LaBSE — только для Bertalign-выравнивания, НЕ для RAG** (слабейшая, R@5 0.827). **ни одна модель не даёт разделяющего порога** (пересечение распределений) эмбеддинг-слой low-trust, per-книга калибровка, только кандидаты на ревью (флешбеки/редкие термины), не тихая инъекция.
- **Резюме (иерархическая память) первоклассный пробел:** у резюме нет post-check-аналога, галлюцинация факта компаундится по 1000 глав отдельный гейт фактичности резюме (Фаза 2, реестр D1).
- **Ставка на банк памяти НЕ морозить до in-house eval:** WMT25-трёхрежимный протокол (no / correct / **random** terminology) на реальных zh/jaru + **baseline «банк vs длинный контекст» frontier-модели** (DelTA этого не делала) + предзарегистрированные acceptance-пороги. Eval идёт параллельно реализации схемы (схема low-regret при «long-context победил» флипается только режим инъекции `selective→full`, а не схема; post-check-гейт нужен в любом случае).
- Экспорт/импорт TMX/TBX + tab-глоссарии OmegaT.
## Р4. Модельный стек и контент-роутинг. **Принято (стартовый состав) / цены и составы — в конфиге**
Из [04](../research/04-api-providers.md), [09](../research/09-cost-model.md), [11-gap-1](../research/11-gap-1.md), [11-gap-2](../research/11-gap-2.md) (актуально на 2026-07-04, пересматривать ежеквартально):
> **Решение владельца (04.07): удалён только Anthropic — за ДОРОГОВИЗНУ** (git `c7f8a95`, `85f24fb`), не за недоступность: флагманы Claude в любом контуре съедают маржу per-book (Р5), а роль судьи закрывает Gemini. Нативный Anthropic-адаптер в коде помечен DEPRECATED (не удалён — референс для нативного Gemini-адаптера). **OpenAI остаётся** (у владельца есть ключ). Живой набор ключей у бэкенда и полигона (04.07): `DEEPSEEK_API_KEY`, `ZAI_API_KEY`, `KIMI_API_KEY`, `OPENAI_API_KEY`, `GEMINI_API_KEY`, `XAI_API_KEY` — то есть Gemini (судья/апекс) и xAI (канал B) доступны сразу, а не «в Фазе 2» (нативные адаптеры для safety-контроля судьи — всё ещё Фаза 2, но OpenAI-совместимый слой работает уже сейчас). Эскалационные развязки — см. [05-decisions-log.md](05-decisions-log.md) D3.
| Роль | Основная модель | Альтернативы/эскалация |
|---|---|---|
| Черновик | DeepSeek V4 Flash ($0.14/$0.28; cache-hit input $0.0028; лучший zh-токенизатор) | GPT-5 nano ($0.05/$0.40), Qwen-Flash. эксп.04: DeepSeek «эхал» оригинал на высоко-CJK фрагменте (82% CJK, 3/3) тихий отказ = оригинал вместо перевода; ловит CJK-гейт + фолбэк-черновик |
| **Редактор (ru-стиль) — эмпирический дефолт (эксп.04)** | **grok-4.3** (слепой бейк-офф, 2 фронтир-судьи: ранг-1 верность, ранг-2 стиль, самый дешёвый+быстрый ~13с без reasoning) | премиум-эскалация **gemini-3.1-pro-preview** (лучшая проза, дорогая/медленная, иногда дописывает). GLM/Kimi сняты с дефолта (GLM-4.6 слабейший перемерить при GLM-5; Kimi худший value: ~11k reasoning-ток./абзац). *Провизорно: LLM-судьи на коротких фрагментах; финал — человеческий пилот Ф2.5* |
| Эскалация канал A (по сигналу гейта) | DeepSeek V4 Pro GLM-5.1 gemini-3.1-pro-preview (апекс) | нативный Gemini-адаптер для safety-судьи Ф2 |
| Судья | Gemini 3.1 Pro (для явного safety-контроля нативный API, Ф2) | GPT-5 mini second-opinion судья чужого семейства; **Grok 4.3 — судья 18+** (не отказывается оценивать explicit, в отличие от Gemini/Claude); локальный POLLUX-judge-7B бесплатный гейт |
| Эмбеддинги/скрининг/экстракция терминов | локально: bge-m3, Qwen3.5-9B | Qwen3-Embedding-0.6B |
| 18+ (канал B) | **Grok 4.3** ($1.25/$2.50 средний тир, самый пермиссивный крупный API) + DeepSeek офиц. + локальная abliterated Qwen3.5 | open-weights через OpenRouter (Chutes/Venice). Grok 4.1 Fast (дешёвый тир) retired 15.05.2026 слаги редиректят на grok-4.3; сам xAI НЕ выведен. reasoning xAI **аддитивный** канал B с thinking OFF (EstimateUSD не резервирует reasoning). Промо xAI $150 за data-sharing брать на выделенный NSFW/eval-аккаунт (PD/тест-корпус), НЕ на продакшн клиентских книг |
Контент-роутинг ([11-gap-2](../research/11-gap-2.md)):
- Локальный классификатор «горячести» 03. Уровни 01 канал A. Уровень 2 канал B (пермиссивный). Уровень 3 (несовершеннолетние в сексуальном контексте) **жёсткий отказ на уровне чанка**: чанк не переводится, помечается в отчёте, глава и книга продолжают обрабатываться (ложное срабатывание классификатора не должно убивать многочасовую оплаченную джобу).
- **Эскалация channel-aware**: для чанков канала B дорогая эскалация Grok 4.3 / Gemini (safety off) / крупные open-weights; канал A DeepSeek V4 Pro / GLM-5.1 / Gemini 3.1 Pro. Anthropic из роутинга исключён (дорого); OpenAI остаётся, но **в канал B не включать** (политика 18+ строгая, adult mode заморожен как и раньше). При подключении failover (Фаза 2) пара primary/fallback канала B только пермиссивные провайдеры (xAI/DeepSeek/local/open-weights) или fail loudly (иначе пустой ответ local-abliterated молча уйдёт в непермиссивную облачную ногу дыра D3 ревью бэкенда).
- Гигиена аккаунтов xAI (Grok теперь центральная модель дефолт-редактор SFW + канал B + судья 18+): **три раздельных использования одного провайдера** (1) промо/data-sharing аккаунт только под eval и NSFW-тесты (PD/тест-корпус); (2) продакшн-редактор SFW **чистый аккаунт без data-sharing** (реальные/конфиденциальные книги через data-sharing нельзя, research/08); (3) NSFW-продакшн отдельный биллинг. Концентрация ролей на xAI риск: провайдер лёг редактор-роль паузаresume (D4, не сайлент-своп). Reasoning xAI аддитивный, но дефолт-редактор работает с thinking OFF ЯВНЫЙ `reasoning_effort:none` (дефолт grok = `low`, не off; xAI docs 05.07) reasoning=0, ledger чист; think-ON на Grok только после reasoning-буфера в EstimateUSD (D6.2).
- Обязателен **детектор молчаливых вырезаний** (сверка покрытия предложений входвыход) Qwen-подобные внешние фильтры молча портят перевод.
- Внутренний refusal/excision-бенчмарк (50100 фрагментов), прогонять при каждой смене версии модели.
- Для политически чувствительных zh-текстов не полагаться на китайские API (цензура в весах), фолбэк на западные/локальные.
Локальная GPU (8GB) **«спецслужба», не переводчик** ([06](../research/06-local-models.md)): роли NSFW-скрининг и перевод флагованных фрагментов (abliterated), эмбеддинги, экстракция кандидатов в глоссарий, дешёвый судья-гейт. Рантайм llama-server (llama.cpp) как ещё один OpenAI-совместимый «провайдер» за фейловером из vojo; для качества Qwen3.6-35B-A3B через MoE-офлоад (~2530 tok/s).
## Р5. Экономика вызовов: один контур (прямые ключи, EU-SaaS), caching-first, премиум-бюджет. **Принято**
Из [09](../research/09-cost-model.md) + токен-калибровка [experiments/01](../experiments/01-token-calibration.md) + критика эконом-ревью.
> **КОРРЕКЦИЯ ВЛАДЕЛЬЦА (04.07, фундаментальная): один контур — прямые ключи.** Владелец **не в РФ**; бэкенд на **EU-сервере**, все вызовы моделей идут оттуда с прямыми ключами провайдеров; продукт — **обычный SaaS** (владелец платит за токены, клиент — за сервис). **BYOK не делается — ни сейчас, ни в планах.** Прежняя модель «три контура (прямые/RU-агрегаторы/BYOK)» **отменена**: аггрегаторская наценка ×26, неопределённость проброса cache/batch и вся RU-платёжная обвязка (Р8/Р9) — неприменимы. Валидным остаётся **ru как язык перевода** (рынок ru-читателей), меняется только доставка. Плюс: цифры токен-калибровки (exp01) и весь прайсинг doc 09 теперь **канонические без оговорок про контур**.
COGS (прямые ключи, **актуально — [experiments/08-cost-model-v2.md](../experiments/08-cost-model-v2.md)**, стек с grok-редактором; заменяет exp01-цифры): том ранобэ jaru стандарт **~$0.69**, 500-главная вебновелла zhru стандарт **~$10.94** (скачок от exp01 целиком редактор: grok-выход ×9 против прежнего GLM/DeepSeek). Премиум (селективный apex ~15%): ранобэ ~$1.5, вебновелла ~$25; полный apex вебновеллы ~$82 (rf=1.0) дешевле человеческого якоря $100, но переполняет $30-потолок не дефолт. Маржа против прайсинга (Р9) остаётся высокой (том <$1); удар калибровки по премиум-миксу вебновеллы, отсюда жёсткость правила «дорогая модель адресно». rf (Gemini thinking-as-output) НЕ измерен через OpenAI-compat слой премиум-числа rf-условны до нативного Gemini API.
- **Prompt caching главный рычаг**, и раскладка промпта фиксируется под него (разрешение конфликта Р3Р5 из ревью): **стабильный кэшируемый префикс** = системный промпт роли + book brief + style sheet + резюме книги/арок (меняется редко, раз в главу-арку); **волатильный хвост после кэш-брейкпоинта** = селективный глоссарий + STM + чанк. На стадии edit кэшу ловить почти нечего (уникальный черновик в промпте) ожидаемый cache-hit считать по стадиям, а не «≥50% в среднем». Альтернатива для DeepSeek (cache-hit $0.0028/M): полный глоссарий в стабильном префиксе может оказаться дешевле селективной инъекции по miss-тарифу решить расчётом на прототипе, обе схемы поддержать конфигом.
- **Батчуемость свойство стадии**: Analyst, Terminologist, судья/оценки, книжный QA батчуемы (50%); черновик и редактура чанков последовательны (STM/резюме создают зависимость, DelTA-паттерн). «С batch ≈$2» относится только к батчуемым стадиям. Batch API Фаза 2 (к судье), не Фаза 0.
- **Бюджет премиум-токенов на книгу**: полный проход премиум-моделью (историческая калибровка на Sonnet до его удаления: ~$92 за 500-главную вебновеллу, впритык к якорю GlobeScribe $100; двойной ~$185 ломает экономику) не должен идти сплошняком. Принцип сохраняется для любой премиум-эскалации (Gemini 3.1 Pro): дорогая модель только адресно по сигналу судьи/гейтов, в пределах $-потолка (формула ниже).
- **Формула премиум-бюджета** (уточнение по запросу бэкенд-сессии, заменяет эвристику «≤2×»): в коде конфигурируемый $-потолок на книгу, `premium_budget_usd = clamp(price_target × (1 target_margin) est_base_cogs, 0, hard_cap)`; для локального режима без прайса дефолты под СЕЛЕКТИВНЫЙ apex ([exp08](../experiments/08-cost-model-v2.md)): ранобэ/роман ~$2 (полный apex жив), вебновелла потолок-на-главу или явная `apex_fraction`; полный apex вебновеллы (~$82) дефолтом НЕ ставить (переполняет $30). «≤2× input-объёма» остаётся прикидочной эвристикой в доках, не контрактом кода.
- **Пересчёт COGS завершён — [experiments/08-cost-model-v2.md](../experiments/08-cost-model-v2.md)** (grok-редактор): актуальные цифры выше. Прежние exp01-оценки ($0.17/$2.6/$49) сняты; exp01 остаётся источником множителей токенизации, денежная модель exp08.
- Буфер +25% к расчётному COGS (ретраи, глоссарий-строительство, регенерации). Цены/имена моделей только в конфиге с датой проверки. Миграция deepseek-chat deepseek-v4-flash до 24.07.2026. Для DeepSeek планировщик внепиковых часов (надбавка ×2 в пик; сам планировщик Фаза 3, до тех пор просто не гнать массовые прогоны в пик).
## Р6. Хранилище и оркестрация: SQLite + durable jobs + чанк-чекпоинты. **Принято**
- Локальный режим MVP: SQLite (modernc.org/sqlite, CGO-free, без нативных расширений см. Р3) для проектных данных; отдельный файл БД на книгу для банка памяти. Интерфейс хранилища тонкий миграция на Postgres (pgx уже в vojo) при появлении сервера.
- Оркестрация **durable jobs в БД с resume**; джоба = глава×стадия. **Гранулярность сохранности — чанк, не глава** (правка red-team): каждый сырой ответ LLM персистится сразу после settle (ключ: request-hash), отдельно от смысловой TM; kill -9 посреди главы теряет максимум один незавершённый вызов. Из ключа resume исключаются волатильные части контекста (snapshot контекста фиксируется на джобу до её завершения) иначе любое подтверждение термина инвалидирует TM-хиты уже переведённых чанков. `brief_hash` входит в ключ TM; изменение translation brief посреди книги явная команда с показом стоимости пере-перевода.
- Проверяется тестом: kill -9 в середине главы рестарт доплата только за прерванный вызов.
- **Ключ TM подтверждён** (запрос бэкенд-сессии): консервативный вариант `(chunk_src_hash, lang_pair, model_id, prompt_version, brief_hash, context_snapshot_hash)`; перечанкование инвалидирует TM by design (ключ от src-чанка) это осознанная плата за корректность.
## Р7. Телеметрия и качество. **Принято**
- Деньги: дисциплина vojo целиком биллинг по usage из ответа API (включая reasoning-токены), reserve-before-call/settle-after, потолок $ на книгу/день, request_log per-агент/per-глава/per-стадия, trace_id насквозь.
- Качество онлайн: **CometKiwi** (reference-free, локальная, не умеет отказывать валидировать на 18+ ru-корпусе до доверия) + периодический GEMBA-MQM-подобный LLM-судья; **сырой BLEU/COMET как KPI художественности запрещён** (LitEval: автометрики отличают человеческий перевод максимум в 20% случаев).
- **Не-LLM гейты по фазам**: Фаза 1 (реализуемо в Go без морфологии) детектор CJK-артефактов, глоссарная консистентность, coverage-гейт v1 (счёт предложений регэксп-сегментацией `。!?/.!?`, соотношение длин ±порог, blacklist refusal-паттернов; сам гейт проверяется мини-набором из 2030 фрагментов с искусственно выпиленными предложениями), правило «в TM коммитится только вывод, прошедший все гейты». Фаза 2 (Python-сайдкар) морфодетектор канцелярита по чек-листу Галь (pymorphy/Natasha), MTLD/distinct-n, дисперсия длин, доля пассива, порт BlonDe-подобных дискурсивных проверок на русскую морфологию.
- Метрика глоссарной консистентности с процедурой: знаменатель = вхождения `src`/алиасов в исходных чанках; числитель = наличие леммы `dst` (по полю `decl`) в соответствующем выводе; прономинализация Ли Вэй он») не штрафуется, гейт считает только `approved`-термины; в безлюдном режиме autoapproved автоматом с записью в журнал. **Это post-CHECK и он ОБЯЗАТЕЛЕН** (не опциональный флаггер soft-глоссарий молча теряет 1736% терминов; правка валидации Р3): главный почти-бесплатный детектор тихой деградации, ловит и «модель проигнорировала термин», и «мы инъектили неверное». **Слепой post-replace форм в русский выход — запрещён** (ломает согласование).
- Оффлайн: паттерн routedecide/routereval из vojo **golden-set реплей** решений об эскалации и вердиктов судьи со свипом порогов. Золотой набор приватно из лицензионных изданий; GuoFeng Webnovel V2 только dev (non-commercial, референсы MTPE-качества).
## Р8. Юридическая и продуктовая позиция. **Принято (переориентировано на EU после коррекции контура)**
Из [08-legal.md](../research/08-legal.md) + коррекция контура (Р5: EU-SaaS, прямые ключи, без BYOK).
Остаётся валидным (юрисдикционно-нейтральное):
- **Продаём инструмент, не переводы и не платформу** (Sony/Grokster/Cox; аналогия Trados/Photoshop). Никакого хостинга переведённого контента, UGC, встроенных парсеров пиратских библиотек и кнопок «опубликовать на агрегатор».
- ToS: пользователь гарантирует права на тексты + логика «перевод генерация» (transformation exception). Жёсткий отказ только CSAM-категория. Перевод производное произведение (Бернская конвенция, международно) нарушение только при распространении, не при приватной обработке.
- Фича **«журнал творческого вклада»** доказательство human authorship (охрана постредактированного MT: USCO / EU «own intellectual creation»); аргумент «перевод принадлежит вам».
Изменилось (RU-право EU-право):
- **BYOK/RU-платежи отменены** (Р5): ИП/самозанятость, ЮKassa/СБП, 259-ФЗ (крипта), 152-ФЗ (локализация ru-БД), перепродажа токенов **неприменимо** (бизнес EU-SaaS, не российское юрлицо).
- **Применяется GDPR** (EU-сервер/EU-сущность): минимизация ПДн (email/ID, без ФИО), DPA с провайдерами моделей, право на удаление, zero-retention-режим для конфиденциальных рукописей B2B (не гнать через data-sharing аккаунты см. xAI-промо, Р4). **EU AI Act**: обязанности прозрачности/маркировки AI-выхода (ст. 50) в основном на GPAI-провайдерах, но маркировку AI-перевода заложить.
- 18+: риск концентрируется в **распространении** (в целевом рынке своя возрастная маркировка/законы; для ru-читательской аудитории риски распространения на стороне площадок, не инструмента) помогаем клиенту комплаенсом (маркировка, age-gate-метаданные), но витрину не размещаем. Инструмент EU-based снижает прямую экспозицию к RU-специфике (ст. 242 УК и т.п. на распространителе, не на нас).
## Р9. Прайсинг и сегменты. **Гипотеза до полевой валидации**
Из [01](../research/01-market.md), [11-gap-4](../research/11-gap-4.md), [11-gap-5](../research/11-gap-5.md) + правки эконом-ревью:
- Сегментация SAM честно: **fan-B2C $0,150,7 млн ARR**; вместе с per-book авторами (строка «не проверено») $0,41,5 млн. Fan-B2C **beachhead** (пользователи, данные, соцдоказательство), не основа выручки.
- **Модель монетизации обычный SaaS** (Р5: наши прямые ключи, мы платим за токены, клиент за сервис; BYOK отменён). Платёжные рельсы стандартные для EU-сущности (Stripe/Paddle), валюта $/€. Тарифная сетка (все наши токены, эконом-конфигурация пайплайна для метеред): metered ~$0.030.05/глава или подписка ~$57/мес (длинный хвост); Pro ~$1219/мес (топ-переводчики); Studio $2949 usage-based ИИ-фабрики»); per-book $4999 (авторы/малые издатели).
- **Открытый GTM-вопрос**: как платят клиенты-физлица в РФ (RU-карты не проходят иностранный SaaS). Не блокер архитектуры (владелец подтвердил SaaS-модель) вопрос доставки платежа для ru-in-Russia сегмента; целевой аудиторией могут быть ru-переводчики вне РФ / диаспора / B2B-площадки. Отметить, решить на GTM-этапе.
- **Якоря с двух сторон**: сверху GlobeScribe $100/книга; **снизу booktranslator.ai $6,999,99 за 100k слов (≈$720 за роман, уже с ru-лендингом)**. Дельту оправдываем издательским качеством, отчётом, журналом вклада; в сетке предусмотреть дешёвый per-book «стандарт» ($1525) как ответ на нижний якорь.
- **Центр тяжести выручки MVP+1 B2B/платформенные пилоты** (white-label для Rulate-класса площадок; валидированный путь по gap-5), а не per-book: сегмент авторов-самиздата тянет за собой ruen, которого MVP не делает per-book остаётся гипотезой со сроком валидации после пилота качества.
- Под сегмент «ИИ-фабрик» (38 владельцев на 80 случайных онгоингов Rulate) в план MVP включён **режим онгоинга** (дозагрузка глав в проект с наследованием памяти) и ранний импорт бэк-каталога без них Studio-тариф нечем обслуживать.
- Последовательность: сначала пилот качества (Р2) потом A/B прайсинга против якоря VseGPT (999 ₽/мес + токены прямой конкурент по функции, хоть и BYOK-модели).
- Позиционирование «инструмент переводчика/редактора» (модель Nuanxed), не «замена переводчиков» (PR-бэклэш GlobeScribe). Дифференциация не «первый в ru» (ниша сырого MTL занята: Rulate AI-раздел 14,4 тыс. работ, MLate, VseGPT), а издательское качество + память серии + 18+.
## Р10. Главные риски (мониторить)
1. **Судья — бутылочное горлышко**: ставка generate-then-select зависит от качества судьи (порог s* из arXiv:2603.20324); LLM-судьи расходятся с живыми читателями (LAIT; человеческая валидация режет LLM-judge win rates на 5367%). Митигция: пилот Р2, пара судей, человеческий pairwise в golden-set.
2. **Смена контент-политик провайдеров** (GLM-4.64.7, заморозка OpenAI adult mode): refusal-бенчмарк на каждую смену версии, мультипровайдерность by design.
3. **Западные сервисы добавят ru-таргет** (booktranslator.ai уже имеет ru-лендинг и демпингует): окно не первенство, а глубина (память серии, редакционная петля).
4. **Приём платежей от ru-in-Russia клиентов** (RU-карты не проходят EU-SaaS): открытый GTM-вопрос (Р9), не архитектурный целевая аудитория может быть ru-переводчики вне РФ / диаспора / B2B; решить на GTM-этапе.
5. **Волатильность цен API**: конфиг с датами, ежеквартальный пересмотр, буфер +25%.
6. **Концентрация ролей на xAI/Grok** (редактор + канал B + судья 18+): провайдер лёг пауза/resume (D4); мониторить, при риске держать валидированную замену редактора (gemini как премиум уже есть).