# Архитектурные решения (v2, 2026-07-04)

> **⚠ Шапка-указатель (ревизия D31, 12.07).** Принципы Р1–Р10 живы, но конкретика моделей/цен в этом доке — состояние 04–05.07 и **проигрывает D-логу**: редактор теперь БИЛИНГВ, grok reasoning-off из редакторских ролей снят, кандидат glm-5-билингв (D30.1); черновик DeepSeek — интерим до бейк-оффа exp13 (D30.6); канал B: переводчик-дефолт Mistral + grok-ON эскалация (D14.1/D19.1), Gemini-судья fail-closed на эротике (D22.6); ключ xAI един, с data-sharing (D27); COGS ~$0.85/ранобэ после флипа D1 (D30.4); кэш ≈2% стоимости, НЕ главный рычаг (exp08). Точечные пометки — по тексту.

Синтез по итогам исследований `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` прямо переносится ~2–2,5 тыс. строк проверенной инфраструктуры: OpenAI-совместимый транспорт с retry/backoff, фейловер «локальная GPU → облако» с circuit breaker, прайсинг + reserve/settle-ledger, телеметрия (request_log, трейсы W3C), fail-fast конфиг. Это 3–6 недель сэкономленной разработки.
- 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-токенов (недоучёт до 30–44% расходов).

## Р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 рук: ~25–35 глав zh/ja/en→ru; решающий критерий — человеческие попарные сравнения (протокол LAIT; для двух систем это pairwise, не BWS — BWS только с ≥3 объектами, третьим якорем берём человеческий перевод) + панель LLM-судей чужих семейств. Правило: если C2/C3 лучше C1 менее чем на 5 п.п. win rate — берём C1 (в 2–3 раза дешевле). Бюджет: <$50 API + внешние редакторы 20–40 ч; **elapsed 2–3 недели, отдельная фаза** (см. план 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/ja→ru. Её 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, ~100–800 токенов). **Принцип «лучше ничего, чем мусор»**: пустой матч — норма, не тревога; бюджет допустимо недозаполнить; фильтр по точности ПЕРЕД приоритетом. Реальная тихая деградация — не пустота, а **ошибочная инъекция** (модель послушно следует неверной строке, уверенность↑ точность↓) → **трёхстороннее решение на каждую запись** (CONFIRMED / AMBIGUOUS+обязательный post-check / REJECT+лог) + per-chunk `retrieval-state` запись (наблюдаемость с первого дня).
- Трёхслойная защита (GalTransl): pre-replace нормализация (только на источнике) → мягкий глоссарий в промпте → **обязательный post-CHECK** (не опциональный флаггер: soft молча теряет 17–36% терминов). **Слепой 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/ja→ru); **LaBSE — только для Bertalign-выравнивания, НЕ для RAG** (слабейшая, R@5 0.827). ⚠ **ни одна модель не даёт разделяющего порога** (пересечение распределений) → эмбеддинг-слой low-trust, per-книга калибровка, только кандидаты на ревью (флешбеки/редкие термины), не тихая инъекция.
- **Резюме (иерархическая память) — первоклассный пробел:** у резюме нет post-check-аналога, галлюцинация факта компаундится по 1000 глав → отдельный гейт фактичности резюме (Фаза 2, реестр D1).
- **Ставка на банк памяти НЕ морозить до in-house eval:** WMT25-трёхрежимный протокол (no / correct / **random** terminology) на реальных zh/ja→ru + **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)** *(→ superseded D30.1: редактор БИЛИНГВ, grok-off снят как no-op, кандидат glm-5-билингв; ревизия D31)* | **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) *(→ superseded D14.1/D19.1: переводчик-дефолт Mistral; DeepSeek в explicit запрещён ToS; эскалация grok reasoning-ON; ревизия D31)* | **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)):
- Локальный классификатор «горячести» 0–3. Уровни 0–1 → канал 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-бенчмарк (50–100 фрагментов), прогонять при каждой смене версии модели.
- Для политически чувствительных zh-текстов — не полагаться на китайские API (цензура в весах), фолбэк на западные/локальные.

Локальная GPU (8GB) — **«спецслужба», не переводчик** ([06](../research/06-local-models.md)): роли — NSFW-скрининг и перевод флагованных фрагментов (abliterated), эмбеддинги, экстракция кандидатов в глоссарий, дешёвый судья-гейт. Рантайм — llama-server (llama.cpp) как ещё один OpenAI-совместимый «провайдер» за фейловером из vojo; для качества — Qwen3.6-35B-A3B через MoE-офлоад (~25–30 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)» **отменена**: аггрегаторская наценка ×2–6, неопределённость проброса 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-цифры): том ранобэ ja→ru стандарт **~$0.69**, 500-главная вебновелла zh→ru стандарт **~$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 — главный рычаг** *(→ опровергнуто exp08: кэш ≈2% стоимости; ревизия D31)*, и раскладка промпта фиксируется под него (разрешение конфликта Р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-паттернов; сам гейт проверяется мини-набором из 20–30 фрагментов с искусственно выпиленными предложениями), правило «в TM коммитится только вывод, прошедший все гейты». Фаза 2 (Python-сайдкар) — морфодетектор канцелярита по чек-листу Галь (pymorphy/Natasha), MTLD/distinct-n, дисперсия длин, доля пассива, порт BlonDe-подобных дискурсивных проверок на русскую морфологию.
- Метрика глоссарной консистентности — с процедурой: знаменатель = вхождения `src`/алиасов в исходных чанках; числитель = наличие леммы `dst` (по полю `decl`) в соответствующем выводе; прономинализация («Ли Вэй → он») не штрафуется, гейт считает только `approved`-термины; в безлюдном режиме auto→approved автоматом с записью в журнал. **Это post-CHECK и он ОБЯЗАТЕЛЕН** (не опциональный флаггер — soft-глоссарий молча теряет 17–36% терминов; правка валидации Р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,15–0,7 млн ARR**; вместе с per-book авторами (строка «не проверено») — $0,4–1,5 млн. Fan-B2C — **beachhead** (пользователи, данные, соцдоказательство), не основа выручки.
- **Модель монетизации — обычный SaaS** (Р5: наши прямые ключи, мы платим за токены, клиент — за сервис; BYOK отменён). Платёжные рельсы — стандартные для EU-сущности (Stripe/Paddle), валюта $/€. Тарифная сетка (все — наши токены, эконом-конфигурация пайплайна для метеред): metered ~$0.03–0.05/глава или подписка ~$5–7/мес (длинный хвост); Pro ~$12–19/мес (топ-переводчики); Studio $29–49 usage-based («ИИ-фабрики»); per-book $49–99 (авторы/малые издатели).
- **Открытый GTM-вопрос**: как платят клиенты-физлица в РФ (RU-карты не проходят иностранный SaaS). Не блокер архитектуры (владелец подтвердил SaaS-модель) — вопрос доставки платежа для ru-in-Russia сегмента; целевой аудиторией могут быть ru-переводчики вне РФ / диаспора / B2B-площадки. Отметить, решить на GTM-этапе.
- **Якоря с двух сторон**: сверху GlobeScribe $100/книга; **снизу booktranslator.ai $6,99–9,99 за 100k слов (≈$7–20 за роман, уже с ru-лендингом)**. Дельту оправдываем издательским качеством, отчётом, журналом вклада; в сетке предусмотреть дешёвый per-book «стандарт» ($15–25) как ответ на нижний якорь.
- **Центр тяжести выручки MVP+1 — B2B/платформенные пилоты** (white-label для Rulate-класса площадок; валидированный путь по gap-5), а не per-book: сегмент авторов-самиздата тянет за собой ru→en, которого 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 на 53–67%). Митигция: пилот Р2, пара судей, человеческий pairwise в golden-set.
2. **Смена контент-политик провайдеров** (GLM-4.6→4.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 как премиум уже есть).
