57 KiB
Журнал прогресса
2026-07-04 — Старт проекта (MVP-сессия)
- Прочитан стартовый бриф
START_PROMT.MD(37 пунктов идей). - Осмотрена кодовая база
/home/ubuntu/projects/vojo/apps/ai-bot: Go-сервис с адаптерами LLM-провайдеров (gemini, xai, local), роутером, каскадом, фейловером, прайсингом и телеметрией — кандидат на переиспользование. - Запущен мультиагентный исследовательский воркфлоу (10 направлений параллельно + критик полноты + добор пробелов):
- Рынок и спрос →
research/01-market.md - Конкуренты и существующие решения →
research/02-competitors.md - Научные работы по agentic/document-level MT →
research/03-academic-agentic-mt.md - LLM API: цены/качество/цензура →
research/04-api-providers.md - Память и глоссарий (банк памяти книги) →
research/05-memory-glossary.md - Локальные модели на 8GB VRAM →
research/06-local-models.md - Методология профессионального худ. перевода →
research/07-translation-methodology.md - Юридические аспекты →
research/08-legal.md - Модель стоимости перевода книги →
research/09-cost-model.md - Ревью vojo/ai-bot на переиспользование →
research/10-vojo-ai-bot-review.md
- Добор пробелов от критика →
research/11-gap-*.md
- Рынок и спрос →
Исследования завершены (04.07, ~2 млн токенов, 16 агентов)
Все 15 документов в research/. Ключевые развязки:
- Статья «про судью-селектора, март 2026» найдена: arXiv:2603.20324 «When Agents Disagree» — но перевода среди её задач нет; на zh→ru/ja→ru нужен собственный пилот (см.
research/11-gap-3.md). - MemPalace существует, но форкать нельзя (метрики не подтверждаются) — банк памяти пишем сами: SQLite + спека SillyTavern World Info + память DelTA.
- «Ru-нишу никто не обслуживает» — опровергнуто: Rulate AI-раздел 14,4 тыс. работ, MLate, VseGPT «Нейропереводчик» 999 ₽/мес. Дифференциация — издательское качество, память серии, 18+.
- Экономика сходится: COGS тома ранобэ ~$2–4 при марже 70–96%; главные рычаги — prompt caching (до −98% input) и Batch API (−50%).
- OpenAI adult mode заморожен бессрочно — NSFW-канал: Grok / open-weights / DeepSeek / локальная abliterated. Anthropic — только «стерильные» роли.
- RU-сегмент: BYOK-модель (агрегаторы ProxyAPI/VseGPT/AITunnel или прямой DeepSeek), не перепродавать западные токены.
Синтез (04.07)
architecture/01-decisions.md— 10 решений (Р1 Go-бэкенд на базе vojo/ai-bot; Р2 конфигурируемое ядро пайплайна + пилот 4 рук; Р3 банк памяти на SQLite; Р4 модельный стек и NSFW-роутинг; Р5 экономика вызовов; Р6 durable jobs; Р7 телеметрия/качество; Р8 юр-позиция «инструмент, не платформа»; Р9 прайсинг-гипотеза; Р10 риски).architecture/02-mvp-plan.md— фазы 0–3 с критериями приёмки.architecture/components.puml+pipeline.puml(+ отрендеренные .svg) — провалидированы PlantUML.PARALLEL_SESSION_PROMPT.md— промт для второй сессии («Полигон»: токен-замеры, refusal-бенчмарк, локальный стенд, пилотный корпус, эмбеддинги).- Проведено адверсариальное ревью синтеза тремя критиками (техархитектура, экономика, red-team): 2 critical + ~15 major находок, все внесены в v2 документов. Главные исправления:
- экономика разделена на контуры «чей ключ» (прямые ключи / ru-агрегаторы ×2–6 на флагманы / BYOK) — премиум-микс с Sonnet в ru-контуре недоступен;
- разрешён конфликт «кэшируемый префикс vs селективный глоссарий» (зафиксирована раскладка промпта) и «modernc.org/sqlite vs sqlite-vec» (в MVP — brute-force KNN, без C-расширений);
- Фаза 1 получила интерим-правило 18+ (SFW-приёмка, исключение Anthropic при 18+ в brief) — до этого 18+ книги шли бы через Anthropic до появления NSFW-роутера;
- resume пересобран на чанк-чекпоинты (kill -9 теряет максимум один вызов);
- пилот вынесен в отдельную Фазу 2.5, горизонт MVP честно сдвинут до 10–11 недель;
- baseline метрики качества заменён с «сырой DeepSeek» на «DeepSeek+глоссарий» (уровень VseGPT), порог — статистический;
- в план добавлены режим онгоинга и series-bible-lite (сегмент «ИИ-фабрик» и проверка рода/ты-вы).
Следующие шаги
- Фаза 0–1 бэкенда — передана отдельной сессии «Бэкенд» (промт:
BACKEND_SESSION_PROMPT.md; шаг 0 — перевалидация решений, финал фаз — агентное селфревью). Оркестратор делает внешнее ревью её кода. - Параллельная сессия «Полигон» запущена (эксперименты 01–03 идут).
- Сессия «Редакция» (промпты ролей) — после фиксации формата конфига в Фазе 0.
- Пилот 4 рук для выбора ядра пайплайна (Фаза 2.5).
- Роли сессий: «Бэкенд» →
backend/; «Полигон» →eval/+docs/experiments/; оркестратор → доки, ревью, синхронизация, дозаправки ресёрча. - Дозаправка ресёрча выполнена (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-04 — Сессия 1: шаг 0 (перевалидация) завершён
- Донорский код vojo сверен построчно + воркфлоу из 4 критиков (консистентность, Go-исполнимость, донор, онлайн-фактчек цен). Вердикт: архитектура v2 исполнима, кодить можно; блокеров нет. Полный вердикт и контракты Фазы 0 → architecture/03-implementation-notes.md.
- Главные находки валидации (упущения передачи): в
Usageдонора нет cache-write Anthropic (×1.25/×2 — тот же класс ошибки, что недоучёт reasoning 30–44%); в транспорте донора скрытый захардкоженный per-attempt таймаут 60 с (полигон видел только 45 с ноги failover);http.Client{}донора уйдёт в webshare-прокси на не-loopback локальных адресах (172.x); Grok 4.1 Fast retired 15.05.2026 — слаги молча редиректят на grok-4.3 с ценой ×9, таблица Р4 устарела; store.go на SQLite — переписывание по семантике, не «адаптация <20%». - Окружение: git-репо инициализирован, Go 1.26.4 установлен (~/sdk/go, PATH в .bashrc).
[НУЖНО РЕШЕНИЕ] (детали в 03-implementation-notes §5):
- Формула премиум-бюджета Р5 «≤2×» после токен-калибровки неоднозначна — реализую конфигурируемый $-потолок, формулу уточнить.
- Политика инвалидации TM сверх brief_hash (prompt_version в ключе? модель? перечанкование?) — реализую консервативный вариант, нужно подтверждение.
- Канал B остался без дешёвого Grok (4.1 Fast retired, grok-4.3 дороже ×9) — перевыбрать модель канала B к Фазе 2.
- Стриминг: эмпирика полигона требует его как keep-alive транспорта (не SSE-фронт) — предлагаю перенести из Фазы 3 в Фазу 1–2; в Фазе 0 закрываю длинными таймаутами.
- Оркестратору, не блокирует: цифры Р5 устарели ~2× против эксп. 01; задача «cache-hit агрегаторов» задвоена (Фаза 0 бэкенда ↔ бэклог полигона — предлагаю отдать полигону); мелкие фазовые пометки в диаграммах.
Вопросы владельцу: ключи провайдеров для backend/.env (DeepSeek минимум — на нём приёмка Фазы 0 с реальным вызовом; Anthropic — для проверки cache_control). Не блокируюсь: тесты на httptest-моках.
Ответ оркестратора на [НУЖНО РЕШЕНИЕ] (04.07). Отличный шаг 0 — фактчек Grok и cache-write Anthropic особенно ценны. Решения:
- Премиум-бюджет: подтверждаю $-потолок; формула зафиксирована в Р5 (
clamp(price_target × (1 − target_margin) − est_base_cogs, 0, hard_cap), дефолты $5/том, $30/вебновелла-500). «≤2×» — только прикидочная эвристика доков.- TM-инвалидация: консервативный ключ подтверждён и зафиксирован в Р6:
(chunk_src_hash, lang_pair, model_id, prompt_version, brief_hash, context_snapshot_hash); перечанкование инвалидирует by design.- Канал B: Р4 обновлён — интерим до Фазы 2: DeepSeek офиц. + локальная abliterated; Grok 4.3 только как дорогая эскалация; перевыбор дешёвого пермиссивного тира — по результатам refusal-бенчмарка полигона.
- Стриминг: перенос одобрен — транспортный keep-alive-стриминг в Фазу 1–2 (без SSE-фронта), зафиксировано в плане; в Фазе 0 — длинные per-роль таймауты.
- Р5 обновлён сноской на токен-калибровку (×1.4–1.75 для zh→ru); задача «cache-hit агрегаторов» снята с Фазы 0 — она в бэклоге полигона. Новая вводная: готова карта режимов отказа architecture/04-unhappy-paths.md (~70 режимов → механизмы). Перед фиксацией схемы store/глоссария Фазы 1 прочитай раздел «Следствия для плана»: расширение полей глоссария (alias-граф, ranked-set, gender=hidden, first_person, translit_policy), ruby-парсер в спеку импорта, дешёвые детерминированные гейты Фазы 1 (линтер прямой речи, блок-лист транслит-междометий, ёфикатор, число-гейт 万/億), словарь тегов ошибок с MQM-весами в request_log с первого дня. Пороги coverage-гейта уже сняты полигоном (см. его секцию, эксперимент 02).
2026-07-04 — Сессия 2: Фаза 0 (каркас) ЗАВЕРШЕНА
Каркас backend/ собран, приёмка Фазы 0 продемонстрирована исполняемо: tmctl translate --config book.yaml
гоняет чанк draft→edit с полным учётом $ по стадиям в request_log; повторный запуск обслуживается из
чекпоинтов за $0 (ledger неизменен); kill -9-тест настоящим SIGKILL подтверждает инвариант
committed == SUM(checkpoints) (деньги ≡ чекпоинты). go test ./..., go vet, -race — зелёные.
- Порт vojo → internal/llm|ledger|obs: нейтральные типы (+
CacheCreationTokens,CacheBoundary,FinishReason); общий OpenAI-совместимый транспорт (таймауты-параметры per-провайдер, Retry-After с капом, overflow-safe backoff, LimitReader, оба варианта cache-полей DeepSeek); нативный Anthropic-адаптер (Messages API,cache_control, суммирование usage-инварианта, sampling не шлётся); local-адаптер с no-proxy транспортом (грабли стенда 172.x); failover с анти-flapping брейкером; ledger с cache-write иPriceForResponse. - internal/store (SQLite, modernc, CGO-free): идемпотентные миграции; reserve/settle с потолками книга/день; settle+checkpoint одной транзакцией (закрыта дыра двойной оплаты); flock-владение проектным файлом; recovery зависших резервов; request_log.
- internal/config (fail-fast): models.yaml (цены с датой проверки,
CheckKeyspreflight), pipeline C1+C2 (граница «конфиг vs код» Р2,CheckRunnableguard на механику Фазы 2), book.yaml + brief_hash. - internal/pipeline: детерминированный однопроходный рендер (инвариант §3.1), request-hash (length-prefix,
attempt-измерение), snapshot-pinning с
--resnapshot, нормализация источника (BOM/CRLF/NFC), мини-раннер draft→edit с resume; cmd/tmctl (translate/report); черновики промптов ролей. - Финал — агентное селфревью:
/code-review(8 линз) + воркфлоу-критики (4 линзы задания) с адверсариальной верификацией; подтверждённые находки исправлены двумя волнами (детали и остаточный техдолг — 03-implementation-notes §6). Коммиты:dc6ea8eкаркас →a32ec2eволна 1 → волна 2.
Учтено из ответа оркестратора: ключ TM (chunk_src_hash, lang_pair, model_id, prompt_version, brief_hash, context_snapshot_hash) — совпадает с составом моего snapshot-payload (prompt_version+model+PromptSHA256 per-role,
brief_hash, chunker/estimator version); перечанкование инвалидирует by design (chunkerVersion в snapshot).
Карту 04-unhappy-paths заберу в схему store/глоссария при старте Фазы 1.
Остаток техдолга Фазы 0 (осознанные ограничения, не блокеры; детали §6): дневной потолок пер-книжный;
timeout-путь «оплачено-но-потеряно» (≤1 вызов, укладывается в Р6); cache_ttl↔cache_write под один TTL (5m);
гонка Runner.clients (безопасна при последовательном проходе, мьютекс — к fan-out Фазы 1–2).
Ключи: бэкенд заводится на ДВУХ ключах (DEEPSEEK_API_KEY + ZAI_API_KEY) — по замечанию владельца сузил
CheckKeys: модели стадий проверяются всегда, модели эскалационных цепочек — только если включён хоть один гейт
(эскалация запускается по провалу гейта; в Фазе 0 гейты off → цепочки недостижимы → ключи Anthropic/Kimi не
нужны). Проверено на боевых конфигах: с 2 ключами прогон доходит до сетевого вызова DeepSeek. .env.example
размечен «нужны сейчас / Фаза 1+ опционально». Anthropic/Kimi для Фазы 0 не требуются.
Вопросы от бэкенда — сессии «Полигон» и оркестратору (04.07)
Владелец резонно заметил: бэкенд не должен коммититься в модели, которых полигон не гонял. Прежде чем в Фазе 1 включать эскалацию и фиксировать редактора-дефолт, нужны замеры:
- Полигону — Anthropic на «стерильном» канале (SFW). Sonnet 5 как SFW-эскалация/судья не валидирован: в refusal-бенчмарке Anthropic исключён намеренно (гигиена NSFW-аккаунта, gap-2 §3), но сам эксп. 02 отметил «уровень L0–L1 можно добавить отдельным конфигом для проверки стерильного канала». Можно ли прогнать Sonnet-5 (промо $2/$10) на чистых SFW-фрагментах — качество ru-редактуры/суждения — чтобы знать, окупает ли он цену как эскалация? Если не приоритет — бэкенд держит Anthropic вне дефолтной цепочки и берёт валидированную дешёвую модель.
- Полигону — качество редактора ru-стиля. Эксп. 02 мерил роль ЧЕРНОВИКА (отказы/вырезания), но не роль РЕДАКТОРА. Дефолт C1 — GLM-5 на редактуре — стоит на утверждении Р4, без замера. Планируется ли маленькое сравнение GLM-5 vs Kimi-K2.6 (vs Sonnet-5, если будет ключ) по ru-редактуре на нескольких SFW-фрагментах? От этого зависит дефолт редактора Фазы 1.
- Оркестратору — эскалационный дефолт в RU-контуре. Оставить Anthropic Sonnet дефолтом эскалации или в RU-контуре взять GLM-5.1/Gemini (Sonnet — только прямой контур, где per-book-премиум оправдан)? Это правка Р4/экономики; бэкенд — только исполнитель конфига.
- Оркестратору — per-role provider-fallback? Для batch-джобы (не live-бот) провайдер-недоступность
естественно закрывается durable jobs + чекпоинтами (лёг → пауза → resume без переоплаты), поэтому
мгновенный fallback на другого провайдера — nice-to-have, не блокер. Добавлять ли простой список фоллбеков
на роль (
draft: [deepseek, glm]) для длинных ночных прогонов, или полагаться на pause/resume? Решение — за оркестратором (владеет Р4/экономикой).
Не блокирует Фазу 0 (принята на DeepSeek+Z.ai); ответы нужны к старту Фазы 1 (эскалация, дефолты ролей).
Внешнее ревью Фазы 0 — принято (04.07)
Независимая сессия провела построчное ревью backend/ + исполняемую приёмку + адверсариальный воркфлоу.
Вердикт: Фаза 0 принята, блокеров ноль. Детали и диспозиция находок — 03-implementation-notes §6.
Кратко: F1 (CheckKeys) уже был закрыт до ревью; F2/F5/F7/F8 исправлены этой волной (local-оверрайды в snapshot;
fail-loud на включённый гейт в Фазе 0; поправка §3.4 под подтверждённый ключ TM; *.db.lock в .gitignore);
F3/F4/F6 — в техдолг (F3: граница timeout-недоучёта уточнена — до MaxAttempts−1, не «≤1»; честный фикс —
idempotency-ключ, отложено). Дизайн-вопросы к владельцу/оркестратору D1–D3 (монолингвальный редактор Фазы 1;
per-chunk skip+flag вместо падения; структурный запрет Anthropic в канале B при подключении failover) —
зафиксированы в §6, все Фаза 1–2.
Следующее: Фаза 1 (перевод книги целиком) — чанкер, банк памяти v1, гейты (пороги полигона готовы), режим онгоинга.
Реальная приёмка на живых ключах — PASS (04.07, ревьюер)
Первый реальный прогон провайдеров (раньше всё было на моках — главный незакрытый пробел ревью). tmctl translate
на example/book.yaml (draft=deepseek-v4-flash → edit=glm-5, один чанк 264 симв., потолок $1.00):
- Деньги сходятся до цента: draft $0.000219 (453·0.14+556·0.28/1e6 ✓), edit $0.001277 (672·1.0+189·3.2/1e6 ✓);
committed == Σстадий == $0.001496,reserved=0. Порядок величин совпал с прайсингом DeepSeek/z.ai. - Цена по ответившей: z.ai вернул
model=glm-5→ edit книжится по цене GLM, НЕ по дешёвому deepseek-якорю (fallback дал бы $0.000147 — в 8.7× меньше);PriceForResponseподтверждён на реале. - Usage реальный, не мок:
prompt/completion_tokensненулевые в request_log; GLM латентность штатная (5–8 с, без ×3) →extra_body thinking:{type:disabled}фактически применён. - Resume: второй прогон — обе стадии из чекпоинтов за $0, ledger неизменен (нет двойной оплаты).
- DeepSeek автокэш на реале: повторный прогон того же префикса в окне кэша →
cached_tokens=384/453(полеprompt_cache_hit_tokensпарсится вrequest_log.cached_tokens), billed по $0.0028/M;CostUSDсошёлся до 7 знаков ((453−384)·0.14 + 384·0.0028 + 1074·0.28 = $0.0003115). Кэш-путь подтверждён живым провайдером. - Пост-ревью правки провалидированы: F1 (CheckKeys — заводится на 2 ключах), F2 (provider temp/maxtok в
snapshot), F5 (fail-loud на включённый гейт), F7 (сноска §3.4) — все на месте; Anthropic вычищен из конфигов,
висячих ссылок нет (в
BuildClientветкаcase "anthropic"осталась, ноkind: anthropicв models.yaml нет).
Новая находка реальной приёмки (исправлена): tmctl report рвался с context canceled и печатал таблицу
частично/пусто без строки Ledger (exit 1). Причина — Store.RequestLogRows отдавал *sql.Rows с defer cancel():
контекст отменялся посреди ленивой итерации у вызывающего. Данные и деньги в БД были корректны — баг только на
read-пути report. Фикс: строки материализуются под таймаутом и возвращаются срезом []RequestLogView;
регрессионный тест TestRequestLogRowsMaterializes. go test ./... -race зелёные.
Не покрыто реальным прогоном (честно): (б) kill-9 посреди реального провайдерского вызова — инвариант
committed==SUM(checkpoints) доказан unit-тестом kill9_test.go (настоящий SIGKILL на SQLite), на реале не
воспроизводил (деньги/один-чанк дисциплина). (в) Anthropic cache_control/usage-сумма — Anthropic из стека убран,
проверять больше нечего на этом контуре.
[НУЖНО РЕШЕНИЕ] перед Фазой 1 (владелец/оркестратор)
Фаза 0 закрыта; перед стартом Фазы 1 нужно закрыть решения ниже (по каждому — рекомендация ревьюера). Фундамент Фазы 1 (чанкер + схема памяти) можно начинать параллельно — гейтят только пп. 1, 2, 4.
- D1 — что видит редактор: монолингвальный (черновик) vs билингвальный (черновик+исходник). Рек:
монолингвальный стилист; верность/полноту → coverage-гейт + билингвальный судья (Р2/04-unhappy-paths; убирает
риск zh→ru кальки от GLM). Блокирует context assembly, промпты «Редакции»,
editor.md(убрать{{text}}). - D2 — диспозиция «плохого» чанка (пустой/отказ/
finish=length): падать всем прогоном vs per-chunk флаг+продолжить. Рек: skip+flag+continue (Р4) + механизмattempt(наlength— ретрай с бОльшим max_tokens; N → флаг). Ключ resume уже несётattempt. Блокирует главный цикл раннера, resume-семантику флагов. - Финальные модели эскалации (канал A/B) после вывода Anthropic —
[НУЖНО РЕШЕНИЕ]п.3. Рек: A — GLM-5.1/5.2 или Gemini (нативный адаптер Ф2); B — по refusal-бенчмарку полигона, интерим DeepSeek+abliterated. Фундамент НЕ блокирует (нужно к моменту исполнения эскалации). - Схема банка памяти v1 — скоуп (миграция store v2). Рек v1: база Р3 + alias-граф +
gender=hidden(until_ch)translit_policy+first_person+ series-bible-lite; отложить в v1.1: ranked-set, эвфемизмы,nickname_translation, число-словарь. Сверка со «Следствиями для плана» 04-unhappy-paths — обязательна.
- Онгоинг: перегоняется ли Analyst при
add-chapters([НУЖНО РЕШЕНИЕ]п.5)? Рек: инкрементально, Analyst только на новые главы, book-brief не перегонять.
Уже решено (не пере-обсуждаем): премиум-бюджет (формула Р5 + $5/$30), ключ TM (консервативный), стриминг
keep-alive (Ф1–2), инъекция глоссария (selective), пороги coverage (полигон), epub v1 (текст по spine).
Ответ оркестратора на все [НУЖНО РЕШЕНИЕ] + Q3/Q4 (04.07) → полный контракт в architecture/05-decisions-log.md. Все 6+1 решений приняты (D1 монолингвальный редактор, D2 skip+flag+continue, D3 эскалация, D4 нет provider-fallback, D5 инкрементальный Analyst, D6 think-режим, D7 схема памяти v1) и прошли адверсариальную панель из 3 критиков (research/эконом/код) — читай
05-decisions-log.mdцеликом перед Фазой 1, там уточнения меняют реализацию. Самое важное для тебя:
snapshotIDрасширить memory-state + context-assembly hash ДО инъекции памяти (D5.2) — иначе изменённый глоссарий/STM меняетrequest_hash, но неsnapshotID, resnapshot-гейт молчит, ре-ран старой главы промахивается мимо чекпоинта и переоплачивает расходящимся переводом. Это общий гейт, держит D1 и D5.- Runner без цикла по чанкам/главам + нет хранилища флагов — главный длинный шест Фазы 1;
attemptНЕ несёт disposition/skip-семантику (я переоценил). Строить цикл + таблицу флагов +flag_reasonпервым.- D2: тегировать
flag_reason;retry-flaggedпереатакует только length/empty (refusal — не переатаковать, деньги на гарантированный отказ не жечь); n-gram-loop чек ПЕРЕД удвоением max_tokens; editmax_tokensот длины ЧЕРНОВИКА, не исходника.- D3: завести провайдеры gemini/xai/openai/deepseek-v4-pro/glm-5.1 в
models.yaml(все OpenAI-совместимы,kind: openai; нативный Gemini-судья — Ф2), фактчекнуть слагdeepseek-v4-pro. Премиум-бюджет $5/$30 устарел (был на Sonnet) — полигон пересчитает на Gemini-апексе с reasoning-as-output.- D1: убрать
{{text}}из editor.md И поднять editprompt_version(иначе лейбл врёт на двух SHA); честно: приёмка Фазы 1 БЕЗ критерия верности (mistranslation ловит билингвальный судья Ф2, не coverage-гейт).- D6: дефолт think off/minimal (операционно), но пилот Ф2.5 think-ON включает translator/editor (не только Terminologist); Gemini-апекс форсированно думает (бюджетить как output); think-ON эскалация — только subset-провайдеры (не xAI/Grok, пока EstimateUSD не резервирует reasoning).
- Новые дешёвые гейты Фазы 1 (детерминированные, Go): линтер тире-диалогов, ёфикатор, блок-лист транслит-междометий, число-гейт 万/億; ruby-парсер в спеку импорта (для ja-имён).
ПОПРАВКА ВЛАДЕЛЬЦА (04.07): удалён только Anthropic (за дороговизну), OpenAI ОСТАЁТСЯ. Живой набор ключей у бэкенда и полигона:
DEEPSEEK_API_KEY,ZAI_API_KEY,KIMI_API_KEY,OPENAI_API_KEY,GEMINI_API_KEY,XAI_API_KEY. → Вернуть провайдерopenaiвmodels.yaml(gpt-5-nanoальт черновика,gpt-5-miniкандидат редактора/second-opinion судьи; квирки вexperiments/00-provider-quirks.md: reasoning_effort minimal, без temperature,max_completion_tokens). Gemini/xAI теперь доступны сразу (не «Фаза 2»), нативные адаптеры для safety-судьи — по-прежнему Ф2. Р4 в01-decisions.mdобновлён. xAI/Grok НЕ выведен (уточнение владельца): Grok 4.3 — основной пермиссивный тир канала B + судья 18+; промо $150 за data-sharing — на выделенный NSFW/eval-аккаунт.
Ответ оркестратора на два флага + вопрос «план vs старт» (04.07). Оба флага верные, приняты:
- Рассинхрон quirks — исправил (
experiments/00-provider-quirks.md: строка про OpenAI была устаревшей). Источник истины по стеку —05-decisions-log.mdD3 + Р4.- Capability-слой — принял как корректировку D3.1 (записано в
05-decisions-log.md): «без новых адаптеров» было оптимистично. Kimi (temperature:1), gpt-5-mini (max_completion_tokens, без temperature, effort minimal), Gemini 3.1 Pro (thinking обязателен) → текущийopenAIRequestдаст 400. И это раньше D3: Kimi — уже альт-редактор, edit temp 0.4 упрётся. Форма — декларативные capabilities per-модель вmodels.yaml(budget_field,temperature: send|omit|locked:1,reasoning_control), адаптер строит тело по ним; эталон квирков —00-provider-quirks.md. Про «план vs старт»: пиши КОРОТКИЙ implementation-plan, но только на контракт-несущие куски, не waterfall. Полную спеку — на три места, где двусмысленность = переделка: (а) точный payloadsnapshotID(что именно входит в хэш памяти/сборки контекста — это класс бага «тихий расходящийся ре-пэй»); (б) схема disposition/флагов (таблица флагов,flag_reason, как resume читает терминал-для-прогона vs retry-flagged); (в) capability-матрица провайдеров. Чанкер/импорт/гейты — механика, их в план не разворачивай. Порядок работ, который ты предложил, ратифицирую: (1) runner-loop + флаг-таблица + disposition, (2) snapshotID под память, (3) чанкер+импорт(+ruby), (4) миграция памяти v2, (5) четыре гейта; capability-слой + заводка D3 — не «параллельно потом», а вместе с (1), т.к. Kimi-редактор упрётся сразу. Стартуй с (1)+(2) — они держат всё остальное.deepseek-v4-proслаг фактчекни на api-docs.deepseek.com перед wiring эскалации (не блокирует фундамент).
Ответ оркестратора на readiness-вердикт + флаг git (04.07). Готовность принята, порядок работ подтверждён кодом — старт Фазы 1 разрешён.
- Флаг git закрыт: docs закоммичены (
docs/— моя зона; коммит после этой записи). Полигону: закоммить свою зонуeval/(2 изменённых + 4 новых скрипта untracked — приreset --hardпотеряются);eval/data/.venv/токенизаторы в .gitignore, коммить только код.- Дефолт редактора Фазы 1 =
grok-4.3(эксп.04 полигона, бейк-офф — закрывает твой вопрос №2, ОПРОВЕРГАЕТ прежнее «редактор=GLM»): ранг-1 верность, ранг-2 стиль, ~13с без reasoning, лучший value. Премиум-эскалация редактора —gemini-3.1-pro. GLM/Kimi сняты с дефолта. Вpipeline-c1.yamledit-стадию перевести на grok-4.3 (провайдер xAI,kind: openai, thinking OFF — reasoning=0, ledger чист; capability: temperature шлётся,max_tokens). Провизорно (LLM-судьи, короткие фрагменты) — финал на пилоте Ф2.5. Р4/05-decisions-logобновлены.- Следствие: grok-4.3 стал центральной моделью (редактор SFW + канал B + судья 18+) — гигиена аккаунтов xAI на три использования (Р4): промо/data-sharing только eval+NSFW, продакшн-редактор SFW — чистый аккаунт.
- ⚠ DeepSeek-черновик «эхал» оригинал на высоко-CJK фрагменте (эксп.04, 3/3) — тихий отказ = оригинал вместо перевода. CJK-гейт Фазы 1 обязан это ловить (уже в плане); плюс фолбэк-черновик как у полигона.
Полигон
(секция параллельной сессии — записи добавлять сюда)
Сообщение от основной сессии (04.07, после ревью твоих экспериментов 01–02). Работа принята, качество высокое. Важные вводные:
- Архитектурные доки обновлены до v2 (~05:08, после адверсариального ревью) — если читал их до этого, перечитай
architecture/01-decisions.md: экономика теперь разделена по контурам «чей ключ» (Р5), премиум-микс с Sonnet в ru-контуре недоступен, batch — только для батчуемых стадий. Твой пересчёт COGS из эксперимента 01 отлично ложится в контур «прямые ключи»; при случае добавь строку-оговорку про ru-агрегаторский контур (×2–6 на флагманы).- Твои коридоры len_ratio из эксперимента 01 — прямой вход в coverage-гейт v1 бэкенда (Р7/план Фазы 1). Когда сузишь их по факту прогонов — зафиксируй в experiments-доке итоговые пороги отдельной таблицей, я заберу их в конфиг гейта.
- GTX 1070 ≠ допущения research/06 (там RTX 3060/4060, 40–53 tok/s; по vojo-референсу у 1070 ~28 tok/s на 8B). В эксперименте про локальный стенд явно проверь: (а) реальные tok/s качественного кандидата 30b-a3b MoE при лимите WSL RAM ~19GB (модель 18GB — впритык, возможен свопинг; вариант — llama.cpp
--n-cpu-moeвместо ollama), (б) достаточность 8B-abliterated для ролей «скрининг + 18+ перевод». Если 30b не влезает — это меняет рекомендацию Р4 по локальному стеку, пометь как «Расхождение».- Опциональная задача в бэклог (из Р5/Р10 риск №6, понадобятся ключи владельца): эмпирическая проверка, пробрасывают ли ru-агрегаторы (ProxyAPI/VseGPT/AITunnel) cache-hit тарифы DeepSeek — два одинаковых запроса подряд, сравнить usage/стоимость. Это разблокирует экономику ru-контура.
- Договорённость по журналу: фиксируй здесь краткие итоги каждого эксперимента (1–2 строки + ссылка на док) — основная сессия читает эту секцию, а не всю папку experiments.
2026-07-04 — Сессия 1 полигона (ответ на вводные выше — приняты)
Инфраструктура: eval/ (venv, токенизаторы DeepSeek V3.2/Qwen3/Qwen2.5/GLM-4.6 + tiktoken), PD-корпус 16 текстов zh/ja/en/ru с 3 параллельными парами. Ключи — eval/.env (gitignored, закрыт deny-правилом; скрипты читают сами; шаблон на 7 провайдеров создан, ждёт заполнения владельцем).
- Эксперимент 01 (задача 1) — завершён → experiments/01-token-calibration.md. Два расхождения с research/09 >15%: иероглиф = 0.86–0.93 ток. (in-family) против 0.65–0.75; «выход≈вход±20%» сломано — zh→ru 1.88×B (en→ru 1.53, ja→ru 1.29). COGS (контур прямых ключей): стандарт-вебновелла DeepSeek $1.85→$2.57, премиум-микс ≈$28→≈$49 ($26 batch); ранобэ ja→ru подешевел ($3.9→$3.1). Оговорка про ru-агрегаторский контур добавлена (п.1 вводных учтён).
- Эксперимент 02 (задача 2) — первый прогон выполнен (ключи получены ~06:10) → experiments/02-refusal-benchmark.md. 6 провайдеров × 11 фрагментов (SFW/L1/L2-violence): 66/66 ok — ноль отказов и вырезаний, контроль ложных срабатываний пройден; содержательная 18+ часть ждёт explicit-фрагментов владельца. Пороги len_ratio для coverage-гейта готовы (п.2 вводных): zh→ru <2.2, ja→ru <1.4, en→ru <0.70, sent_cov <0.75 — таблица в 02, забирайте в конфиг v1. Побочные находки для продакшн-конфига провайдеров: thinking GLM-4.6 (таймауты ×3) и Gemini (молча обрезал перевод — детектор поймал) отключать для роли переводчика; gpt-5-mini — reasoning minimal; safety_settings Gemini через OpenAI-слой не передаются (судье нужен нативный API).
- Эксперимент 03 (задача 3) — первый замер + эталон → experiments/03-local-stand.md. По п.3 вводных: (а) 30b-a3b в WSL влезает (mmap, без OOM), но на ollama даёт лишь 10 tok/s — «Расхождение» с research/06 (25–30 обещаны через llama.cpp
--n-cpu-moe; ставится в фоне — перемерить; Р4 менять пока не надо: рекомендация там и так llama-server); частично виноват и лимит WSL RAM 20GB — поднят до 26GB (.wslconfig, вступит после рестарта WSL); (б) 8b @ 27 tok/s (6.6GB VRAM) — на роли скрининга/экстракции годен. Эталон DeepSeek снят: разрыв качественный — API даёт корректные реалии («ворота Расёмон на улице Судзаку», «Новогоднее жертвоприношение») за ~$0.0005/фрагмент там, где обе локалки галлюцинируют («Рождественская дверь», «петухи»); NSFW-фрагменты ещё не гонялись. Для бэкенда: лег-таймаут vojo 45 с несовместим с чанками (63–278 с) — нужен свой профиль + стриминг. План расширения пула: ваниль qwen3:8b (цена абляции) → Qwen3.5-9B → RuadaptQwen3 (докачиваются в фоне). - Бэклог принят: проверка проброса cache-hit агрегаторами (п.4, нужны ключи) — в шагах ниже. Задачи 4–5 не начаты (bge-m3 уже на стенде).
2026-07-04 — Сессия 2 полигона (после рестарта WSL с RAM 26GB)
-
llama.cpp
--n-cpu-moeдля 30b-a3b — перемерено, «Расхождение» с research/06 подтверждено: потолок генерации на GTX 1070 ~13.5 tok/s (не 25–30). Таблица конфигов в 03: ollama 10 → llama.cpp--cpu-moe11.2 →--n-cpu-moe 3313.5 (VRAM 2.9→7.8GB, prefill 105→208). Узкое место — пропускная способность CPU-RAM (DDR4/Pascal), не рантайм; llama.cpp честно лучше ollama (+35% ген., ×2–3 prefill), но 30b-a3b на этом железе — только фоновые роли (~2.5 мин/главу). Скрипт:eval/llama_moe_bench.sh. -
Замер 4 новых dense-моделей (ваниль qwen3:8b / qwen3.5:9b / +abliterated / ruadapt) — готово, таблица в 03. Три вывода: (1) абляция бесплатна — qwen3.5 vanilla vs abliterated идентичны по скорости и SFW-качеству → 18+-роль можно на abliterated без штрафа; (2) поколение 3.5>3 умеренно (лучше понимание, −25% токенов, −10% скорости); (3) RuAdapt: токен-выигрыш подтверждён (−40% ru-токенов), но перевод развалился (羅生門→«дерево с колокольчиками») → редактор ru-стиля, не переводчик (как и предупреждал research/06). Разрыв с API держится у всех. Побочная находка для бэкенда: thinking у Qwen3.5+/GLM/Gemini для роли переводчика обязателен к отключению (иначе пустой/обрезанный вывод — ловилось дважды: эксп. 02 и здесь).
-
Think-режим (проверка гипотезы владельца «reasoning поднимет качество в разы») — 03, раздел «Влияние thinking». Итог: (а) прежняя «пустота» — артефакт тесного контекста (рассуждения не влезали с ответом), не зависание; (б) с ctx 16k think завершается и реально чинит реалии (羅生門: «Радзёмон»→«Рашо-мон»; 朱雀 с китайского чтения на японское) — гипотеза частично подтвердилась; (в) но локально нежизнеспособен: 8,6 мин и ~11k токенов рассуждений на 1400 знаков (вебновелла ≈ 200 ч). Новый пункт бэклога → оркестратору/бэкенду: проверить think-ON vs OFF по КАЧЕСТВУ на быстром облачном черновике/редакторе (DeepSeek/GLM) — потенциальный дешёвый рычаг качества, раз reasoning вытаскивает реалии.
-
Справочник провайдерских граблей → experiments/00-provider-quirks.md (по замечанию владельца: бэкенд и полигон оба «ходят к провайдерам», но это не дубль — Go-продакшн-адаптеры 1735 строк с failover/ledger vs 40-строчный Python-зонд сырого поведения; объединять нельзя, но знание о граблях сведено в один справочник). Собраны: thinking-управление (GLM/Gemini/gpt-5/Qwen — у каждого по-своему!), Kimi только temp=1, Gemini 3.1 Pro обязательно-думающая, safety_settings Gemini не через OpenAI-слой, localhost-прокси, деприкации. Бэкенду: читать при правке адаптеров
internal/llm. -
Эксперимент 04 — бейк-офф редакторов ru-стиля (вопрос бэкенда №2 + замена Anthropic) → experiments/04-editor-quality.md. Метод: DeepSeek-черновик → 4 редактора (glm-4.6/kimi-k2.6/gemini-3.1-pro/grok-4.3) полируют; 4 фрагмента (ja/zh/en); слепая человеческая оценка владельца (LLM-судьи на худ. качестве ненадёжны). Артефакт для оценки: https://claude.ai/code/artifact/25394796-96f0-4f3f-b8d0-de000d415472. Объективно уже видно: grok-4.3 — быстрый/дешёвый (~13с, без reasoning); kimi-k2.6 дорогой (~11k reasoning-токенов на абзац → биллятся как выход); gemini-3.1-pro обязательно-думающая. Цена входит в решение наравне со стилем. Оценка стиля — на владельце (ожидает). Методическое следствие для пилота (задача 4): владелец читает только en/ru → человеческая оценка верности возможна лишь на en→ru + русской стороне, для zh/ja нужен английский якорь.
Эксперимент 04 — РЕЗУЛЬТАТ (04.07): слепую оценку сделали два фронтир-судьи (GPT + Opus 4.8), сверяясь с каноническими переводами (Фельдман/Рогов/Морозов), сошлись независимо. Ключ: A=grok-4.3, B=glm-4.6, C=gemini-3.1-pro, D=kimi-k2.6. Итог: стиль gemini > grok > kimi > glm; верность grok > gemini > glm > kimi; value grok ≫ gemini > glm > kimi. Рекомендация дефолта редактора Фазы 1: grok-4.3 (лучший баланс качество/цена, надёжен по смыслу, ~13с/без reasoning), премиум-эскалация gemini-3.1-pro (лучшая проза, культурные узлы на уровне канона). GLM-4.6 (текущее допущение Р4 «редактор=GLM») эмпирически слабейший — снять с дефолта; Kimi убрать (худший value: 11k reasoning/абзац, последний по верности). → оркестратору: правка Р4 (полигон архдоки не трогает). Полный разбор — 04-editor-quality.md.
Следующие шаги полигона
- Эксперимент 04 (редактор) — оценён (grok-4.3 дефолт, gemini-3.1-pro премиум; GLM/Kimi не дефолт); правка Р4 на оркестраторе.
- Прогон refusal-бенчмарка (SFW/L1/L2-violence часть) — 66/66 ok, пороги в 02; explicit-часть ждёт фрагментов владельца.
- Эталон DeepSeek для сравнения черновиков — в 03.
- llama.cpp
--n-cpu-moeдля 30b-a3b — перемерено (потолок 13.5 tok/s, см. выше). - Прогон Qwen Model Studio (
data_inspection_failed) и OpenRouter — при появлении ключей. - Проверка ru-агрегаторов: проброс cache-hit DeepSeek (два одинаковых запроса, сравнить usage) — разблокирует экономику ru-контура.
- Довалидация калибровки на 3–5 главах реальных вебновелл (файлы владельца →
eval/data/samples/+ manifest). - Задача 4: протокол BWS + панель LLM-судей (LAIT/JP-TL-Bench), харнесс
eval/pilot/. - Задача 5: bge-m3 vs Qwen3-Embedding-0.6B vs LaBSE на retrieval глоссария (bge-m3 скачан).
Задачи от оркестратора (04.07, из журнала решений architecture/05-decisions-log.md):
- Пересчитать премиум-бюджет на Sonnet-free стеке: апекс — Gemini 3.1 Pro ($2/$12 ≤200k) с обязательным thinking (reasoning биллится как output $12/M — учесть, это класс недоучёта vojo 30–44%); batch −50% только на судью/QA, НЕ на inline-эскалацию (последовательна из-за STM); эскалированный чанк платит Gemini дважды (перевод+ре-джадж). Дефолты $5/$30 — заглушка до твоего пересчёта.
- Замерить, эмитят ли DeepSeek/GLM/Kimi
finish_reason=content_filter(D2.4): бэкенд ветвит диспозицию по нему, но OpenAI-совместимый слой отдаёт finish_reason сырым — если провайдеры его не шлют, реальная страховка только refusal-blacklist. Дешёвый зонд на отказном фрагменте.- Think-ON vs OFF по КАЧЕСТВУ на облачных translator/editor (DeepSeek/GLM/Kimi — subset-billing, безопасно по потолку): гипотеза владельца про reasoning частично подтвердилась локально (羅生門→Радзёмон), DRT (arXiv:2412.17498) подтверждает для роли переводчика. Это ключевой вход в пилот Ф2.5 — мерить именно translator/editor, не только Terminologist.
- Проброс cache-hit/batch RU-агрегаторами (уже в бэклоге) гейтит достоверность всего премиум-бюджета — приоритет поднять.
- Ключевой набор расширен: теперь живы и
OPENAI_API_KEY, иGEMINI_API_KEY, иXAI_API_KEY— Gemini-судья и Grok-канал-B можно гонять в евалах сразу.- xAI/Grok НЕ выведен (уточнение владельца): ретайрнулся только дешёвый Grok 4.1 Fast, сам провайдер жив. Роли Grok — переводчик канала B и судья 18+ (не отказывается оценивать explicit). У xAI промо $150 за data-sharing — бери на выделенный NSFW-аккаунт: этим разблокируется висящая 18+ часть refusal-бенчмарка (эксп.02) и 18+ плечо пилота. Гони на промо-кредитах: (а) 18+ refusal/excision на Grok/DeepSeek/локальной abliterated; (б) Grok в роли 18+-судьи — качество оценки explicit-сцен. Data-sharing только PD/тест-корпус, реальные книги через него не гнать. Grok в евалах — thinking OFF (reasoning аддитивный).