textmachine/docs/architecture/05-decisions-log.md

155 KiB
Raw Blame History

Журнал решений оркестратора — контракт D1D31 (развязки 04.07 · пост-ревью и пакеты 0910.07 · приёмка и качество-первым 1112.07)

КАРТА АКТУАЛЬНОСТИ (ревизия D31, 12.07; исторические записи ниже НЕ переписываются — дисциплина D23.3). Читая контракт целиком, держи под рукой, что чем перекрыто:

  • Полностью superseded: D1 (моно-редактор) → D17 → D30.1 (редактор БИЛИНГВ) · D9 (ja-приёмка) → D18 (蛊真人 zh→ru; ja — второй прогон) · D17 → D30.1 · скобка D19.4 «ключ без data-sharing» и D20.3 «чистый ключ = блокер пилота» → D27 (единый ключ С data-sharing, отключение перед продом) · exp04-дефолт «editor grok-4.3» (D3) → D30.1 (grok reasoning-off из редакторских ролей СНЯТ — no-op; кандидат glm-5-билингв; gemini — премиум-эскалация только за санитайзером D30.3).
  • Частично амендировано: D3 (канал B → D14.1/D19.1 + оговорки D22.5/D22.6; апекс-слаг -preview — D22.4; draft под вопросом exp13 — D30.6) · D6 («off/minimal для draft/edit» эродирован: draft thinking-ON принудительно, editor-off снят D30.1; живы per-роль принцип и D6.2-буфер) · D10 (+D24.2 alias-слепое пятно, истинная консистентность ≈99.5%) · D11-числа → exp08 → D30.4 (флип D1 = +1525%, ~$0.85/ранобэ; «$1.52» = неподписанная опция Б) · D12 (+D24.3 флоры max_tokens; +D29.1в rollup — амендмент вердикт-правила) · D13.1-арм из решающего → ПОДТВЕРЖДАЮЩИЙ (D30.1); +D25.3 prefix-анализ судьи · D14.2 закрыт D19.1/D22.4; D14.4 закрыт D22.1 · D15.3 исполнен; спека D15.2: v2→v3→v3.1 (D22.2), реализация = текущий пакет (D30.9) · D24.4 +D28.1 (precision/recall-трейдофф; hard-gate требует пере-замера) · порядок D24.5 отложен D26.1 (этап B — после читаемых 25 глав).
  • Живое ядро без изменений: D2 (+новый гейт-класс D30.3), D4, D5, D7, D8, D10-механизм, D12-таксономия отказов, D16, D18, D19.119.2, D21 (Ф2-механизмы voice/address/reveal), D22.522.7, D23 (golden = инвариант №8), D24D31 — действующая голова контракта.

Ответ на вопросы бэкенд-сессии (PROGRESS §«Вопросы от бэкенда», §«[НУЖНО РЕШЕНИЕ] перед Фазой 1» — с ревизии D31 в archive/PROGRESS-2026-07-04-10.md) и полигона (think-режим). Каждое решение прошло адверсариальную панель из 3 критиков (research / экономика / исполнимость в коде Фазы 0); ни одно не отклонено, все уточнены. Это контракт Фазы 1 — бэкенд исполняет отсюда; при конфликте с буквой 01-decisions/02-mvp-plan — источник истины здесь (потом сольём в основные доки).

Статусы: принято · + принято с уточнением панели.


D12. Модель устойчивости к отказам (веха coverage-гейта, 04.07) — заземлена на durable-execution prior-art

4 вопроса бэкенда + большой вопрос владельца «падать ли / фолбечиться / как не терять книгу». Заземлено ресёрчем (Temporal / Step Functions / Airflow / River / Stripe idempotency / OpenRouter/LiteLLM fallback; проверено по первоисточникам).

4 вопроса — все A:

  • 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.
  • Q3 (детект): только excision_suspect (нижняя граница). Верхняя аномалия-дописывание ложно флагает (ru-выход 1.41.9× исходника) — нужен entity-счёт+судья (Ф2); coverage_fail/D10 блокирован памятью v2.
  • Q4 (активация): opt-in (enabled:false), тестами. Боевой флип — после валидации precision владельцем на реальных чанках (порог N флагов — за владельцем); до починки диалоговой сегментации флип ложно флагал бы диалого-плотные главы. [exp07, коммит 3911baf]: precision гейта = 0 ложных/57 на реальных чанках; вердикт главы — ≥2 флага→fail, 1→attention; finish_reason=content_filter не эмитит ни один из 5 провайдеров (ветка эмпирически мертва). Флип enabled:true всё ещё за подписью владельца.

Таксономия отказа — ТРИ класса (не бинар «фолбэк vs пауза» — это мис-фрейминг):

Класс Триггер Реакция
Транзиентный / бюджетный 429/5xx/timeout; finish=length/пустой same-model retry (ось attempt, бо́льший max_tokens); ретраятся только {length, empty}
Детерминированный контент-провал echo / cjk_artifact / excision / refusal — HTTP 200! детектит app-слой post-settle, НЕ транспорт single-hop escalation на ДРУГУЮ модель (same-model retry бессмыслен); 1 хоп → флаг; отдельная ось модели в request_hash (не attempt); escalation.budget_usd; результат ре-гейтится; канал B изолирован ТИПОМ (permissive/nil-guard в failover.go), пишет новую TM-запись (model_id в ключе)
Outage / системный 503-storm, 429-исчерпание, terminal-4xx, ceiling — не per-chunk circuit-breaker (Azure Closed/Open/Half-Open, ~30с health-окно) → пауза джобы + resume (НЕ mass-swap: D4, стиль поплывёт + TM-инвалидация); супервизор рестартит tmctl

F3 фикс (оплаченный неидемпотентный вызов):

  • Provider idempotency-key = существующий request_hash, заморожен на входе (константа через транспорт-ретраи и resume), в заголовке Idempotency-Key где поддержано. ⚠ Матрица (проверено по первоисточникам): OpenAI поддерживает; DeepSeek / xAI / Gemini / Kimi — НЕТ. Центральный стек (draft-DeepSeek, editor-grok, judge-Gemini) provider-dedup не имеет → не архитектурить F3 вокруг него. Capability-флаг supports_idempotency_key в models.yaml (в готовый capability-слой).
  • Для непокрытого стека — at-most-once cap: класс «billed-but-unconfirmed» (2xx с нечитаемым НЕусечённым телом / чистый timeout после отправки) получает бюджет ≤1 доп. вызова, не MaxAttempts1 (Temporal «maxAttempts=1 для non-idempotent»). Восстанавливает приёмку «≤1 вызов». + консервативный settle оценки (не Release) на post-send-timeout, чтобы потолок не был слеп (расширить существующий BilledDecodeError-путь); ledger-состояние AMBIGUOUS-BILLED. Честная модель — «at-most-once billed, replay бесплатен», не exactly-once (saga/exactly-once на оплаченный вызов не мапятся).

Consistency-aware fallback by stage: draft-фолбэк свободно (editor ре-нормализует стиль — 2605.13368); editor pinned per book (на отказе editor — пауза / same-family, не чужая модель); model-per-chunk логировать для последующего uniformity-пасса. Global call-budget guard: суммарные попытки на чанк = retries_on_primary + 1 fallback hop, НЕ сбрасывается на фолбэке (иначе retry×fallback = 30+ оплаченных вызовов — LiteLLM #19985).

Прогресс — единственный реальный пробел (ответ на «подсвечивать прогресс»):

  • tmctl status --config book.yamlREAD-ONLY проекция chunk_status+jobs+spend+request_log (Temporal query-handler аналог; 0 LLM, 0 replay); --json (стабильные disposition/flag_reason enum как контракт) для CI/IDE. chunk_status бэкенд УЖЕ построил — read-model есть; нет только команды и знаменателя.
  • Book manifest на snapshot (всего глав/чанков-на-главу) — иначе честный N/M невозможен. Вести unit-счётом (done/in-progress/flagged/skipped/pending), % только из N/M; никакого синтетического time-бара (fictional-bar анти-паттерн, Cloud Four).
  • Словарь статусов (Airflow/Step-Functions): flagged≠failed (jobs.status.failed = infra-only), skipped с upstream-reason; всегда REASON (GitLab «explain why skipped»).
  • Паспорт качества главы (JUnit <testsuite> + SonarQube gate): chunks total/ok/flagged/skipped, worst flag_reason, coverage-вердикт (pass|attention|fail по 5002500-char порогам), $, версия — против «проклятия 300-й главы» (04-unhappy §10).
  • ETA от сглаженного throughput (EWMA α≈2/(n+1)), не present-state; unit-счёт ведущий, ETA вторично. Деньги в status: committed/reserved/ceiling%, F3-честный кумулятив, projected book cost = (cost/done-chunk)×remaining. Re-drivable флагнутые (Step Functions redrive), не трогать DispOK.

Не строить (cautions верификатора): distributed-движок (Temporal/Step Functions инфра — мы single-node/один файл, брать паттерны не инфру и не их HA-числа); прозрачный cross-provider fallback главного пути (D4); детектор контент-провала в транспорте (обязан быть app-слой post-settle — транспорт видит 200); real-time SSE-прогресс (Ф3, IDE вне MVP); наивный параллелизм чанков (гонка Runner.clients + «коммит терминов только на границе джоб»).


Вторая волна развязок Фазы 1 (04.07, вопросы бэкенда после survey) — D8D11

Онбординг-поправки бэкенда ратифицированы: (1) дефолт-редактор grok-4.3 @ temp 0.4 thinking-OFF (не Kimi — «Kimi-editor 400» как повод для capability-слоя снят; живые 400 дают Gemini/gpt-5); (2) deepseek-v4-pro нигде не подтверждён → слаг канала A резолвить через /models, не хардкодить (deepseek-chat депрекейт 2026-07-24, ~3 недели — миграция черновика срочная); (3) Gemini wire-слаг gemini-3.1-pro-preview (суффикс несущий, голый → 404); (4) models.yaml на диске отстаёт — бэкенд обновляет сам (его зона); (5) F4 (усечённый length течёт в edit как OK) чинить в A, F3 (retryable-but-paid переоплата) учесть явно. A/B/C-план бэкенда принят как есть.

D8 (Q1) — memory-компонент snapshotID: content-hash материализации (не version-counter).

Хэшировать детерминированно ORDER-BY-материализованное полное состояние инъектируемой памяти на старте джобы (approved-глоссарий + резюме + series-bible-lite — тот пул, из которого per-chunk селективная инъекция потом выбирает; сам per-chunk выбор детерминирован и уже покрыт request_hash через rendered messages). Drift-proof — решающий довод: version-counter (буква §3.2/D5.2) молча дрейфует, если забыли бампнуть, и переоткрывает ровно тот баг тихой переоплаты, который D5.2 закрывает. Content-hash забыть нельзя. Стоимость (хэш пула раз на джобу, не на чанк) — ничтожна, не горячий путь. Правит §3.2: memory-компонент снапшота = content-hash, не счётчик.

D9 (Q2) — приёмочная книга Фазы 1 = ja→ru ранобэ (~150k токенов). +

Причины: соответствует флагманскому «ранобэ»; COGS-запас (R5 ~$3.1 стандарт vs потолок); ставит ruby/фуригану на критический путь импорта — форсирует закрытие известной дыры (04-unhappy §4), иначе отложат и забудут. Уточнение (границы ruby): извлекать чтения фуриганы при первом появлении → глоссарий-лок имени, НЕ сохранять ruby в выходной вёрстке (это остаётся ограничением epub-v1, план:25). Хедж: если полное ruby-извлечение окажется тайм-синком, блокирующим веху — принять на ранобэ, где чтения имён капчатся из первого появления обычным путём, а полный ruby-лок — fast-follow внутри Фазы 1. CJK-echo (zh) тестируется CJK-гейтом отдельно (не требует zh-приёмочной книги). Все три пары строятся; коммерческая проверка пар — пилот Ф2.5.

D10 (Q3) — знаменатель глоссарной консистентности = ВСЕ approved-термины (имена + выдуманные термины/титулы).

Матчит букву R7 («гейт считает approved-термины») и — важнее — бьёт по реальной жалобе №1 читателей: коллапс терминосистемы рангов/титулов («Immortal, immortal or immortal», 04-unhappy §1) страшнее скачущих имён. Гейт параметризовать (знаменатель = вхождения src/алиасов, числитель = лемма dst по decl), names-only — как под-метрика для диагностики. Порог 98% — на детерминированном слое (pre-replace+инъекция+post-check) достижим (механизм не модель-зависим); если приёмка покажет систематическую недостижимость — ревизуем порог, НЕ знаменатель (не геймить метрику сужением).

D11 (Q4) — премиум-микс: конфиг-потолок, не гейт приёмки + — но ОБА cost-числа устарели, не только премиум.

budget_usd = R5-clamp; дефолты под селективный apex (пересчёт ВЫПОЛНЕН — exp08): ранобэ/роман $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 через ЯВНЫЙ reasoning_effort:none — дефолт grok = low, gemini reasoning-as-output); мягкий sanity-check ~$0.69/ранобэ (exp08), жёсткий гейт $0.6/$5 СНЯТ. Числа пересчитаны — exp08 (draft DeepSeek + editor grok + премиум Gemini).

Ре-флаг (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 как валидированная замена под рукой.


D1. Редактор C1 — монолингвальный. +

Решение: редактор Фазы 1 видит только черновик + одобренный глоссарий (dst-термины как target-констрейнты), не исходник. Убрать {{text}} из prompts/editor.md.

Обоснование: издательская норма (редактор не знает язык оригинала — research/07); билингвальный редактор в zh→ru якорится к исходнику и плодит кальки (главная translationese-болезнь); монолингвальный редактор к тому же дешевле (исходник не сидит на входе каждого edit-вызова).

Уточнения панели (обязательны):

  1. Честно: coverage-гейт НЕ контролирует верность. Он ловит только omission/дописывание по длине; same-length mistranslation (свап рода, «кто кого», неверная полисемия) проходит насквозь. Значит в Фазе 1 верность после черновика не контролирует ничто до билингвального судьи Фазы 2. Это допустимо (Фаза 1 — инфраструктурная веха), но записать прямо: приёмка Фазы 1 не содержит критерия верности — не маскировать это coverage-гейтом.
  2. Пилот Ф2.5: плечо C1 (draft→editor) меряется на win-rate только вместе с живым билингвальным судьёй — иначе C1 по собственному признанию полирует неверное в «гладко-неверное».
  3. Код: убрать {{text}} меняет SHA256 шаблона → resnapshot-гейт сработает громко (хорошо), но prompt_version: "v0-draft" в pipeline-c1.yaml станет врать (тот же лейбл на двух SHA). Поднять edit prompt_version при этой правке.

D2. Диспозиция плохого чанка — skip+flag+continue. +

Решение: finish=length → ретрай с бо́льшим max_tokens до капа, потом флаг; hard refusal/content_filter → флаг+продолжить; пустой оплаченный → skip+flag (не падение прогона); soft refusal (blacklist) → флаг. Флагнутый чанк не коммитит мусор/пустоту в TM.

Уточнения панели (обязательны):

  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.
  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. [exp07: НЕ эмитит ни один из 5 — ветка эмпирически мертва, страховка = refusal-blacklist гейт.]
  5. Edit max_tokens считать от длины ЧЕРНОВИКА, не исходника (runner.go:283-287 сейчас от source). Для монолингвального редактора (D1), чей вход/выход ≈ русский черновик (~1.9× токенов исходника zh→ru), оценка от source мис-сайзит бюджет и ложно триггерит length-ретрай.

D3. Эскалация. +

Решение: канал A — DeepSeek V4 Pro → GLM-5.1 → апекс Gemini 3.1 Pro (wire-слаг ТОЛЬКО gemini-3.1-pro-preview, голый → 404 — испр. оркестратором по пингу пакета №3/D22; квирк ратифицирован 04.07, см. преамбулу D8D11); канал B (18+) — Grok 4.3 основной пермиссивный тир + DeepSeek офиц. + локальная abliterated. Sonnet удалён (Anthropic — дорого); OpenAI остаётся (ключ есть) — GPT-5 nano альт черновика, GPT-5 mini кандидат в редакторы/second-opinion судьи.

Правка по 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-preview — лучшая проза → премиум-эскалация редактора. 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. Часть моделей ОТСУТСТВУЕТ в конфиге (частично закрыто на 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-preview в 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 — эталонная таблица квирков.
  2. Премиум-бюджет $5/$30 УСТАРЕЛ — выведен из калибровки на Sonnet $3/$15. Апекс теперь Gemini 3.1 Pro ($2/$12 ≤200k) с обязательным thinking (reasoning биллится как output $12/M — тот же класс недоучёта, что сжёг vojo 3044%). Плюс batch 50% к inline-эскалации неприменим (последовательна из-за STM), только к судье/QA. Плюс Gemini = и апекс, и судья → эскалированный чанк платит Gemini дважды (перевод+ре-джадж), оба с форсированным reasoning. Полигону: пересчитать бюджет на фактическом Sonnet-free стеке с reasoning-as-output, batch только на судью. До пересчёта — $-потолок конфигурируемый (D-эконом ниже), дефолты $5/$30 держим как консервативную заглушку.

D4. Provider-fallback — НЕ добавлять для облачных draft/edit. +

Решение: авто-кросс-провайдерного фоллбека для облачных ролей нет (фоллбек драфта = разный стиль/термины по чанкам + model_id в ключе TM обнулит хиты на ре-ране). Провайдер лёг → durable pause → resume. Локальный→облако failover из vojo — только для local-ролей, channel-aware. Ночь — супервизор перезапускает tmctl.

Уточнения панели (обязательны):

  1. Channel-aware изоляция в коде НЕ обеспечена (дыра). FailoverConfig не имеет поля канала/пермиссивности — изоляция сейчас лишь doc-comment для вызывающего; сам failover в Фазе 0 не подключён. Хуже: ветка «fallback отсутствует → fail loud» сделает nil-panic (нет nil-guard, c.fallback.Complete разыменует nil), а путь «пустой local-контент → облако» — ровно тот сайлент-шип, о котором предупреждает заголовок, без guard. При подключении failover (Фаза 2): изоляцию канала B делать типом (поле permissive/channel) или явной fail-loud веткой на nil-fallback, а не комментарием.
  2. Формулировка «resume бесплатен» переусилена: техдолг F3 — retryable-но-оплаченные вызовы не идемпотентны, resume может переплатить прерванный in-flight (до MaxAttempts1). Точнее: «resume переоплачивает максимум прерванный in-flight, всё равно кратно дешевле mixed-model failover».
  3. Local→cloud failover для local-ролей канала A (экстракция глоссария, дешёвый судья-гейт) при OOM 8GB GPU молча превращает $0-вызовы в платные облачные — un-budgeted; пометить (телеметрия должна показывать, когда local-роль ушла в облако).

D5. Онгоинг Analyst — инкрементально. +

Решение: book-brief заморожен; новые главы — Analyst инкрементально расширяет резюме и ищет новые термины; approved-глоссарий/series-bible наследуются read-only, новые термины append, approved не ревизуются молча (research/07); разрешение gender=hidden-твиста — ручное событие.

Уточнения панели (обязательны):

  1. Проактивная эвристика gender=hidden. Онгоинг структурно теряет преимущество «книга целиком видит твист заранее»: инкрементальный Analyst не видит ещё не загруженных глав, поздний реверс-трап (女扮男装) → уже вмороженные главы закоммитили род. Митигация: когда Analyst в загруженных главах видит намеренную неоднозначность (омофонное ta / pro-drop без дизамбигуации), ставить gender=hidden и гнать безродовые конструкции (гайд ООН) до раскрытия, а не дефолтить в мужской (TACL-биас). Плюс ретро-патч-протокол «с тома N — так» с показом стоимости пере-перевода вмороженных глав, которые твист фальсифицировал.
  2. КРИТИЧНО (impl): snapshotID не покрывает память и сборку контекста. Сейчас хэширует только brief_hash + план стадий + defaults, не context-assembly (glossary_injection/stm_depth/overlap) и не инъектированный глоссарий/резюме/series-bible. Как только Фаза 1 начнёт инъектить память в msgs: изменённая память меняет request_hash (msgs в нём), но snapshotID не меняется → resnapshot-гейт не сработаетре-ран старой главы молча промахивается мимо чекпоинта и переоплачивает расходящимся переводом — ломается сам инвариант Р6, на который D5 опирается. Свернуть memory-state + context-assembly hash в snapshotID ДО того, как приедет инъекция Фазы 1. Это общий гейт Фазы 1 — держит и D1 (глоссарий редактору), и D5.

D6. Think-режим — не глобальный дефолт, но пилотить на переводчике. + (существенно переписано)

Решение: reasoning_effort per-роль, дефолт off/minimal для draft/edit — но по операционным причинам (эмпирика полигона: GLM ×3 таймауты, Gemini жрёт max_tokens, gpt-5-mini выжигает бюджет — 00-provider-quirks), НЕ потому что «reasoning вредит переводу».

Переписанное обоснование (панель отозвала мою посылку): прежняя «think ломает роль переводчика — пустой вывод» — отозванная находка: запись «Сессия 2 полигона» (04.07, ныне archive/PROGRESS-2026-07-04-10.md) исправляет её («пустота — артефакт тесного контекста, не зависание; с ctx 16k think завершается и реально чинит реалии: 羅生門→Радзёмон, чтение 朱雀»). DRT (research/03, arXiv:2412.17498) независимо показывает: long-CoT над метафорами/сравнениями поднимает литперевод — это роль ПЕРЕВОДЧИКА. Владелец был прав в гипотезе.

Уточнения (обязательны):

  1. Пилот Ф2.5 think-ON vs OFF по качеству включает draft/translator и editor (не только Terminologist+эскалацию, как я ошибочно сузил) — именно туда указывают и полигон, и DRT. Дефолт-off остаётся до результатов пилота.
  2. Скоуп think-ON эскалации — только subset-billing провайдеры (deepseek/zai/kimi, где reasoning ⊆ completion ≤ maxTokens, EstimateUSD покрывает). xAI/Grok исключить из think-ON пока EstimateUSD не резервирует явный reasoning-бюджет (additive reasoning xAI → «потолок пробьётся» ровно на премиум-пути канала B).
  3. Gemini-апекс/судья — форсированный think-ON (не чтит reasoning='off' → HTTP 400). Заложить его в бюджет как reasoning-as-output ($12/M), а не как opt-in. runner.go шлёт st.Reasoning — адаптеру Gemini off придётся молча глотать; этот кейс назвать явно.
  4. «×23 COGS» занижает многословных ризонеров: Kimi-k2.6 ~11k reasoning-ток./абзац = ×4…×20 на output этой роли — учесть в бюджете эскалации.

D7. Схема банка памяти v1 — скоуп. +

Решение (подтверждаю рекомендацию бэкенда с двумя правками):

  • v1 (store v2-миграция): база Р3 (src, dst, type, aliases, gender, speech, decl, since_ch/until_ch, status, note) + alias-граф (типы: имя/цзы/хао/прозвище/титул) + gender=hidden(until_ch) + translit_policy (западные имена через катакану — 04-unhappy §9) + first_person + series-bible-lite = gender + ты/вы.
  • Правка 1 (панель D5): ты/вы в series-bible-lite — журнал событий переходов, а не статичная матрица пар (переход ты↔вы — сюжетное событие, 12-ru-target §2). Поле genderс проактивной установкой hidden Analyst-ом на неоднозначности (D5.1).
  • Правка 2: nickname_translation оставить в v1 (это одна колонка + лок «перевести раз навсегда», 04-unhappy §1 относит в Фазу 1); дорогая только логика первичного перевода сильной моделью — её можно отложить, но поле держать.
  • Отложить в v1.1: ranked-set (инъективность ступеней), словарь эвфемизмов, число-словарь мер/разрядов (сам число-гейт — Фаза 1, а словарь конвертаций — v1.1).
  • Обязательно: сверка с «Следствиями для плана» 04-unhappy-paths; и snapshotID покрывает состояние памяти (D5.2) — иначе схема памяти без хеша в снапшоте молча ломает resume.

Q3/Q4 бэкенда — прямые ответы

  • Q3 (эскалационный дефолт RU-контура): см. D3 — не-Anthropic, дёшево-первым (DeepSeek Pro/GLM-5.1), апекс Gemini; Sonnet не дефолт (удалён). В будущем зарубежном контуре премиум-эскалация опциональна, но не сейчас.
  • Q4 (per-role provider-fallback): см. D4 — нет для облачных draft/edit; pause/resume; local→cloud только для local-ролей, channel-aware типом.

Требования Фазы 1, не покрытые 6 решениями (из «missed» панели) — в скоуп

  1. Runner без цикла по чанкам/главам — главный длинный шест (chapter/chunk захардкожены). Цикл + хранилище флагов + disposition-колонка — фундамент, на который опираются D2, D5, гейты, эскалация. Строить первым.
  2. snapshotID расширить memory-state + context-assembly hash ДО инъекции (см. D5.2) — общий гейт.
  3. ruby/фуригана-парсер в спеку импорта Фазы 1 (детерминированная часть, 04-unhappy-paths §4). Противоречие с планом:25 («epub v1 фуригану не сохраняет») разрешить: для ja→ru фуригана несёт авторские чтения имён → глоссарий-лок; молчаливая потеря подрывает приёмку ≥98% консистентности ja-книг. Извлекать чтения на инжесте (не сохранять инлайн-разметку, а выхватить ruby в глоссарий).
  4. Дешёвые детерминированные гейты Фазы 1 (были в 04-unhappy-paths §6/§9, но выпали из плана): линтер тире-диалогов (Розенталь §4752), ёфикатор, блок-лист транслит-междометий, число-гейт разрядов 万/億. Самый дешёвый и заметный читателю класс — «максимум воспринимаемого качества за минимум денег». Морфозависимые (канцелярит) остаются Фазой 2 (Python-сайдкар); эти четыре — детерминированные, Go, Фаза 1.
  5. Экономика инвалидации TM ([НУЖНО РЕШЕНИЕ] п.2в): смена параметров чанкера = полная инвалидация «как смена brief» с показом стоимости — да, подтверждаю (ключ TM от src-чанка, перечанкование by design инвалидирует; пользователю показывать $ пере-перевода). prompt_version и model_id в ключе (уже зафиксировано Р6) означают: правка промпта обнуляет TM-библиотеку, эскалация пишет новую запись — это осознанная плата за корректность, не баг.

Экономические открытые пункты (полигону, гейтят достоверность бюджета)

  • Пересчёт премиум-бюджета на Sonnet-free стеке с reasoning-as-output (D3.2), апекс Gemini 3.1 Pro (форсированный thinking).
  • Проброс cache-hit/batch RU-агрегаторамиСНЯТО (коррекция владельца 04.07: EU-SaaS, прямые ключи, BYOK отменён; см. Р5). Вся cache/batch-экономика теперь по прямым ключам без оговорок — это канон.
  • budget_usd: 0 в pipeline-c1.yaml — заглушка; $-потолок владелец задаёт по ценовому намерению, дефолты $5/$30 держим до пересчёта.

Пост-ревью решения D13D17 + D18D21 (2026-07-09, оркестратор)

Ратификация выводов стратегического ревью 07-strategic-review.md (метод: 14 сборщиков + 9 адверсариальных верификаторов, 8 CONFIRMED / 1 PARTIAL). Владелец подтвердил курс 09.07 (вкл. «Rust — нет, не сейчас»: Р1/Go остаётся; вопрос закрыт до пост-пилота и требует конкретного триггера, где Go упирается). Каждое решение ниже — контракт для следующих сессий «Бэкенд»/«Полигон»; хендофф-промты выдаёт оркестратор.

D13. Пилот Ф2.5 — поправки протокола (гейтят валидность главного решения).

Дополнения к experiments/09-pilot-protocol.md (полигон вносит в док и харнесс ДО пре-регистрации):

  1. Новый арм: «моно vs билингв редактор на ОДНОЙ модели, простой general-промпт» — прямой тест D1. Основание (верифицировано по PDF arXiv:2605.13368, вкл. en→ru): monolingual-рефайнмент теряет accuracy с ПЕРВОГО прохода (2.2…5.6 MQM у всех 6 моделей), general-рефайнмент С исходником даёт тот же fluency при accuracy ~flat и лучшем overall. Существующий 7-bis (моно-бейкофф МОДЕЛЕЙ) сохраняется — это другой вопрос.
  2. C2 — только с ГЕТЕРОГЕННЫМИ кандидатами (draft-кандидаты от разных моделей, не N сэмплов одной): на гомогенных селекция ≈ монета (2603.20324: WR 0.512 homogeneous; LitMT 2606.05924: best-of-8+судья — последнее место). Иначе плечо C2 предрешено и жжёт бюджет впустую.
  3. Панель судей — переконфигурация: (а) 23 семейства максимум — 9 судей ≈ 2 эффективных голоса (2605.29800), лучший одиночный ≥ панели; (б) 11+ повторов на вердикт со свапом позиций A/B — одиночный прогон нестабилен (13.6% флипов, парафраз меняет исход в 25%; 2606.13685); (в) агрегация медианой/Bradley-Terry (JP-TL-Bench-паттерн), не средним; (г) grok исключён из судейства grok-редактированных выходов (нарушение собственного анти-self-preference правила §5); (д) валидация судьи — по κ против человеческого IAA + tie-rate/top-1 within-prompt (2603.12520), не по средней корреляции.
  4. Пре-регистрация расширена: MDE/мощность (число BWS-наборов), N аннотаторов ≥3 (при «минимум владелец» κ неисчислим — тогда честно писать «безκ-режим»), развести имена: C0C3 = конфигурации ядра, M0M3 = режимы терминологии memory-eval (коллизия имён в exp09 устранена).
  5. Харнесс чинится ДО решающего прогона (верифицированные дефекты): memory_eval — стрип/запрет эха глоссарий-преамбулы, сохранение ПОЛНЫХ выходов (не out[:160]), реализация fidelity-оси (без неё правило «M3 роняет vs M0» непроверяемо; текущий индикатив ЗАНИЖАЕТ вред неверной инъекции — chunk1-C3 надут эхом); оценочные артефакты — пере-рандомизация меток по фрагментам, ключ/цены ВНЕ артефакта (слепота exp04 была структурно сломана: ключ лежал в том же документе при LLM-оценке). Инструменты: Pearmut (2601.02933) вместо самописного BWS-тулинга — оценить перед постройкой своего.
  6. Think-арм grok-редактора требует reasoning-буфера в EstimateUSD (D6.2) — иначе экономически главный think-вопрос пилот не ответит; бэкенду заложить до прогона.

D14. Канал B (18+) — ревизия состава.

  1. DeepSeek ВЫВЕДЕН из explicit-части канала B: ToS DeepSeek (upd 2026-03-27) §3.4(5) прямо запрещает «pornographic, obscene, or sexually explicit (e.g., sexual chatbots)» — верифицировано по первоисточнику. Для violence-фрагментов (не sexually explicit) DeepSeek остаётся допустим. Интерим D3 «DeepSeek офиц. + локальная abliterated» сужается до «локальная abliterated + Grok».
  2. Mistral — кандидат-фолбэк канала B: Usage Policy (eff. 2026-06-11) не содержит бланкетного запрета adult-текста (только CSAM/NCII/эксплуатация) — верифицировано по первоисточнику. Полигону: прогнать refusal/excision-пробу Mistral на explicit-корпусе, бэкенду — слот в конфиге при положительной пробе.
  3. Обоснование xAI поправлено: «цитата Маска про R-rated текст» — на деле про Grok Imagine (картинки); опора — сам AUP xAI (нет бланкетного запрета adult-текста; запрещены CSAM и порно реальных лиц). Позиция стабильна на 09.07, но политика xAI волатильна — мониторинг остаётся.
  4. 18+ эмпирика — единственный critical ревью: refusal/excision на explicit-корпусе (Grok/Mistral/abliterated) + качество Grok-судьи 18+ + поведение Gemini-судьи на explicit — обязательная рука exp02/пилота. Гейтится фрагментами от владельца.

D15. Resume-экономика и онгоинг.

Верифицировано исполнением: snapshotID вшит в RequestHash → любой --resnapshot (флип гейта, append approved-терминов, бамп версии классификатора) переоплачивает ВСЮ книгу, включая байт-идентичные запросы; redrive флагнутых нет. Решения:

  1. Текущий all-or-nothing ПРИЕМЛЕМ для статичной приёмочной книги Ф1 (гейт громкий, расхождений не бывает) — НЕ чинить до приёмки.
  2. Онгоинг-режим (add-chapters, сегмент «ИИ-фабрик») ГЕЙТИТСЯ одним из двух: content-addressed переиспользование чекпоинтов (msgsContentHash уже существует — render.go:233-249) ИЛИ селективный redrive. Бэкенду: спека-дизайн (не код) в ближайший пакет; реализация — Ф1.5.
  3. Немедленно (в ближайший бэкенд-пакет): исправить лгущие комментарии runner.go:156-160 / coverage.go:29-33 («re-classify for FREE» верно только внутри неизменного снапшота); tmctl status + redrive флагнутых — приоритет D12-хвостов подтверждён (status → redrive → F3); бампнуть edit prompt_version (D1-уточнение №3 не исполнено — один лейбл v0-draft на два SHA).

D16. Банк памяти — фиксы границ доверия (4 верифицированных дыры).

Ядро (F1/нормализация/спойлер/детерминизм/инъекция) ревью подтвердило чистым; все находки — на границах доверия, каждая воспроизведена временным Go-тестом:

  1. Полисемия same-src: две approved-записи (один src, разные sense/dst, пересекающиеся окна) инжектятся ОБЕ как CONFIRMED + post-check даёт гарантированный confirmed-miss (с гейтом ON — детерминированный livelock чанка). Фикс: fail-loud на пересекающихся окнах разных sense в loadGlossarySeed ИЛИ даунгрейд обоих совпадений в AMBIGUOUS. (memory.go:198-204,299-306; memseed.go:155-163)
  2. Sticky-апгрейд: collision-prone AMBIGUOUS попадает в activeIDs без disposition (memory.go:323) → в следующем чанке sticky даёт status-based CONFIRMED, минуя post-check, прямо в редакторские констрейнты. Фикс: наследовать disposition исходного матча в sticky-кэрри (или не класть не-CONFIRMED в activeIDs). ⚠ Это был ложно-негативный отсев 44-агентного ревью (0/3) — рациональ «sticky несёт установленный в сцене термин» не проверялась на коллизионном входе; бэкенду выборочно перепроверить остальные отсевы того ревью.
  3. Source-граница для фонетических ключей ≥4: rose (approved) фаерится CONFIRMED внутри roseanne — collision-даунгрейд покрывает только ≤3, Aho-Corasick границ не знает, target-сторона границу имеет (асимметрия). Фикс: script/word-граница на source-стороне для фонетических скриптов.
  4. Ruby-чтение не матчится: для ручных терминов чтение выбрасывается (memseed.go:217-220), у auto-кандидатов surfaces строятся только при непустом dst → ja-чанк с именем каной даёт 0 матчей. До реализации B6: ruby-reading → auto-alias ручного термина; интерим — обязательный пункт чек-листа подготовки ja-книги: kana-написания сид-имён вносить als aliases руками. Плюс: kana-precision замер (minKeyLenPhonetic=3 — «консервативный дефолт до замера») — полигону, расширение E1-протокола; C4-автозаполнение decl остаётся Ф2, но признаётся условием реалистичности жёсткого postcheck-гейта.

D17. D1 (монолингвальный редактор) — статус понижен до «дефолт Ф1, оспорен внешним замером».

D1 остаётся дефолтом Фазы 1 (менять конфигурацию до пилота не будем — kalki-риск не опровергнут, а вакуум верности Ф1 уже признан D1.1). Но: (а) сильная форма обоснования («исходник в контексте редактора ⇒ кальки») понижена до гипотезы — подтверждений в литературе 202526 нет, кальки документированы как болезнь ДРАФТА; (б) экономический довод слаб (билингв-редактор = +1520% стандарт-микса ≈ +$0.100.14/ранобэ); (в) решает пилот-арм D13.1. Если арм покажет паритет верности при моно — D1 подтверждается дёшево; если налог на верность воспроизведётся — флип на «редактор с исходником, простой промпт» дешевле любой альтернативной митигции.

Ратификации по итогам внешнего ревью двух пакетов (09.07 вечер, оркестратор)

Оба пакета (бэкенд D15/D16, полигон D13-харнесс) прошли внешнее ревью оркестратора (7 ревьюеров, всё исполнением: моки, мутационные реверты, CLI-прогоны $0, пересчёт данных). Вердикты: оба ACCEPT_WITH_FIXES, залендены (153277e, 9afea37) — блокеров на дефолтном конфиге нет, деньги/корректность целы. Решения:

  1. D16.3-дивергенция бэкенда (kana/Han без source-границы) — РАТИФИЦИРОВАНА. Кана-граница рушит recall (すずきは-класс: TP 15→1 — независимая эмпирика полигона, exp09 §6-bis), homograph-класс длино-инвариантен и границей не лечится. Митигация kana-омографов — POS/known-word-гейтинг или ruby-якорь → скоуп B6 (вместе с Палладий/Поливанов-валидатором). MIN=3 для фонетических ключей ратифицирован как дефолт (kana-замер полигона; precision там trap-set-относительная — не продовая метрика).
  2. Спека D15.2 — направление ратифицировано, реализация ЗАБЛОКИРОВАНА до доработки (3 дизайн-дыры ревью): (а) fast-path-гард обязан покрывать ВЕСЬ wire stage-план (текущий драфт теряет model/temp/reasoning/maxTokens-деривацию → смена temperature или reasoning low→none тихо отдаёт stale-текст — ре-открытие F1); (б) расщепление memory_version (wire vs verdict) — ОБЯЗАТЕЛЬНО, не «опционально» (иначе append-термина/toggle гейта = переоплата книги, главный сценарий не материализуется; подсказка ревью: postcheck пересчитывается вживую и в chunk_status не хранится — memory_version можно целиком убрать из ключа вызова); (в) замена loud-гейта согласия — pre-flight dry-run «N чанков, ~$X» с порогом явного флага (Р6-класс согласия на трату не демонтируется без замены). Плюс: полевой маппинг всего снапшота (wire/verdict/dropped), судьба chunk_status.snapshot_id/status-ридеров, sequencing миграции ДО первой онгоинг-книги, blast-radius append-а моделировать со sticky+eviction+каскадом стадий.
  3. D14.2 Mistral: refusal-часть ПРИНЯТА (11/11 ok, провенанс на месте), fidelity-числа (8595) НЕ приняты — сырых выходов и судейских вердиктов в репо нет (провенанс-обещание не выполнено); пере-прогнать с персистом до финализации D14.2. Explicit-часть — ждёт фрагменты владельца.
  4. Pearmut — отказ ратифицирован (нет BWS); инструмент пилота = тонкий свой + Potato-фронт + attention-checks.
  5. Новые задачи бэкенду (следующий пакет): (а) GB18030-детект/конверсия в ingest (реальные zh .txt — не UTF-8; укусит на первой живой книге); (б) homophone first-wins — major ревью: при двух ручных омофонах (разные dst, чтение ≥4 каны) алфавитно-первый получает авторитетный kana-алиас CONFIRMED (attachRubyAliasesToManual видит коллизию только вторым проходом; группировать чтения по нормализованному ключу МЕЖДУ базами до аттача); (в) закрепить мутационно инвариант redrive «DispOK-стадии не сбрасываются» (тест с флагом на ПОСЛЕДНЕЙ стадии; сейчас мутант выживает) + тест --reason-селектора; (г) snapshot-чек ДО ResetChunkStages (сейчас громкий отказ redrive уничтожает флаг-телеметрию); (д) minors: --json exit-код при флагах, developer-подсказка для gate-промоченного glossary_miss (redrive-тупик), README «миграции v1v6», ETA→EWMA или пометка отступления.
  6. Новые задачи полигону (следующий пакет): (а) зеркало ↔ Go: дозеркалить suppressUnboundedPhonetic (D16.3) и апостроф-фолд memnorm-v3 (оба продемонстрированы расхождением; критично для en→ru руки пилота); (б) эхо-детектор — ловить хвостовой/встроенный эхо-глоссарий, не только преамбулу; (в) Mistral-переснятие с персистом (п.3); (г) байт-синк заголовка инъекции с Go (⟨проверить⟩-пояснение); (д) minors: ts в refusal-записи, «508→500» trad2simp-дедуп/пометка, in-file карантин старых C-меточных данных.
  7. Гигиена: *.key.json добавлен в .gitignore (остаточный риск утечки ключа слепоты); правило git-координации мультисессий внесено в CLAUDE.md (инцидент: перезапись истории оркестратором при грязном дереве полигона — недопустимо без сверки чужих правок).

D18. Приёмочная книга Фазы 1 — 蛊真人 (zh→ru); ja→ru прогон отложен. (амендмент D9, решение владельца 09.07)

Решение: приёмка Фазы 1 (end-to-end книга целиком) выполняется на 蛊真人 (Reverend Insanity, «Мастер Гу»), zh→ru — реальная вебновелла от владельца, уже на стенде (чистая вычитанная .txt, GB18030; 7 глав прогнаны вебновелл-срезом). ja→ru прогон (буква D9) понижен до «второй прогон при появлении ja-epub от владельца».

Обоснование: (1) форсирующая функция D9 — «ruby на критическом пути» — ВЫПОЛНЕНА (ruby-захват/сид реализованы и покрыты тестами, шаги 3a/4); (2) zh→ru вебновелла — коммерчески флагманский сегмент («ИИ-фабрики», Р9), а ja-книги на стенде нет; (3) терминологическая плотность 蛊真人 (ранги/титулы гу, рекуррентные имена) — идеальный стресс банка памяти по жалобе №1 читателей; (4) deepseek-эхо 25% на этом тексте (замер полигона 09.07) — боевой тест echo-гейта и single-hop эскалации черновика.

Следствия: GB18030-детект/конверсия в ingest обязательны ДО прогона (пакет №2 бэкенда); сид-глоссарий 蛊真人 (имена/ранги, dst по Палладию, decl) готовит полигон с владельцем — сам текст и производные вне git (Р8: приватная обработка легальна, нарушение — при распространении); OpenCC-полнота trad2simp некритична (текст в упрощённых); Поливанов/Палладий-валидатор — B6/Ф2 как и был; epub-путь остаётся на юнитах до первой epub-книги. Приёмочные критерии 02-mvp-plan v3 не меняются, кроме пары (zh→ru) и cost-sanity (пропорция вебновеллы exp08). Эскалация draft при эхе требует заведённого escalate_to — минимум одна фолбэк-модель черновика в конфиге до прогона.

D19. Канал B v2 + развязки сида (амендмент D3/D14; по exp10 и внешнему ревью полигон-пакета №2, 09.07 поздний вечер).

Внешнее ревью пакета (4 ревьюера, всё исполнением): mirror ACCEPT, остальные ACCEPT_WITH_FIXES; микро-дефекты доков исправлены оркестратором при лендинге (слаг переводчика в exp07-Task5 = grok-4.20-0309-non-reasoning, не grok-4.3; Mistral overall = ≈93.8, не 95.4 — баг агрегации median=max при 2 судьях; счётчики 8b 8/10). Ключевая эмпирика D19 подтверждена сырьём: эхо grok-off — реальный zh verbatim при reasoning_tokens=0, контроль reasoning-ON честный (reasoning_tokens>0, те же фрагменты).

  1. Состав канала B (18+): переводчик-дефолт = Mistral (mistral-large-2512: 10/10 чисто на violence, честная fidelity ≈93.8 двумя кросс-семейными судьями, policy 11.06.2026 без запрета adult); эскалация = grok-4.3 reasoning-ON (10/10 чисто; биллинг через additive-буфер D13.6); local abliterated 8b — скрининг/дешёвый фолбэк (8/10 ok); судьи 18+ = Grok-4.3 + Gemini-3.1-pro (оба 10/10 без отказов — замена не нужна, D14.4-вопрос судей закрыт). grok reasoning-OFF как CJK-переводчик непригоден (5/10 провалов: 4 эха + 1 дегенеративный луп) — «канал B thinking-OFF» из D3/D6.2 в части переводчика ОТМЕНЁН. DeepSeek в explicit остаётся исключён (ToS; на violence переводит — контроль 9/10). Оговорки: N=10, violence-only; erotica не мерена — ждёт второй источник владельца (единственный остаток D14.4); цена Mistral перепроверяется до wiring экономики (комментарий $0.5/$1.5 при $2/$6 на маркетинг-странице — 4×).
  2. Эхо-класс обобщён: «reasoning-off + плотный CJK-вход = зона эха» — свойство класса моделей (DeepSeek, оба grok-слага), не квирк вендора. Полигону: обобщающая строка в 00-provider-quirks.md. Митигации промптом — мандат voice-state ресёрча (3-bis). Echo-гейт вниз по потоку — обязателен навсегда, промпт-митигции его не заменяют.
  3. Сид-развязки ратифицированы: (а) значащие имена гу — ПЕРЕВОД (пиньинь в note; исключения через translit_policy); (б) 古月 = «Гуюэ» слитно (составная клановая фамилия, аналогия Сыма/Оуян); (в) 白凝冰 → gender=hidden, НЕ female/draft — это хрестоматийный кейс механизма D5.1 (первые главы 他/«он», канон female): безродовые конструкции до раскрытия; until_ch выставить при определении главы раскрытия (полигону при следующей курации сида — правка одного поля).
  4. Гигиена xAI пост-фактум: прогон exp10 на текущем (единственном, платном, без data-sharing) xAI-ключе — ратифицирован; категория «приёмочная книга владельца (копирайт, не клиентская)» — допустима для eval-обработки (Р8, приватная обработка); data-sharing промо-аккаунт — по-прежнему только PD. До пилота: завести выделенный NSFW/eval-ключ xAI, разделение ключей зафиксировать.
  5. Fix-лист полигону (микро, со следующим пакетом): агрегация mistral_fidelity.py (mean при n=2); перепроверка цены Mistral по офиц. прайсу; провенанс-нота ahq_final (прогнан до-Task-1 зеркалом — для zh no-op); токен-корзина ゛゜/々/halfwidth-кана (info); line-start-FP эхо-детектора задокументировать.
  6. Пинг бэкенду (СРОЧНО, до их коммита): внешний ревьюер заметил в их незакоммиченном memseed.go:463-466 отладочную заглушку if true { return false }, отключающую contested()-проверку омофонов (их же фикс 1a!), + временный zz_probe_test.go в дереве. Убрать до коммита пакета.

D20. Приёмка бэкенд-пакета №2 + ратификация D15.2 v2 с правками + развязки §13 (09.07 ночь).

Внешнее ревью (5 ревьюеров, всё исполнением и мутациями; smoke-деньги сверены по артефактам БД до микроцента): fixlist/spec-v2 — ACCEPT_WITH_FIXES, ingest/gates/smoke-coord — ACCEPT. Пакет залендён (b51ac4c). Заглушка contested() из D19.6 убрана и мутационно защищена (проверено реинжекцией мутанта). Ingest-клеймы воспроизведены точно (2283 главы / 5088 чанков / 0 U+FFFD на реальном GB18030-файле); Shift-JIS/EUC-JP-ловушка отсекается zh-скоупом (mutation-verified).

  1. Спека D15.2: направление и 90% деталей РАТИФИЦИРОВАНЫ; реализация разблокируется после v3-правок (обе маленькие, бэкенду со следующим пакетом): (а) role + имя стадии в guard_hash — без них формула не суперсет текущей защиты (конструируемый stale-VERDICT fast-path hit при флипе роли; заявление «строго сильнее» пока ложно); (б) аналитическое правило editor-каскада в dry-run §7: любая стадия ниже re-bill-юнита того же чанка считается re-bill (иначе консент-проекция занижает ~2× на самом дорогом классе правок — temp/reasoning/model translator'а); (в) доукомплектовать маппинг §4: style_check_version, слой YoPolicy/StyleAllowlist («dropped: live-recomputed, класс post-check»), memoryNormVersion (target-часть) — и в postcheck-версию, судьба jobs.snapshot_id одним предложением, verdict-фолд конфига гейтов только при enabled (дисциплина coverageSnap).
  2. Ответы на §13: Q1 — пер-стадийная гранулярность wireSnapshotID, ДА (живой довод: вероятная смена редактора glm-5→grok-4.3 при book-global пере-оплатила бы весь translator-бэклог; поверхность мала — snapshotID уже итерирует стадии). Q2 — порог min($0.50, 5%×ProjectedBookUSD) и флаг --accept-rebill[=usd] — ПРИНЯТЫ с поправками: сначала фикс каскада (п.1б), форма флага с опциональным потолком суммы (Р6 = согласие на КОНКРЕТНУЮ трату), fallback-флор при ProjectedBookUSD=0. Q3 — Adult остаётся wire/verdict-нейтральным, слой не назначать; вместо хеша — load-time линт консистентности (adult:true без единой channel:adult-стадии → громко); первый рантайм-потребитель Adult обязан явно назначить слой.
  3. Редактор приёмки Ф1: приёмка — инфраструктурная веха (деньги/resume/гейты/консистентность; качество меряет пилот) → glm-5-редактор ДОПУСТИМ для приёмки, если чистый xAI-ключ не появится к её старту; пилот Ф2.5 требует боевой grok-4.3-редактор → чистый xAI-ключ (без data-sharing) от владельца — блокер пилота, не приёмки. ja-путь: Shift-JIS сознательно fail-loud (ja-книги UTF-8/epub) — ратифицировано.
  4. Fix-лист бэкенду №3 (не блокирует приёмку): README «миграции v1v7» (устарел в том же пакете); cheap-gates v2 (3 ложных срабатывания адверсариального ревью: «-цитата с начала строки как «смешение стилей»; 万 в составе имени + постороннее число в выводе; перефраз магнитуды + год — правка правил = громкий bump cheapGateVersion; + note про дефисные редупликации мимо блок-листа); NUL-гард на GB18030/UTF-16-путях декода (сейчас только UTF-8); tmctl redrive --resnapshot молча игнорируется (ошибка или поддержка); style-колонка в human-таблице глав status (косметика); report без API-ключей для read-only аудита (опционально). Принятые трейд-оффы (задокументированы, не чинить): drift-гард redrive пере-сеет глоссарий на abort-пути (идемпотентно); нарратив «один redrive» в журнале сжал два раунда (материальные клеймы верны).

D21. Приёмка research/15 «Голос и состояние» + ратификация механизмов Ф2 (09.07 ночь, оркестратор-преемник).

Внешнее ревью (9 агентов: 5 спот-чеков несущих CONFIRMED-клеймов по первоисточникам, пересчёт проб из сырых артефактов, консистентность, red-team ратификации, аудит доков). Вердикт: ACCEPT_WITH_FIXES, залендён (5953b37). Спот-чеки: DelTA — CONFIRMED точно (все 5 подклеймов, вкл. анти-клейм «+0.36 не существует»); RoleLLM / Voita / similarity-harm / WMT25 — CONFIRMED_WITH_NUANCE (числа верны, нюансы атрибуции/метрик вписаны в док пометками (ревью); ни один не ломает выводов яруса-1). Пробы пересчитаны поштучно: P4-таблица сходится на 100% (вкл. кросс-чек пересечения эхо-фрагментов с exp10 полигона), wire-клейм reasoning_tokens подтверждён (v1 всегда >0, префилл всегда =0), бюджет $0.28 сведён по usage×прайс. Исправлены оркестратором: агрегат 0/26→0/29, «~35%»→«3067% по армам (пул ~44%)», три deepseek-эха rt 111/182/149 (не «оба 111/149»), пятый судья = gemini-2.5-flash (не 3.5), строгий пересчёт маркера 奴婢 (0/4→2/4→3/4→4/4 — порядок армов устойчив), знаменатель «$2.50» = кап probe_runner.py.

  1. Voice-профиль (схема research/15 §1.5) — механизм Ф2, ратифицирован с оговорками red-team: (а) до лендинга D15.2 профиль заморожен per-job — самодозаполнение exemplars = mid-run append памяти = переоплата книги при D8/D15.1; (б) приоритет бюджета инъекции: CONFIRMED-глоссарий > address_pair > voice_profile > reveal-алиасы; кап voice-слоя ≤300 ток./чанк; (в) brightness/«серые голоса не инжектить» — гипотеза-под-пилот (T2, N=2 свапа), не жёсткое правило схемы; (г) драфт-слот — дефолт, editor-слот НЕ исключён до пилота (P3 = 4 вызова на чистых черновиках); (д) сид exemplars курирует владелец по СТИЛЕВОМУ критерию ru-стороны, верность реплики-экземпляра гейтится кросс-семейным судьёй (процесса «approved-перевод» в Ф1 нет — D1.1); (е) членство топ-героев в кэш-префиксе уважает окна профиля (смена манеры → миграция в селективный слот; «кэш почти бесплатен» — только при неизменном префиксе).
  2. Реестр обращений пар (address_pair, §2.1) — ратифицирован как МАТЕРИАЛИЗАЦИЯ журнала ты/вы D7-Правки-1 (один источник истины, не второе хранилище; бэкенду миграционная нота при заведении типа). Схема + детерминированный ты/вы-флаггер — безусловно; инъекционная часть — условно до полигон-эксперимента на ТРУДНЫХ парах (лифт на лёгких = 0; исход «только флаггер-ось» легитимен и дешевле).
  3. Reveal-окна (reveal_ch + pre/post-reveal алиасы, §2.2) — Ф2, ратифицированы с переобоснованием: опора = (а) само-нанесённый риск банка (post-reveal dst инжектится до раскрытия — та же логика спойлер-окон) + (б) механический родовой канал zh→ru (2311.08836), НЕ «12-common §16» (провенанс дока не зафиксирован — числа не абсорбируем). Judge-вопрос «раскрыто ли X до гл. N» гонять и на вебновелл-срезе вне претрейна.
  4. Армы пилота — приняты С ТИРИНГОМ (защита мощности первичных вопросов D13.4): первичные (ядро C0C3 / память / D13.1 / think) — полный N человеческого BWS; voice-A/B/C/D — на voice-маркированном подкорпусе; формат инъекции и «сэндвич» — судейские армы с echo/cjk_share как охранной метрикой (урок P4-инверсии); minimal-diff редактор — гейтится машинерией search/replace-апплая (спека бэкенду до пилота). НЕ ставить в решающий прогон: двухпроходность-в-одном-вызове (пост-пилотная проба допустима при флипе смежных выводов), min_p (не экспонирован нашими API).
  5. Скоуп Annotator Ф2 (§2.3) ратифицирован (детерминированный пре-гейт 说/道 → LLM на implicit → disposition; CONFIRMED-only в инъекцию; отношения курировать как глоссарий; пространство/эмоции/эпистемику вне reveal не аннотировать). Ресурс gold-бенча назван честно: zh-читателя в проекте нет → якорь через en-фан-перевод (спикер-сверка мостом) либо LLM-консенсус двух семейств + выборочная человеческая проверка; «LLM-предразметка + ручная дочистка» в оригинальной форме неисполнима.
  6. Анти-эхо пакет: направление ПРИНЯТО, wiring ГЕЙТИТСЯ fidelity-хвостом P4 (35 пар, пинг полигону стоит) И повторным echo-rate замером (эхо стохастично per-fragment). Скоуп wiring = только deepseek-драфт; Mistral/канал B без собственного замера не трогать (база чиста 10/10; P4: одна строка system инвертировала grok-none 3/10→9/10). Wiring только на границе prompt_version (правка промпта обнуляет TM — Р6). Запрет: языковые констрейнты в промпты reasoning-off путей без per-model замера. ⚠ Латентное: translator.md:10 уже содержит языковую строку — сегодня едет только на thinking-ON DeepSeek (вне зоны инверсии); при заводке Mistral-канала B — прогнать P4-реплику на боевом промпте. Зафиксирован вендор-конфликт: few-shot в thinking-драфт противоречит «DeepSeek R1-классу few-shot вредит» (§3.1) и research/14 M1 — fidelity-хвост разрешает именно его, до него канал A не трогать.
  7. Клеймы уникальности сужены (доки/память синхронизировать): «аналогов не найдено» → «не найдено при скрининге (границы — research/15 §5); патентная часть — скрининг, не FTO»; «первые с механизмом» → «механизм не раскрыт ни одним найденным конкурентом»; спойлер-окна: CONFIRMED-absence → PLAUSIBLE-absence.
  8. Экономика: «+$0.20.3/вебновелла» — верхняя граница editor-side инъекции; при рекомендованном драфт-слоте +$0.020.05. Незакрытые статьи Ф2 — Annotator-пасс (+10% к вебновелле) и курация сида → exp08 v3 (полигону: строки annotator + voice/pair по стадиям) до фиксации budget_usd-дефолтов Ф2.
  9. Поручения полигону (следующий пакет, после erotica): fidelity-хвост P4 (35 пар); пре-шаг wire-аудита ДО любого temp-свипа (thinking×sampling no-op DeepSeek, V4-маппинг, grok none+penalties); voice-A/B на трудных парах + вебновелл-срезе; эвал-база ru-детектора (IWSLT22-RU + mSynthSTEL + пертурбации); exp08 v3; строка эхо-класса в 00-provider-quirks (поручение D19.2 — не выполнено и не потерять) + инверсия языкового констрейнта; миграция судьи memory_eval с gemini-2.5-flash (интермиттентный 404; 3.1-flash-lite проверен пробой) + ревизия exp07-вывода: content_filter на Gemini 3.x ЖИВ (PROHIBITED_CONTENT).
  10. Поручения бэкенду (пакет №3, БЕЗ кода памяти): резервирование места под voice_profile/address_pair/reveal_ch в схеме v2 (note, не реализация); wire-probe «пишется ли temperature в thinking-канале DeepSeek» — в бэклог; языковые констрейнты не вносить (п.6); спека minimal-diff апплая — по готовности.

Сопутствующее: сырые артефакты проб продублированы оркестратором в /home/ubuntu/books/gu-zhenren/research15-probes/ (вне git; scratchpad /tmp волатилен); статус-доки (CURRENT-STATE, README, CLAUDE.md, quirks editor-строка по D19.1) — синхронизированы отдельным коммитом.

D22. Приёмка пакетов «бэкенд №3» и «полигон-erotica» + развязки 18+/эха/L3 (10.07, оркестратор).

Внешнее ревью обоих пакетов (8 ревьюеров, всё исполнением: go build/vet/test -race + 11 мутационных ревертов в scratchpad-копии; пересчёт exp11 из сырья поштучно независимой репликой классификатора; Fisher-статистика на клеймах; вендор-цены по официальным страницам с датами). Вердикты: оба ACCEPT_WITH_FIXES, залендены (e1fcee4, 3551997); микро-дефекты журнала исправлены оркестратором (заголовок пакета-2 восстановлен; счёт диффа бэкенда 20 файлов +860/143).

  1. D14.4 ЗАКРЫТ — последний critical проекта. 18+ эмпирика полна: violence (exp10) + erotica по трём парам/регистрам (exp11). Mistral-дефолт канала B подтверждён 18/18 на классике/вебновелле/романе; 0 content-отказов у всех переводчиков (0/18×5 армов).
  2. Спека D15.2: v3 принята с двумя ОБЯЗАТЕЛЬНЫМИ амендментами (v3.1) до реализации. (а) Book.SourceLang/TargetLang → verdictSnapshotID: ревью сконструировало и ИСПОЛНИЛО stale-hit, который v3 пропускает (языки — вердикт-входы вне рендера: cjk-гейт/coverage-коридоры; editor.md не рендерит {{target_lang}} → content_hash их не ловит; на этой оси v3 была СЛАБЕЕ текущего snapshotID, клейм «нет ре-открытия stale-serve» опровергнут); правило §4 переформулировать: судьбу обязано получить ЛЮБОЕ brief-поле, потребляемое вне рендера. (б) cache_ttl-противоречие: Context.CacheTTL демотировать до advisory (wire-инертен — не доходит ни до одного клиента) либо честно признать полную переоплату; prov.CacheTTL — в маппинг §4. Плюс до реализации: axis-sensitivity-тест RequestHash (флип role/stage меняет хеш — сейчас мутация «удалить role» выживает весь сьют); абзац «паритетные не-цели» в §8 (classify-Source для editor-строк; Retries/Escal.BudgetUSD вне хешей; транспорт); line-refs обновить. Отклонение YoPolicy/StyleAllowlist → verdictSnapshotID (консервативнее подсказки D20.1c, цена $0) — ратифицировано. Узкий клейм §3.3 (guard ⊇ stageSnap wire-поля) подтверждён поле-за-полем.
  3. Деньги Gemini: reasoning: additive_total РАТИФИЦИРОВАН — закрыт недоучёт 146×/вызов (thinking только в total_tokens; settle деривит totalpromptcompletion; mutation-hardened; кэш не задваивается). Условия до заводки Gemini-стадии в прод: $0.01-проба «thinking ⊆ max_tokens» на 3.1-pro-preview (резерв для additive_total сознательно 0 — допущение проверено только на 2.5-flash; пробой потолка ограничен одним вызовом), негативный кейс деривации (total<prompt+completion — мутация гарда сейчас выживает), квирк-строка в exp00. Экспозиция Ф1 нулевая (gemini не на wire-пути дефолт-конфига).
  4. D3-текст исправлен: апекс = gemini-3.1-pro-preview (голый → 404; квирк был ратифицирован 04.07 — синк живых доков по grep-списку ревью выполнен). Цена Mistral $0.5/$1.5 (Large 3) закрыта тройной сходимостью: полигон (зеркала) + бэкенд (/pricing/api) + ревью (вендор-страница); $2/$6 = legacy Large 2 (ретайр 31.05.2026). Вопрос №3 бэкенда закрыт.
  5. D19.1 — register-оговорка (амендмент): «reasoning-ON снимает эхо grok» подтверждено для СОВРЕМЕННОЙ прозы (совр. zh-вебновелла 0/10 exp10; совр. ja 1/6; en 0/6), но на архаичной плотно-ханьской (金瓶梅, минский байхуа, упрощ. графика) НЕ спасает: 4/6 verbatim при reasoning_tokens 349847 (vs совр. zh p=0.008; vs ja p=0.12 — не значимо; ON vs OFF на архаике неразличимы p=0.28; для OFF регистр-эффекта нет p=0.79). «Регистр входа» как общий закон — рабочая гипотеза до контрольных ячеек (дешёвый PD-контроль: совр.-zh-эротика + violence-пассажи 水滸傳 — полигону, не срочно). Следствия: echo-гейт обязателен на ВСЕХ конфигурациях включая reasoning-ON (D19.2 подтверждён); эскалация на grok-ON — НЕ лекарство от эха на архаичных zh (echo-rate хопа ~2/3 — жжёт бюджет на почти гарантированный ре-флаг); для приёмочной 蛊真人 (совр. вебновелла) D19.1 в силе. Квирк-строка дописана.
  6. Судьи 18+ (сужение exp10/D19.1): формула «судьи 18+ = Grok+Gemini, замена не нужна» ОТМЕНЕНА для эротики: Gemini fail-closed на графичной эротике (8× PROHIBITED_CONTENT wire-verified; фильтр неконфигурируем — native API не спасёт; на violence/SFW Gemini остаётся). Grok — первичный судья эротики для НЕ-grok переводов. Дублёр НЕ ратифицирован: gpt-5-mini на эротике не мерен (и ушёл с прайс-страницы), а D13.3-коллизия оставляет grok-эскалированные 18+ чанки вовсе без померенного судьи → проба-гейт (полигону, центы, материал уже в eval/data): gpt-5-mini + минимум один не-Google/не-xAI кандидат (mistral-судья для grok-выходов; kimi/glm после ToS-чека) на 18 Mistral- и 13 чистых grok-ON-переводах; пре-регистрировать refusal-rate и agreement.
  7. L3-скрин РАТИФИЦИРОВАН как задача (рамка, не дизайн). Ключевой факт exp11: отказ провайдера — НЕ сигнал уровня (0/18 на L2-explicit; DeepSeek переводит против собственного ToS) → пре-скрин — не «глубина обороны», а единственная автоматическая линия L3 (сегодня линию держит только ручная дисциплина корпуса/сида). Рамка: (а) per-chunk скрин на ingest для adult:true книг ДО любого wire-вызова (детерминированный лексикон-префильтр + локальный классификатор); (б) чек перед эскалационным хопом; (в) fail-closed: неэскалируемый терминальный флаг + человек, redrive только с явным ack; (г) НЕ реализовывать без спеки+метрики приёмки классификатора (FN-rate на размеченной пробе; методику сидируют minor-marker-скрины corpus_build; закрывает дыру стратревью §4.6/§9.12). Спека — бэкенд-пакет после рефакторинга; ОБЯЗАТЕЛЕН до первой erotica-книги в проде (приёмку 蛊真人 не блокирует). Настройка «переводить L3» — отклонена владельцем 10.07.
  8. Fix-лист полигону (пакет №4): (а) major: матчер content-filter подстрокой + самотест на составной 'content_filter: PROHIBITED_CONTENT' (сейчас 8/8 отказов лежат behaviour='empty' — латентная мина классификации); (б) major: параметризовать язык/жанр судейского промпта explicit_judges.py (ja/en-fidelity сняты под zh-рамкой — переснять при переиспользовании); (в) мигрировать судью memory_eval.py (инлайн 2.5-flash EOL 16.10 + двойной extra_body + нет 404-ретрая — ружьё на стене пилота); (г) U+FF70 из kana-корзины + parity-кейс с ー; (д) append-only провенанс: ретраи — отдельным файлом/superseded-полем, error-записи не удалять; (е) judge-raw без [:600] или оговорка; (ж) проба судьи-дублёра (п.6) + fidelity-хвост P4 (висит) + wire-аудит пре-шаг temp-свипа (D21.9) + контрольные ячейки регистра (п.5, не срочно).
  9. Fix-лист бэкенду (в реализационный пакет D15.2, попутно): v3.1-амендменты (п.2); CLI-тест проводки redrive --resnapshot (хедлайн-фикс без покрытия — мутация _ = resnapshot выживает); axis-тест RequestHash; негативный кейс additive_total; комментарии models.yaml «native Gemini для судьи 18+ — Ф2» устарели против exp11 (поправить при следующем касании); опц. smoke-тест LoadModels на боевом yaml.
  10. Кодифицировано: transient-прогоны в ЧУЖОЙ зоне — только в копии вне рабочего дерева (полигон гонял go test в живом backend/ при чужих незакоммиченных правках — обошлось, но впредь запрещено).
  11. Приёмка Ф1 разблокирована полностью: сид финализирован (白凝冰 gender=hidden, 49 записей чисто — воспроизведено ревью боевым loader'ом), цепочка D3/escalate_to заведены, деньги Gemini честны, D14.4 закрыт. Приёмочная сессия ОБЯЗАНА выставить escalation.budget_usd>0 (иначе echo-эскалация черновика D18 не стреляет). Очередь предложена: приёмка → бэкенд-№4 (рефакторинг, промт выдан) → GPT-восхождение (промт выдан); порядок приёмка↔рефакторинг — за владельцем.

D23. Приёмка рефакторинг-пакета №4: golden-гард и OpenReadOnly (10.07, оркестратор).

Внешнее ревью (5 ревьюеров, всё исполнением в scratchpad-копиях, $0): golden-эквивалентность / инварианты-деньги / дифф-аудит / OpenReadOnly / журнал-скоуп. Вердикты: invariants и diff — ACCEPT, остальные — ACCEPT_WITH_FIXES; пакет залендён (296419c). Эквивалентность «форма, не поведение» доказана трижды независимо: (а) новый golden прогнан на ЧИСТОМ HEAD-коде — PASS байт-в-байт (snapshotID, все 11 request_hash вкл. эскалационные, wire-тела, вердикты, resume с 0 вызовов; единственный шим — аддитивный read-view); (б) чувствительность golden 5/5 кодовых мутаций (render / snapshotID-компонент / request_hash-домен / nil-гард injected_ids / порядок терминов) — все валят тест громко; (в) AST-дифф 36 деклараций: 29 байт-идентичны, 7 изменены только заявленными способами, 0 потеряно; CLI-контракты сверены исполнением двух бинарей (exit-коды/stderr байт-идентичны). Инварианты 17: 9/9 мутаций убиты; go.mod, миграции, схема БД, боевые промпты и конфиги — нетронуты (sha256).

  1. Golden-гард — постоянный инвариант №8 бэкенда. Обновление capture.golden — ТОЛЬКО при ратифицированной смене поведения (TM_UPDATE_GOLDEN=1 вручную; при заводке CI переменную в раннеры не экспортировать — сегодня «CI не перепишет» вакуумно, CI нет). Известные слепые пятна фикстуры задокументированы (attempt>1 regeneration-путь, STM, coverage/postcheck-гейты ON, AMBIGUOUS=0) — расширение опционально с реализационным пакетом D15.2.
  2. OpenReadOnly САНКЦИОНИРОВАН как изменение поведения (боль воспроизведена исполнением; покрыт приоритетом-2 мандата): status/report без flock/миграций/recovery, работают ПРИ живом прогоне; запись гарантированно падает (PRAGMA query_only на каждом соединении — mutation-verified; барьер SQL-уровня, НЕ файловый); кросс-процессная конкурентность доказана (WAL-снимок, 1702 чтения под settle-штормом без busy). Трейд-офф ратифицирован: после краха reserved-хвост (≤1 резервации — раннер последователен) виден в status до следующей write-команды; read-команды НИКОГДА не чинят ledger (честнее старого поведения, где «read-only» status сам мутировал ledger — это и было причиной flock); schema-mismatch громкий в обе стороны; нет БД → fallback на создающий Open; read-only ФС/иммутабельные бэкапы не поддерживаются (WAL). Рекомендация, не блокер: staleness-маркер через неблокирующий flock-probe.
  3. Микро-дефекты исправлены оркестратором при лендинге: diffstat +3317 (не +3295); фикстура фактически 4 главы/5 чанков/11 тел; line-refs старого runner.go починены в живых доках (06:71, 07:42/109/192, research/13:196/198 — по полной карте ревью); исторические цитаты (D-лог 04.07, журнал) не переписываются; refs D15.2-спеки (15 шт., зона бэкенда) — с v3.1-правками (уже в D22.2).
  4. Fix-лист бэкенду (попутно с реализационным пакетом D15.2): тест errTail на границу руны (реверт фикса сейчас выживает сьют — против дисциплины mutation-verified); лог-ассерты retryLoop (retry_in / отсутствие «will retry» на последней попытке — unit-able через slog-capture); AMBIGUOUS>0 ячейка в фикстуру или смягчение коммента golden_test.go:32; опц.: компонент-тест snapshotID-payload (самопроверка fold'а без golden), kill9 rounds 3→5.
  5. Ф2-критерий выполнен: канал B садится файлом в escalation.go, annotator/voice — в chunkrun.go; runner.go = 168 строк сетапа. Очередь размораживается: GPT-восхождение деблокировано (условие владельца «после рефакторинга» выполнено); промт приёмочной сессии Ф1 выдан (ACCEPTANCE_SESSION_PROMPT.md).

D24. Приёмка Ф1 этапа A ратифицирована с оговорками + развязки floor max_tokens / post-check + порядок этапа B (11.07, оркестратор-преемник №3).

Внешняя верификация отчёта приёмки (воркфлоу 5 осей — money / d10-recount / dispositions / lifecycle / red-team; ВСЁ исполнением по read-only копии store, phase-логам, экспортам, сиду, коду; $0): все хедлайны воспроизведены — деньги до float-epsilon (130 чекпоинтов пересчитаны из usage_json × models.yaml, SUM(request_log)=committed=$0.4080773152 ровно), классификация 55 промахов D10 реплицирована бит-в-бит независимой реализацией матчера, SIGKILL/honest-stop/resume сверены по логам (EXIT=137 в живом glm-5 вызове; killed call оставил 0 записей), конфиг-паритет с pipeline-c1 подтверждён diff'ом (ровно две санкционированные дельты D20.3/D22.11). Текстовые дефекты отчёта (денежная опечатка ×10, смешение двух resume, «==» после redrive, «0 дрейфа») исправлены при лендинге с пометками (7ca14c2). Решения:

  1. Вердикт ратифицирован: критерии Ф1 выполнены как инфраструктурная веха — с оговорками, дополненными верификацией: (а) объём — срез 25/2283 глав, полный объём двигается в этап B; (б) recall-тест coverage-гейта «≥90% искусственных пропусков» не гонялся (гейт OFF) — задача бэкенд-пакету №5 (синтетический мини-набор пропусков юнит/интеграционным тестом, без wire); (в) grok-биллинг не мерен (glm-5 по D20.3) — закроется пилотом/чистым ключом; (г) budget_usd эскалации проверен только в направлении «>0 → стреляет», отказ по исчерпанию — в тест-лист №5. Ни одна оговорка — не машинный отказ.
  2. Alias-слепое пятно post-check зафиксировано (найдено red-team-ревью): 1 дрейф-вхождение вне видимости флаггера — гл.18/0 рендерит 古月方源 раздельно «гу юэ фан юань» (против «гуюэ»×154 в корпусе); longest-match поглощает вложенный алиас (古月) внутри полного имени, dst родителя (方源→Фан Юань) присутствует → промах не фаерится. Истинная консистентность этапа A ≈99.5%, не 100%. Класс редкий (~1/190 поверхностей клан-имени); фикс в Ф1 НЕ заказывается; полигону — пометка класса в 06-memory-risk-registry при следующем касании + учесть в методике D10-пересчёта этапа B.
  3. Развязка (а) — per-model floor min_max_tokens: РАТИФИЦИРОВАН схемой (capability-слой models.yaml, НЕ комментарий): применяется при деривации max_tokens ЛЮБОГО вызова модели — праймари-аттемпты И эскалационные хопы (stagerun.go:89-92; хоп наследует бюджет праймари — maybeEscalate), ДО request_hash (wire-видимо). Флоры по quirks: deepseek-v4-flash/pro 8000, gemini-3.1-pro-preview 8000, kimi-k2.6 16000; glm-5/5.1 (reasoning off) и grok-4.3 (reasoning_effort:none) — без флора. Основание: эмпирика этапа A — хопы deepseek-v4-pro получили унаследованные 2048/3291, вернули finish=length (один — 0 байт контента), ~3× цены draft впустую; при реализации прайора эха ~25% (exp10/D18) на полной книге это ≈$3.6 эскалаций-пустышек и ~25% глав без перевода → флор = блокер этапа B. Резерв-инфляция EstimateUSD тривиальна (≤$0.10/вызов на самом дорогом тарифе); committed не растёт (биллинг по факту). Изменение wire → снапшот → golden update ратифицирован (процедура инварианта №8, D23.1).
  4. Развязка (б) — post-check dstFormPresent: правка КОДА, сид — дополнительно. Код: базовый dst ВСЕГДА в множестве проверяемых форм (union declForms normalizeTargetForm(dst), mempostcheck.go:85-96) — закрывает 37/55 ложных промахов (nominative_gap). Рациональ кода-над-сидом: базовая форма — сама approved-форма; требовать её дублирования в decl — избыточный ввод, на который наступит каждая будущая книга; правка только снижает false positives (уточнение D28.1, поймано самим пакетом №5: строго — precision/recall-трейдофф; узкий реальный класс ложных пропусков — нарицательная база рядом «не по делу» при дропнутом термине; на данных этапа A recall не пострадал; флип postcheck_gate в hard-gate требует пере-замера recall на нарицательных терминах). Сид (полигон): дописать мн.ч. в decl.forms счётных терминов (元石/凡人/蛊师-класс) — закрывает 18/55 (inflection_gap); C4-автозаполнение decl остаётся Ф2. Правка кода меняет вердикты (verdict-ось) → golden update тем же пакетом; правка сида меняет memory content-hash (D8) → тот же resnapshot.
  5. Порядок этапа B (ответ на развязку хендоффа «до или после фиксов»): ФИКСЫ — ДО. (i) бэкенд-мини-пакет №5 (п.3+4 код, coverage-recall тест п.1б, budget_usd-отказ тест, golden re-capture, mutation-verified) ∥ сид-обогащение полигона; (ii) ЕДИНЫЙ resnapshot; (iii) этап B на новом снапшоте: скоуп переопределён владельцем — срез ~300 глав, проекция ~$4.96 (нужен «да» + потолок; рекомендация book_usd≈7; editor glm-5 — сравнимость с этапом A и D20.3). Этап B дополнительно обязан: echo-rate чекпоинт против прайора ~25% (статистика на ~680 чанках vs 3.5% этапа A на 57); контроль эскалаций после флора (length-класс хопов должен начать проходить ре-гейт; cjk_artifact-класс гл.1 останется — интринсик); перегенерация parallel-экспорта (stale ch1/4); методика D10-пересчёта — скриптом в артефактах.
  6. Ответы на вопросы отчёта владельцу: №1 — скоуп B изменён владельцем на ~300 глав, потолок за ним; №2 — glm-5 (grok ждёт чистого ключа и нужен пилоту, не приёмке); №3 — сид дописать ДО этапа B (тот же resnapshot, что и фиксы; D10-флаггер на B становится осмысленным).

D25. Приёмка research/17 (внешняя критика GPT-5.6 «восхождение»): вердикт и абсорбция (11.07, оркестратор).

Ревью по мандату владельца «воспринять критично» (воркфлоу 12 агентов: 19 первоисточников по живым URL — 0 несуществующих/чужих; протокол-аудит анти-якорения; аудит ~30 line-refs; red-team 11 строк §C против контракта; аудит §D/«Итога»): ACCEPT_WITH_FIXES, залендено (a148f41) с ревью-шапкой — правила чтения там: §B2/«Итог» переграждены в PLAUSIBLE (ценностные «чей сильнее» ≠ CONFIRMED по его же §1); конвергенция §A↔проект на осях, засеянных нашим мандатом, НЕ считается независимым подтверждением; анти-якорение критиком соблюдено (лексический аудит + errata-без-правки-§A); критик не видел ни кода, ни результатов этапа A. Решения по абсорбции:

  1. Release-state контракт (§C-R1) — ПРИНЯТ КАК ЗАДАЧА С ГЕЙТОМ (единственный blocker-класс вопрос совсем без D-решения): лестница run_complete / structurally_complete / quality_reviewed / publishable; детерминированный fail-closed экспорт для структурных/policy-дыр; semantic-флаги — только через audited waiver. Ложится на disposition/паспорта D12 + Ф1-задачу экспорта. Ратифицировать при постройке читательского экспорта, ДО первого reader-facing артефакта (этап B не гейтит — его экспорт owner-facing). Семантика «publishable» и право подписи waiver — владельцу. Живой якорь уже есть: экспорт этапа A несёт флагнутые чанки маркированными zh-плейсхолдерами — «run complete» ≠ «publishable» продемонстрировано.
  2. Fidelity evidence cascade (R2) — ПРИНЯТ КАК Ф2-ЭКСПЕРИМЕНТ, SHADOW: минимальные пары 100150 (естественные + контрфактуальные: отрицание, агент/пациенс, число, род, модальность), обязательная случайная выборка unflagged, метрики corrected recall/precision + review-minutes/error; в гейт — только после доказанного utility. Гейт очерёдности: НЕ вперёд пилота Ф2.5 (D1.2 привязывает замер C1 к живому билингвальному судье пилота; каскад конкурирует за самый дефицитный ресурс — билингв-якорь). Подготовку пар совместить с корпус-подготовкой пилота (полигон).
  3. Sequential-repeat судьи (R7) — амендмент D13.3 ТОЛЬКО как вложенный анализ: решающие вердикты пилота остаются полными 11+ со свапом (пре-регистрация не трогается); prefix-анализ 1/3/5 vs full-11 считается из ТЕХ ЖЕ данных (cluster bootstrap по айтемам, $0 сверху); sequential-stopping как протокол — только пост-пилот/production после этой валидации. Как замена решающего протокола — ОТКЛОНЁН.
  4. L3 (R5) — расширения в спеку D22.7; методика валидации — вопрос владельцу. В спеку: versioned policy, book/entity-контекст (cross-chunk возраст/алиасы/отрицание/цитаты-бэкстори), тройной выход adult/prohibited/uncertain, terminal uncertainty, human-confirm всех релевантных сцен первых adult-книг. Требование «~300 positive cases для ≥99% sensitivity» СТАЛКИВАЕТСЯ с гардрейлом «L3 не обрабатывать/не анализировать»: допустимый путь валидации (синтетические маркер-прокси / внешние размеченные бенчи / human-only контроль первых книг) и численный FN-bound — решения владельца при приёмке спеки.
  5. Trust boundary (R10) — В КОНТРАКТ немедленно (стоимость $0): текст книги и любая веб-выдача = untrusted DATA, никогда — инструкции; translator/editor-роли не имеют tools/секретов/исходящих действий (сегодня выполняется конструкцией — фиксируется как ИНВАРИАНТ, не случайность); action-security gate — именованный блокер перед дачей tools/webfetch (Ф3). Адверсариальная инъекция-проба (plain/Unicode-obfuscated/quoted-fiction/false-positive) — в eval-очередь перед Ф3, не срочно.
  6. Review bundle (R4) — ПРИНЯТ в minimal-форме: экспортируемый бандл поверх существующих flags/disposition (reason, evidence, typed resolution, seconds, reviewer, reuse-маркер) БЕЗ нового persistent-домена; инструментировка minutes/flag + typed resolutions — в пре-регистрацию пилота (полигон); persistent ReviewTask-домен — только если данные этапа B/пилота его оправдают (flag-rate 5.3% с концентрацией 2/25 глав поддерживает минимализм).
  7. Echo-gate калибровка (R6) — задача полигону (после флора D24.3): накопленные echo-провалы + 3050 чистых выходов на язык + синтетические partial/tail-эхо; порог при фиксированном FP-бюджете; каузальная модель «регистра» для гейта НЕ нужна (контрольные ячейки D22.5 остаются некритичными). Формулировка критика «prompt mitigation только экономит fallback» принята с поправкой этапа A: сам fallback-хоп до D24.3 был сломан бюджетом.
  8. Остальное: R9 (summary baseline: source-retrieval vs prose+citations vs typed claims на 2030 дальних зависимостях ДО постройки typed claim store) — Ф2 design-gate, принят; R3/R8 — конвергенция без действий (= D15.2/D22.2 и D21.24), из R8 абсорбируется только метрика over-stylization/fidelity в voice-арм пилота; R11 — rights/data manifest приложен к висящему юр-пакету владельца, строка «API-only vs all-in COGS раздельно» — в exp08 v3 (D21.8) + логирование human-minutes в пилоте. Нюанс источников (шапка research/17): морф-оговорку Exel et al. НЕ абсорбировать в форме критика (инверсия: морфологию ломают constrained-decoding методы, не «терминологические констрейнты вообще» — наш decl-aware путь ей не противоречит, а отвечает).
  9. §D: ранжирование реально открытых вопросов (для владельца и очереди): Q1 билингв-якорь zh/ja→ru (блокер валидности пилота; владельцу: рекрут билингв-аннотаторов ИЛИ явное принятие ограничений en-моста в пре-регистрации) > Q3 publishable (п.1) > Q2 human budget (инструментировка в пилот; числа — владельцу пост-пилот) > Q5 L3 FN-bound (п.4) > Q4 юр-пакет (уже висит) > Q7 календарь G1/B6/морфо-гейта (оркестратор, после пилот-подготовки) > Q6 fact-gate резюме (Ф2-дизайн). Q8 (doc-drift) снят: владелец = оркестратор; его наблюдение подтверждено и закрыто — 02-mvp-plan:24,31 (ja→ru приёмка вопреки D18) исправлены этим лендингом.
  10. Методологический урок для будущих внешних критик: (а) §A хешировать/коммитить ДО открытия фазы 2 (фриз research/17 — attested, not proven); (б) оси мандата формулировать нейтрально, не встраивая наши выводы; (в) список признанных дыр (фаза-3(г)) выдавать только ПОСЛЕ фиксации §A.

D26. Качество-первым: этап B заморожен, диагностика exp12 вперёд (11.07, решение владельца + оркестратор).

Триггер: первое человеческое чтение продукта — владелец прочитал 25 глав этапа A (draft deepseek-v4-flash → editor glm-5 моно) и вынес вердикт: качество нечитаемо, слабейшее звено — редактура. Это ПЕРВЫЙ замер читаемости на реальной книге; он не противоречит D24 (приёмка Ф1 = инфраструктура по D1.1 и читаемость не мерила), но меняет очерёдность: масштабировать нечитаемый конфиг смысла нет. Наблюдение согласуется с тремя задокументированными рисками: редактор этапа A = glm-5 (замена D20.3; GLM-линейка — слабейшая в бейк-оффе exp04, glm-5 не перемерян), D1-моно оспорен (D17: 2.2…5.6 MQM), рейтинг grok снят билингвально при боевом моно-промпте (quality-transfer риск exp08). Решения:

  1. Этап B (~300 глав) ЗАМОРОЖЕН до достижения читаемого конфига на 25 главах (подтверждение — чтение владельца). D24.5-порядок (фиксы→resnapshot→B) не отменён — отложен; предусловия B пополняются: «читаемый конфиг ратифицирован».
  2. exp12 «диагностика качества» — приоритет №1 полигона (промт POLYGON_QUALITY_DIAG_SESSION_PROMPT.md): армы на 3 чистых главах {draft-only · glm-5-моно(=этап A) · glm-5-билингв · grok-4.3-моно · grok-4.3-билингв · gemini-премиум-билингв · grok-моно-без-констрейнтов}; слепые пакеты владельцу-читателю (безκ-режим честно, N=1 — пре-скрин пилота, НЕ пилот); LLM-судьи вторично (кросс-семейные, свои выходы не судят, верность билингвально — «гладко-неверное» не побеждает молча); root-cause разбор 1020 худших мест чтения (черновик/редактор/констрейнты/оформление). Кап $5; текущий xAI-ключ допустим (категория D19.4). Дефолт-конфиг по итогам меняется только ратификацией.
  3. Полигон №4 — второй приоритет (сид мн.ч. без этапа B не горит; D22.8-очередь не отменена).
  4. Бэкенд не тормозится: №5 без изменений (floor/post-check нужны любому конфигу); следующий пакет после №5 — D15.2 v3.1+реализация: пер-стадийный wireSnapshotID (D20.1-Q1) делает смену редактора без переоплаты черновиков — прямая синергия с качественной итерацией.
  5. Дорожка после диагностики: пере-прогон 25 глав выигравшим конфигом (~$0.51) → чтение владельца → читаемо → этап B и подготовка пилота Ф2.5 (пилот остаётся решающей точкой; диагностика его не подменяет и не разбавляет — D25.2-гейт про билингв-якорь в силе).

D27. xAI-ключевая политика: единый ключ с data-sharing для тестов/пилота, отключение перед продом (11.07, решение владельца).

Решение владельца 11.07 (амендмент D19.4/D20.3): отдельный «чистый» xAI-ключ НЕ заводится. Текущий ключ — с data-sharing (промо; уточнение владельца — supersedes скобку D19.4 «без data-sharing»: либо устарела, либо была ошибкой записи) — используется для ВСЕХ тестов полигона И пилота Ф2.5; тот же ключ пойдёт в прод — перед релизом data-sharing на нём отключается. Рациональ владельца: промо-кредиты существуют ровно для тестов; не пользоваться ими странно.

  1. «Чистый ключ» СНЯТ из блокеров пилота (правка D20.3). Блокеры пилота теперь: корпус 2535 глав, аннотаторы ≥3, билингв-якорь (D25.9-Q1), проба судьи-дублёра 18+ (D22.6).
  2. Следствие для редактора: вынужденная замена grok→glm-5 (D20.3) не нужна — grok-4.3 доступен на текущем ключе для exp12-армов, пере-прогона 25 глав и этапа B, если выиграет диагностику.
  3. Принятые владельцем риски (зафиксированы с калибровкой): (а) 蛊真人 — чужой копирайт: data-sharing = передача текста в обучение (иная правовая поза, чем приватная обработка Р8) — принято для собственных тестов, для клиентских книг НИКОГДА; (б) NSFW-eval-история на аккаунте — риск бана принят, мониторинг политики xAI (D14.3) продолжается.
  4. Митигация контаминации (рекомендация оркестратора, дёшево): на окно прогонов ПИЛОТНОГО корпуса (вебновеллы вне претрейна — их «чистота» = валидность замеров) data-sharing временно выключать, затем включать обратно; PD-классика и 蛊真人 (в претрейне) — шарить без ограничений. Статус: предложено владельцу, ждёт его «да/нет» к пре-регистрации пилота.
  5. Перед релизом: механику отключения сверить с вендор-докой xAI (немедленность, независимость от промо-периода; уже переданное не отзывается) — правило двух направлений; задача уходит в чек-лист первого боевого прогона.

D28. Приёмка бэкенд-пакета №5 (11.07 ночь, оркестратор).

Внешнее ревью (5 осей: floor-wire / postcheck-union / golden-empty / tests-mutations / scope-report; всё исполнением в scratchpad-копиях при ДВУХ живых сессиях в дереве; ~10 мутаций переисполнено независимо, повторный -race после каждого реверта): все оси ACCEPT, 0 critical/major. Пакет залендён (aa47e25). Ключевая проверка: альтернативная гипотеза «floor/union мертвы (потому golden пуст)» убита исполнением в обе стороны — флор на фикстурной модели валит golden диффом wire-класса (11×max_tokens + snapshotID), oblique-only сид флипает postcheck-вердикты 2/1/2→1/0/1; пустой дифф — data-driven (фикстура нефлорнута, сид несёт базу первой формой). Scope чист (ровно 4 флора в models.yaml, PROGRESS — один аддитивный ханк, чужие exp12-файлы не тронуты, контрабанды нет).

  1. D24.4 амендирован (поймано самим пакетом, подтверждено ревью репро 剑→меч): «recall не страдает» → честный precision/recall-трейдофф; флип postcheck_gate в hard-gate — только после пере-замера recall на нарицательных терминах (пометка внесена в D24.4).
  2. Ответы на оговорки пакета: (1) расширение golden-фикстуры (флорнутая модель + oblique-only entry) — ПРИНЯТО как задача следующего ОСОЗНАННОГО golden-рефреша (реализационный пакет D15.2; ревью подтвердило исполнением, что это дифф вне санкции {a,b} текущего пакета — отложено корректно); (2) resnapshot реального конфига — ожидаем, ровно план D24.5; (3) композиция floor×global = max() подтверждена исполнением в обе стороны (global 9500 бьёт флор 8000; флор бьёт global 512).
  3. Fix-лист бэкенду (в реализационный пакет D15.2, попутно): (а) mutation-pin fbHash-зеркала хопа — hop-checkpoint-replay тест (краш после settle хопа + resume при исчерпанном budget_usd: десинк fbHash↔runAttempt сегодня выжил бы сьют; кода-дефекта НЕТ — гэп покрытия); (б) note/реестр: provider_local MaxTokens-override молча побеждает флор на wire для local-моделей (сегодня флорнутых local нет — латентно, не пкг5-дефект); (в) косметика: коммент mempostcheck.go:84 «D24.3/D24.4»→«D24.4»; (г) стейл-комменты models.yaml «чистый ключ/data-sharing» привести к D27 при следующем касании файла.
  4. Очередь бэкенда: свободен. Реализационный пакет D15.2 (v3.1-правки D22.2 первым шагом + fix-листы D22.9/D23.4-остаток/D28.3) — промт выдаётся ПОСЛЕ развязки exp12: селективный reuse и смена редактора взаимодействуют (D20.1-Q1 пер-стадийная гранулярность), исход диагностики может добавить пакету требования — не плодить ревизии промта.

D29. Приёмка research/16 «Ридер-IDE» + абсорбция фронт-требований в бэкенд-контракт (12.07, оркестратор).

Внешнее ревью (4 оси: калибровочный и якорный источник-батчи по первоисточникам — все несущие клеймы существуют и держат силу, ниты в шапке дока; независимая реплика $0-пробы — арифметика воспроизведена точно, но база stale и метрика диапазонная; red-team контракта против status.go/D15.2-спеки — 4 major-поправки). ACCEPT_WITH_FIXES, залендён с ревью-шапкой (458b0ea). Ядро принято: чанк = несущий якорь (иерархия глава→чанк→абзац-best-effort→предложение; синк ко-локацией, не скролл-синком); калибровка YELLOW важнее покрытия (precision-гейт перед показом цветов, FP-бюджет <10%/флаг, severity-таблица, worst-child+счёт); детект-флаггер вместо форс-структуры промптом; числовой confidence — НИКОГДА без QE-модели. Решения по абсорбции:

  1. В реализационный пакет D15.2 (бэкенд; промт после развязки exp12 — D28.4): (а) tmctl export — настоящая команда (канонический ассемблер перевода + annotations.json annot-v1) — НЕ «проекция как status --json»: src_range требует офсетов в чанкере, dst_range — nullable/эфемерный, source_file_hash — новое поле, спаны style-флагов — пересчёт линтерами на экспорте; схему ратифицировать с колонкой exists/derivable/net-new; нормализация выхода (markdown-### в 8/54 финалов, унификация разделителей абзацев); paragraph_anchors v1 = детерминированная позиционная пара ТОЛЬКО при равном числе абзацев, aligner-based — Ф3; (б) политика красных: editor-facing — маркированный плейсхолдер (текущее); reader-facing — fail-closed (0 красных для structurally_complete) — реализуется вместе с release-state лестницей D25.1 в этой же экспорт-задаче; (в) цвет-мап + GREY (RED = дополнение: flagged && reason≠glossary_miss; YELLOW = done∧(escalated glossary_miss postcheck_misses>0 style_flags>0); GREY = pending) + passport-rollup 3-тир — как ЯВНЫЙ амендмент вердикт-правила D12/exp07 (при gate-on glossary_miss уже катится в fail-счётчик — сохранить консистентность с exit-кодом translate); (г) human_override слой 1 (LOCK): per-chunk provenance-состояние, ключ = хеш сырого src-текста чанка (НЕ content_hash=rendered-msgs — ловушка ложных re-review), консультируется redrive/status/export (redrive НЕ мутирует override — тест); слой 2 (context-keyed carry-over с состоянием «override needs re-review», метрика «тихо-потерян=0») — дизайн вместе с v3.1 wire/verdict-split; override НЕ кормит глоссарий/память книги (чекпоинт-кэш не может по построению); (д) диалог-аварный флаггер парности — verdict-side класс (bump cheapGateVersion → снапшот: только с D15.2, не «$0 сейчас»), калибровка на конфиге-победителе exp12 (stage-A вёрстка будет снесена reflow-фиксом).
  2. Полигону: (а) диалог-пере-нарезка stage-A пробы — falsification-only (данные устареют с reflow); (б) precision-замер флагов — post-hoc против существующих заметок владельца (пре-регистрацию exp12 НЕ трогать; <10%-гейт = отдельный проход по 25 главам пост-reflow, гейтит только показ цветов Ф3); (в) Bertalign zh→ru spot-check перед GOLD-парами пилота (лицензия GPL-3.0 — учесть в тулинге); (г) arity-полоса паспорта — с пином определения абзаца (диапазон 4458% по метрике — ревью).
  3. Ф3 (в F3-brief, не сейчас): chat-edit (span-map re-insert, только YELLOW/RED, re-flag выхода, метрить $/edit); ко-локация спаренных якорей; «Not useful»-петля; aligner-based paragraph_anchors; cost-of-fix ранжирование.
  4. Зафиксировано: reader-embedded книго-полоса из детерминированных вердиктов — новый синтез при скрининге (сужение как D21.7, не «аналогов нет»); Bertalign-мост «прошлый том» — кандидат пилот-подготовки (гейт: spot-check).

D30. Приёмка exp12 + флип D1 (моно→билингв) + пакет качественных фиксов + трек дешёвых моделей (12.07, оркестратор; владелец: дешёвый трек).

Внешнее ревью exp12 (4 оси, всё исполнением по diag/-артефактам и store-копии: реплика активности под 3 метриками, аудит судейского слоя с пере-агрегацией, root-cause против промптов/store, scope+COGS+мемо): все оси ACCEPT_WITH_FIXES, залендено с ревью-шапкой. Ядро диагноза «нечитаемо = связка 4 дефектов» (пассивный моно-редактор + кривой сид + построчная вёрстка от промптов + отсутствие санитайзера) подтверждено независимой репликой; украшения сняты (шапка exp12: «единогласный #1» ложен; fidelity-гейт не доказан — A2 сам внёс инверсию смысла). Решения:

  1. Флип D1: редактор — БИЛИНГВАЛЬНЫЙ (черновик + исходник), новый дефолт. Ратифицирован с явным supersede D17.в (решение было закреплено за пилот-армом D13.1; переопределяю по досрочной эмпирике exp12 — тройная ОТНОСИТЕЛЬНАЯ триангуляция: механика активности + судьи (билингв>моно устойчиво у всех) + 2 флагмана слепо; пилот-арм D13.1 остаётся ПОДТВЕРЖДАЮЩИМ на решающем корпусе). Вакуум верности (D1.1) закрывается обязательным re-gate на пере-прогоне: span-цитирующий fidelity-судья reasoning-ON + охота на класс инверсий/порч правки («пожертвуй мной»/«молва считал» — новые классы, вносимые АКТИВНЫМ редактором). Editor-модель пере-прогона: glm-5 билингв (цена ×13 vs gemini, 0 утечек; НЕ «единогласие судей»); gemini-3.1-pro — премиум-эскалация редактора ТОЛЬКО за санитайзером (утечка преамбул 6/6); grok-4.3 reasoning-off из редакторских ролей СНЯТ (no-op; exp04-ранг был на дефолт-reasoning билингв).
  2. Reflow-вёрстка: снять «Сохраняй разбивку на абзацы» из zh→ru промптов (translator.md:9, editor.md:8 — дословно подтверждено) + разрешить нормативную репараграфизацию (1:N на диалоге — норма, D29/research-16 §2.3) → bump prompt_version → resnapshot. Механизм реверстки (в промпте редактора vs отдельный пасс) — открытый вопрос пере-прогона (CAND-данные n=6 недостаточны); пере-прогон обязан мерить консистентность вёрстки явно.
  3. Output-санитайзер — новый детерминированный гейт-класс (бэкенд, в пакет D15.2): ведущие преамбулы И хвостовые «заметки» (gemini 6/6), битые словоформы («Первок предок», «валуне»), латиница-врезки, markdown-### (8/54 финалов этапа A — D29-находка), утёкшие заметки переводчика. Ни один существующий гейт классы не ловит (проверено кодом). Дисциплина D2 (flag+skip), вердикт-ось.
  4. COGS-рамка (поправка мемо): флип D1 = +1525% (~$0.830.86/ранобэ) — принято как цена качества (замер: вход редактора +60% токенов, книга +19%); «$1.52/ранобэ» = ОПЦИЯ Б (селективный апекс по exp08 + слой памяти) — отдельное решение владельца, НЕ подписано; проценты мемо (+117190%) арифметически верны, но относятся к опции Б.
  5. Глоссарий v2 — условная ратификация: бесспорные 11 правок + 8 добавлений — принять; спорные (修炼/культивация, 人祖/Первопредок, род «гу», 花酒行者 — добавлен ревью: тихо перезаписывал пожелание владельца) → status:draft ДО подписи владельца (иначе уйдут в CONFIRMED-hard-constraints — memory.go:419/473); тихие промоушены draft→approved откатить в draft. Сид-обогащение мн.ч. (D24.4/полигон-№4-п.1) слить в ту же v2-итерацию — один resnapshot вместе с п.2/промптами.
  6. exp13 «бейк-офф переводчиков» — ратифицирован, приоритет №1 полигона (премисса верифицирована: draft выбран за цену/токенизатор/кэш, качеством как переводчик не мерен НИКОГДА; exp04 мерил редакторов). Армы: mistral-large-2512 / glm-5 / deepseek-v4-pro / grok-4.3 reasoning-ON (добавка ревью: единственный CJK-чистый замер 10/10 exp10; ключ разблокирован D27); qwen — опционально, гейт на DashScope-ключ владельца; deepseek — thinking ON (эхо-мина). Судьи span-цитирующие reasoning-ON (урок п.1) + флагман-сверка владельца тем же monitor-паттерном.
  7. Трек владельца: дешёвые модели сейчас, фронтир — потом. Зафиксировано: архитектура УЖЕ конфиг-первая (Р2/Р4: один раннер, пайплайн = yaml, C0C3) — «несколько бэкендов со своими пайплайнами качества» = несколько pipeline-конфигов поверх одной машинерии; фронтир-тир позже = модели в models.yaml + новый pipeline-yaml + resnapshot, БЕЗ переделки кода. Интерим-планка пере-прогона: «лучше фан-перевода» на дешёвом миксе; полная планка запуска (лучше-фана/гибрид/издательский + честный COGS опции Б) — остаётся открытым решением владельца (мемо-эскалация).
  8. «Модели не следят за сюжетом» = слой авто-памяти/состояния (Annotator, межглавные резюме, voice/reveal — D21) — Ф2, связка с пилотом Ф2.5 зафиксирована; mid-run-append ограничение (D8/D15.1/D21.1а) не демонтируется. Owner-proposal «модель гуглит термины» = Ф3+ (D25.5 trust boundary); near-term = засев глоссария фан-конвенциями (v2 это и делает).
  9. Дорожка: бэкенд-пакет D15.2 (промт ВЫДАН — BACKEND_D152_SESSION_PROMPT.md: v3.1 + фикс-листы D22.9/D23.4-остаток/D28.3 + D29.1-экспорт/override + D30.2/30.3 промпты/санитайзер + golden-refresh с расширением фикстуры D28.2) ∥ полигон exp13 (POLYGON_EXP13_SESSION_PROMPT.md) + финализация сида v2 → единый resnapshot → пере-прогон 25 глав кандидат-конфигом (переводчик по exp13; glm-5-билингв; reflow; сид v2; санитайзер) с re-gate верности → чтение владельца → этап B.
  10. Гигиена полигону (из ревью, в exp13): каждый платный скрипт персистит usage/cost; пре-регистрацию коммитить до первого платного вызова; parse-чек полноты ранжирования судьи; флагман-сырьё — в diag/.

D31. Тотальная ревизия документации (12.07, оркестратор, по мандату владельца).

Проект за 8 дней дорос до D30; половина «истин» в онбординг-доках перевёрнута (CLAUDE.md в шапке говорил «монолингвальный редактор grok-4.3»), PROGRESS распух до 393KB. Полный staleness-инвентарь мультиагентным аудитом (5 кластеров: architecture / experiments / research / PROGRESS / root+prompts; read-only, каждый клейм сверен с D-логом построчно). Дисциплина: исторические записи НЕ переписываются (D23.3) — только баннеры/inline-пометки/архив/актуализация живых доков. Применено:

  1. PROGRESS.md разделён (9e3762e): закрытая хроника 0410.07 (~330KB: день-0, стратревью, пакеты бэкенда №04, сессии полигона 13+18+, память/голос/ридер-IDE) → archive/PROGRESS-2026-07-04-10.md с точка-во-времени-баннером и дословно сохранёнными заголовками (на них ссылаются комменты кода models.yaml:31/models.go/llm.go и eval-скрипты — grep-совместимость). В живом файле: CURRENT-STATE + отчёт приёмки этапа A + оркестраторские записи 1112.07 + якоря секций «Бэкенд/Полигон/Память/Голос/Ридер-IDE» для аппенда сессий. 393→63KB (~85100K токенов экономии на онбординге). Единственный числовой line-ref в репо (05-decisions-log:122 → PROGRESS:230, уже сломан дрейфом до сплита) и 5 name-refs живых доков репойнчены на архив.
  2. D-лог получил карту актуальности сверху (что чем superseded — быстрый чек при чтении контракта); титул обновлён до D1D31.
  3. CLAUDE.md актуализирован: шапка-пайплайн (моно-grok → БИЛИНГВ-кандидат-glm-5, COGS ~$0.85), счётчик D1D31, блок «Текущее состояние» под дорожку D30.9; гардрейл grok reasoning-off помечен «из редакторских ролей снят»; добавлен указатель на архив PROGRESS. Гардрейлы/зоны/онбординг-порядок — целы.
  4. Баннеры/пометки живых доков: architecture — шапка-указатель на 01-decisions (модели/цены проигрывают D-логу), точка-во-времени на 03-implementation-notes/07-strategic-review (вердикты развязаны), inline на 02-mvp-plan v3.2 (флип D1, дорожка), 06-memory-risk-registry (+D24.2/G2/D28.1), критическая пометка §3.2 (content-hash, не счётчик — D8). experiments — опасные editor-grok строки 00-provider-quirks (reasoning-off = no-op редактор) исправлены + gemini-судья/additive_total/преамбула-утечка дописаны; баннеры на 04-editor-quality (рекомендация отменена) и 08-cost-model-v2 (до-D30 экономика); указатели на 09-pilot-protocol (пост-D13 амендменты) и 07-coverage-precision (content_filter жив на Gemini). research — баннер 04-api-providers обновлён под D30, баннер 11-gap-2 (канал B пересобран), указатели 15/17 (флип D1 меняет editor-слот/§C), inline 13/14 (post-check реализован decl-путём, не pymorphy).
  5. Промты: старые версии в архив (ORCHESTRATOR v2, ACCEPTANCE v1, READER_IDE — задача закрыта D29); написаны заново: ORCHESTRATOR хендофф №3 (пост-D31, дорожка D30.9, столпы обновлены) и ACCEPTANCE под пере-прогон+этап B (баннерная стратегия старого исчерпала себя — три противоречащих слоя; сохранены золотой чек-лист методологии этапа A + re-gate верности D30.1 + методика D10 скриптом + alias-слепое пятно + echo-rate чекпоинт).
  6. Сознательно НЕ тронуто (низкий приоритет, покрыто картой актуальности D-лога): 01-token-calibration/02-refusal-benchmark/10-explicit-benchmark — нишевые закрытые эксперименты, стейл-части кросс-ссылаются корректно; правки backend/README (D1D23→D1D31, «D15.2 после правок») и eval/README (exp04/exp08-каветки) — ЧУЖИЕ зоны, переданы в fix-листы пакета D15.2 и exp13 (не правил из оркестраторской ревизии). Провенанс 12-*-доков — по-прежнему открытый вопрос владельца.

Сопутствующие правки доков (оркестратор, 09.07)

02-mvp-plan.md → v3 (мёртвые пороги/интерим-18+/фазовые списки синхронизированы с D-логом); обе *.puml → v3 (убраны Opus/BYOK/«≤2×», дорисованы ре-гейт эскалации, три класса отказов D12, человек в петле, фазовые пометки); superseded-баннеры на research/01, 02, 03, 04, 09; провенанс-шапки на research/12-architecture-as-antipattern.md и 12-common-failures.md (происхождение не зафиксировано — до уточнения владельцем числа оттуда не абсорбировать как факты); закрытые промты → docs/archive/prompts/; онбординг: корневой CLAUDE.md + backend/README.md + eval/README.md.