Consolidate docs after reconciliation audit: name 05-decisions-log source of truth, fold exp08 economics and grok reasoning fix, archive closed prompts, add backend/polygon/strategic handoff prompts
This commit is contained in:
parent
1aed2c7627
commit
ff5f000da5
18 changed files with 177 additions and 23 deletions
47
docs/BACKEND_SESSION_PROMPT_CONSOLIDATION.md
Normal file
47
docs/BACKEND_SESSION_PROMPT_CONSOLIDATION.md
Normal file
|
|
@ -0,0 +1,47 @@
|
||||||
|
# Промт: бэкенд-сессия — консолидация конфига (drift из doc-аудита, 2026-07-05)
|
||||||
|
|
||||||
|
Ты — бэкенд-сессия TextMachine, зона `backend/`. Оркестратор прогнал read-only аудит доков↔кода и причесал доки; ниже — 4 конфиг-расхождения твоей зоны + фикс капабилити + подтверждение пробы. Каждый пункт с указателем (сверь по своему коду — номера строк из аудита, могли сместиться). **НЕ читай `.env`.** Источник истины по решениям — `architecture/05-decisions-log.md`.
|
||||||
|
|
||||||
|
## ⚠ ГЛАВНОЕ — переворот находки аудита: grok-4.3 reasoning ОТКЛЮЧАЕТСЯ
|
||||||
|
|
||||||
|
Аудит (и exp08) считали, что grok-4.3 форсит reasoning и надо менять слаг на `grok-4.20-0309-non-reasoning`. **Это НЕВЕРНО** — перепроверено по xAI docs (`docs.x.ai/developers/model-capabilities/text/reasoning`, 05.07):
|
||||||
|
|
||||||
|
- grok-4.3 принимает `reasoning_effort` ∈ {none, low, medium, high}; **`none` = 0 thinking-токенов**.
|
||||||
|
- **Дефолт = `low`.** Не послал параметр явно → grok думает (вот почему exp08's «off by omission» не сработал).
|
||||||
|
- Chat Completions: плоский `reasoning_effort:"none"`. Responses API: вложенный `reasoning.effort:"none"`. exp08 слал `reasoning_effort:low` (не off) и вложенный `extra_body.reasoning.effort:none` (форма Responses-API) → на Chat Completions off-switch не отправлялся ни разу.
|
||||||
|
- `grok-4.20-0309-non-reasoning` под капотом = grok-4.3 + `effort:none` (мигрированные слаги, ретайр 15.05.2026).
|
||||||
|
|
||||||
|
**Вывод: слаг НЕ менять. Редактор = grok-4.3, слать `reasoning_effort:"none"` ЯВНО.**
|
||||||
|
|
||||||
|
## Задачи
|
||||||
|
|
||||||
|
### 1. capability.go — `ReasoningNone` конфлейтит два ПРОТИВОПОЛОЖНЫХ поведения (F2)
|
||||||
|
`backend/internal/llm/capability.go` (~:52-56) трактует `control=none` как «off by omission (DeepSeek / xAI-Grok)» — это неверно объединяет два провайдера, которым нужна ОБРАТНАЯ обработка:
|
||||||
|
- **DeepSeek: omission НАМЕРЕННЫЙ — держит thinking ON (дефолт DeepSeek = ON).** У DeepSeek-flash thinking ОБЯЗАН оставаться ON, иначе он эхает исходник (`echoMineViolation` — та самая мина, ради которой строилась Веха 2.5). Пропуск параметра ≠ «дефолт off». **НЕ добавлять DeepSeek явное отключение thinking.**
|
||||||
|
- **grok: omission даёт `low` (thinking ON), а редактору нужен OFF** → grok должен ЭМИТИТЬ явный `reasoning_effort:"none"`.
|
||||||
|
|
||||||
|
Развести: DeepSeek → keep-default (параметр не слать, thinking остаётся ON); grok → explicit-none (слать `reasoning_effort:none`). Единый `ReasoningNone`=«off by omission» на оба — источник будущей ошибки (сессия «правильно» отключит DeepSeek-thinking и взведёт эхо-мину).
|
||||||
|
|
||||||
|
### 2. models.yaml grok-4.3 (F2)
|
||||||
|
`backend/configs/models.yaml` (~:110 заметка «0 reasoning-токенов», ~:113 `reasoning.control: none`). `control:none` = off-by-omission → на деле low. Поставить режим, шлющий explicit `reasoning_effort:none`; заметку уточнить: «reasoning=0 ТОЛЬКО при явном `reasoning_effort:none`; дефолт grok = low». Reasoning у xAI аддитивен (`reasoning: additive`): при none → 0; при on → billed = completion+reasoning.
|
||||||
|
|
||||||
|
### 3. Редактор всё ещё glm-5 (F3)
|
||||||
|
Переключить **только edit-стадию** на **grok-4.3** с `reasoning_effort:none` (ратифицированный дефолт D1/D3). Цели: `pipeline-c1.yaml` (~:44, edit) и edit-стадия `pipeline-c2.yaml`. **НЕ трогать `pipeline-c2.yaml:34` — это стадия `select`** (Gemini-слот Фазы 2), не редактор. Прим.: `glm-5` в конфиге — **плейсхолдер** (exp04 мерил glm-4.6, не glm-5); дефолт grok обоснован рейтингом exp04, а не «glm-5 слаб». Свитч гейтится **чистым xAI-ключом без data-sharing** (реальные книги через промо-аккаунт нельзя). `models.yaml:116-117` признаёт отложенное переключение — закрыть.
|
||||||
|
|
||||||
|
### 4. Anthropic price-litter (F5)
|
||||||
|
`backend/configs/models.yaml` (~:7) — в шапке price-source ещё строка Anthropic pricing URL, хотя провайдер удалён (`:119-120`). Убрать.
|
||||||
|
|
||||||
|
### 5. Escalation-заглушки (F10)
|
||||||
|
`pipeline-c1.yaml` (~:68-69) / `pipeline-c2.yaml` (~:61-62) — цепочки `[kimi-k2.6]`-заглушки. Ратифицированная D3-цепочка: **канал A** — DeepSeek V4 Pro → GLM-5.1 → Gemini 3.1 Pro; **канал B** — Grok 4.3. В `models.yaml` НЕ заведены провайдеры `gemini`/`openai` и модели `deepseek-v4-pro`/`glm-5.1`/`gemini-3.1-pro`. Либо завести их (провайдер+модель+цена+capability: Gemini mandatory-thinking `thinking_budget:0`→400 / `max_tokens` по `00-provider-quirks.md` (≥8000 для Gemini 3.1 Pro; НЕ спутать с Kimi ≥16000); `deepseek-v4-pro` подтверждён живьём $0.435/$0.87) и подставить D3-цепочку, **либо явно пометить `[kimi-k2.6]` интеримом** (чтобы заглушку не приняли за контракт). Слаги/квирки — provider-wiring память + `experiments/00-provider-quirks.md`.
|
||||||
|
|
||||||
|
### 6. PROGRESS [НУЖНО РЕШЕНИЕ]-маркеры (F18)
|
||||||
|
Оба заголовка `[НУЖНО РЕШЕНИЕ]` в `docs/PROGRESS.md` отвечены и ратифицированы (05-decisions-log D1–D7), но не помечены RESOLVED → grep читает как открытые. Пометь «РЕШЕНО → <ссылка на ответ>». Нюансы: (а) фраза «НУЖНО РЕШЕНИЕ» есть не только в заголовках, но и в строках-ответах/back-ref'ах — помечай именно заголовки-вопросы, не полагайся на один grep; (б) один из двух заголовков — **оркестраторский блок, вложенный в §Бэкенд** (владение спорное) → его оставь оркестратору, тронь только чисто-бэкендовый. (Строки сдвинулись после вставки CURRENT-STATE — ищи по фразе, не по номеру.)
|
||||||
|
|
||||||
|
## Проба (НЕ гейт)
|
||||||
|
Eval УЖЕ переснял (05.07): на grok-4.3 / Chat Completions плоский `reasoning_effort:"none"` → `usage.reasoning_tokens=0` ✅ (дефолт→444, `low`→384, вложенный `extra_body.reasoning.effort` молча проглочен). Рабочая форма записана в `00-provider-quirks.md`. Ты — подтверди то же в своём адаптере при wiring + additive-биллинг. **Это НЕ гейт**: контракт уже известен из xAI docs, задачи 1–2 делать не дожидаясь пробы.
|
||||||
|
|
||||||
|
## Приёмка
|
||||||
|
- grep «reasoning=0» больше не врёт: редактор grok-4.3 шлёт explicit `none`, проба показывает 0 reasoning-токенов.
|
||||||
|
- edit-стадия = grok-4.3, не glm-5.
|
||||||
|
- `models.yaml` без anthropic-строки; escalation = D3-цепочка или явный интерим.
|
||||||
|
- Отчёт оркестратору на внешнее ревью (как обычно).
|
||||||
33
docs/POLYGON_SESSION_PROMPT_CONSOLIDATION.md
Normal file
33
docs/POLYGON_SESSION_PROMPT_CONSOLIDATION.md
Normal file
|
|
@ -0,0 +1,33 @@
|
||||||
|
# Промт: eval/полигон-сессия — коррекция exp08 (grok-reasoning) + пилот-arm (2026-07-05)
|
||||||
|
|
||||||
|
Ты — полигон-сессия TextMachine, зона `eval/` + `docs/experiments/`. Оркестратор прогнал doc-аудит; одна из твоих находок (exp08, «живая проба» grok-reasoning) оказалась основана на **баге пробы**. Ниже — коррекция + доп-arm в пилот. Источник истины по решениям — `architecture/05-decisions-log.md`. **НЕ читай `.env`.**
|
||||||
|
|
||||||
|
## Коррекция exp08: grok-4.3 reasoning ОТКЛЮЧАЕТСЯ (баг пробы)
|
||||||
|
|
||||||
|
exp08 §«Живая проба» / §«Расхождения» (`docs/experiments/08-cost-model-v2.md`) заключил: «grok-4.3 форсирует reasoning, thinking-OFF недостижимо, истинный non-reasoning редактор = grok-4.20-0309-non-reasoning». **Это неверно** — xAI docs (`docs.x.ai/developers/model-capabilities/text/reasoning`, 05.07):
|
||||||
|
|
||||||
|
- `reasoning_effort` ∈ {none, low, medium, high}; **`none` = 0 thinking-токенов**; **дефолт = `low`**.
|
||||||
|
- Проба слала `reasoning_effort:low` (это low, не off) и `extra_body.reasoning.effort:none` (вложенная форма Responses-API; на Chat Completions нужен ПЛОСКИЙ `reasoning_effort:"none"`) → документированный off-switch не отправлялся ни разу.
|
||||||
|
- `grok-4.20-0309-non-reasoning` = grok-4.3 + `effort:none` под капотом (мигрированные слаги, ретайр 15.05.2026).
|
||||||
|
|
||||||
|
### Задача 1 — переснять пробу правильным off-switch
|
||||||
|
На `grok-4.3`, Chat Completions, послать **плоский `reasoning_effort:"none"`** на боевую правку. Подтвердить: `usage.reasoning_tokens=0`, completion = видимый выход, биллинг без reasoning-надбавки. Зафиксировать точную рабочую форму параметра в `00-provider-quirks.md`.
|
||||||
|
|
||||||
|
**+ Reconcile `00-provider-quirks.md` (обязательно):** строки **:12** (столбец model = `grok-4.20-0309-non-reasoning`) и **:64** («для перевода брать non-reasoning») противоречат исправленной :33 → привести к `grok-4.3` + explicit `reasoning_effort:none` (слаг НЕ меняем). Бэкенд wire-ит адаптеры отсюда — иначе возьмёт неверный слаг. **(Если пробу уже переснял 05.07 — подтверди и закрой только этот reconcile :12/:64.)**
|
||||||
|
|
||||||
|
### Задача 2 — исправить exp08
|
||||||
|
- §«Живая проба» и §«Расхождения» (D3-строка): вывод → «reasoning отключается явным `reasoning_effort:none`; дефолт grok = low (must-be-explicit); slug остаётся grok-4.3».
|
||||||
|
- Рек #3 («editor slug = grok-4.20-0309-non-reasoning») → «editor slug = grok-4.3 + explicit `reasoning_effort:none`» (эквивалент, слаг не меняем).
|
||||||
|
- **Экономика exp08 ($0.69 ранобэ / $10.94 вебновелла) СТОИТ** — она считалась для reasoning-off, а он достижим. Таблицы НЕ пересчитывать.
|
||||||
|
|
||||||
|
### Задача 3 — editor mono-quality arm в пилот (F8)
|
||||||
|
exp08 (§Ограничения, Quality-transfer риск) верно отметил: exp04 выбрал grok, кормя его **билингвально** (исходник+черновик), а боевой редактор D1 — **моноязычный** (только черновик) → рейтинг grok на моноредактуре строго не перенесён. Добавить в пилот-протокол (`09-pilot-protocol.md`) явную руку: grok-4.3 моно-редактура (think-ON vs OFF — рука уже там) против кандидатов на реальной моноязычной задаче. Оркестратор уже свернул этот caveat в D3/D1.
|
||||||
|
|
||||||
|
## Что УЖЕ сделал оркестратор (не дублируй)
|
||||||
|
- exp07 (coverage 0/57 FP, ≥2 флага=fail, `content_filter` мёртв) свёрнут в D12/D2.4.
|
||||||
|
- exp08-экономика ($0.69/$10.94) свёрнута в Р5/D11; пороги $0.6/$5/$30 сняты.
|
||||||
|
|
||||||
|
## Приёмка
|
||||||
|
- exp08 больше не утверждает «grok reasoning недостижимо»; проба переснята; точная форма параметра — в `00-provider-quirks`.
|
||||||
|
- Пилот-протокол имеет mono-editor arm.
|
||||||
|
- Отчёт оркестратору.
|
||||||
|
|
@ -1,5 +1,11 @@
|
||||||
# Журнал прогресса
|
# Журнал прогресса
|
||||||
|
|
||||||
|
> **⟶ ТЕКУЩЕЕ СОСТОЯНИЕ** (обновляемый блок; на 2026-07-05). **Источник истины по РЕШЕНИЯМ — `architecture/05-decisions-log.md` (D1–D12); этот файл — ЖУРНАЛ, не спека.**
|
||||||
|
> - **Фаза:** 0 (каркас) завершена; машинерия Фазы 1 в основном построена — банк памяти v2, чанкер + txt/epub импорт, disposition/coverage-гейт/эскалация, durable resume, глоссарий→редактор. Следующее: реальный ja→ru прогон end-to-end + пилот Ф2.5.
|
||||||
|
> - **Стек (2026-07-05):** черновик DeepSeek V4 Flash · редактор **grok-4.3** (thinking-OFF через ЯВНЫЙ `reasoning_effort:none` — дефолт grok = `low`) · судья/апекс Gemini 3.1 Pro (mandatory thinking) · эскалация A: DeepSeek V4 Pro → GLM-5.1 → Gemini · канал B (18+): Grok. **Anthropic выброшен (за дороговизну), OpenAI оставлен.** 6 ключей.
|
||||||
|
> - **Экономика:** `experiments/08-cost-model-v2.md` (~$0.69 ранобэ / ~$10.94 вебновелла-500) — заменяет старые пороги $0.6 / $5 / $30.
|
||||||
|
> - Записи ниже — хронология; РАННИЕ (день-0, 04.07) содержат устаревшие цифры/решения (COGS $2–4, BYOK, Anthropic-Sonnet), переопределённые позже — см. блок выше и 05-decisions-log.
|
||||||
|
|
||||||
## 2026-07-04 — Старт проекта (MVP-сессия)
|
## 2026-07-04 — Старт проекта (MVP-сессия)
|
||||||
|
|
||||||
- Прочитан стартовый бриф `START_PROMT.MD` (37 пунктов идей).
|
- Прочитан стартовый бриф `START_PROMT.MD` (37 пунктов идей).
|
||||||
|
|
@ -41,7 +47,7 @@
|
||||||
- в план добавлены режим онгоинга и series-bible-lite (сегмент «ИИ-фабрик» и проверка рода/ты-вы).
|
- в план добавлены режим онгоинга и series-bible-lite (сегмент «ИИ-фабрик» и проверка рода/ты-вы).
|
||||||
|
|
||||||
### Следующие шаги
|
### Следующие шаги
|
||||||
- [ ] Фаза 0–1 бэкенда — **передана отдельной сессии «Бэкенд»** (промт: `BACKEND_SESSION_PROMPT.md`; шаг 0 — перевалидация решений, финал фаз — агентное селфревью). Оркестратор делает внешнее ревью её кода.
|
- [~] Фаза 0 (каркас) ЗАВЕРШЕНА; машинерия Фазы 1 в основном построена — сессия «Бэкенд» (промт: `prompts/done/BACKEND_SESSION_PROMPT.md`; шаг 0 — перевалидация решений, финал фаз — агентное селфревью). Осталось: полный стек-wiring, автопопуляция глоссария, реальный ja→ru прогон. Оркестратор делает внешнее ревью её кода.
|
||||||
- [x] Параллельная сессия «Полигон» запущена (эксперименты 01–03 идут).
|
- [x] Параллельная сессия «Полигон» запущена (эксперименты 01–03 идут).
|
||||||
- [ ] Сессия «Редакция» (промпты ролей) — после фиксации формата конфига в Фазе 0.
|
- [ ] Сессия «Редакция» (промпты ролей) — после фиксации формата конфига в Фазе 0.
|
||||||
- [x] Сессия «Валидация банка памяти» — завершена (вердикт GO на схему+гейты; реестр `architecture/06`; ставка гейтится in-house eval'ом в пилоте Ф2.5).
|
- [x] Сессия «Валидация банка памяти» — завершена (вердикт GO на схему+гейты; реестр `architecture/06`; ставка гейтится in-house eval'ом в пилоте Ф2.5).
|
||||||
|
|
@ -57,7 +63,7 @@
|
||||||
- Главные находки валидации (упущения передачи): в `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%».
|
- Главные находки валидации (упущения передачи): в `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).
|
- Окружение: git-репо инициализирован, Go 1.26.4 установлен (~/sdk/go, PATH в .bashrc).
|
||||||
|
|
||||||
**[НУЖНО РЕШЕНИЕ]** (детали в 03-implementation-notes §5):
|
**РЕШЕНО** (04.07) → ответ оркестратора ниже + ратифицировано в [05-decisions-log](architecture/05-decisions-log.md) (D1–D7); детали в 03-implementation-notes §5:
|
||||||
1. Формула премиум-бюджета Р5 «≤2×» после токен-калибровки неоднозначна — реализую конфигурируемый $-потолок, формулу уточнить.
|
1. Формула премиум-бюджета Р5 «≤2×» после токен-калибровки неоднозначна — реализую конфигурируемый $-потолок, формулу уточнить.
|
||||||
2. Политика инвалидации TM сверх brief_hash (prompt_version в ключе? модель? перечанкование?) — реализую консервативный вариант, нужно подтверждение.
|
2. Политика инвалидации TM сверх brief_hash (prompt_version в ключе? модель? перечанкование?) — реализую консервативный вариант, нужно подтверждение.
|
||||||
3. Канал B остался без дешёвого Grok (4.1 Fast retired, grok-4.3 дороже ×9) — перевыбрать модель канала B к Фазе 2.
|
3. Канал B остался без дешёвого Grok (4.1 Fast retired, grok-4.3 дороже ×9) — перевыбрать модель канала B к Фазе 2.
|
||||||
|
|
@ -294,7 +300,7 @@ keep-alive (Ф1–2), инъекция глоссария (`selective`), пор
|
||||||
- **Q2 (эхо — ретрай/эскалация или флаг?):** согласен — эхо должно ЭСКАЛИРОВАТЬ, не просто флажок. `cjk_artifact` ДЕТЕРМИНИРОВАН (та же модель → то же эхо) → same-model retry бессмыслен (переэхнёт, переплатит) → в classify он **non-retryable именно поэтому**. При заводке эскалации (шаг 7) `cjk_artifact` уходит на ФОЛБЭК-ЧЕРНОВИК (другая модель) — это и есть «эскалация, не флаг» (интент записан в Вехе 2). Сейчас флаг — цикла эскалации ещё нет.
|
- **Q2 (эхо — ретрай/эскалация или флаг?):** согласен — эхо должно ЭСКАЛИРОВАТЬ, не просто флажок. `cjk_artifact` ДЕТЕРМИНИРОВАН (та же модель → то же эхо) → same-model retry бессмыслен (переэхнёт, переплатит) → в classify он **non-retryable именно поэтому**. При заводке эскалации (шаг 7) `cjk_artifact` уходит на ФОЛБЭК-ЧЕРНОВИК (другая модель) — это и есть «эскалация, не флаг» (интент записан в Вехе 2). Сейчас флаг — цикла эскалации ещё нет.
|
||||||
- **Q3 (live-conformance):** ДА, и Python-оракул Полигона = приёмочный ГЕЙТ перед фиксацией адаптеров. Мои Go-тесты — httptest wire-контракты (быстрые, детерминированные, CI без ключей) — живые эхо/`reasoning_content`/алиасы/503 не воспроизводят by design. Разделение: **Python-оракул (зона Полигона)** = кросс-провайдерный live-гейт «каждый адаптер бьёт живого, получает валидный перевод без эха/пусто/обрезки»; **Go live-интеграционные тесты (зона бэкенда, build-tag `live`/env-gated, вне CI)** = per-adapter wire+parse на живых ключах. Оба; оракул — гейт.
|
- **Q3 (live-conformance):** ДА, и Python-оракул Полигона = приёмочный ГЕЙТ перед фиксацией адаптеров. Мои Go-тесты — httptest wire-контракты (быстрые, детерминированные, CI без ключей) — живые эхо/`reasoning_content`/алиасы/503 не воспроизводят by design. Разделение: **Python-оракул (зона Полигона)** = кросс-провайдерный live-гейт «каждый адаптер бьёт живого, получает валидный перевод без эха/пусто/обрезки»; **Go live-интеграционные тесты (зона бэкенда, build-tag `live`/env-gated, вне CI)** = per-adapter wire+parse на живых ключах. Оба; оракул — гейт.
|
||||||
|
|
||||||
Фикс (эскалация `cjk_artifact`→фолбэк-черновик + coverage-гейт вырезания + live-conformance) — **отдельная сессия**, онбординг-промт: [BACKEND_SESSION_PROMPT_SILENT_REFUSALS.md](BACKEND_SESSION_PROMPT_SILENT_REFUSALS.md). Не блокирует шаг 3.
|
Фикс (эскалация `cjk_artifact`→фолбэк-черновик + coverage-гейт вырезания + live-conformance) — **отдельная сессия**, онбординг-промт: [BACKEND_SESSION_PROMPT_SILENT_REFUSALS.md](prompts/done/BACKEND_SESSION_PROMPT_SILENT_REFUSALS.md). Не блокирует шаг 3.
|
||||||
|
|
||||||
### 2026-07-04 — Сессия 5: Веха 2.5 (старт) — DeepSeek эхо-мина зафиксирована регресс-гейтом
|
### 2026-07-04 — Сессия 5: Веха 2.5 (старт) — DeepSeek эхо-мина зафиксирована регресс-гейтом
|
||||||
|
|
||||||
|
|
@ -503,6 +509,15 @@ keep-alive (Ф1–2), инъекция глоссария (`selective`), пор
|
||||||
|
|
||||||
**Заметка владельцу/оркестратору:** редактор стал **источник-слепым** (D1) — правит стиль/консистентность имён, но не ловит мистранслейты (это судья/эскалация, Фаза 2). Осознанный размен по контракту D1.
|
**Заметка владельцу/оркестратору:** редактор стал **источник-слепым** (D1) — правит стиль/консистентность имён, но не ловит мистранслейты (это судья/эскалация, Фаза 2). Осознанный размен по контракту D1.
|
||||||
|
|
||||||
|
### 2026-07-05 — Консолидация конфига (drift из doc-аудита оркестратора)
|
||||||
|
|
||||||
|
6 конфиг-расхождений моей зоны (промт `BACKEND_SESSION_PROMPT_CONSOLIDATION`); центральный grok-разворот верифицирован веб-чеком xAI-доки + пробой eval, всё — адверсариальным селфревью (5 измерений, **0 находок**).
|
||||||
|
- **grok-4.3 reasoning OFF даётся ЯВНО** (задачи 1-2, money-path). `models.yaml`: `control:none`→`control:effort/off_effort:none`. Дефолт grok = `low` (омиссия заставляет думать, additive-биллинг ~444 ток./правку) → `ReasoningNone` (off-by-omission) молча оставлял бы low; теперь при `reasoning:"off"` уходит плоский `reasoning_effort:"none"` (проба eval → 0 ток.). Комментарий `ReasoningNone` в `capability.go` разведён (DeepSeek ≠ grok — логика не тронута). **DeepSeek остаётся `ReasoningNone`** (omission намеренный: отключение thinking взводит эхо-мину; гвард `echoMineViolation` цел, xAI не echo-prone).
|
||||||
|
- **Редактор glm-5 → grok-4.3** (задача 3, D1/D3; glm-5 был плейсхолдером) в edit-стадии C1/C2; select-стадия C2 (judge/glm-5, Gemini-слот Ф2) не тронута. Прод — только чистый xAI-ключ без data-sharing.
|
||||||
|
- **Anthropic price-litter убран** из шапки `models.yaml` (з.4); **escalation-заглушки `[kimi-k2.6]` помечены интеримом** с названной D3-цепочкой (з.5 — заводка провайдеров gemini/openai + v4-pro/glm-5.1/gemini-3.1-pro отдельным шагом, гейтится ценами/ключами/cost-model); **бэкендовый `[НУЖНО РЕШЕНИЕ]`-маркер → РЕШЕНО** (з.6; оркестраторский блок не тронут).
|
||||||
|
|
||||||
|
Тесты: `capability_test` кейс assert'ит **присутствие** `reasoning_effort:"none"` (закрыл eval-указанную дыру — ложный «off шлёт nothing» тут падает); `TestBoevoyConfigGrokEditorExplicitNone` (config end-to-end: grok→explicit-none, не echo-flagged, edit=grok, c2-select=glm-5). Полный `-race` зелёный, `tmctl report` $0. Eval подтвердил: прогоны переигрывать не надо, баг был латентным (grok не был в стадии) — пойман до флипа.
|
||||||
|
|
||||||
## Полигон
|
## Полигон
|
||||||
(секция параллельной сессии — записи добавлять сюда)
|
(секция параллельной сессии — записи добавлять сюда)
|
||||||
|
|
||||||
|
|
@ -575,7 +590,7 @@ keep-alive (Ф1–2), инъекция глоссария (`selective`), пор
|
||||||
- **Побочно (D§85, → бэкенду):** `finish_reason=content_filter` **не эмитит ни один** из 5 ядровых провайдеров на SFW-violence (все `stop`/200/перевели) → ветка мертва, страховка = refusal-blacklist (подтверждает D2.4). Нюанс: **gemini-3.1-pro** (апекс) единожды дал `content_filter:PROHIBITED_CONTENT`, но не воспроизвёл на 4 контрольных → изредка срабатывает, не системно.
|
- **Побочно (D§85, → бэкенду):** `finish_reason=content_filter` **не эмитит ни один** из 5 ядровых провайдеров на SFW-violence (все `stop`/200/перевели) → ветка мертва, страховка = refusal-blacklist (подтверждает D2.4). Нюанс: **gemini-3.1-pro** (апекс) единожды дал `content_filter:PROHIBITED_CONTENT`, но не воспроизвёл на 4 контрольных → изредка срабатывает, не системно.
|
||||||
- **Побочно (→ бэкенду):** **draft-эхо классической zh — системно:** deepseek-v4-flash эхнул **13/24** zh-чанков Лу Синя, grok-non-reason **10/24** (лёгкая правка исходника вместо перевода, не усечение) → ловит интринсик echo-гейт; single-hop эскалация черновика оправдана; вебновеллы вне претрейна — риск ниже.
|
- **Побочно (→ бэкенду):** **draft-эхо классической zh — системно:** deepseek-v4-flash эхнул **13/24** zh-чанков Лу Синя, grok-non-reason **10/24** (лёгкая правка исходника вместо перевода, не усечение) → ловит интринсик echo-гейт; single-hop эскалация черновика оправдана; вебновеллы вне претрейна — риск ниже.
|
||||||
|
|
||||||
- **Задача 2 — COGS v2 на grok-editor стеке → оба порога мертвы.** [experiments/08](experiments/08-cost-model-v2.md). Прайсы — офиц. доки, датированы 2026-07-05, кросс-верифицированы (воркфлоу). **Стандарт-микс (draft+editor):** ja→ru ранобэ **$0.69**, zh→ru вебновелла-500 **$10.94**, en→ru роман **$0.93** — **редактор ~88–90% стоимости** (grok-выход ×9 draft). **$0.6 мёртв.** **Премиум (Gemini apex):** ранобэ $5.0, вебновелла центр **~$82** (rf-условно $66–112; ниже якоря $100), роман $6.8 — **полный apex больших работ НЕ дефолт** (переполняет $30). Селективный apex (15%): вебновелла $24.6. **[→ бэкенду/оркестратору]** (1) editor slug = **`grok-4.20-0309-non-reasoning`** — grok-4.3 форсирует reasoning (не отключается effort-параметром, +25% output; живая проба); (2) `budget_usd` под селективный apex ($2 ранобэ/роман; вебновелла — потолок-на-главу/`apex_fraction`); (3) батч −50% только Gemini-судье; (4) **rf Gemini НЕ измерим через OpenAI-слой** (thoughts=0) — нужен нативный API перед привязкой премиум-бюджета.
|
- **Задача 2 — COGS v2 на grok-editor стеке → оба порога мертвы.** [experiments/08](experiments/08-cost-model-v2.md). Прайсы — офиц. доки, датированы 2026-07-05, кросс-верифицированы (воркфлоу). **Стандарт-микс (draft+editor):** ja→ru ранобэ **$0.69**, zh→ru вебновелла-500 **$10.94**, en→ru роман **$0.93** — **редактор ~88–90% стоимости** (grok-выход ×9 draft). **$0.6 мёртв.** **Премиум (Gemini apex):** ранобэ $5.0, вебновелла центр **~$82** (rf-условно $66–112; ниже якоря $100), роман $6.8 — **полный apex больших работ НЕ дефолт** (переполняет $30). Селективный apex (15%): вебновелла $24.6. **[→ бэкенду/оркестратору]** (1) **[ИСПРАВЛЕНО 05.07 — проба была багом]** editor slug остаётся **grok-4.3**; reasoning отключается ЯВНЫМ `reasoning_effort:none` (дефолт grok = low → без явного none думает), переснято (xAI docs + exp08:70-74). Прежнее «grok-4.3 форсирует / не отключается» — НЕВЕРНО; (2) `budget_usd` под селективный apex ($2 ранобэ/роман; вебновелла — потолок-на-главу/`apex_fraction`); (3) батч −50% только Gemini-судье; (4) **rf Gemini НЕ измерим через OpenAI-слой** (thoughts=0) — нужен нативный API перед привязкой премиум-бюджета.
|
||||||
|
|
||||||
- **Задача 3 — подготовка пилота Ф2.5.** [experiments/09](experiments/09-pilot-protocol.md) (протокол: ядро C0–C3 BWS, судья-панель+s\*, memory-eval WMT25-3-режим, think-ON/OFF, Annotator A/B, en-якорь для zh/ja верности) + харнесс `eval/pilot/`. **Decl-метрика** (`declmetric.py`, pymorphy3+stored-decl, mirror Go post-check) — склонённые формы (Вэйчжуане/Вана/Дэна) 0 ложных флагов. **memory_eval.py** — WMT25-3-режим, инъекция = **зеркало Go-контракта memory.go** (спойлер/disposition/sticky/containment/per-lang-minkey валидированы; `memory_hotpath.py` устарел до cc57c7b — не переиспользовал). **Индикатив (Ah-Q, N=5):** C0 консист. 0.58, **C1(банк) 1.0 = C2(длинный контекст) 1.0**, C3(неверный) 0.60 → банк ≈ длинный контекст по консистентности при меньшей инъекции; неверная инъекция не помогает. **[← владельцу нужно]** корпус 25–35 глав с приватными эталонами (рекуррентные имена, диалог/нарратив); человеческие BWS-аннотаторы; explicit-18+ фрагменты для канала B (gitignored).
|
- **Задача 3 — подготовка пилота Ф2.5.** [experiments/09](experiments/09-pilot-protocol.md) (протокол: ядро C0–C3 BWS, судья-панель+s\*, memory-eval WMT25-3-режим, think-ON/OFF, Annotator A/B, en-якорь для zh/ja верности) + харнесс `eval/pilot/`. **Decl-метрика** (`declmetric.py`, pymorphy3+stored-decl, mirror Go post-check) — склонённые формы (Вэйчжуане/Вана/Дэна) 0 ложных флагов. **memory_eval.py** — WMT25-3-режим, инъекция = **зеркало Go-контракта memory.go** (спойлер/disposition/sticky/containment/per-lang-minkey валидированы; `memory_hotpath.py` устарел до cc57c7b — не переиспользовал). **Индикатив (Ah-Q, N=5):** C0 консист. 0.58, **C1(банк) 1.0 = C2(длинный контекст) 1.0**, C3(неверный) 0.60 → банк ≈ длинный контекст по консистентности при меньшей инъекции; неверная инъекция не помогает. **[← владельцу нужно]** корпус 25–35 глав с приватными эталонами (рекуррентные имена, диалог/нарратив); человеческие BWS-аннотаторы; explicit-18+ фрагменты для канала B (gitignored).
|
||||||
|
|
||||||
|
|
@ -648,6 +663,8 @@ keep-alive (Ф1–2), инъекция глоссария (`selective`), пор
|
||||||
|
|
||||||
> **[РАСХОЖДЕНИЕ → оркестратору]** (1) Литература «Log Probability Tracking» (2512.03816) утверждает «все xAI/GPT возвращают logprobs» — **живая проба опровергает** (grok-4.3 нет, gpt-5 → 403): урок «проверяй пробой» подтверждён. (2) **Хорошая новость ядру:** soft-глоссарий Р3 индикативно **сильно работает на zh→ru** (0.458→0.875) — валидация банка это на нашем направлении не мерила. (3) Гипотеза владельца о VRAM — принята как инженерная гигиена, отклонена как путь к «обучающемуся модулю, бьющему базис».
|
> **[РАСХОЖДЕНИЕ → оркестратору]** (1) Литература «Log Probability Tracking» (2512.03816) утверждает «все xAI/GPT возвращают logprobs» — **живая проба опровергает** (grok-4.3 нет, gpt-5 → 403): урок «проверяй пробой» подтверждён. (2) **Хорошая новость ядру:** soft-глоссарий Р3 индикативно **сильно работает на zh→ru** (0.458→0.875) — валидация банка это на нашем направлении не мерила. (3) Гипотеза владельца о VRAM — принята как инженерная гигиена, отклонена как путь к «обучающемуся модулю, бьющему базис».
|
||||||
|
|
||||||
|
> **[ОРКЕСТРАТОР → на РАСХОЖДЕНИЕ, 05.07]** Принято, расхождение закрыто. (1) Урок «проверяй пробой» — тот же, что сработал против находки exp08 про grok-reasoning (перепроверено 05.07 по xAI docs: reasoning ОТКЛЮЧАЕТСЯ через явный `reasoning_effort:none`); статус logprob-доступа занесён в provider-wiring-память. (2) Сильный сигнал soft-глоссаря на zh→ru (0.458→0.875) фолдится в in-house memory-eval пилота Ф2.5 как подтверждение направления (валидация банка его не мерила). (3) VRAM-гипотеза — согласен: инженерная гигиена (эмбеддер→CPU), не путь к обучающемуся модулю; M2 (детерминированный, 0 ML) — в банк v2.
|
||||||
|
|
||||||
> **[БЭКЕНДУ]** Из research/14 в банк v2 фолдится **M2 (детерминированно, 0 ML, 0 VRAM):** консистентность-кэш auto/ambiguous (first-seen/majority-vote) + precision-gated adaptive-retrieval КАКИЕ серо-зонные записи инъектить с **hard-abstention** (лучше ничего, чем мусор). Это гигиена банка, закрывает recall-0.571-дыру и B1 first-wins. **НЕ строить:** локальный kNN-MT, книга-LoRA, constrained decoding, self-correction-как-слой (всё не проходит БАР/физически blocked).
|
> **[БЭКЕНДУ]** Из research/14 в банк v2 фолдится **M2 (детерминированно, 0 ML, 0 VRAM):** консистентность-кэш auto/ambiguous (first-seen/majority-vote) + precision-gated adaptive-retrieval КАКИЕ серо-зонные записи инъектить с **hard-abstention** (лучше ничего, чем мусор). Это гигиена банка, закрывает recall-0.571-дыру и B1 first-wins. **НЕ строить:** локальный kNN-MT, книга-LoRA, constrained decoding, self-correction-как-слой (всё не проходит БАР/физически blocked).
|
||||||
|
|
||||||
> **[ПИЛОТУ]** M1 (in-context демонстрации, серая зона) фолдится в тот же WMT25-3-режимный eval, что и банк, **+ стилевая ось** (win-rate человека/сильного судьи): критерий — бьёт ли базис по стилю БЕЗ потери консистентности/fidelity и без роста дистрактор-вреда. Индикатив этой сессии: по консистентности не бьёт; стиль не измерен.
|
> **[ПИЛОТУ]** M1 (in-context демонстрации, серая зона) фолдится в тот же WMT25-3-режимный eval, что и банк, **+ стилевая ось** (win-rate человека/сильного судьи): критерий — бьёт ли базис по стилю БЕЗ потери консистентности/fidelity и без роста дистрактор-вреда. Индикатив этой сессии: по консистентности не бьёт; стиль не измерен.
|
||||||
|
|
|
||||||
|
|
@ -14,14 +14,16 @@
|
||||||
|
|
||||||
- `research/` — результаты исследований:
|
- `research/` — результаты исследований:
|
||||||
- `01-market.md` — рынок и спрос; `02-competitors.md` — конкуренты; `03-academic-agentic-mt.md` — наука (agentic MT, метрики); `04-api-providers.md` — цены/качество/цензура API; `05-memory-glossary.md` — банк памяти и глоссарий; `06-local-models.md` — локальные модели (8GB VRAM); `07-translation-methodology.md` — методология худперевода; `08-legal.md` — право; `09-cost-model.md` — модель стоимости; `10-vojo-ai-bot-review.md` — ревью переиспользуемого Go-кода;
|
- `01-market.md` — рынок и спрос; `02-competitors.md` — конкуренты; `03-academic-agentic-mt.md` — наука (agentic MT, метрики); `04-api-providers.md` — цены/качество/цензура API; `05-memory-glossary.md` — банк памяти и глоссарий; `06-local-models.md` — локальные модели (8GB VRAM); `07-translation-methodology.md` — методология худперевода; `08-legal.md` — право; `09-cost-model.md` — модель стоимости; `10-vojo-ai-bot-review.md` — ревью переиспользуемого Go-кода;
|
||||||
- `11-gap-1…5.md` — добор пробелов критиком: RU-платежи/санкции, 18+ политики провайдеров (уточнение), валидация ядра пайплайна на zh→ru/ja→ru, российская конкурентная экосистема, платёжеспособный спрос.
|
- `11-gap-1…5.md` — добор пробелов критиком: RU-платежи/санкции, 18+ политики провайдеров (уточнение), валидация ядра пайплайна на zh→ru/ja→ru, российская конкурентная экосистема, платёжеспособный спрос;
|
||||||
- `architecture/` — синтез: `01-decisions.md` (10 решений), `02-mvp-plan.md` (фазы и приёмка), `components.puml`/`pipeline.puml`. Диаграммы владелец смотрит PlantUML-расширением VS Code — **рендерить .svg вручную не нужно** (лежащие рядом .svg — разовые превью от 04.07, при правках .puml их не обновлять, а удалить).
|
- `12-*.md` — дозаправка: отзывы потребителей, таксономии ошибок, режимы отказа ja/zh/ru-сторона (~70 режимов → `architecture/04-unhappy-paths.md`); `13-memory-bank-validation.md` — валидация банка памяти; `14-adaptive-memory.md` — вердикт по адаптивной памяти (гибрид не строим).
|
||||||
- `experiments/` — результаты «Полигона» (параллельная сессия, см. `PARALLEL_SESSION_PROMPT.md`).
|
- `architecture/` — синтез (**актуальный источник истины по решениям — `05-decisions-log.md`**; при конфликте с 01/02 он выше):
|
||||||
- `PROGRESS.md` — журнал прогресса и принятых решений.
|
- `01-decisions.md` — принципы Р1–Р10 (стек, экономика, гейты); `02-mvp-plan.md` — фазы 0–3 и приёмка; `03-implementation-notes.md` — контракты Фазы 0; `04-unhappy-paths.md` — ~70 режимов отказа → механизм; **`05-decisions-log.md` — ратифицированный контракт Фазы 1 (D1–D12)**; `06-memory-risk-registry.md` — реестр рисков банка памяти; `components.puml`/`pipeline.puml` — диаграммы (владелец смотрит PlantUML-расширением VS Code, .svg вручную не рендерить).
|
||||||
|
- `experiments/` — эмпирика «Полигона»: `00-provider-quirks`, `01-token-calibration`, `02-refusal-benchmark`, `03-local-stand`, `04-editor-quality`, `06-local-extraction`, `07-coverage-precision`, `08-cost-model-v2`, `09-pilot-protocol` (текущий промт — `POLYGON_SESSION_PROMPT_PHASE2.md`).
|
||||||
|
- `PROGRESS.md` — **журнал** прогресса (хронология; НЕ источник решений — решения ратифицированы в `architecture/05-decisions-log.md`).
|
||||||
|
|
||||||
## Статус
|
## Статус
|
||||||
|
|
||||||
См. [PROGRESS.md](PROGRESS.md). Исследовательская фаза завершена 04.07.2026; следующий шаг — Фаза 0 бэкенда (Go).
|
См. [PROGRESS.md](PROGRESS.md). Исследовательская фаза завершена 04.07.2026; **Фаза 0 (каркас) завершена**; машинерия Фазы 1 в основном построена (банк памяти v2, чанкер + txt/epub импорт, disposition/coverage-гейт/эскалация, durable resume, глоссарий→редактор). **Следующий шаг — реальный ja→ru прогон одной книги end-to-end + пилот Ф2.5.** Источник истины по решениям — [architecture/05-decisions-log.md](architecture/05-decisions-log.md).
|
||||||
|
|
||||||
## Доступые ключи от моделей
|
## Доступые ключи от моделей
|
||||||
DEEPSEEK_API_KEY
|
DEEPSEEK_API_KEY
|
||||||
|
|
|
||||||
45
docs/STRATEGIC_REVIEW_SESSION_PROMPT.md
Normal file
45
docs/STRATEGIC_REVIEW_SESSION_PROMPT.md
Normal file
|
|
@ -0,0 +1,45 @@
|
||||||
|
# TextMachine — сессия «Стратегическая валидация архитектуры» (онбординг-промт)
|
||||||
|
|
||||||
|
## Роль
|
||||||
|
Ты — независимый архитектурный аудитор и стратег. Смотри на TextMachine **с нуля**: от корней (стартовый бриф владельца) через уже реализованное к цели — и ответь на пять направлений ниже. Это НЕ про баги в строчках и НЕ про конфиг-мелочи — это «держится ли замысел end-to-end и туда ли мы идём».
|
||||||
|
|
||||||
|
**Дисциплина проекта:** не верь репортам и заголовкам — читай первоисточники и код; грунтуй каждый вывод (`file:line` / цитата / коммит / URL); проверяй сомнительное пробой. Твоя ценность — **независимое суждение и исследование**, а не пересказ существующих доков. Где видишь слабую ставку или расхождение с наукой — говори прямо.
|
||||||
|
|
||||||
|
## Что такое TextMachine (короткая ориентировка)
|
||||||
|
Go-бэкенд (позже — фронтенд-IDE) **издательского художественного перевода крупных текстов** (ранобэ / вебновеллы, zh/ja/en→ru) через мультиагентный LLM-API пайплайн. Цели: (1) макс. худкачество — победить translationese; (2) низкий COGS; (3) банк памяти на всю книгу (консистентность имён/терминов/стиля); (4) 18+ с учётом цензуры провайдеров; (5) телеметрия денег/качества. Работа идёт параллельными сессиями: **Бэкенд → `backend/`**, **Полигон → `eval/` + `docs/experiments/`**, оркестратор — доки/ревью; координация — `docs/PROGRESS.md`. Ролевой стек (по издательскому процессу): черновик (DeepSeek) → редактор (grok-4.3) → судья/апекс (Gemini); эскалация каналами A/B; Anthropic выброшен за дороговизну.
|
||||||
|
|
||||||
|
## Пять направлений — это и есть твоя миссия
|
||||||
|
1. **Корни / видение.** Что владелец задумал изначально — [`START_PROMT.MD`](../START_PROMT.MD) (37 буллетов). Точка отсчёта: куда целились и почему.
|
||||||
|
2. **Что уже реализовано (актуальное состояние).** Ратифицированные конкретные решения и построенный код — что РЕАЛЬНО существует сейчас в `backend/` и на полигоне. Источник истины по решениям — `docs/architecture/05-decisions-log.md` (D1–D12); что построено и с какими вердиктами — `PROGRESS.md` + сам код + `docs/experiments/00-09`.
|
||||||
|
3. **Направление.** Куда идём: цель (издательское качество, банк памяти серии, 18+, низкий COGS), фазы MVP (`02-mvp-plan`), пилот выбора ядра пайплайна (Ф2.5).
|
||||||
|
4. **Правильно ли уже реализованное?** — ГЛАВНЫЙ вопрос ревью. Архитектурно ли здоров построенный стек и подход; реализует ли код ядро C1 и замысел диаграмм ([`components.puml`](architecture/components.puml) + [`pipeline.puml`](architecture/pipeline.puml)); где структурный дрейф, где слабая ставка, где решение стоит пересмотреть. *(Диаграммы — day-0, стек в них местами устарел; конфиг местами отстаёт от ратифицированного — это известный лаг, чинится отдельно, НЕ выдавай за архитектурный дефект.)*
|
||||||
|
5. **Академические труды / SOTA.** Свежий глубокий survey (веб-ресёрч, НЕ только переиспользовать research/01-14 от 04.07): новые работы 2026 по agentic/document-level MT, translationese/anti-MT-artifact, память и консистентность серии, **надёжность LLM-судьи**, длинный контекст vs RAG-глоссарий, литперевод CJK→ru. По **каждой известной боли индустрии** — решает ли её наш стек, **где мы позади SOTA, где мимо готового решения.** Ссылки на источники обязательны.
|
||||||
|
|
||||||
|
**Синтез → стратегический вердикт:** цела ли архитектура end-to-end; ранжированные топ-риски/пробелы; курс-коррекции до масштабирования; что обязательно подтвердить пилотом.
|
||||||
|
|
||||||
|
## Погружение — читай в порядке корни → история → текущее
|
||||||
|
1. **Корни:** `START_PROMT.MD` — 37 буллетов, оригинальное видение.
|
||||||
|
2. **Ресёрч (обоснования):** `docs/research/01-14` — рынок, конкуренты, agentic/doc-level MT наука, API-провайдеры, память/глоссарий, локальные модели, методология худперевода, право, экономика, ревью кода vojo, `11-gap-*`, `12-*` (~70 режимов отказа), `13` (валидация памяти), `14` (адаптивная память). Часть несёт **superseded-баннеры** — читай их.
|
||||||
|
3. **Эмпирика полигона:** `docs/experiments/00-09` — квирки провайдеров, токен-калибровка, refusal-бенч, локальный стенд, editor bake-off (04), локальная экстракция, coverage-precision (07), cost-model-v2 (08), пилот-протокол (09).
|
||||||
|
4. **Решения/архитектура:** `architecture/01-decisions` (Р1–Р10 принципы), `02-mvp-plan` (фазы 0–3 + приёмка), `03-implementation-notes` (контракты), `04-unhappy-paths` (~70 режимов отказа → механизм), **`05-decisions-log` (D1–D12, контракт Фазы 1)**, `06-memory-risk-registry`.
|
||||||
|
5. **Диаграммы:** `components.puml` + `pipeline.puml` — целевой MVP (владелец смотрит VS Code PlantUML-расширением; .svg НЕ рендерить).
|
||||||
|
6. **Журнал:** `PROGRESS.md` — CURRENT-STATE сверху, ниже хронология (ранние записи помечены устаревшими).
|
||||||
|
7. **Код:** `backend/` — раннер, пайплайн/рендер/инъекция, банк памяти, ledger, store, llm-адаптеры + capability-слой, `backend/configs`.
|
||||||
|
|
||||||
|
## Метод
|
||||||
|
Проект работает **адверсариальными мультиагентными воркфлоу** (author≠reviewer; каждый вывод грунтуется; спорное верифицируется независимым скептиком). Разверни своё ревью так же: фан-аут по подсистемам/направлениям → независимая верификация → синтез. Масштабируй под «с нуля, максимум погружения».
|
||||||
|
|
||||||
|
## Что стоит пресс-тестировать (затравки к вопросу №4 — это гипотезы к проверке, НЕ готовые ответы)
|
||||||
|
- **Судья — bottleneck** ставки generate-then-select (Р10№1): LLM-судьи расходятся с живыми читателями — устойчива ли ставка.
|
||||||
|
- **Детерминированный no-LLM горячий путь памяти** (Aho-Corasick вместо эмбеддингов/FTS5) — академически нов; правда ли бьёт длинный контекст флагмана (гейтится in-house eval пилота).
|
||||||
|
- **Монолингвальный редактор** (D1): верность после черновика в Фазе 1 не контролирует ничто до билингвального судьи Ф2 — приемлемо ли для качества.
|
||||||
|
- **Ядро C0–C3 не решено** (selection vs refinement — наука разошлась); чем решается риск неверного выбора.
|
||||||
|
|
||||||
|
## Guardrails
|
||||||
|
- **НИКОГДА не читать `.env`** — ключи запрещены (README содержит только имена env-переменных).
|
||||||
|
- **18+ уровень 3** (несовершеннолетние в сексуальном контексте) — жёсткая линия: не обрабатывать/не эскалировать/не анализировать контент.
|
||||||
|
- **Зоны:** ты — РЕВЬЮ, пишешь ОТЧЁТ, не правишь чужие зоны (`backend/`, `eval/`+`experiments/`).
|
||||||
|
- Коммит-стиль (если коммитишь отчёт): английский, одно предложение ≤30 слов, без Co-Authored-By. `settings.local.json` не коммитить. PUML не рендерить в .svg.
|
||||||
|
|
||||||
|
## Deliverable
|
||||||
|
Стратегический вердикт — предлагаю `docs/architecture/07-strategic-review.md` (или как решишь с владельцем): по каждому из 5 направлений — грунтованный ответ; **вердикт** цельности архитектуры end-to-end; ранжированные топ-риски/пробелы; курс-коррекции до масштабирования; что подтвердить пилотом. Верни отчёт владельцу; спорные архитектурные выводы — оркестратору на сверку.
|
||||||
|
|
@ -12,7 +12,7 @@
|
||||||
- Goroutines/context — идеальная модель для тысяч параллельных LLM-вызовов; один статический бинарь без рантайма — идеально для локального режима у пользователя.
|
- Goroutines/context — идеальная модель для тысяч параллельных LLM-вызовов; один статический бинарь без рантайма — идеально для локального режима у пользователя.
|
||||||
- **Отвергнуто:** C++/userver — ноль переиспользования, производительность здесь не монетизируется (мы ждём сеть, а не CPU), а код пишет Claude, не владелец. Python — только оффлайн-евалы и Python-сайдкар качества (CometKiwi, морфология русского — в Go-экосистеме зрелого лемматизатора нет). TypeScript — для будущего IDE-фронтенда.
|
- **Отвергнуто:** 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` (миграции). Первый новый код — нативный Anthropic-адаптер с `cache_control`. Известная ловушка из vojo: per-adapter семантика reasoning-токенов (недоучёт до 30–44% расходов).
|
План выделения пакетов: `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. Ядро пайплайна — конфигурируемый граф стадий; выбор ядра решает пилот. **Принято (каркас) / гипотеза (ядро)**
|
## Р2. Ядро пайплайна — конфигурируемый граф стадий; выбор ядра решает пилот. **Принято (каркас) / гипотеза (ядро)**
|
||||||
|
|
||||||
|
|
@ -21,7 +21,7 @@
|
||||||
Решение:
|
Решение:
|
||||||
|
|
||||||
- **Граница «конфиг vs код» фиксирована** (урок ревью: без этого DSL расползается в кривой язык): циклы по главам/чанкам, ветвление по гейтам, эскалация с лимитом бюджета, fan-out кандидатов, ретраи — **фиксированная логика раннера**; конфиг задаёт только состав и порядок стадий, роли→модели, версии промптов и пороги гейтов. Четыре ядра (C0 baseline, C1 draft→editor, C2 generate-then-select, C3 select-then-refine) — четыре YAML-конфига одного раннера. Конкретный YAML-пример C1 пишется до старта Фазы 1 (приложение к плану MVP).
|
- **Граница «конфиг 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** (сильнейшая по русскому стилю модель), **Judge** (шкала Комиссарова + Nida-вопрос; пара судей: монолингвальный на художественность + билингвальный на верность). Роли второй очереди (Фаза 2+): **Line Editor** (чек-лист Норы Галь), **Continuity Editor** (series bible), **анти-translationese пасс** (>40% переводов даже GPT-4 содержат кальки).
|
- Ролевая модель — по издательскому процессу ([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 — премиум-эскалация), **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, только по явному сигналу «незнакомый термин» и с подтверждением через глоссарий (риск многозначности, о котором предупреждал сам бриф).
|
- Пункты брифа, по которым решение принято явно: **консультант поп-культуры / языковой аналитик** (бриф п.2; прототип — CRAT arXiv:2410.21067) и **tool-calling / переводческие тулзы** (п.32; в vojo tool-calling нет) — вне скоупа MVP, кандидаты Фазы 3; **webfetch за культурным контекстом** (п.16) — post-MVP, только по явному сигналу «незнакомый термин» и с подтверждением через глоссарий (риск многозначности, о котором предупреждал сам бриф).
|
||||||
- У каждого пасса **узкий мандат** (запрет менять чужую зону) и диффы вместо полной перегенерации.
|
- У каждого пасса **узкий мандат** (запрет менять чужую зону) и диффы вместо полной перегенерации.
|
||||||
- Приоритет силы моделей: **редактор > черновик** (вывод arXiv:2605.13368 — refinement проецирует текст в распределение редактора).
|
- Приоритет силы моделей: **редактор > черновик** (вывод arXiv:2605.13368 — refinement проецирует текст в распределение редактора).
|
||||||
|
|
@ -54,7 +54,7 @@
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| Черновик | 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-гейт + фолбэк-черновик |
|
| Черновик | 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** (лучшая проза, дорогая/медленная, иногда дописывает). GLM/Kimi сняты с дефолта (GLM-4.6 слабейший — перемерить при GLM-5; Kimi худший value: ~11k reasoning-ток./абзац). *Провизорно: LLM-судьи на коротких фрагментах; финал — человеческий пилот Ф2.5* |
|
| **Редактор (ru-стиль) — эмпирический дефолт (эксп.04)** | **grok-4.3** (слепой бейк-офф, 2 фронтир-судьи: ранг-1 верность, ранг-2 стиль, самый дешёвый+быстрый ~13с без reasoning) | премиум-эскалация **gemini-3.1-pro** (лучшая проза, дорогая/медленная, иногда дописывает). GLM/Kimi сняты с дефолта (GLM-4.6 слабейший — перемерить при GLM-5; Kimi худший value: ~11k reasoning-ток./абзац). *Провизорно: LLM-судьи на коротких фрагментах; финал — человеческий пилот Ф2.5* |
|
||||||
| Эскалация канал A (по сигналу гейта) | DeepSeek V4 Pro → gemini-3.1-pro (премиум-проза) | нативный Gemini-адаптер для safety-судьи — Ф2 |
|
| Эскалация канал A (по сигналу гейта) | DeepSeek V4 Pro → GLM-5.1 → gemini-3.1-pro (апекс) | нативный 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 — бесплатный гейт |
|
| Судья | 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 |
|
| Эмбеддинги/скрининг/экстракция терминов | локально: 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/тест-корпус), НЕ на продакшн клиентских книг |
|
| 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/тест-корпус), НЕ на продакшн клиентских книг |
|
||||||
|
|
@ -62,7 +62,7 @@
|
||||||
Контент-роутинг ([11-gap-2](../research/11-gap-2.md)):
|
Контент-роутинг ([11-gap-2](../research/11-gap-2.md)):
|
||||||
- Локальный классификатор «горячести» 0–3. Уровни 0–1 → канал A. Уровень 2 → канал B (пермиссивный). Уровень 3 (несовершеннолетние в сексуальном контексте) — **жёсткий отказ на уровне чанка**: чанк не переводится, помечается в отчёте, глава и книга продолжают обрабатываться (ложное срабатывание классификатора не должно убивать многочасовую оплаченную джобу).
|
- Локальный классификатор «горячести» 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 ревью бэкенда).
|
- **Эскалация 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=0) → ledger чист; think-ON на Grok — только после reasoning-буфера в EstimateUSD (D6.2).
|
- Гигиена аккаунтов 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-подобные внешние фильтры молча портят перевод.
|
- Обязателен **детектор молчаливых вырезаний** (сверка покрытия предложений вход↔выход) — Qwen-подобные внешние фильтры молча портят перевод.
|
||||||
- Внутренний refusal/excision-бенчмарк (50–100 фрагментов), прогонять при каждой смене версии модели.
|
- Внутренний refusal/excision-бенчмарк (50–100 фрагментов), прогонять при каждой смене версии модели.
|
||||||
- Для политически чувствительных zh-текстов — не полагаться на китайские API (цензура в весах), фолбэк на западные/локальные.
|
- Для политически чувствительных zh-текстов — не полагаться на китайские API (цензура в весах), фолбэк на западные/локальные.
|
||||||
|
|
@ -75,13 +75,13 @@
|
||||||
|
|
||||||
> **КОРРЕКЦИЯ ВЛАДЕЛЬЦА (04.07, фундаментальная): один контур — прямые ключи.** Владелец **не в РФ**; бэкенд на **EU-сервере**, все вызовы моделей идут оттуда с прямыми ключами провайдеров; продукт — **обычный SaaS** (владелец платит за токены, клиент — за сервис). **BYOK не делается — ни сейчас, ни в планах.** Прежняя модель «три контура (прямые/RU-агрегаторы/BYOK)» **отменена**: аггрегаторская наценка ×2–6, неопределённость проброса cache/batch и вся RU-платёжная обвязка (Р8/Р9) — неприменимы. Валидным остаётся **ru как язык перевода** (рынок ru-читателей), меняется только доставка. Плюс: цифры токен-калибровки (exp01) и весь прайсинг doc 09 теперь **канонические без оговорок про контур**.
|
> **КОРРЕКЦИЯ ВЛАДЕЛЬЦА (04.07, фундаментальная): один контур — прямые ключи.** Владелец **не в РФ**; бэкенд на **EU-сервере**, все вызовы моделей идут оттуда с прямыми ключами провайдеров; продукт — **обычный SaaS** (владелец платит за токены, клиент — за сервис). **BYOK не делается — ни сейчас, ни в планах.** Прежняя модель «три контура (прямые/RU-агрегаторы/BYOK)» **отменена**: аггрегаторская наценка ×2–6, неопределённость проброса cache/batch и вся RU-платёжная обвязка (Р8/Р9) — неприменимы. Валидным остаётся **ru как язык перевода** (рынок ru-читателей), меняется только доставка. Плюс: цифры токен-калибровки (exp01) и весь прайсинг doc 09 теперь **канонические без оговорок про контур**.
|
||||||
|
|
||||||
COGS (прямые ключи, из [experiments/01](../experiments/01-token-calibration.md), стек без Sonnet): том ранобэ ja→ru стандарт ~$0.17, премиум-микс ~$3.1; 500-главная вебновелла zh→ru стандарт ~$2.6, премиум-микс ~$49 (batch на батчуемых стадиях ~$26). Маржа против рыночного прайсинга (Р9) — высокая; главный удар калибровки — по премиум-миксу вебновеллы (буфер под якорем $100 сжался ~вдвое), отсюда жёсткость правила «дорогая модель — адресно».
|
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 — главный рычаг**, и раскладка промпта фиксируется под него (разрешение конфликта Р3↔Р5 из ревью): **стабильный кэшируемый префикс** = системный промпт роли + book brief + style sheet + резюме книги/арок (меняется редко, раз в главу-арку); **волатильный хвост после кэш-брейкпоинта** = селективный глоссарий + STM + чанк. На стадии edit кэшу ловить почти нечего (уникальный черновик в промпте) — ожидаемый cache-hit считать по стадиям, а не «≥50% в среднем». Альтернатива для DeepSeek (cache-hit $0.0028/M): полный глоссарий в стабильном префиксе может оказаться дешевле селективной инъекции по miss-тарифу — решить расчётом на прототипе, обе схемы поддержать конфигом.
|
- **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.
|
- **Батчуемость — свойство стадии**: Analyst, Terminologist, судья/оценки, книжный QA — батчуемы (−50%); черновик и редактура чанков — последовательны (STM/резюме создают зависимость, DelTA-паттерн). «С batch ≈$2» относится только к батчуемым стадиям. Batch API — Фаза 2 (к судье), не Фаза 0.
|
||||||
- **Бюджет премиум-токенов на книгу**: полный проход премиум-моделью (историческая калибровка на Sonnet до его удаления: ~$92 за 500-главную вебновеллу, впритык к якорю GlobeScribe $100; двойной ~$185 — ломает экономику) не должен идти сплошняком. Принцип сохраняется для любой премиум-эскалации (Gemini 3.1 Pro): дорогая модель — только адресно по сигналу судьи/гейтов, в пределах $-потолка (формула ниже).
|
- **Бюджет премиум-токенов на книгу**: полный проход премиум-моделью (историческая калибровка на 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)`; для локального режима без прайса — дефолты $5/том ранобэ, $30/вебновелла-500. «≤2× input-объёма» остаётся прикидочной эвристикой в доках, не контрактом кода.
|
- **Формула премиум-бюджета** (уточнение по запросу бэкенд-сессии, заменяет эвристику «≤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 этого раздела устарели после токен-калибровки** (эксперимент 01 полигона): zh→ru дороже в ~1.4–1.75 раза (премиум-микс вебновеллы ≈$49, с batch ≈$26; ранобэ ja→ru, наоборот, дешевле — ≈$3.1). Структура выводов не меняется; актуальные множители — `docs/experiments/01-token-calibration.md`.
|
- ✅ **Пересчёт 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, до тех пор — просто не гнать массовые прогоны в пик).
|
- Буфер +25% к расчётному COGS (ретраи, глоссарий-строительство, регенерации). Цены/имена моделей — только в конфиге с датой проверки. Миграция deepseek-chat → deepseek-v4-flash до 24.07.2026. Для DeepSeek — планировщик внепиковых часов (надбавка ×2 в пик; сам планировщик — Фаза 3, до тех пор — просто не гнать массовые прогоны в пик).
|
||||||
|
|
||||||
## Р6. Хранилище и оркестрация: SQLite + durable jobs + чанк-чекпоинты. **Принято**
|
## Р6. Хранилище и оркестрация: SQLite + durable jobs + чанк-чекпоинты. **Принято**
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,7 @@
|
||||||
- **Q1 (сегментация): порт 1:1 наивного split.** `refusal_bench.py::split_sentences` = **источник истины** (он же приёмочный оракул); Go зеркалит бит-в-бит; любое изменение — Python-first, лок-степ. §3.7 «поглощение кавычек» → v1.1 (координированно). Иначе Go-гейт и Python-оракул разъедутся.
|
- **Q1 (сегментация): порт 1:1 наивного split.** `refusal_bench.py::split_sentences` = **источник истины** (он же приёмочный оракул); Go зеркалит бит-в-бит; любое изменение — Python-first, лок-степ. §3.7 «поглощение кавычек» → v1.1 (координированно). Иначе Go-гейт и Python-оракул разъедутся.
|
||||||
- **Q2 (эскалация): минимальный single-hop.** НЕ противоречит D4: D4 запрещал массовый outage-своп, а это точечная эскалация ОДНОГО чанка на детерминированном контент-провале. Нужна сейчас (DeepSeek-эхо воспроизводим). Минимально: 1 хоп → флаг; полные цепочки — шаг 7.
|
- **Q2 (эскалация): минимальный single-hop.** НЕ противоречит D4: D4 запрещал массовый outage-своп, а это точечная эскалация ОДНОГО чанка на детерминированном контент-провале. Нужна сейчас (DeepSeek-эхо воспроизводим). Минимально: 1 хоп → флаг; полные цепочки — шаг 7.
|
||||||
- **Q3 (детект): только excision_suspect (нижняя граница).** Верхняя аномалия-дописывание ложно флагает (ru-выход 1.4–1.9× исходника) — нужен entity-счёт+судья (Ф2); coverage_fail/D10 блокирован памятью v2.
|
- **Q3 (детект): только excision_suspect (нижняя граница).** Верхняя аномалия-дописывание ложно флагает (ru-выход 1.4–1.9× исходника) — нужен entity-счёт+судья (Ф2); coverage_fail/D10 блокирован памятью v2.
|
||||||
- **Q4 (активация): opt-in (`enabled:false`), тестами.** Боевой флип — после валидации precision владельцем на реальных чанках (порог N флагов — за владельцем); до починки диалоговой сегментации флип ложно флагал бы диалого-плотные главы.
|
- **Q4 (активация): opt-in (`enabled:false`), тестами.** Боевой флип — после валидации precision владельцем на реальных чанках (порог N флагов — за владельцем); до починки диалоговой сегментации флип ложно флагал бы диалого-плотные главы. **[exp07, коммит 3911baf]: precision гейта = 0 ложных/57 на реальных чанках; вердикт главы — ≥2 флага→fail, 1→attention; `finish_reason=content_filter` не эмитит ни один из 5 провайдеров (ветка эмпирически мертва). Флип `enabled:true` всё ещё за подписью владельца.**
|
||||||
|
|
||||||
**Таксономия отказа — ТРИ класса (не бинар «фолбэк vs пауза» — это мис-фрейминг):**
|
**Таксономия отказа — ТРИ класса (не бинар «фолбэк vs пауза» — это мис-фрейминг):**
|
||||||
|
|
||||||
|
|
@ -55,8 +55,8 @@
|
||||||
Матчит букву R7 («гейт считает approved-термины») и — важнее — **бьёт по реальной жалобе №1 читателей**: коллапс терминосистемы рангов/титулов («Immortal, immortal or immortal», 04-unhappy §1) страшнее скачущих имён. Гейт параметризовать (знаменатель = вхождения src/алиасов, числитель = лемма dst по `decl`), **names-only — как под-метрика для диагностики**. Порог 98% — на детерминированном слое (pre-replace+инъекция+post-check) достижим (механизм не модель-зависим); если приёмка покажет систематическую недостижимость — ревизуем порог, НЕ знаменатель (не геймить метрику сужением).
|
Матчит букву R7 («гейт считает approved-термины») и — важнее — **бьёт по реальной жалобе №1 читателей**: коллапс терминосистемы рангов/титулов («Immortal, immortal or immortal», 04-unhappy §1) страшнее скачущих имён. Гейт параметризовать (знаменатель = вхождения src/алиасов, числитель = лемма dst по `decl`), **names-only — как под-метрика для диагностики**. Порог 98% — на детерминированном слое (pre-replace+инъекция+post-check) достижим (механизм не модель-зависим); если приёмка покажет систематическую недостижимость — ревизуем порог, НЕ знаменатель (не геймить метрику сужением).
|
||||||
|
|
||||||
### D11 (Q4) — премиум-микс: **конфиг-потолок, не гейт приёмки** ✅+ — но ОБА cost-числа устарели, не только премиум.
|
### D11 (Q4) — премиум-микс: **конфиг-потолок, не гейт приёмки** ✅+ — но ОБА cost-числа устарели, не только премиум.
|
||||||
budget_usd = R5-clamp, дефолт $5/$30 — заглушка. Приёмка держится на резюмируемости + гейтах + **точности телеметрии денег**, а не на конкретном премиум-числе (оно ждёт пересчёта полигоном на Sonnet-free стеке: exp01 намерил ~$49/$26-batch на Gemini-апексе с reasoning-as-output).
|
budget_usd = R5-clamp; дефолты **под селективный apex (пересчёт ВЫПОЛНЕН — [exp08](../experiments/08-cost-model-v2.md)):** ранобэ/роман ~$2, вебновелла — потолок-на-главу/`apex_fraction`; полный apex вебновеллы (~$82) не дефолт. Приёмка держится на резюмируемости + гейтах + **точности телеметрии денег**, а не на конкретном премиум-числе (exp01 намерял ~$49/$26 на Sonnet-апексе — заменено exp08 на Gemini-апексе с reasoning-as-output).
|
||||||
**Расширение за рамки вопроса бэкенда: порог стандарт-микса $0.6 ТОЖЕ устарел** — он считался с дешёвым редактором (GLM/DeepSeek), а дефолт-редактор теперь **grok-4.3 ($2.50/M output ≈ 10× дороже draft)**. Пересчёт ja→ru ранобэ: draft ~$0.065 + grok-editor ~$0.67 = **~$0.73 стандарт-микс** (выше $0.6). Экономика при этом здоровая (том <$1 против якоря $100 — маржа огромна), но **конкретные приёмочные числа ($0.6 стандарт, $5 премиум) оба устарели после смены редактора на grok**. → Приёмка Фазы 1 по стоимости = (а) escalation уважает конфигурируемый budget_usd (тест механизма); (б) телеметрия денег точна (ledger корректно биллит grok/gemini с их квирками — grok reasoning=0 при thinking-OFF, gemini reasoning-as-output); мягкий sanity-check ~$1/ранобэ стандарт, НЕ жёсткий гейт на $0.6/$5. Точные числа — полигон пересчитывает на реальном стеке (draft DeepSeek + editor grok + премиум Gemini).
|
**Расширение за рамки вопроса бэкенда: порог стандарт-микса $0.6 ТОЖЕ устарел** — он считался с дешёвым редактором (GLM/DeepSeek), а дефолт-редактор теперь **grok-4.3 ($2.50/M output ≈ 10× дороже draft)**. Пересчёт ja→ru ранобэ: draft ~$0.065 + grok-editor ~$0.67 = **~$0.73 стандарт-микс** (выше $0.6). Экономика при этом здоровая (том <$1 против якоря $100 — маржа огромна), но **конкретные приёмочные числа ($0.6 стандарт, $5 премиум) оба устарели после смены редактора на grok**. → Приёмка Фазы 1 по стоимости = (а) escalation уважает конфигурируемый budget_usd (тест механизма); (б) телеметрия денег точна (ledger корректно биллит grok/gemini с их квирками — grok reasoning=0 при thinking-OFF через ЯВНЫЙ `reasoning_effort:none` — дефолт grok = low, gemini reasoning-as-output); мягкий sanity-check ~$0.69/ранобэ ([exp08](../experiments/08-cost-model-v2.md)), жёсткий гейт $0.6/$5 СНЯТ. Числа пересчитаны — exp08 (draft DeepSeek + editor grok + премиум Gemini).
|
||||||
|
|
||||||
### Ре-флаг (grok как центральная модель — усилилось с D8): гигиена аккаунтов xAI критична
|
### Ре-флаг (grok как центральная модель — усилилось с D8): гигиена аккаунтов xAI критична
|
||||||
grok-4.3 теперь дефолт-редактор → **каждый чанк каждой книги идёт через xAI**. Значит: (1) дефолт-редактор продакшна — **чистый xAI-аккаунт БЕЗ data-sharing** (промо-$150-аккаунт с data-sharing — только eval/NSFW, реальные книги через него нельзя, research/08); (2) концентрация трёх ролей (редактор+канал B+судья 18+) на xAI — риск доступности (Р10 №6): провайдер лёг → пауза/resume (D4), премиум-редактор gemini как валидированная замена под рукой.
|
grok-4.3 теперь дефолт-редактор → **каждый чанк каждой книги идёт через xAI**. Значит: (1) дефолт-редактор продакшна — **чистый xAI-аккаунт БЕЗ data-sharing** (промо-$150-аккаунт с data-sharing — только eval/NSFW, реальные книги через него нельзя, research/08); (2) концентрация трёх ролей (редактор+канал B+судья 18+) на xAI — риск доступности (Р10 №6): провайдер лёг → пауза/resume (D4), премиум-редактор gemini как валидированная замена под рукой.
|
||||||
|
|
@ -82,7 +82,7 @@ grok-4.3 теперь дефолт-редактор → **каждый чанк
|
||||||
1. **`attempt` этого НЕ несёт** (переоценка в моём ответе). В коде Фазы 0 нет ни цикла по чанкам (chapter=1/chunk=0 захардкожены, `runner.go:235`), ни хранилища флагов, ни статуса «skipped/flagged»; любой ненормальный путь сейчас = `SetJobStatus(failed)+return`. Механика skip+flag+continue — **net-new работа Фазы 1** (цикл + таблица флагов + колонка disposition, читаемая resume-путём). `attempt` — необходим, но не достаточен.
|
1. **`attempt` этого НЕ несёт** (переоценка в моём ответе). В коде Фазы 0 нет ни цикла по чанкам (chapter=1/chunk=0 захардкожены, `runner.go:235`), ни хранилища флагов, ни статуса «skipped/flagged»; любой ненормальный путь сейчас = `SetJobStatus(failed)+return`. Механика skip+flag+continue — **net-new работа Фазы 1** (цикл + таблица флагов + колонка disposition, читаемая resume-путём). `attempt` — необходим, но не достаточен.
|
||||||
2. **Тегировать `flag_reason`.** `retry-flagged` переатакует **только** `length`/`empty` на той же модели; `content_filter`/refusal детерминирован per-модель/канал — повтор на том же SFW-канале снова откажет и снова спишет деньги. В Фазе 1 refusal-флаги просто **не переатаковать** (деньги на гарантированный отказ не жечь); маршрутизация в канал B/эскалацию — Фаза 2.
|
2. **Тегировать `flag_reason`.** `retry-flagged` переатакует **только** `length`/`empty` на той же модели; `content_filter`/refusal детерминирован per-модель/канал — повтор на том же SFW-канале снова откажет и снова спишет деньги. В Фазе 1 refusal-флаги просто **не переатаковать** (деньги на гарантированный отказ не жечь); маршрутизация в канал B/эскалацию — Фаза 2.
|
||||||
3. **Детектор вырождения перед удвоением max_tokens.** У дешёвого черновика `finish=length` чаще всего — repetition-loop; бо́льший max_tokens лишь оплачивает больше повтора (усугубляется неидемпотентными ретраями F3). Дешёвый n-gram-loop чек ПЕРЕД удвоением → при вырождении сразу флаг, без оплаты цикла.
|
3. **Детектор вырождения перед удвоением max_tokens.** У дешёвого черновика `finish=length` чаще всего — repetition-loop; бо́льший max_tokens лишь оплачивает больше повтора (усугубляется неидемпотентными ретраями F3). Дешёвый n-gram-loop чек ПЕРЕД удвоением → при вырождении сразу флаг, без оплаты цикла.
|
||||||
4. **`content_filter` ненадёжен как ветка:** OpenAI-совместимый адаптер отдаёт `finish_reason` сырым (`httpllm.go`), пробрасывают ли его DeepSeek/GLM/Kimi — не проверено. Реальная страховка — **refusal-blacklist гейт**, а не ветка по finish_reason. Полигону: замерить, эмитят ли провайдеры `content_filter`.
|
4. **`content_filter` ненадёжен как ветка:** OpenAI-совместимый адаптер отдаёт `finish_reason` сырым (`httpllm.go`), пробрасывают ли его DeepSeek/GLM/Kimi — не проверено. Реальная страховка — **refusal-blacklist гейт**, а не ветка по finish_reason. Полигону: замерить, эмитят ли провайдеры `content_filter`. **[exp07: НЕ эмитит ни один из 5 — ветка эмпирически мертва, страховка = refusal-blacklist гейт.]**
|
||||||
5. **Edit `max_tokens` считать от длины ЧЕРНОВИКА, не исходника** (`runner.go:283-287` сейчас от source). Для монолингвального редактора (D1), чей вход/выход ≈ русский черновик (~1.9× токенов исходника zh→ru), оценка от source мис-сайзит бюджет и ложно триггерит length-ретрай.
|
5. **Edit `max_tokens` считать от длины ЧЕРНОВИКА, не исходника** (`runner.go:283-287` сейчас от source). Для монолингвального редактора (D1), чей вход/выход ≈ русский черновик (~1.9× токенов исходника zh→ru), оценка от source мис-сайзит бюджет и ложно триггерит length-ретрай.
|
||||||
|
|
||||||
## D3. Эскалация. ✅+
|
## D3. Эскалация. ✅+
|
||||||
|
|
@ -91,10 +91,10 @@ grok-4.3 теперь дефолт-редактор → **каждый чанк
|
||||||
|
|
||||||
**Правка по xAI (04.07, вопрос владельца — xAI НЕ выведен):** ретайрнулся только дешёвый Grok 4.1 Fast; сам провайдер жив, ключ есть. grok-4.3 ($1.25/$2.50) — средний тир, не «дорогой крайний». Роли Grok: (а) **переводчик канала B** (самый пермиссивный крупный API — стандарт R-rated); (б) **судья/QA 18+ контента** — не отказывается оценивать explicit, в отличие от Gemini (нужен нативный safety-off) и Claude (отказ). Ограничения: reasoning xAI **аддитивный** → канал B с thinking OFF, а think-ON на Grok — только после reasoning-буфера в `EstimateUSD` (D6.2). Промо xAI **$150 за data-sharing**: брать на выделенный NSFW/eval-аккаунт для PD/тест-корпуса и refusal/18+-бенчмарка (разблокирует висящую 18+ часть эксп.02) — но **не гнать через data-sharing реальные/конфиденциальные клиентские книги** (конфликт с ToS-гарантией и zero-retention режимом B2B, research/08).
|
**Правка по xAI (04.07, вопрос владельца — xAI НЕ выведен):** ретайрнулся только дешёвый Grok 4.1 Fast; сам провайдер жив, ключ есть. grok-4.3 ($1.25/$2.50) — средний тир, не «дорогой крайний». Роли Grok: (а) **переводчик канала B** (самый пермиссивный крупный API — стандарт R-rated); (б) **судья/QA 18+ контента** — не отказывается оценивать explicit, в отличие от Gemini (нужен нативный safety-off) и Claude (отказ). Ограничения: reasoning xAI **аддитивный** → канал B с thinking OFF, а think-ON на Grok — только после reasoning-буфера в `EstimateUSD` (D6.2). Промо xAI **$150 за data-sharing**: брать на выделенный NSFW/eval-аккаунт для PD/тест-корпуса и refusal/18+-бенчмарка (разблокирует висящую 18+ часть эксп.02) — но **не гнать через data-sharing реальные/конфиденциальные клиентские книги** (конфликт с ToS-гарантией и zero-retention режимом B2B, research/08).
|
||||||
|
|
||||||
**Правка редактора (04.07, эксп.04 полигона — бейк-офф): дефолт-редактор Фазы 1 = `grok-4.3`.** Слепой бейк-офф glm-4.6 / kimi-k2.6 / gemini-3.1-pro / grok-4.3 на 4 фрагментах (2 фронтир-судьи, сверка с каноническими ru-переводами, согласие независимо): **grok-4.3** — ранг-1 верность, ранг-2 стиль, самый дешёвый+быстрый (~13с без reasoning) → лучший value «одной модели на роль». **gemini-3.1-pro** — лучшая проза → премиум-эскалация редактора. **GLM-4.6 слабейший** (опровергает допущение Р4 «редактор=GLM»; перемерить при GLM-5), **Kimi худший value** (~11k reasoning-ток./абзац, ранг-последний по верности) → оба сняты с дефолта редактора. Это **закрывает вопрос бэкенда №2** (дефолт редактора). Оговорка: LLM-судьи на коротких фрагментах — провизорный дефолт Фазы 1; финальный выбор редактора/ядра — человеческий пилот Ф2.5. Р4 обновлён. Следствие: grok-4.3 стал центральной моделью (редактор SFW + канал B + судья 18+) — гигиена аккаунтов xAI на три использования (Р4), редактор с thinking OFF (ledger чист).
|
**Правка редактора (04.07, эксп.04 полигона — бейк-офф): дефолт-редактор Фазы 1 = `grok-4.3`.** Слепой бейк-офф glm-4.6 / kimi-k2.6 / gemini-3.1-pro / grok-4.3 на 4 фрагментах (2 фронтир-судьи, сверка с каноническими ru-переводами, согласие независимо): **grok-4.3** — ранг-1 верность, ранг-2 стиль, самый дешёвый+быстрый (~13с без reasoning) → лучший value «одной модели на роль». **gemini-3.1-pro** — лучшая проза → премиум-эскалация редактора. **GLM-4.6 слабейший** (опровергает допущение Р4 «редактор=GLM»; перемерить при GLM-5), **Kimi худший value** (~11k reasoning-ток./абзац, ранг-последний по верности) → оба сняты с дефолта редактора. Это **закрывает вопрос бэкенда №2** (дефолт редактора). Оговорка: LLM-судьи на коротких фрагментах — провизорный дефолт Фазы 1; **эксп.04 кормил редактор БИЛИНГВАЛЬНО (исходник+черновик), а боевой редактор D1 — МОНОЯЗЫЧНЫЙ (только черновик) → рейтинг grok на моноредактуре строго не перенесён (exp08 §Ограничения, Quality-transfer риск), проверяется в пилоте**; финальный выбор редактора/ядра — человеческий пилот Ф2.5. Р4 обновлён. Следствие: grok-4.3 стал центральной моделью (редактор SFW + канал B + судья 18+) — гигиена аккаунтов xAI на три использования (Р4), редактор с thinking OFF через ЯВНЫЙ `reasoning_effort:none` (дефолт grok = `low`; ledger чист).
|
||||||
|
|
||||||
**Уточнения панели (обязательны):**
|
**Уточнения панели (обязательны):**
|
||||||
1. **Модели ОТСУТСТВУЮТ в конфиге.** `models.yaml` знает только `deepseek-v4-flash`/`glm-5`/`kimi-k2.6`/`local`; `deepseek-v4-pro`/`glm-5.1`/`gemini-3.1-pro`/`grok-4.3` и провайдеры `gemini`/`xai`/`openai` — **не заведены**, цепочки эскалации всё ещё `[kimi-k2.6]`-заглушки. Задача бэкенда: завести провайдеры+модели+цены, **фактчекнуть слаг `deepseek-v4-pro`** перед wiring (иначе 4xx).
|
1. **Часть моделей ОТСУТСТВУЕТ в конфиге (частично закрыто на 05.07).** Заведены с тех пор: `grok-4.3` + провайдер `xai` (commit 636919c); `deepseek-v4-pro` подтверждён живьём и по цене ($0.435/$0.87). Ещё НЕ заведены: провайдеры `gemini`/`openai`, модели `deepseek-v4-pro`/`glm-5.1`/`gemini-3.1-pro` в `models.yaml`; цепочки эскалации всё ещё `[kimi-k2.6]`-заглушки; редактор всё ещё `glm-5`. Задача бэкенда (см. промт консолидации): завести недостающие провайдеры+модели+цены и заменить заглушки цепочкой D3.
|
||||||
- **ПОПРАВКА (принял корректировку бэкенда): «без новых адаптеров» было оптимистично.** Провайдеры OpenAI-совместимы по эндпоинту, но не по телу запроса: текущий `openAIRequest` всегда шлёт `temperature` + `max_tokens`, а Kimi требует `temperature: 1` (иначе 400), gpt-5-mini — `max_completion_tokens` без temperature + `reasoning_effort: minimal`, Gemini 3.1 Pro — обязательный thinking (`thinking_budget: 0` → 400). Это **не строчка в yaml, а per-model capability-слой** в адаптере, и он нужен **раньше D3**: Kimi — уже альтернативный редактор Р4, edit-стадия на temp 0.4 даст 400 на первом вызове. → Capability-слой — фундаментальный элемент Фазы 1. Форма (согласована с принципом «модели/цены только в конфиге», Р4): каждая модель в `models.yaml` декларирует возможности — `budget_field: max_tokens|max_completion_tokens`, `temperature: send|omit|locked:1`, `reasoning_control: none|extra_body_disable|effort_minimal|mandatory`; адаптер строит тело запроса по ним. `experiments/00-provider-quirks.md` — эталонная таблица квирков.
|
- **ПОПРАВКА (принял корректировку бэкенда): «без новых адаптеров» было оптимистично.** Провайдеры OpenAI-совместимы по эндпоинту, но не по телу запроса: текущий `openAIRequest` всегда шлёт `temperature` + `max_tokens`, а Kimi требует `temperature: 1` (иначе 400), gpt-5-mini — `max_completion_tokens` без temperature + `reasoning_effort: minimal`, Gemini 3.1 Pro — обязательный thinking (`thinking_budget: 0` → 400). Это **не строчка в yaml, а per-model capability-слой** в адаптере, и он нужен **раньше D3**: Kimi — уже альтернативный редактор Р4, edit-стадия на temp 0.4 даст 400 на первом вызове. → Capability-слой — фундаментальный элемент Фазы 1. Форма (согласована с принципом «модели/цены только в конфиге», Р4): каждая модель в `models.yaml` декларирует возможности — `budget_field: max_tokens|max_completion_tokens`, `temperature: send|omit|locked:1`, `reasoning_control: none|extra_body_disable|effort_minimal|mandatory`; адаптер строит тело запроса по ним. `experiments/00-provider-quirks.md` — эталонная таблица квирков.
|
||||||
2. **Премиум-бюджет $5/$30 УСТАРЕЛ** — выведен из калибровки на Sonnet $3/$15. Апекс теперь Gemini 3.1 Pro ($2/$12 ≤200k) с **обязательным thinking** (reasoning биллится как output $12/M — тот же класс недоучёта, что сжёг vojo 30–44%). Плюс `batch −50%` к inline-эскалации неприменим (последовательна из-за STM), только к судье/QA. Плюс Gemini = и апекс, и судья → эскалированный чанк платит Gemini дважды (перевод+ре-джадж), оба с форсированным reasoning. **Полигону: пересчитать бюджет на фактическом Sonnet-free стеке с reasoning-as-output, batch только на судью.** До пересчёта — $-потолок конфигурируемый (D-эконом ниже), дефолты $5/$30 держим как консервативную заглушку.
|
2. **Премиум-бюджет $5/$30 УСТАРЕЛ** — выведен из калибровки на Sonnet $3/$15. Апекс теперь Gemini 3.1 Pro ($2/$12 ≤200k) с **обязательным thinking** (reasoning биллится как output $12/M — тот же класс недоучёта, что сжёг vojo 30–44%). Плюс `batch −50%` к inline-эскалации неприменим (последовательна из-за STM), только к судье/QA. Плюс Gemini = и апекс, и судья → эскалированный чанк платит Gemini дважды (перевод+ре-джадж), оба с форсированным reasoning. **Полигону: пересчитать бюджет на фактическом Sonnet-free стеке с reasoning-as-output, batch только на судью.** До пересчёта — $-потолок конфигурируемый (D-эконом ниже), дефолты $5/$30 держим как консервативную заглушку.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -49,6 +49,8 @@
|
||||||
|
|
||||||
## D. Иерархическая память (резюме) — «вторая половина банка», почти не покрыта
|
## D. Иерархическая память (резюме) — «вторая половина банка», почти не покрыта
|
||||||
|
|
||||||
|
> Строки D1/D2 ниже — ID секции D этого РЕЕСТРА (буква-секция + номер, как A1/E1/F1); НЕ путать с решениями D1–D12 из `05-decisions-log.md`.
|
||||||
|
|
||||||
| # | Сценарий отказа | Вер./Тяж. | Механизм защиты | Слой | Где в коде/схеме | Фаза | Статус |
|
| # | Сценарий отказа | Вер./Тяж. | Механизм защиты | Слой | Где в коде/схеме | Фаза | Статус |
|
||||||
|---|---|---|---|---|---|---|---|
|
|---|---|---|---|---|---|---|---|
|
||||||
| D1 | **Пропагация ошибки резюме**: галлюцинированный/неверный факт в резюме главы инъектируется как авторитетный контекст и **компаундится по 1000 глав — post-check-аналога у резюме НЕТ** (у глоссария есть GalTransl layer-3, у резюме — ничего) | С / 🟠🔇 | Отдельный gate для резюме: сверка сущностей резюме против глоссария/coverage; батч-судья фактичности резюме раз в арку; резюме — не «авторитет по умолчанию» | DET+LLM(батч) | схема резюме; гейт резюме | 2 | ❌ **первоклассный пробел** — все направления ~на 90% про глоссарий (находка критика) |
|
| D1 | **Пропагация ошибки резюме**: галлюцинированный/неверный факт в резюме главы инъектируется как авторитетный контекст и **компаундится по 1000 глав — post-check-аналога у резюме НЕТ** (у глоссария есть GalTransl layer-3, у резюме — ничего) | С / 🟠🔇 | Отдельный gate для резюме: сверка сущностей резюме против глоссария/coverage; батч-судья фактичности резюме раз в арку; резюме — не «авторитет по умолчанию» | DET+LLM(батч) | схема резюме; гейт резюме | 2 | ❌ **первоклассный пробел** — все направления ~на 90% про глоссарий (находка критика) |
|
||||||
|
|
@ -66,7 +68,7 @@
|
||||||
|
|
||||||
| # | Сценарий отказа | Вер./Тяж. | Механизм защиты | Слой | Где в коде/схеме | Фаза | Статус |
|
| # | Сценарий отказа | Вер./Тяж. | Механизм защиты | Слой | Где в коде/схеме | Фаза | Статус |
|
||||||
|---|---|---|---|---|---|---|---|
|
|---|---|---|---|---|---|---|---|
|
||||||
| F1 | **`snapshotID` не покрывает память → тихий расходящийся ре-пэй (D5.2)**. Подтверждено кодом: `snapshotID` (`runner.go:145-163`) хэширует brief/chunker/план-стадий/сэмплинг, но **не** версию approved-глоссария и **не** параметры сборки контекста; `RequestHash` (`render.go:158`) включает контент `msgs`; `render.go:23-29` декларирует рендер «чистой функцией snapshot». Как только Фаза 1 инъектит память в `msgs` (`render.go:133-136`): изменённый глоссарий/STM меняет `request_hash`, но не `snapshotID` → resnapshot-гейт (`runner.go:260`) молчит → ре-ран старой главы промахивается мимо чекпоинта и **переоплачивает расходящимся переводом**, ломая инвариант Р6 | В / 🔴🔇 | **Свернуть в snapshot ОБА:** (1) состояние памяти (версия-счётчик approved-глоссария + резюме/series-bible на момент старта джобы — рендер читает **замороженную** версию, не live) и (2) context-assembly-конфиг (`glossary_injection`, `stm_depth`, `overlap`). Тогда рендер снова чист по snapshot. **✅ УЖЕ СДЕЛАНО (commit 5eaf2d9): snapshot содержит `context_assembly` (`GlossaryInjection`/`GlossaryTokenBudget`) + `MemoryVersion` — материализует память → хеш (выбран мой рекомендованный «материализующий» вариант); `Capability` тоже свёрнут. `memoryVersion()` пока хеширует константу-заглушку `tm-memory-v1\x00`, т.к. банк памяти v2 ещё не приземлился (комментарий в коде явно фиксирует инвариант).** | DET | `runner.snapshotID()`/`memoryVersion()`/`contextSnap` | сделано; активируется с v2 | ✅ структурно закрыто (5eaf2d9). **ОСТАЁТСЯ узко: при приземлении глоссария заменить константу в `memoryVersion()` на хеш ORDER BY-стабильных материализованных строк (замороженных, не live) — иначе F1 тихо регрессирует.** |
|
| F1 | **`snapshotID` не покрывает память → тихий расходящийся ре-пэй (D5.2)**. Подтверждено кодом: `snapshotID` (`runner.go:145-163`) хэширует brief/chunker/план-стадий/сэмплинг, но **не** версию approved-глоссария и **не** параметры сборки контекста; `RequestHash` (`render.go:158`) включает контент `msgs`; `render.go:23-29` декларирует рендер «чистой функцией snapshot». Как только Фаза 1 инъектит память в `msgs` (`render.go:133-136`): изменённый глоссарий/STM меняет `request_hash`, но не `snapshotID` → resnapshot-гейт (`runner.go:260`) молчит → ре-ран старой главы промахивается мимо чекпоинта и **переоплачивает расходящимся переводом**, ломая инвариант Р6 | В / 🔴🔇 | **Свернуть в snapshot ОБА:** (1) состояние памяти (**content-hash материализованного** approved-глоссария + резюме/series-bible на момент старта джобы — рендер читает **замороженную** версию, не live; **D8: content-hash, НЕ версия-счётчик** — счётчик молча дрейфует, если забыли бампнуть) и (2) context-assembly-конфиг (`glossary_injection`, `stm_depth`, `overlap`). Тогда рендер снова чист по snapshot. **✅ УЖЕ СДЕЛАНО (commit 636919c): snapshot содержит `context_assembly` (`GlossaryInjection`/`GlossaryTokenBudget`) + `MemoryVersion` — материализует память → хеш (выбран мой рекомендованный «материализующий» вариант); `Capability` тоже свёрнут. `memoryVersion()` пока хеширует константу-заглушку `tm-memory-v1\x00`, т.к. банк памяти v2 ещё не приземлился (комментарий в коде явно фиксирует инвариант).** | DET | `runner.snapshotID()`/`memoryVersion()`/`contextSnap` | сделано; активируется с v2 | ✅ структурно закрыто (636919c). **ОСТАЁТСЯ узко: при приземлении глоссария заменить константу в `memoryVersion()` на хеш ORDER BY-стабильных материализованных строк (замороженных, не live) — иначе F1 тихо регрессирует.** |
|
||||||
| F2 | **Токен-бюджет: eviction не определён**. При превышении бюджета (matched + sticky > лимит) **какая запись выпадает — не задано**; выпавшая нужная запись = тихая деградация | С / 🟡🔇 | Явная политика приоритета/вытеснения (World Info inclusion-groups: approved>auto; персонажи чанка>фоновые) **+ логировать факт вытеснения** (не молча) | DET | сборщик; `retrieval-state` запись | 1 | ❌ политика и лог вытеснения не специфицированы (находка критика) |
|
| F2 | **Токен-бюджет: eviction не определён**. При превышении бюджета (matched + sticky > лимит) **какая запись выпадает — не задано**; выпавшая нужная запись = тихая деградация | С / 🟡🔇 | Явная политика приоритета/вытеснения (World Info inclusion-groups: approved>auto; персонажи чанка>фоновые) **+ логировать факт вытеснения** (не молча) | DET | сборщик; `retrieval-state` запись | 1 | ❌ политика и лог вытеснения не специфицированы (находка критика) |
|
||||||
| F3 | **Конкурентность/порядок в SQLite**: параллельный перевод чанков + запись auto-записей ломает `first-translation-wins` и sticky (оба предполагают последовательность); modernc — один писатель | С / 🟡 | Явное правило: auto-экстракция и коммит терминов — только на **границе джоб** (impl-notes §3.2 это уже фиксирует); sticky/порядок считаются от детерминированной пересборки чекпоинтов, не от wall-clock порядка | DET | граница джоб; write-пул store | 1 | 🔶 назвать явно (находка критика) |
|
| F3 | **Конкурентность/порядок в SQLite**: параллельный перевод чанков + запись auto-записей ломает `first-translation-wins` и sticky (оба предполагают последовательность); modernc — один писатель | С / 🟡 | Явное правило: auto-экстракция и коммит терминов — только на **границе джоб** (impl-notes §3.2 это уже фиксирует); sticky/порядок считаются от детерминированной пересборки чекпоинтов, не от wall-clock порядка | DET | граница джоб; write-пул store | 1 | 🔶 назвать явно (находка критика) |
|
||||||
| F4 | **Один SQLite-файл на книгу = SPOF**: повреждение файла молча теряет весь глоссарий+резюме | Н / 🟠🔇 | Бэкап/интеграл-чек/версионирование файла книги; экспорт TMX/TBX как побочный бэкап | DET | store; экспорт | 2 | 🔶 нет строки бэкапа/интеграла (находка критика) |
|
| F4 | **Один SQLite-файл на книгу = SPOF**: повреждение файла молча теряет весь глоссарий+резюме | Н / 🟠🔇 | Бэкап/интеграл-чек/версионирование файла книги; экспорт TMX/TBX как побочный бэкап | DET | store; экспорт | 2 | 🔶 нет строки бэкапа/интеграла (находка критика) |
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,8 @@
|
||||||
|
|
||||||
Дата исследования: 2026-07-04. Все URL проверены поиском/чтением на дату исследования.
|
Дата исследования: 2026-07-04. Все URL проверены поиском/чтением на дату исследования.
|
||||||
|
|
||||||
|
> **⟶ ЧАСТИЧНО ПЕРЕОПРЕДЕЛЕНО (2026-07-05).** Числа этого дока и рекомендация «SQLite+FTS5+sqlite-vec / эмбеддинги» на ГОРЯЧЕМ пути переопределены: горячий путь детерминированный (Aho-Corasick, НЕ FTS5/не эмбеддинги), числа не переносятся на zh/ja→ru. Актуально: [research/13-memory-bank-validation.md](13-memory-bank-validation.md) + [research/14-adaptive-memory.md](14-adaptive-memory.md) + реестр [architecture/06-memory-risk-registry.md](../architecture/06-memory-risk-registry.md). Оставлен как первоисточник обоснований.
|
||||||
|
|
||||||
## TL;DR
|
## TL;DR
|
||||||
|
|
||||||
1. **"MemPalace" существует** — это реальный open-source проект (апрель 2026, ~57k звёзд GitHub, MIT, Python + ChromaDB), но независимый разбор показал разрыв «маркетинг vs код»: бенчмарк-цифры фактически измеряли дефолтные эмбеддинги ChromaDB, часть заявленных фич отсутствует в коде. **Форкать не стоит**; полезно заимствовать идеи (иерархия Wings→Rooms→Drawers, «пробуждение» за ~170 токенов).
|
1. **"MemPalace" существует** — это реальный open-source проект (апрель 2026, ~57k звёзд GitHub, MIT, Python + ChromaDB), но независимый разбор показал разрыв «маркетинг vs код»: бенчмарк-цифры фактически измеряли дефолтные эмбеддинги ChromaDB, часть заявленных фич отсутствует в коде. **Форкать не стоит**; полезно заимствовать идеи (иерархия Wings→Rooms→Drawers, «пробуждение» за ~170 токенов).
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,8 @@
|
||||||
|
|
||||||
Дата исследования: июль 2026. Статус: закрытие пробела (gap #1) к docs 01/04/08/09. Не является юридической консультацией.
|
Дата исследования: июль 2026. Статус: закрытие пробела (gap #1) к docs 01/04/08/09. Не является юридической консультацией.
|
||||||
|
|
||||||
|
> **⟶ ПЕРЕОПРЕДЕЛЕНО контуром (2026-07-05).** BYOK / РФ-ИП / ЮKassa / RU-платёжные рельсы и Anthropic-в-стеке — ОТМЕНЕНЫ владельцем: единый EU-SaaS контур с прямыми ключами ([Р5](../architecture/01-decisions.md)), Anthropic выброшен за дороговизну (Р4/D3, `c7f8a95`). Оставлен как фон по санкциям/гео/оценке спроса (SAM/SOM в Р7/Р9).
|
||||||
|
|
||||||
## TL;DR
|
## TL;DR
|
||||||
|
|
||||||
1. **Прямой доступ из РФ закрыт у 4 из 7 провайдеров стека**: OpenAI, Anthropic, Google Gemini и xAI блокируют РФ по IP, карте и региону аккаунта; с июля 2024 OpenAI режет API-трафик из неподдерживаемых стран активно. **DeepSeek — единственный «большой» провайдер, доступный из РФ по IP без VPN**, но оплатить его российской картой нельзя (реально — Alipay или посредники).
|
1. **Прямой доступ из РФ закрыт у 4 из 7 провайдеров стека**: OpenAI, Anthropic, Google Gemini и xAI блокируют РФ по IP, карте и региону аккаунта; с июля 2024 OpenAI режет API-трафик из неподдерживаемых стран активно. **DeepSeek — единственный «большой» провайдер, доступный из РФ по IP без VPN**, но оплатить его российской картой нельзя (реально — Alipay или посредники).
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,8 @@
|
||||||
|
|
||||||
Цель: разрешить противоречие doc 04 ↔ doc 08 по OpenAI, дать проверенный срез enforcement-практики по всем провайдерам и зафиксировать двухканальную маршрутизацию NSFW для MVP. Все даты и статусы проверены поиском на 04.07.2026; непроверенное помечено.
|
Цель: разрешить противоречие doc 04 ↔ doc 08 по OpenAI, дать проверенный срез enforcement-практики по всем провайдерам и зафиксировать двухканальную маршрутизацию NSFW для MVP. Все даты и статусы проверены поиском на 04.07.2026; непроверенное помечено.
|
||||||
|
|
||||||
|
> **⟶ ЧАСТИЧНО ПЕРЕОПРЕДЕЛЕНО (2026-07-05).** Роутинг вокруг «избегания Anthropic-аккаунтов» неактуален — Anthropic выброшен из стека целиком (Р4/D3, `c7f8a95`). Двухканальная модель A/B и срез enforcement-политик провайдеров остаются справочником.
|
||||||
|
|
||||||
## TL;DR
|
## TL;DR
|
||||||
|
|
||||||
1. **Противоречие разрешено в пользу doc 04**: OpenAI «adult mode» так и не запустился — анонс 14.10.2025, перенос с декабря на Q1 2026, перенос 06–07.03.2026, **бессрочная заморозка 26.03.2026** (FT/TechCrunch). Doc 08 неверно трактовал Model Spec 18.12.2025: там erotica осталась в «restricted»-категории с формулировкой «we're exploring» — это декларация намерения, а не разрешение. **Маршрутизировать NSFW-генерацию на OpenAI нельзя.**
|
1. **Противоречие разрешено в пользу doc 04**: OpenAI «adult mode» так и не запустился — анонс 14.10.2025, перенос с декабря на Q1 2026, перенос 06–07.03.2026, **бессрочная заморозка 26.03.2026** (FT/TechCrunch). Doc 08 неверно трактовал Model Spec 18.12.2025: там erotica осталась в «restricted»-категории с формулировкой «we're exploring» — это декларация намерения, а не разрешение. **Маршрутизировать NSFW-генерацию на OpenAI нельзя.**
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,8 @@
|
||||||
|
|
||||||
Дата: 2026-07-04. Закрывает пробел: «SAM $2,5–18M ARR (doc 01) и подписка $19/мес (doc 09) — гипотезы, не проверенные готовностью платить». Метод: настольное исследование + прямые замеры каталога tl.rulate.ru (live-запросы 2026-07-04, скрипт выборки — см. §1.1) + публичные Patreon-метрики (Graphtreon). Всё непроверенное помечено «(не проверено)» или «(оценка)».
|
Дата: 2026-07-04. Закрывает пробел: «SAM $2,5–18M ARR (doc 01) и подписка $19/мес (doc 09) — гипотезы, не проверенные готовностью платить». Метод: настольное исследование + прямые замеры каталога tl.rulate.ru (live-запросы 2026-07-04, скрипт выборки — см. §1.1) + публичные Patreon-метрики (Graphtreon). Всё непроверенное помечено «(не проверено)» или «(оценка)».
|
||||||
|
|
||||||
|
> **⟶ ЧАСТИЧНО ПЕРЕОПРЕДЕЛЕНО контуром (2026-07-05).** «Платёжная фрикция РФ — наш козырь» и RU-платёжная обвязка сняты: бизнес — EU-SaaS ([Р5](../architecture/01-decisions.md)), не российское юрлицо. SAM/SOM снизу-вверх и прайсинг-якоря остаются валидны (Р9).
|
||||||
|
|
||||||
## TL;DR
|
## TL;DR
|
||||||
|
|
||||||
1. **Rulate измерен напрямую (2026-07-04):** каталог 75 838 переводов, из них раздел «AI-переводы» — **14 389 (~19%)**; активных онгоингов **14 625**, из которых по случайной выборке (n=80) **85% имеют платные главы** → ~12,4 тыс. активных монетизируемых проектов. AI-перевод в нише уже не будущее, а массовая практика.
|
1. **Rulate измерен напрямую (2026-07-04):** каталог 75 838 переводов, из них раздел «AI-переводы» — **14 389 (~19%)**; активных онгоингов **14 625**, из которых по случайной выборке (n=80) **85% имеют платные главы** → ~12,4 тыс. активных монетизируемых проектов. AI-перевод в нише уже не будущее, а массовая практика.
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue