From 0e88f83b17d478b1530d3218896930b6b2e94dea Mon Sep 17 00:00:00 2001 From: "Claude (backend session)" Date: Sat, 25 Jul 2026 07:22:00 +0300 Subject: [PATCH] =?UTF-8?q?Ratify=20pack-17=20channel-B=20design=20as=20D3?= =?UTF-8?q?9.26=20in=20its=20=C2=A714=20revision,=20add=20three=20acceptan?= =?UTF-8?q?ce=20findings,=20mark=20phase=202=20exactly,=20land=20design=20?= =?UTF-8?q?report=20with=20review=20header?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CLAUDE.md | 6 +- ...BACKEND_PACK17_CHANNEL_B_SESSION_PROMPT.md | 39 +- docs/PROGRESS.md | 10 +- docs/README.md | 8 +- docs/architecture/05-decisions-log.md | 39 +- docs/architecture/09-target-architecture.md | 2 +- .../reports/PACK17_DESIGN_2026-07-25.md | 344 ++++++++++++++++++ 7 files changed, 432 insertions(+), 16 deletions(-) create mode 100644 docs/archive/reports/PACK17_DESIGN_2026-07-25.md diff --git a/CLAUDE.md b/CLAUDE.md index e11ca6e7..c661ac8c 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -14,7 +14,7 @@ Go-бэкенд издательского художественного пер ## Источники истины (по убыванию) -1. **`docs/architecture/05-decisions-log.md` (D1–D39.25)** — ратифицированный контракт; при конфликте с любым другим доком побеждает он; сверху файла — карта актуальности (что чем superseded). **Правило чтения (онбординг-диета 25.07): карта + живая голова (эра D39.x); корпус D1–D38 = справочник — по ссылкам/grep по D-номеру, целиком НЕ читать.** +1. **`docs/architecture/05-decisions-log.md` (D1–D39.26)** — ратифицированный контракт; при конфликте с любым другим доком побеждает он; сверху файла — карта актуальности (что чем superseded). **Правило чтения (онбординг-диета 25.07): карта + живая голова (эра D39.x); корпус D1–D38 = справочник — по ссылкам/grep по D-номеру, целиком НЕ читать.** 2. `docs/experiments/00-provider-quirks.md` — wire-квирки провайдеров (читать ПЕРЕД правкой адаптеров/вызовами провайдеров). 3. `docs/architecture/09-target-architecture.md` (7 слоёв; статус стройки — шапка-таблица) · `12-go-style-notes.md` (норматив общности §0) · `10-prompt-architecture.md` (промпт-тема). 4. `docs/architecture/01-decisions.md` (Р1–Р10), `02-mvp-plan.md`, `04-unhappy-paths.md`, `06-memory-risk-registry.md` — тела исторические, читать через ⚠-баннеры 25.07. @@ -39,11 +39,11 @@ Go-бэкенд издательского художественного пер 2. `docs/architecture/05-decisions-log.md`: карта актуальности (шапка) + живая голова (D39.x). Целиком НЕ читать — корпус D1–D38 по ссылкам/grep по мере надобности. 3. По роли: Бэкенд — `backend/README.md` + `03-implementation-notes.md` (через баннер) + `12-go-style-notes.md`; Полигон — `eval/README.md` + `experiments/00` + `09-pilot-protocol.md`; всем — шапка-таблица `09-target-architecture.md` (статус слоёв). -## Текущее состояние (2026-07-25, пост-пак-16/D39.25 — эра «механизация выпускного качества») +## Текущее состояние (2026-07-25, пост-пак-16 / дизайн пака-17 ратифицирован D39.26 — эра «механизация выпускного качества») - **Фазы:** Ф0 ✅ · Ф1-инфра ✅ (D20–D28; golden = инвариант детерминизма №8) · арка «качество-первым» D26→D38.5 закрыта · **арх-ресет D39 исполнен ЦЕЛИКОМ**: 7 слоёв построены паками 11–16 (D39.13–D39.24; статус слоёв — шапка-таблица `09-target-architecture.md`; слой-3 diff-редактор — за `enabled:false`, включение = решение владельца по замеру остатка). - **Пере-прогон rerun2 прочитан (D39.20):** операционка живьём ($0-резюм ×3 арма, $6.63<$15, echo 0, майнинг-стоп→подпись); планка ≤2 НЕ пройдена; анти-корреляция гладкость↔верность ×3 → mistral-редактор вон. **Эксп ЗАКРЫТ (D39.22), итерация №2 отложена; редактор = deepseek-v4-pro ИНТЕРИМ** (glm-5 резерв). Стайл-каноны D39.21 (时辰=2ч · generic-«гу» ср. род · стихи смыслом · 资质=«талант»). -- **Курс — разработка бэкенда:** **пак-17 «канал B вживую» ЗАПУЩЕН 25.07** (двухфазный; **D39.25: в движке НЕТ понятия «18+»** — generic content-labels × provider-capabilities, refusal причино-агностичен) → следующий платный прогон (разом: итерация №2 dspro-vs-glm · замер остатка ремонта · живой канал B) → сид-дельта (元 · 赤城 · 学堂家老 · 春秋蝉) → Ф2-механизмы (голос/состояние D21 · native-Gemini судья) · ja→ru §B5 → пилот Ф2.5. +- **Курс — разработка бэкенда:** **пак-17 «канал B вживую»: фаза 1 (дизайн) ПРИНЯТА в редакции §14 — D39.26, фаза 2 (стройка) размечена и открыта** (**D39.25: в движке НЕТ понятия «18+»** — generic content-labels × provider-capabilities, refusal причино-агностичен; лейблы вне хешей · резолв до валидации · один хоп `chain[0]` · гранулярность = книга; на владельце — вокабуляр лейблов и редактор под лейблом) → следующий платный прогон (разом: итерация №2 dspro-vs-glm · замер остатка ремонта · живой канал B) → сид-дельта (元 · 赤城 · 学堂家老 · 春秋蝉) → Ф2-механизмы (голос/состояние D21 · native-Gemini судья) · ja→ru §B5 → пилот Ф2.5. - **Стек:** draft deepseek-v4-flash thinking-ON → editor deepseek-v4-pro → судья gemini-preview + grok-фолбэк 18+ (~$0.85/ранобэ D30.4). Ключи: DEEPSEEK, ZAI, KIMI, OPENAI, GEMINI, XAI, MISTRAL (xAI: единый, data-sharing, off перед продом D27). - **Висит на владельце + открытые петли:** трекер в CURRENT-STATE `docs/PROGRESS.md` (единственное место). - **Стенд:** WSL2, GTX 1070 8GB (localhost из-под прокси = 403 — no-proxy транспорт для local). Книга `/home/ubuntu/books/gu-zhenren/` (GB18030; текст и производные ВНЕ git). diff --git a/docs/BACKEND_PACK17_CHANNEL_B_SESSION_PROMPT.md b/docs/BACKEND_PACK17_CHANNEL_B_SESSION_PROMPT.md index 3481c71a..1ee7df5d 100644 --- a/docs/BACKEND_PACK17_CHANNEL_B_SESSION_PROMPT.md +++ b/docs/BACKEND_PACK17_CHANNEL_B_SESSION_PROMPT.md @@ -1,6 +1,8 @@ # Промт бэкенд-сессии: ПАК-17 «канал B (18+) вживую» (ДВУХФАЗНЫЙ: дизайн → ратификация → стройка) -**Статус: ВЫДАН 25.07.2026, оркестратор №7.** Цель: 18+ контент (уровни 1–2) идёт через волновой стек по adult-каналу — permissive-провайдеры, refusal-обработка, механические гарантии маршрутизации. Ратифицированная база: D14 (состав канала B) · D19 (Mistral = переводчик канала B; register-оговорка эха D19.1; судьи 18+ п.6: Gemini fail-closed на эротике, Grok первичный) · D22 (развязки 18+/эха; L3-спека D22.7) · D4 (adult-цепочка = permissive-провайдеры; уже в конфигах: `escalation.chains.adult: [grok-4.3]`). Эмпирика полигона: `experiments/10-explicit-benchmark` (violence) · `11-erotica-benchmark`. +**Статус: ФАЗА 1 ИСПОЛНЕНА И РАТИФИЦИРОВАНА (`D39.26`, 25.07) → ФАЗА 2 РАЗМЕЧЕНА И ОТКРЫТА.** Дизайн-отчёт `docs/archive/reports/PACK17_DESIGN_2026-07-25.md` принят **В РЕДАКЦИИ §14** (тело §0–13 читать ТОЛЬКО через §14; при расхождении побеждает §14) + ревью-шапка оркестратора. **Фаза 2 стартует по §«ФАЗА 2» ниже** — там ратифицированный «ровно так»-список; §«ФАЗА 1» оставлена как история задания. + +**Статус фазы 1: ВЫДАН 25.07.2026, оркестратор №7.** Цель: 18+ контент (уровни 1–2) идёт через волновой стек по adult-каналу — permissive-провайдеры, refusal-обработка, механические гарантии маршрутизации. Ратифицированная база: D14 (состав канала B) · D19 (Mistral = переводчик канала B; register-оговорка эха D19.1; судьи 18+ п.6: Gemini fail-closed на эротике, Grok первичный) · D22 (развязки 18+/эха; L3-спека D22.7) · D4 (adult-цепочка = permissive-провайдеры; уже в конфигах: `escalation.chains.adult: [grok-4.3]`). Эмпирика полигона: `experiments/10-explicit-benchmark` (violence) · `11-erotica-benchmark`. ## Инварианты — «РОВНО ТАК» (ратифицировано; конфликт с кодом/доками → пинг оркестратору через владельца, НЕ интерпретация) @@ -27,9 +29,40 @@ **Приёмка фазы 1:** отчёт `docs/archive/reports/PACK17_DESIGN_<дата>.md` — НАЧИНАЕТСЯ эхо-блоком (≤10 строк: скоуп/инварианты/не-делать); по каждому B: варианты, рекомендация, риски; адверсариальный селф-ревью (линзы: L3-линия/гардрейлы · маршрутизация-fail-loud · байт-точность канала A · деньги/резюм · общность §0). **СТОП — ратификация.** -## ФАЗА 2 — СТРОЙКА (после ратификации; список станет размеченным «ровно так») +## ФАЗА 2 — СТРОЙКА (ратифицировано `D39.26`; читай вместе с §14 отчёта — там file:line на каждый пункт) -Инварианты фазы: golden байт-идентичен · парити EXACT · `-race` · **сэндбокс-репродукции через драйвер** (правило 11: mock-провайдер, сквозные сценарии — refusal-каскад, non-permissive-реджект, маршрутизация) · дифф `^func Test` исполнением · заявление=команда. Хвосты из петель: ниты общности (Detail-строки чекеров → из данных · множитель ×2 `lintTimeUnits` → ключ данных). +**Читать перед работой:** §14 отчёта фазы 1 (несущее) + `D39.26` в `05-decisions-log.md` (что я изменил против §14 и три добора приёмки). Промт даёт РЕШЕНИЯ; код-факты вытаскивай сам, отчёт — карта. + +### «РОВНО ТАК» (ратифицировано; отступление = пинг оркестратору через владельца, не тихая девиация) + +1. **Лейблы НЕ входят ни в один хеш.** Назначенный слой снапшота (разрядка D20.2-Q3) = **резолвнутая модель стадии + её wire-фолд, пер-стадийно и пер-волново** (`stageSnap`): лейбл на редакторе двигает ТОЛЬКО edit-волну, оплаченный драфт резюмится за $0. Канон brief ЗАМОРОЖЕН — `"adult":false` остаётся 7-м полем, omitempty-хвост НЕ нужен; `stageSnap.Escalate*` сохраняют имя/тег/позицию/правило заполнения, любой фолд хопов — строго аддитивный указатель+omitempty. Провенанс лейблов — шапка отчёта, не хеш. +2. **Порядок: РЕЗОЛВ → ВАЛИДАЦИЯ → все читатели видят резолвнутое.** Лейблы приходят в `LoadPipeline` тем же швом, что `pair` (доктрина «все проблемы конфига одним списком»); резолвнутые поля — `yaml:"-"`; «достижимое» ЛЕЙБЛ-ЗАВИСИМО (`st.EscalateTo`/`chains.default` под лейблом недостижимы); дедуп — только по цепочкам активных лейблов ИСПОЛНЯЕМОГО конфига (C2-заглушка не блокирует загрузку); резолв работает и на read-путях (`export`/`status` пере-считывают снапшот). +3. **Эскалация под лейблом = ОДИН хоп `chain[0]`** (Q4 = B3-A′): `len(chain) > 1` — громкая ошибка загрузки «мульти-хоп не построен» (тихого усечения нет); `escalation.budget_usd > 0` ОБЯЗАТЕЛЕН для route-лейбла (иначе гейт не может выстрелить); `escMu` — как сегодня (лок-на-итерацию ОТМЕНЁН: он ломает пин «перерасход ≤ 1 хоп»). +4. **Гранулярность v1 = КНИГА** (аргумент гарантии: авто-скрина нет, пер-главность сводит ToS-гарантию к точности ручного чтения). `labelsFor()` — БЕЗ аргумента, с ассертом книго-константы; диапазоны глав НЕ обещать формой. +5. **Вокабуляр данных:** книга — `content_labels:`, провайдер/модель — `accepts_labels:` (разные ключи: свойство контента ≠ разрешение получателя); пер-модельный оверрайд — `*[]string`, только СУЖАЕТ (nil = наследовать, указатель на пустой = «ни одного», модельный ⊆ провайдерского, load-тест на вычитание); реестр политик — **УПОРЯДОЧЕННЫЙ СПИСОК** (`action: route|terminal`), «первая политика, претендующая на стадию, выигрывает», равное притязание = громко; лейбл книги без записи в реестре = громко; эффективный список хопов — упорядоченное объединение с дедупом ПОСЛЕ резолва. +6. **Отставки — ОДНИМ диффом:** `permissive` (громко при наличии) · `adult:` книги (громко ТОЛЬКО на `true`; `false`/отсутствие терпимо — ключ несут 13 файлов вне git + `example/book.yaml`; обязателен `LoadBook`-тест на все три формы) · **`Stage.Channel` + его enum + блок изоляции D4.1** (иначе `providerPermissive` вечно false и выживший `channel: adult` = операторский тупик) · `CheckAdultChannel`. Go-идентификаторы — БЕЗ слова adult (тег = замороженный ключ данных). Два существующих adult-теста перепиши/удали тем же диффом. +7. **Механическая гарантия:** инвариант «для книги с набором лейблов L каждая модель, которую прогон может вызвать, несёт все лейблы L». Рубеж 1 — загрузка (сообщение называет модель, провайдера и НЕДОСТАЮЩИЙ лейбл). Рубеж 2 — рантайм-ассерт в `runAttempt` **ДО `Reserve`** через `clientFor(model, labels)` (компиль-энфорс: путь на провод не может не объявить контент). Ассерт НЕ переносить до `GetCheckpoint` (реплей ничего не отправляет; перенос отнял бы $0-реплей). Негативный тест — на СВЕЖЕМ вызове, ассертит идентичность ОШИБКИ, не дельту `spend`. +8. **Отказы загрузки — за `forWrite`; резолв — ВСЕГДА.** Книга, помеченная после оплаты, обязана остаться читаемой ($0 read-only, D20.4) — иначе единственный выход «снять лейбл» = тихий обход; на read-пути те же условия дают громкое предупреждение + флаг в шапке отчёта. +9. **`internal/llm/failover.go` — УДАЛИТЬ** (вызывающих нет; пересылает тот же запрос другому провайдеру — ровно то, что лейбл запрещает; nil-panic-дыра D4 п.1). Тесты файла уходят с ним — объявить в цензе `^func Test` ИСПОЛНЕНИЕМ. Гард-тест шва оставить: `\.Complete(` вне `internal/llm` и вне `stagerun.go` — пусто, с ИМЕНОВАННЫМ аллоулистом `live_conformance_test.go`. +10. **Реестр-пример — только `route` на синтетическом значении.** `prohibited` из примеров убрать (не воспроизводить выходы будущего L3); механизм `terminal` построить, значение НЕ заводить; будущий L3-скрин подключается НАЗВАННЫМ пер-лейбловым хуком политики, а не через `terminal`. **D22.7 этим паком НЕ снимается** — пер-чанковый L3-скрин остаётся предусловием первой erotica-книги в проде. +11. **Отказ РЕДАКТОРА под лейблом терминален** (D12 pinned: flag+skip без хопа). Refusal остаётся причино-агностичным: новых классов нет, `refusal.txt` не переписывается. +12. **Закрыть тихий выход `reasoning:"off"` на аддитивном провайдере (добор приёмки B).** Сегодня гейт `pipeline.go:541` гейтится внешним `st.Reasoning != "off"`, а шиппинг-стадия edit объявляет ровно `off` (no-op для dspro, НО не для grok: `control: effort, off_effort: none` шлёт явный `none`) ⇒ деньги честны, а эхо-зона D19.1 п.2 («reasoning-off + плотный CJK — свойство класса, DeepSeek и ОБА grok-слага») открыта, и `echoMineViolation` выстрелить не может (`echoes_when_thinking_off` только у deepseek). **Форму выбираешь сам и аргументируешь** (данные: флаг у xai ⇒ `off` становится громким | код: аддитивный гейт над резолвнутой моделью независимо от `off`), закрытие — обязательно, с тестом. +13. **Рейт-гарды утверждать ПОЗИТИВНО (добор C):** `rateGuard()` возвращает nil (= без лимита) молча, в отличие от громкого `r.client`; лейблованный переводчик — `mistral-large-2512` с `max_concurrency: 2`. Тест: резолвнутая лейблованная модель получила свой гард. +14. **Тесты (все обязательны, правило 11 — гоняем, не читаем):** негативный load (книга с лейблом + модель без способности) · рантайм-ассерт до резервации · сквозняк refusal→хоп→OK→ре-гейт · сквозняк «хоп тоже отказал» → flag+skip · **генеральность на СИНТЕТИЧЕСКОМ значении лейбла** (если движок знает слово «adult» — тест красный) · второй лейбл только данными · шиппинг-конфиги в лейблованном сценарии. +15. **Док-правки §10 отчёта (5 расхождений док↔код)** — тем же паком, включая устаревшие против D30.1 комменты про «вход редактора — русский черновик». + +### «РЕШИ САМ И АРГУМЕНТИРУЙ» + +- Форма закрытия п.12 · где физически живут резолвнутые поля и как именно `labelsFor` доезжает до `runAttempt` · формы валидационных сообщений · отчётность B6 (шапка `report`/`status` с резолвнутыми лейблами и таблицей маршрутизации · `Hops` из durable-чекпойнтов · read-only агрегат `SpendByModel`) — состав и объём на твоё усмотрение, миграций схемы НЕ вводить, `Role` синтетическую под лейбл НЕ заводить (ось `RequestHash` = новый платный вызов). +- **Данные редактора/переводчика под лейблом НЕ прибивай сам:** переводчик = `mistral-large-2512` (D19, ровно так); **редактор и вокабуляр лейблов ждут владельца** (единый `adult` против `violence`/`sexually-explicit` — D14 п.1 оставляет DeepSeek допустимым на violence; кандидаты редактора только из способных, dspro запрещён на sexually-explicit по ToS, mistral отвергнут как несущий D39.20, glm-5 — одна строка данных ТОЛЬКО после сверки ToS/AUP Z.AI по первоисточнику). Строй механизм так, чтобы ответ был строкой данных; получишь его релеем. + +### ВЫНЕСЕНО ИЗ ПАКА (не делать) + +`escalation_model` = ОТВЕТИВШАЯ модель (вердикт-изменение: golden пинит `esc_model` на отказавшем хопе ⇒ отдельная ратификация с санкционированным пере-капчером) · `--accept-rebill` (D20.2-Q2, открытая петля) · полный обход цепочки · авто-детекция лейблов · L3-классификатор · судья 18+ (eval-сторона). + +**Хвосты общности из петель — УСЛОВНО:** Detail-строки чекеров из данных · множитель ×2 `lintTimeUnits` (`checkers.go:174`) → ключ данных. Берутся ТОЛЬКО в байт-нейтральной форме (данные в пар-конфиге, фолд лишь при отличии от дефолта) с доказательством ИСПОЛНЕНИЕМ (выход чекеров байт-идентичен до/после над корпусом); иначе `CheapGateVersion`/`pack.Version()` двигают снапшот стендовых книг и убивают $0-резюм драфта под замер остатка пака-16 — тогда отложи и скажи явно. Молча bump-нуть версию нельзя, молча не bump-нуть — тоже. + +Инварианты фазы: **golden байт-идентичен без пере-капчера** · парити EXACT · `-race` · **сэндбокс-репродукции через настоящий драйвер** (правило 11: mock-провайдер, сквозные сценарии — refusal-каскад, реджект неспособной модели, маршрутизация) · **дифф `^func Test` ИСПОЛНЕНИЕМ, не памятью** · заявление = команда (приёмка ре-ранит манифест) · самопроверка ревью исполнением своего кода и результатов · сессия НЕ коммитит, `git mv` декларировать. ## НЕ делать diff --git a/docs/PROGRESS.md b/docs/PROGRESS.md index cbb6e0d1..1972ae54 100644 --- a/docs/PROGRESS.md +++ b/docs/PROGRESS.md @@ -1,11 +1,15 @@ # Журнал прогресса -> **⟶ ТЕКУЩЕЕ СОСТОЯНИЕ** (на 2026-07-25, пост-пак-16/D39.25). **Источник истины по РЕШЕНИЯМ — `architecture/05-decisions-log.md` (D1–D39.25); этот файл — ЖУРНАЛ.** -> - **Фазы/курс:** Ф0 ✅ · Ф1-инфра ✅ (D20–D28; golden = инвариант №8) · арка «качество-первым» D26→D38.5 закрыта · **арх-ресет D39 исполнен ЦЕЛИКОМ** (7 слоёв → программа D39.1–D39.10 → паки 11–16, D39.13–D39.24; статус слоёв — шапка-таблица `architecture/09-target-architecture.md`) · пере-прогон rerun2 прочитан (D39.20: операционка живьём, $0-резюм ×3 арма, $6.63<$15; планка ≤2 НЕ пройдена; анти-корреляция гладкость↔верность ×3 → mistral-редактор вон) · эксп ЗАКРЫТ (D39.22), итерация №2 отложена · **курс = разработка бэкенда: пак-17 «канал B вживую» ЗАПУЩЕН 25.07** (D39.25: в движке НЕТ понятия «18+» — generic content-labels × provider-capabilities) → следующий платный прогон (разом: итерация №2 dspro-vs-glm · замер остатка ремонта → решение о петле D39.24 · живой канал B) → сид-дельта (元 · 赤城 · 学堂家老 · 春秋蝉) → Ф2-механизмы (голос/состояние D21 · native-Gemini судья) · ja→ru §B5 → пилот Ф2.5. Хроника треков A/B, exp15/16 и стройки паков — архивы ниже + D-лог. +> **⟶ ТЕКУЩЕЕ СОСТОЯНИЕ** (на 2026-07-25, пост-пак-16 / дизайн пака-17 ратифицирован D39.26). **Источник истины по РЕШЕНИЯМ — `architecture/05-decisions-log.md` (D1–D39.26); этот файл — ЖУРНАЛ.** +> - **Фазы/курс:** Ф0 ✅ · Ф1-инфра ✅ (D20–D28; golden = инвариант №8) · арка «качество-первым» D26→D38.5 закрыта · **арх-ресет D39 исполнен ЦЕЛИКОМ** (7 слоёв → программа D39.1–D39.10 → паки 11–16, D39.13–D39.24; статус слоёв — шапка-таблица `architecture/09-target-architecture.md`) · пере-прогон rerun2 прочитан (D39.20: операционка живьём, $0-резюм ×3 арма, $6.63<$15; планка ≤2 НЕ пройдена; анти-корреляция гладкость↔верность ×3 → mistral-редактор вон) · эксп ЗАКРЫТ (D39.22), итерация №2 отложена · **курс = разработка бэкенда: пак-17 «канал B вживую» — ФАЗА 1 (дизайн) ПРИНЯТА и ратифицирована в редакции §14 (D39.26, 25.07), ФАЗА 2 (стройка) РАЗМЕЧЕНА И ОТКРЫТА** (D39.25: в движке НЕТ понятия «18+» — generic content-labels × provider-capabilities; лейблы вне хешей · резолв до валидации · один хоп `chain[0]` · гранулярность = книга) → следующий платный прогон (разом: итерация №2 dspro-vs-glm · замер остатка ремонта → решение о петле D39.24 · живой канал B) → сид-дельта (元 · 赤城 · 学堂家老 · 春秋蝉) → Ф2-механизмы (голос/состояние D21 · native-Gemini судья) · ja→ru §B5 → пилот Ф2.5. Хроника треков A/B, exp15/16 и стройки паков — архивы ниже + D-лог. > - **Стек:** draft deepseek-v4-flash (thinking ON) → **editor deepseek-v4-pro БИЛИНГВ ИНТЕРИМ (D39.22; glm-5 резерв, mistral вон D39.20)**, промпт v3-discourse (P1a+чэнъюй+few_shot-тумблер) → судья gemini-3.1-pro-preview; канал B Mistral+grok; 7 ключей; ~$0.85/ранобэ (D30.4). -> - **ОТКРЫТЫЕ ПЕТЛИ (норма 25.07, перепись 180 инцидентов: класс NEVER_CLOSED больше не копим — каждая петля обязана получить диспозицию решено/отложено-с-записью/отклонено; ведёт оркестратор).** *Владелец:* мини-каноны сид-дельты — 元-корень (предложение «изначальн-») и 春秋蝉 (подписано «Весенне-осенняя цикада», ждёт подтверждения) · **включение платной петли ремонта — по замеру остатка на пост-профилактическом прогоне (D39.24; заменил mini-live гейт D6)** · ja→ru-реплика §B5 (тайминг) · старые Ф2.5-блокеры (билингв-якорь — D25 п.9 Q1 · контаминация корпуса — D27 п.4 · судья-дублёр D22.6 · планка запуска · publishable/waiver — D25 п.1 · FN-bound L3 — D25 п.4 · юр-пакет · провенанс 12-*-доков · xAI-ключ off перед продом D27 · residual-тачпойнты exp16, не влитые в сид-дельту: мини-голд алиасов · precision@30, `books/gu-zhenren/exp16/`). *Оркестратор:* ~~ратификация дизайна пака-16~~ РЕШЕНО D39.24 (25.07) · фантом-гард D-ссылок в чек-листе лендинга (действует) · ~~doc-sync pass~~ **ИСПОЛНЕН 25.07** (запись ниже: оба puml перерисованы под пост-пак-16 · баннеры на 01/02/03/04/06/07/08/09 · ресёрч-свип 18/18c/19/20/21/22 · README/POLYGON_PACKAGE4 освежены; residual — пинги полигону в его зоне) · приёмка пака-17 фаза 1 (когда придёт отчёт: эхо-блок сразу, ратификация пропорционально). *Бэкенд:* ~~пак-16 ф.2~~ ЗАЛЕНДЕНА 25.07 · per-class исходы ремонта — схемное решение (класс не durable), принимается ВМЕСТЕ с включением петли · ниты общности (владелец 25.07, хвост ближайшего пака): Detail-строки чекеров → шаблоны/цитаты из данных (статический 时辰-текст в generic-файле соврёт второй паре) · множитель ×2 `lintTimeUnits` (`checkers.go:174`) → ключ данных. *Полигон (residual):* **6 пингов doc-sync аудита 25.07 (зона `docs/experiments/` — оркестратор не правит):** (1) `00-provider-quirks.md:13,73` — катовер deepseek-chat 24.07 ПРОШЁЛ, пост-катовер факт (жив ли алиас, цены) не внесён — live-проба `/models` + вендор-дока; (2) `00-provider-quirks.md:69` — оговорка «mistral-editor-арм до guard» superseded D39.20 (mistral вон из редакторов; rate-limit-цифры оставить — нужны переводчику канала B пака-17); (3) `09-pilot-protocol.md:3` — ⚠-указатель застрял на D31/glm-5: продлить до пост-D39.22 (dspro-интерим · планка ≤2 не пройдена rerun2 · авто-QA слепыми метками D39.20 · стайл-каноны D39.21), тело не трогать; (4) `15-segmentation-empirics.md:6-7` — шапка до сих пор «НИ ОДНОГО платного вызова», а эксп залендён REV.2 (D39.7/D39.8, $12.79) — перевернуть статус-блок; (5) `16-bank-mining.md:3` — дописать финал «ИСПОЛНЕН И ЗАЛЕНДЁН (D39.10); gender-тачпойнт §7 закрыт (D39.19); продолжение — Go-майнер парити EXACT»; (6) `experiments/README.md` — индекс без строк exp15/16 (сверка застряла на D38.2); (7) `eval/README.md` — не тронут с 19.07 (пре-rerun2): освежить статус под пост-D39.22 (эксп закрыт · судейский риг-стандарт D39.7 · экстракция только `tmctl export`). +> - **ОТКРЫТЫЕ ПЕТЛИ (норма 25.07, перепись 180 инцидентов: класс NEVER_CLOSED больше не копим — каждая петля обязана получить диспозицию решено/отложено-с-записью/отклонено; ведёт оркестратор).** *Владелец:* **вокабуляр content-лейблов (НОВОЕ 25.07, D39.26 добор A): единый `adult` против пары `violence`/`sexually-explicit`** — D14 п.1 оставляет DeepSeek допустимым на violence (запрещён только sexually explicit), поэтому единственное значение «adult» гонит violence-книгу целиком мимо dspro-редактора (D39.22) и умножает выходную цену; механизм держит оба варианта ДАННЫМИ, стройку не блокирует · **Q2 редактор под лейблом (НОВОЕ)**: grok-4.3 ИНТЕРИМ (ранг-1 верность билингвально exp04, первичный судья эротики D22.6, но $1.25/$2.50 против $0.435/$0.87 + развилка reasoning) | glm-5 = одна строка данных ТОЛЬКО после сверки ToS/AUP Z.AI по первоисточнику | mistral отвергнут как несущий (D39.20) | local-8b — скрининг · мини-каноны сид-дельты — 元-корень (предложение «изначальн-») и 春秋蝉 (подписано «Весенне-осенняя цикада», ждёт подтверждения) · **включение платной петли ремонта — по замеру остатка на пост-профилактическом прогоне (D39.24; заменил mini-live гейт D6)** · ja→ru-реплика §B5 (тайминг) · старые Ф2.5-блокеры (билингв-якорь — D25 п.9 Q1 · контаминация корпуса — D27 п.4 · судья-дублёр D22.6 · планка запуска · publishable/waiver — D25 п.1 · FN-bound L3 — D25 п.4 · юр-пакет · провенанс 12-*-доков · xAI-ключ off перед продом D27 · residual-тачпойнты exp16, не влитые в сид-дельту: мини-голд алиасов · precision@30, `books/gu-zhenren/exp16/`). *Оркестратор:* ~~ратификация дизайна пака-16~~ РЕШЕНО D39.24 (25.07) · фантом-гард D-ссылок в чек-листе лендинга (действует) · ~~doc-sync pass~~ **ИСПОЛНЕН 25.07** (запись ниже: оба puml перерисованы под пост-пак-16 · баннеры на 01/02/03/04/06/07/08/09 · ресёрч-свип 18/18c/19/20/21/22 · README/POLYGON_PACKAGE4 освежены; residual — пинги полигону в его зоне) · ~~приёмка пака-17 фаза 1~~ **РЕШЕНО D39.26 (25.07: принято в редакции §14, три добора приёмки, фаза 2 размечена)** · **`escalation_model` = ОТВЕТИВШАЯ модель (НОВОЕ, вынесено из пака-17): вердикт-изменение** — golden пинит `esc_model` на ОТКАЗАВШЕМ хопе, маскировка не скрывает ⇒ отдельная ратификация с санкционированным пере-капчером · **`--accept-rebill[=usd]` с порогом `min($0.50, 5%×ProjectedBookUSD)` РАТИФИЦИРОВАН D20.2-Q2, но в коде/CLI ОТСУТСТВУЕТ (НОВОЕ)** — живёт только в спеке `backend/docs/D15.2-*.md`; `--resnapshot` пере-пиннит без суммы · **D22.7 (пер-чанковый L3-скрин) — предусловие первой erotica-книги в проде НЕ снято паком-17 (НОВОЕ, держать отдельным гейтом)** · фантом-гард D-ссылок в чек-листе лендинга (действует). *Бэкенд:* **пак-17 фаза 2 — ОТКРЫТА (промт размечен «ровно так», D39.26)** · ~~пак-16 ф.2~~ ЗАЛЕНДЕНА 25.07 · per-class исходы ремонта — схемное решение (класс не durable), принимается ВМЕСТЕ с включением петли · ниты общности (владелец 25.07) — **едут хвостом пака-17 фазы 2 УСЛОВНО**: только в байт-нейтральной форме с доказательством исполнением (иначе `CheapGateVersion`/`pack.Version()` двигают снапшот стендовых книг и убивают $0-резюм драфта под замер остатка пака-16): Detail-строки чекеров → шаблоны/цитаты из данных (статический 时辰-текст в generic-файле соврёт второй паре) · множитель ×2 `lintTimeUnits` (`checkers.go:174`) → ключ данных. *Полигон (residual):* **6 пингов doc-sync аудита 25.07 (зона `docs/experiments/` — оркестратор не правит):** (1) `00-provider-quirks.md:13,73` — катовер deepseek-chat 24.07 ПРОШЁЛ, пост-катовер факт (жив ли алиас, цены) не внесён — live-проба `/models` + вендор-дока; (2) `00-provider-quirks.md:69` — оговорка «mistral-editor-арм до guard» superseded D39.20 (mistral вон из редакторов; rate-limit-цифры оставить — нужны переводчику канала B пака-17); (3) `09-pilot-protocol.md:3` — ⚠-указатель застрял на D31/glm-5: продлить до пост-D39.22 (dspro-интерим · планка ≤2 не пройдена rerun2 · авто-QA слепыми метками D39.20 · стайл-каноны D39.21), тело не трогать; (4) `15-segmentation-empirics.md:6-7` — шапка до сих пор «НИ ОДНОГО платного вызова», а эксп залендён REV.2 (D39.7/D39.8, $12.79) — перевернуть статус-блок; (5) `16-bank-mining.md:3` — дописать финал «ИСПОЛНЕН И ЗАЛЕНДЁН (D39.10); gender-тачпойнт §7 закрыт (D39.19); продолжение — Go-майнер парити EXACT»; (6) `experiments/README.md` — индекс без строк exp15/16 (сверка застряла на D38.2); (7) `eval/README.md` — не тронут с 19.07 (пре-rerun2): освежить статус под пост-D39.22 (эксп закрыт · судейский риг-стандарт D39.7 · экстракция только `tmctl export`). > - Архивы хроники: `archive/PROGRESS-2026-07-04-10.md` (D31) · `archive/PROGRESS-2026-07-10-13.md` (D39.6-гигиена) · `archive/PROGRESS-2026-07-13-25.md` (слайс 25.07: стройка паков 11–16, rerun2). Записи ниже — живой хвост. +## Оркестратор №8 — ПАК-17 ФАЗА 1 (дизайн канала B) ПРИНЯТА и ратифицирована в редакции §14 (D39.26); три добора приёмки; фаза 2 размечена, 25.07 + +Приёмка **пропорциональная** (поправка 25.07: инлайн-пасс исполнением, без воркфлоу — как и в паке-16 тяжёлая ратификация не понадобилась). Эхо-блок отчёта сверен с промтом — сошёлся (7 инвариантов + мысленный тест генеральности + не-делать + канал вопросов; xAI-ключевая петля осознанно не эхнута — она «в пак не тащить»). **Метод сессии — образец пака-16:** 11 адверсариальных агентов, §14 отдельным слоем, тело не переписано; сессия сама отменила ТРИ своих решения и перевернула ДВЕ рекомендации — это ровно то поведение, которое нормы 5/10 поощряют. **Мой рубеж-2: ноль опровержений §14, три добора.** Пере-вывел сам: **M1 ре-деривирован независимо** (питон-канон по `book.go:214-228`) — все пять дайджестов посимвольно, `c2021b1b…cab0df` = `capture.golden:6`, omitempty-хвост при пустых лейблах байт-в-байт тот же ⇒ денежный кейстоун (защита $0-резюма драфта под замер остатка пака-16) стоит; **фантом-гард D-ссылок чист** (18 блоков/подпунктов, включая `:245` D20.2-Q1/Q2, `:247` D20.4, `:276` D22.7, `:310` D25 п.4); спот-чеки подтвердили §14.1 (`BriefHash` book-global в общем билдере обеих волн при пер-стадийном `stageSnap` + `waveStages`), §14.2 (сырое `reachableModels`; `chains.default[0]` = `escalate_to` драфта ⇒ неограниченный дедуп упал бы на шиппинге), §14.3 (`escMu`-пин «перерасход ≤ 1 хоп», `Waves.Workers` дефолт 1 ⇒ лок-на-итерацию правильно отменён), §14.5.6 (`GetCheckpoint:337`→`Reserve:379`→`client:410`→`Complete:442`), §14.6.1/2 (golden пинит `esc_model` на отказавшем хопе; `style_check_version` фолдится безусловно), 13 файлов вне git с `adult:`. Неточности, выводов не меняющие: «`accept-rebill` грепом пусто» — 9 попаданий, все в спеке `backend/docs/D15.2-*.md` (в коде действительно нет); «23 сайта `LoadPipeline`» включает строку определения. **Три добора (в D39.26):** (A) единый лейбл «adult» схлопывает ратифицированную violence-развязку D14 п.1 ⇒ вокабуляр лейблов — владельцу (механизм держит обе формы данными, стройку не блокирует); (B) `reasoning:"off"` — тихий выход из аддитивного гейта (внешнее условие `pipeline.go:541`) И из эхо-гейта (`echoes_when_thinking_off` только у deepseek — обобщение D19.1 п.2 «оба grok-слага» в данные не доехало) ⇒ закрытие обязательно; (C) рейт-гард молча деградирует в «неограниченно» при лейблованном переводчике mistral `max_concurrency: 2`. **Мои решения поверх §14:** `failover.go` УДАЛИТЬ (а не давать конструктору лейблы — least mechanism при нуле вызывающих), гард-тест шва `\.Complete(` с именованным аллоулистом `live_conformance_test.go`. **Q3/Q4/Q5/Q6 закрыл сам** (D12 pinned · B3-A′ один хоп · `chains.default` остаётся мёртвым · механизм `terminal` строим, значение не заводим); **Q1 = книга** по аргументу гарантии; **владельцу — вокабуляр лейблов + Q2 редактор** (деньги/продукт/18+). Выносы: `escalation_model`=ответившая · `--accept-rebill` · D22.7-предусловие — все три легли в трекер петель. + ## Оркестратор №7 — DOC-ДИЕТА ИСПОЛНЕНА (санкция владельца 25.07, блоки A+B+C): онбординг-путь разгружен, `abdfbff`, 25.07 Мотив владельца: часть доков морально устарела/перегружена и мешает моделям погружаться. **A:** хроника 13–25.07 (стройка паков 11–16, rerun2) → третий слайс `archive/PROGRESS-2026-07-13-25.md`; PROGRESS 268→54 строк (CURRENT-STATE сжат: фазы/курс · стек · петли); «Текущее состояние» CLAUDE.md: параграф-монстр → 6 буллетов (детали паков живут в D-логе/отчётах). **B:** исполненные арх-доки 07-strategic-review · 08-sync-audit-ledger · 11-implementation-plan → `archive/architecture/` (`git mv`, история сохранена); 07 вычеркнут из «источников истины №2»; живые ссылки обновлены (README · ORCHESTRATOR_SESSION_PROMPT · шапка 09); тела D-лога не тронуты (D23.3 — его исторические относительные ссылки на 07/11 осознанно оставлены). **C:** правило чтения D-лога при онбординге: «целиком» → «карта актуальности + живая голова D39.x; корпус D1–D38 — справочник по ссылкам/grep» — снимает ~100k токенов (375 КБ) с каждого онбординга; физический сплит D-лога ОТВЕРГНУТ (ломает file:line-ссылки из десятков доков). Не тронуты: 04-unhappy-paths (живая матрица) · 03 (контракты) · 09/10/12 (карта слоёв/реестр/нормы) · research/* (вне онбординг-пути, баннеры стоят). Заодно: стейл-шапка CLAUDE.md «кандидат glm-5» → dspro-интерим D39.22. **Дорезка по вопросу владельца:** ORCHESTRATOR_SESSION_PROMPT переписан хендоффом №6 (91→67 строк: мёртвая миссия эры «план→стройка» срезана, снапшот v5 → `archive/prompts/`; живое — роль/методология/уроки/нормы §1–11 — дословно; состояние больше НЕ дублируется, только указатели в PROGRESS/D-лог); D-лог решено НЕ резать (после правила чтения корпус не налог; физический сплит ломает file:line-ссылки ради нуля); +пинг №7 полигону (eval/README от 19.07). diff --git a/docs/README.md b/docs/README.md index 951d88ae..f7b530b7 100644 --- a/docs/README.md +++ b/docs/README.md @@ -11,17 +11,17 @@ ## Структура -- `architecture/` — синтез. **Источник истины по решениям — [`05-decisions-log.md`](architecture/05-decisions-log.md) (D1–D39.25); при конфликте с любым доком он выше.** +- `architecture/` — синтез. **Источник истины по решениям — [`05-decisions-log.md`](architecture/05-decisions-log.md) (D1–D39.26); при конфликте с любым доком он выше.** - `01-decisions.md` — принципы Р1–Р10; `02-mvp-plan.md` — фазы и приёмка (v3, 09.07); `03-implementation-notes.md` — контракты Фазы 0; `04-unhappy-paths.md` — ~70 режимов отказа → механизм; `06-memory-risk-registry.md` — реестр рисков банка памяти; **[`09-target-architecture.md`](architecture/09-target-architecture.md) — целевая 7-слойная архитектура (D39; статус стройки — шапка-таблица; инвариант общности §0.1)** · [`10-prompt-architecture.md`](architecture/10-prompt-architecture.md) — консолидированная промпт-заметка (концерн 4) · [`12-go-style-notes.md`](architecture/12-go-style-notes.md) — норматив общности §0 + Go-ответы. **Исполненные (архив 25.07, санкция владельца, → `archive/architecture/`):** [`07-strategic-review.md`](archive/architecture/07-strategic-review.md) (стратаудит 09.07 — курс исполнен) · [`08-sync-audit-ledger.md`](archive/architecture/08-sync-audit-ledger.md) (ледджер синк-аудита — отработан) · [`11-implementation-plan.md`](archive/architecture/11-implementation-plan.md) (план пака-11 — исполнен целиком); `components.puml`/`pipeline.puml` — диаграммы (перерисованы 25.07 под пост-пак-16 реальность: волновой исполнитель, пакетный сплит пака-15, repair-петля за `enabled:false`, generic content-labels D39.25; владелец смотрит PlantUML-расширением VS Code; вручную НЕ рендерить). - `experiments/` — эмпирика «Полигона»: `00-provider-quirks` (читать перед любым вызовом провайдера), `01-token-calibration`, `02-refusal-benchmark`, `03-local-stand`, `04-editor-quality`, `06-local-extraction`, `07-coverage-precision`, `08-cost-model-v2` (актуальная денежная модель), `09-pilot-protocol` (пилот Ф2.5 + поправки D13), `10-explicit-benchmark` (18+ violence-рука канала B), `11-erotica-benchmark` (erotica по трём парам/регистрам — закрытие D14.4, D22), `12-quality-diagnosis`/`13-translator-bakeoff`/`14-quality-empirics`/`14b-meaning-battery` (дуга качества «мерить→строить», закрыты → D30/D32/D37/D38), `15-segmentation-empirics` (exp15: когезия под floor-шумом, фертильность — закрыт → D39.7/D39.8), `16-bank-mining` (exp16: WHICH/WHAT банк-майнинга — закрыт → D39.10). - `research/` — фактура исследований 04–05.07: `01–10` базовые, `11-gap-*` добор критиком, `12-*` режимы отказа/отзывы/таксономии (+ два внешних материала с провенанс-шапками), `13` валидация памяти, `14` адаптивная память, `15` голос и состояние (принят, D21), **`16` ридер-IDE (принят с ревью-шапкой, D29)**, **`17` внешняя критика GPT-5.6 (принят с ревью-шапкой, D25)** — у 16/17 читать шапку прежде тела. **`18` рычаги качества (два отчёта, D36)** · **`19` нарезка+когезия+контракт t/e (D39.1)** · **`20` банк-майнинг W1.5 (D39.6)** · **`21` обзор LLM-транспорта чужих харнессов (23.07: наш транспорт опережает/вровень со всеми 11)** · **`22` доменные харнессы перевода (24.07: калибрующий — ядро подтверждено, впереди COGS/18+/общность/измеренность, позади Q4-выпуск и gate+repair-петля; сиквел `02`/`05`)** — у всех ревью-шапки. ⚠ Часть под superseded-баннерами (01/02/03/04/05/09 и gap-1/2/5) — **читай баннер прежде содержимого**. - `PROGRESS.md` — **журнал** (CURRENT-STATE сверху, ниже хронология; НЕ источник решений). -- **Активные хендофф-промты (пост-пак-16, 25.07):** [`BACKEND_PACK17_CHANNEL_B_SESSION_PROMPT.md`](BACKEND_PACK17_CHANNEL_B_SESSION_PROMPT.md) (**пак-17 канал B (18+) вживую — ТЕКУЩИЙ, ЗАПУЩЕН 25.07, ДВУХФАЗНЫЙ**: дизайн B1–B6 → ратификация → стройка; L3 — жёсткая линия, live только по санкции владельца) · [`ORCHESTRATOR_SESSION_PROMPT.md`](ORCHESTRATOR_SESSION_PROMPT.md) (хендофф №6, 25.07 — только живое: роль/методология/уроки/нормы §1–11; состояние НЕ дублирует) · [`POLYGON_PACKAGE4_SESSION_PROMPT.md`](POLYGON_PACKAGE4_SESSION_PROMPT.md) (residual пилот/18+/echo). **Пак-16 ЗАЛЕНДЁН 25.07** (слой-3 diff-редактор: двухфазный дизайн D39.24 → стройка за `enabled:false`; отчёты с ревью-шапками — [`archive/reports/PACK16_DESIGN_2026-07-25.md`](archive/reports/PACK16_DESIGN_2026-07-25.md), [`archive/reports/PACK16_DIFF_EDITOR_REPORT_2026-07-25.md`](archive/reports/PACK16_DIFF_EDITOR_REPORT_2026-07-25.md)). **Паки 12/13/14/15 ЗАЛЕНДЕНЫ 24–25.07** (приёмка воркфлоу-линзами; отчёты с ревью-шапками — [`archive/reports/PACK14_GENERALITY_REPORT_2026-07-24.md`](archive/reports/PACK14_GENERALITY_REPORT_2026-07-24.md), [`archive/reports/PACK15_STRUCTURE_REPORT_2026-07-25.md`](archive/reports/PACK15_STRUCTURE_REPORT_2026-07-25.md); норматив — [`architecture/12-go-style-notes.md`](architecture/12-go-style-notes.md)). Дальше: **пак-17 = канал B вживую** (батч со следующим платным прогоном: вопросы итерации №2 + замер остатка ремонта → решение о включении петли) → голос/состояние D21 + C2/C3 → пилот Ф2.5. Закрытые — в `archive/prompts/`. +- **Активные хендофф-промты (пост-пак-16, 25.07):** [`BACKEND_PACK17_CHANNEL_B_SESSION_PROMPT.md`](BACKEND_PACK17_CHANNEL_B_SESSION_PROMPT.md) (**пак-17 канал B (18+) вживую — ТЕКУЩИЙ, ДВУХФАЗНЫЙ: ФАЗА 1 ПРИНЯТА (D39.26, 25.07 — дизайн в редакции §14 отчёта), ФАЗА 2 РАЗМЕЧЕНА «ровно так» И ОТКРЫТА**; отчёт фазы 1 с ревью-шапкой — [`archive/reports/PACK17_DESIGN_2026-07-25.md`](archive/reports/PACK17_DESIGN_2026-07-25.md); L3 — жёсткая линия, live только по санкции владельца) · [`ORCHESTRATOR_SESSION_PROMPT.md`](ORCHESTRATOR_SESSION_PROMPT.md) (хендофф №6, 25.07 — только живое: роль/методология/уроки/нормы §1–11; состояние НЕ дублирует) · [`POLYGON_PACKAGE4_SESSION_PROMPT.md`](POLYGON_PACKAGE4_SESSION_PROMPT.md) (residual пилот/18+/echo). **Пак-16 ЗАЛЕНДЁН 25.07** (слой-3 diff-редактор: двухфазный дизайн D39.24 → стройка за `enabled:false`; отчёты с ревью-шапками — [`archive/reports/PACK16_DESIGN_2026-07-25.md`](archive/reports/PACK16_DESIGN_2026-07-25.md), [`archive/reports/PACK16_DIFF_EDITOR_REPORT_2026-07-25.md`](archive/reports/PACK16_DIFF_EDITOR_REPORT_2026-07-25.md)). **Паки 12/13/14/15 ЗАЛЕНДЕНЫ 24–25.07** (приёмка воркфлоу-линзами; отчёты с ревью-шапками — [`archive/reports/PACK14_GENERALITY_REPORT_2026-07-24.md`](archive/reports/PACK14_GENERALITY_REPORT_2026-07-24.md), [`archive/reports/PACK15_STRUCTURE_REPORT_2026-07-25.md`](archive/reports/PACK15_STRUCTURE_REPORT_2026-07-25.md); норматив — [`architecture/12-go-style-notes.md`](architecture/12-go-style-notes.md)). Дальше: **пак-17 = канал B вживую** (батч со следующим платным прогоном: вопросы итерации №2 + замер остатка ремонта → решение о включении петли) → голос/состояние D21 + C2/C3 → пилот Ф2.5. Закрытые — в `archive/prompts/`. - `archive/` — `prompts/`: закрытые сессионные промты (только история, инструкции оттуда не исполнять) · `reports/`: отчёты паков/ресёрч-сессий с ревью-шапками (живая фактура приёмок — на них ссылаются D-лог и активные промты) · `architecture/`: исполненные арх-доки (07 стратревью · 08 синк-ледджер · 11 план пака-11) · три слайса хроники `PROGRESS-2026-07-{04-10,10-13,13-25}.md`. -## Статус (2026-07-25, пост-пак-16/D39.25 — механизация выпускного качества) +## Статус (2026-07-25, пост-пак-16 / дизайн пака-17 ратифицирован D39.26 — механизация выпускного качества) -Фаза 0 ✅; Ф1-инфра ✅ (D20–D28). **АРХ-РЕСЕТ D39 ИСПОЛНЕН ЦЕЛИКОМ:** 7-слойная архитектура (`09-*`) → исследовательская программа (D39.1–D39.10) → план (D39.12, `11-*`) → стройка пака-11 (D39.13–D39.19: волновой исполнитель · чанкер output-бюджет · src→dst-редактор · Go-майнер паритет-EXACT · банкнота · `internal/lang`+langpacks · reject-set · echo-сплит). **ПЕРЕ-ПРОГОН rerun2 ИСПОЛНЕН И ПРОЧИТАН (D39.20, 23.07):** операционка вся подтверждена живьём (ОДИН resnapshot · **$0-резюм драфта ×3 арма** · echo 0 · $6.63<$15 · майнинг-стоп→подпись→reject-set); **планка ≤2 НЕ пройдена** — но дефект-классы полностью механизируемы. Три сигнала (судья dspro 0.679>glm 0.589>>mistral 0.232, floor-шум 0 · два слепых чтения): **анти-корреляция гладкость↔верность доказана трижды**; **mistral исключён как несущий редактор** (голос = north-star промпта); dspro-vs-glm → итерация №2 после механизации (драфт $0). research/21: транспорт наш опережает/вровень со всеми 11, рефакторинг отвергнут. **Эксп ЗАКРЫТ (D39.22), итерация №2 отложена; редактор = deepseek-v4-pro ИНТЕРИМ (glm-резерв); стайл-каноны D39.21 ратифицированы.** **Очередь (курс — разработка бэкенда):** паки 12–16 залендены (транспорт-гигиена · выпускной QA · генеральность · структура: движок разложен `internal/{text,seed,chunk,miner,checks,membank}`+композит-корень, конфиг-слой пары, строгий декод · слой-3 diff-редактор ПОСТРОЕН за `enabled:false` по двухфазному дизайну D39.24 — позиционная детекция + read-only скан остатка + машинерия ремонта §15.2; включение платного пути = решение владельца по замеру остатка на пост-профилактическом прогоне) → пак-17 = канал B вживую (ЗАПУЩЕН 25.07, двухфазный; D39.25: в движке НЕТ понятия «18+» — generic content-labels × provider-capabilities; батч со следующим платным прогоном: вопросы итерации №2 + замер остатка ремонта) → сид-дельта (元/赤城/学堂家老/春秋蝉) → Ф2-механизмы (D21 голос/состояние, native-Gemini судья) + ja→ru §B5 → пилот Ф2.5 (блокеры прежние: билингв-якорь D25.9-Q1, корпус, судья-дублёр D22.6). Судья 18+ = grok-фолбэк (квирк D22.6 подтверждён живьём). Ключ xAI: единый, data-sharing, off перед продом (D27). +Фаза 0 ✅; Ф1-инфра ✅ (D20–D28). **АРХ-РЕСЕТ D39 ИСПОЛНЕН ЦЕЛИКОМ:** 7-слойная архитектура (`09-*`) → исследовательская программа (D39.1–D39.10) → план (D39.12, `11-*`) → стройка пака-11 (D39.13–D39.19: волновой исполнитель · чанкер output-бюджет · src→dst-редактор · Go-майнер паритет-EXACT · банкнота · `internal/lang`+langpacks · reject-set · echo-сплит). **ПЕРЕ-ПРОГОН rerun2 ИСПОЛНЕН И ПРОЧИТАН (D39.20, 23.07):** операционка вся подтверждена живьём (ОДИН resnapshot · **$0-резюм драфта ×3 арма** · echo 0 · $6.63<$15 · майнинг-стоп→подпись→reject-set); **планка ≤2 НЕ пройдена** — но дефект-классы полностью механизируемы. Три сигнала (судья dspro 0.679>glm 0.589>>mistral 0.232, floor-шум 0 · два слепых чтения): **анти-корреляция гладкость↔верность доказана трижды**; **mistral исключён как несущий редактор** (голос = north-star промпта); dspro-vs-glm → итерация №2 после механизации (драфт $0). research/21: транспорт наш опережает/вровень со всеми 11, рефакторинг отвергнут. **Эксп ЗАКРЫТ (D39.22), итерация №2 отложена; редактор = deepseek-v4-pro ИНТЕРИМ (glm-резерв); стайл-каноны D39.21 ратифицированы.** **Очередь (курс — разработка бэкенда):** паки 12–16 залендены (транспорт-гигиена · выпускной QA · генеральность · структура: движок разложен `internal/{text,seed,chunk,miner,checks,membank}`+композит-корень, конфиг-слой пары, строгий декод · слой-3 diff-редактор ПОСТРОЕН за `enabled:false` по двухфазному дизайну D39.24 — позиционная детекция + read-only скан остатка + машинерия ремонта §15.2; включение платного пути = решение владельца по замеру остатка на пост-профилактическом прогоне) → пак-17 = канал B вживую (двухфазный: **фаза 1 ПРИНЯТА — D39.26**, фаза 2 размечена и открыта; D39.25: в движке НЕТ понятия «18+» — generic content-labels × provider-capabilities; лейблы вне хешей · резолв до валидации · один хоп `chain[0]` · гранулярность = книга; на владельце — вокабуляр лейблов и редактор под лейблом; батч со следующим платным прогоном: вопросы итерации №2 + замер остатка ремонта) → сид-дельта (元/赤城/学堂家老/春秋蝉) → Ф2-механизмы (D21 голос/состояние, native-Gemini судья) + ja→ru §B5 → пилот Ф2.5 (блокеры прежние: билингв-якорь D25.9-Q1, корпус, судья-дублёр D22.6). Судья 18+ = grok-фолбэк (квирк D22.6 подтверждён живьём). Ключ xAI: единый, data-sharing, off перед продом (D27). ## Доступные ключи от моделей DEEPSEEK_API_KEY, ZAI_API_KEY, KIMI_API_KEY, OPENAI_API_KEY, GEMINI_API_KEY, XAI_API_KEY, MISTRAL_API_KEY diff --git a/docs/architecture/05-decisions-log.md b/docs/architecture/05-decisions-log.md index efd5d532..a9bc4c34 100644 --- a/docs/architecture/05-decisions-log.md +++ b/docs/architecture/05-decisions-log.md @@ -1,9 +1,9 @@ -# Журнал решений оркестратора — контракт D1–D39.25 (развязки 04.07 · пакеты 09–10.07 · приёмка/качество-первым/пивот/эмпирика 11–12.07 · арх-ресет+стройка пере-прогонного стека 13–19.07) +# Журнал решений оркестратора — контракт D1–D39.26 (развязки 04.07 · пакеты 09–10.07 · приёмка/качество-первым/пивот/эмпирика 11–12.07 · арх-ресет+стройка пере-прогонного стека 13–19.07) > **⟶ КАРТА АКТУАЛЬНОСТИ (ревизия D31, продлена до D38.2 [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 = +15–25%, ~$0.85/ранобэ; «$1.5–2» = неподписанная опция Б) · 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.1–19.2, D21 (Ф2-механизмы voice/address/reveal), D22.5–22.7, D23 (golden = инвариант №8), D24–D39.25 — действующая голова контракта (**D39.25 = в движке НЕТ понятия 18+ [generic content-labels × provider-capabilities, refusal причино-агностичен, «adult» = значение данных; §0 п.6]**; **D39.24 = дизайн пака-16 diff-редактора ратифицирован с перестановкой: $0-части (позиционная детекция · read-only скан · фиксы ru_hours_re/半个时辰) строим, платная машинерия §D3–D5+§15.2 под enabled:false, включение = решение владельца по замеру остатка пост-профилактики; поправки §15.2 (позитивный ре-гейт+анти-удаление · счётчики из role='repair' без миграции · отбрасывание пересечений · reserve-деградация · classify-гард); ru-target-долг = ограничение**; **D39.23 = пак-15 «структура+форма» ратифицирован [хойст text/value-базы → сплит miner/checks/membank/chunk по ИЗМЕРЕННОЙ связности (прил. A пака-14 с поправкой ревью-шапки) · форм-фиксы Export/RequestHash/resolveChunkState · конфиг-слой пары (пар-калибровки из ран-конфигов, промпт-резолв конвенцией) · overlay-хвосты, unionStringMap-коллизия = громкая ошибка; §1 12-go-style амендирован; байт-точность+парити EXACT; crush-масштаб НЕ эмулируем]**; **D39.22 = эксп пере-прогона ЗАКРЫТ решением владельца; итерация №2 ОТЛОЖЕНА [её вопросы — довесок следующего платного прогона]; редактор = deepseek-v4-pro ИНТЕРИМ [судья №1 · проза/глоссарий · дефекты чинибельны · ×2 дешевле], glm-резерв, дефолт-конфиг при лендинге пака-13; курс = разработка бэкенда [масштаб книги · канал B · Ф2-механизмы · ja→ru §B5]**; **D39.21 = стайл-решения владельца: меры → единицы языка читателя [时辰=2ч] · generic-«гу» СРЕДНИЙ род, именные — по-термово из банка · стихи СМЫСЛОМ · 资质=«талант»; + директива аудита полноты банк-инъекции**; **D39.20 = ПЕРЕ-ПРОГОН исполнен+прочитан [операционка вся живьём: $0-резюм драфта ×3 арма · echo 0 · $6.63<$15; судья dspro 0.679>glm 0.589>>mistral 0.232 при floor-шуме 0; слепые чтения ×2: сводные выборы разошлись, чисто-художественные ИДЕНТИЧНЫ = mistral 4/5 → анти-корреляция гладкость↔верность доказана трижды]; планка ≤2 НЕ пройдена → пилот не открыт; mistral ИСКЛЮЧЁН как несущий редактор [критические смысловые вне гейтов; голос = north-star промпта]; dspro-vs-glm НЕ ратифицирован [зазор ~шум] → итерация №2 после механизации [драфт $0]; дефект-классы→механика: 时辰-юнит-чекер · число-масштабы · broken-word/latin · заголовок-шаблон · банк-дельта 元/资质/赤城 · mined_delta-крэш-фикс [пак-13]; решения владельца: род «гу»/меры/стихи/春秋蝉; полигон: авто-QA ключевать слепыми метками**; **D39.19 = пере-прогон-преп ЗАЛЕНДЕН [6 фиксов: R1-FL-A CLI-exit-3 · R1-FL-B reject-set-livelock-закрыт · R1-FL-C x/text-в-Ш-2 · echo-сплит · read-model-naming · ниты]; golden version-only [masked=0]; парити EXACT; §8-манифест полон; gender-signoff закрыт; бэкенд готов к пере-прогону**; **D39.18 = blast-radius edit-единицы: c-lite (редактура чистого остатка вместо бланка всей единицы; вариант владельца (c)+fallback (b)) залендён `488c8d4`, no-flag путь байт-идентичен; + 4 read-модель-фикса пост-лендинг-ревью [quality-echo/status-first-flagged/export-pairs/detail], открытое решение владельцу = echo-метрика семантика; R1-FL-A/B/C deferred в пере-прогон-преп**; **D39.17-errata = runWave parent-cancellation баг [мой рубеж-2 пропустил, 2-я сессия поймала], фикс `5fc4860`**; **D39.17 = R1 драйвер-свитч ЗАЛЕНДЕН [волновой исполнитель черновик∥→банк-майнинг-стоп→редактура∥; редактор не пере-рендерит draft; Ш-1/Ш-2; golden-рерайт; read-модели per-unit]; полный рубеж-2 [5 линз вкл. синк-с-ресёрчем] = clean bill по несущим осям, 3 MINOR/NOTE-фикса (R1-FL-A CLI-exit-код · R1-FL-B mining-стоп-reject · R1-FL-C x/text-версия) в стенд-only mining-пути → пере-прогон-преп; ПАК-11 ЗАВЕРШЁН**; **D39.16 = арх-проход ЗАЛЕНДЕН: майнер-данные (百家姓/Палладий/частицы/суффиксы) вынесены в `internal/lang`+`configs/langpacks/` [граница компиль-enforced, байт-точно — парити EXACT, golden байт-идентичен]; FL-1/2/3+тест-путь; РАТИФИЦИРОВАНЫ 3 дивергенции: language.Tag ОТВЕРГНУТ [CLDR-инстабильность в вердиктах], DC-чекеры+снапшот-фолд DEFER [майнер offline/нейтральность]; общность структурно доказана; промт отработан→архив**; **D39.15 = директива владельца: изоляция языковых данных из `pipeline/` [движок общий · `internal/lang/`+`configs/langpacks/` данными-файлами · `x/text/language.Tag` вместо `isRuTarget` · снапшот-folded как промпты · алгоритмы не трогать]; архитектурный проход ПЕРЕД R1 [ре-секвенс]; поведенчески нейтрально zh→ru [golden байт-стабилен]; не минор-хант/не rewrite-ради-rewrite; промт `BACKEND_ARCH_CLEANUP_SESSION_PROMPT.md` 5-фазный [ресёрч→синтез→фикс-лист→исполнение→ревью]; ja→ru = тест общности §B5 позже**; **D39.14 = пак-11 continuation ПРИНЯТ и залендён [R2 майнер паритет-EXACT · R3 банкнота 12-точек · R4 DC-чекеры+export--pairs · R5 арм-конфиги · R1-аддитив; рубеж-2 D39.13-долга погашен: 3 MINOR/PARTIAL-находки [FL-1 bankTokenBudget-фолд · FL-2 banknote-телеметрия-резюм · FL-3 emission-top-N-кап], все латентны → R1-продолжение; R1 драйвер-свитч резидуал; clean bill по деньгам/wire/порту]**; **D39.13 = пак-11 Block A ПРИНЯТ и залендён [WS2 целиком (вкл. src→dst-блок редактора = закрытие D30.1) + WS1a/b/c-инфра + WS4-ядро; 2 девиации ратифицированы; резидуал R1–R5 в PACK11_REPORT; промт остаётся активным; рубеж-2 приёмки — долг]**; **D39.12 = план `architecture/11-implementation-plan.md` РАТИФИЦИРОВАН [три рубежа: ревью-2 F1–F11 → 7-агентный адверсариал → подтверждающий пас; пер-волновой снапшот + инвариант секвенирования = «переоплата ОДНА»; EditCeilingOut=3200; лемматизатор дефолт B; 4 гейтнутых арма]; бэкенд-пак ЕДИНОЙ сессией — `BACKEND_PLAN11_SESSION_PROMPT.md`**; **D39.11 = директива владельца: стройка ТОЛЬКО после дизайн-синтез сессии с верифицированными алгоритмами; хендофф №5**; **D39.10 = exp16: WHICH подтверждена [V-C recall 0.97, $0] / WHAT→банкнота+Палладий [canon-recovery <70%], 9B-споттер не нужен, Z1→облако, ре-аудит exp14b чист [errata не требуется]; исследовательская программа ЗАВЕРШЕНА → бэкенд-пак слоёв 1+4**; **D39.9 = Q4a: верность НЕ на translate-стадии [flash уже верен, pro ×3.67 не ратифицирован], смысл ломает glm-РЕДАКТОР [свап-арм приоритетен], DET-пол 0.261; exp14b-правила дефектны → $0-ре-аудит в exp16**; **D39.8 = слепое чтение: планка не пройдена никем, дефекты распределены [читатель подтвердил floor-null], битва качества → дефект-классы [时辰-юниты, числа, gender-enforce, стих, регистр]**; **D39.7 = exp15 залендён REV.2: «граница вредит» отозван [артефакт окна судьи], все когезия-эффекты под floor 0.126, «sequential нигде не лучше» LOO-stable [не ратифицированный зелёный свет], фертильность 1.20/0.39, $12.79/$15; гейт = слепое чтение владельца**; **D39.6 = research/20 банк-майнинг залендён [детектор-лестница V-A/B/C, алиас-ярусы, banknote-v1 с 12 гейт-точками, §B5 плагины P1–P6, §D-пре-рег]; полигон-стадия после exp15**; **D39.5 = пак-1.5+F1–F9 залендены [tmctl export с manifest/drift-гардами · fold-first санитайзер · bounded глосс · пример zh-ru]; экстракция полигона впредь через tmctl export**; **D39.4 = адверсариал-долг ПОГАШЕН [8 осей: 0 CRIT/1 HIGH/6 MED], пак-1.5 придержан под фикс-лист F1–F9 в §T4**; **D39.3 = пакет банк-майнинга W1.5 [диспозиция H15/V4-п4] ратифицирован, research/20-промт с HOLD до фриза exp15**; **D39.2 = трек-A пак-1 залендён `d3f6b34`: trust-gated suppressor [терм-дрейф закрыт в КОДЕ] + export-contract нормализация + pair-сеам + реестры + quality-report; адверсариал-долг за 529**; **D39.1 = research/19 залендён: конфликт exp14↔research/18 разрешён [эмиссия≠окно≠связность], Go-спека чанкера+когезии, волновая архитектура W0–W3 [вводная владельца: параллелизм], пре-рег эмпирики Q0–Q5; оркестратор-ревью снято владельцем**; **D39 = АРХ-РЕСЕТ: синк-аудит сломанного телефона [65 находок, 0 refuted, `08-sync-audit-ledger.md`] + целевая 7-слойная архитектура [`09-target-architecture.md`] + фазовый план [трек A build-now ∥ трек B ресёрч, пере-прогон после]; формализует фантомный «D35.7» как цель слоя 1; терм-дрейф код-корень жив [сид-воркэраунд]; редактор 4-мандата-full-regen = причина инверсий**; D35 = пивот качество-первым; D36 = приёмка research/18; D37 = приёмка exp14: претензия-1=промпт-рычаг; D38 = приёмка exp14b: «только gpt-5.4» ОПРОВЕРГНУТО [mistral/deepseek-pro чинят], фронтир в дефолт НЕ нужен, корень терм-дрейфа = статус-draft сида; **D38.1 = слепой h2h P1a↔F-disc залендён [ChatGPT «фронтир сильнее» / Claude «near-parity» расходятся, СХОДЯТСЯ: дефекты = инфра] → РАЗВОРОТ «мерить→строить», выдан BACKEND_INFRA_PACK; D38.2 = консолидация/док-гигиена: спент exp-скрипты в `eval/exp12|13|14|14b/`, статус-доки+.puml актуализированы; D38.3 = инфра-пак читаемости залендён (санитайзер-классы strip+export + число/omission-гард), верифицирован исполнением [build/vet/test зелёные, 3 span-дефекта запинены]; D38.4 = аудит полноты exp14/14b: чэнъюй-рычаг забыт near-term→дописан в дискурс-промпт; inversion-гард D37 §2г не строился (число/omission ≠ полярность)→editor-swap = защита от инверсий (приоритет↑); нарезка = re-run-арм; гард-тумблер вкл. при resnapshot; D38.5 = компоненты resnapshot залендены+верифицированы [reseed-сид eb409f2 · дискурс+чэнъюй editor v3 0ac5f7a с few_shot-тумблером] → следующий шаг единый resnapshot + пере-прогон**). +> - **Живое ядро без изменений:** D2 (+новый гейт-класс D30.3), D4, D5, D7, D8, D10-механизм, D12-таксономия отказов, D16, D18, D19.1–19.2, D21 (Ф2-механизмы voice/address/reveal), D22.5–22.7, D23 (golden = инвариант №8), D24–D39.26 — действующая голова контракта (**D39.26 = дизайн пака-17 «generic content-labels × provider-capabilities» ратифицирован В РЕДАКЦИИ §14 отчёта [лейблы НЕ входят ни в один хеш — назначенный слой D20.2-Q3 = резолвнутая модель стадии пер-стадийно/пер-волново · резолв ДО валидации, «достижимое» лейбл-зависимо · один хоп `chain[0]`, `len>1` громко, `budget_usd>0` обязателен · Q1 = книга по аргументу ГАРАНТИИ · вокабуляр `content_labels`(книга)/`accepts_labels`(модель, `*[]string` только сужает) · `permissive`+`Stage.Channel`+enum+блок D4.1 отставляются ОДНИМ диффом · `failover.go` удаляется · отказы за `forWrite`, резолв всегда]; добор оркестратора: единый лейбл «adult» схлопывает violence-развязку D14 п.1 → вокабуляр владельцу · `reasoning:"off"` — тихий выход из аддитивного И эхо-гейта на xai (обобщение D19.1 п.2 в данные не доехало) · рейт-гард деградирует молча; НА ВЛАДЕЛЬЦЕ: вокабуляр лейблов + Q2 редактор; D22.7 паком НЕ снимается**; **D39.25 = в движке НЕТ понятия 18+ [generic content-labels × provider-capabilities, refusal причино-агностичен, «adult» = значение данных; §0 п.6]**; **D39.24 = дизайн пака-16 diff-редактора ратифицирован с перестановкой: $0-части (позиционная детекция · read-only скан · фиксы ru_hours_re/半个时辰) строим, платная машинерия §D3–D5+§15.2 под enabled:false, включение = решение владельца по замеру остатка пост-профилактики; поправки §15.2 (позитивный ре-гейт+анти-удаление · счётчики из role='repair' без миграции · отбрасывание пересечений · reserve-деградация · classify-гард); ru-target-долг = ограничение**; **D39.23 = пак-15 «структура+форма» ратифицирован [хойст text/value-базы → сплит miner/checks/membank/chunk по ИЗМЕРЕННОЙ связности (прил. A пака-14 с поправкой ревью-шапки) · форм-фиксы Export/RequestHash/resolveChunkState · конфиг-слой пары (пар-калибровки из ран-конфигов, промпт-резолв конвенцией) · overlay-хвосты, unionStringMap-коллизия = громкая ошибка; §1 12-go-style амендирован; байт-точность+парити EXACT; crush-масштаб НЕ эмулируем]**; **D39.22 = эксп пере-прогона ЗАКРЫТ решением владельца; итерация №2 ОТЛОЖЕНА [её вопросы — довесок следующего платного прогона]; редактор = deepseek-v4-pro ИНТЕРИМ [судья №1 · проза/глоссарий · дефекты чинибельны · ×2 дешевле], glm-резерв, дефолт-конфиг при лендинге пака-13; курс = разработка бэкенда [масштаб книги · канал B · Ф2-механизмы · ja→ru §B5]**; **D39.21 = стайл-решения владельца: меры → единицы языка читателя [时辰=2ч] · generic-«гу» СРЕДНИЙ род, именные — по-термово из банка · стихи СМЫСЛОМ · 资质=«талант»; + директива аудита полноты банк-инъекции**; **D39.20 = ПЕРЕ-ПРОГОН исполнен+прочитан [операционка вся живьём: $0-резюм драфта ×3 арма · echo 0 · $6.63<$15; судья dspro 0.679>glm 0.589>>mistral 0.232 при floor-шуме 0; слепые чтения ×2: сводные выборы разошлись, чисто-художественные ИДЕНТИЧНЫ = mistral 4/5 → анти-корреляция гладкость↔верность доказана трижды]; планка ≤2 НЕ пройдена → пилот не открыт; mistral ИСКЛЮЧЁН как несущий редактор [критические смысловые вне гейтов; голос = north-star промпта]; dspro-vs-glm НЕ ратифицирован [зазор ~шум] → итерация №2 после механизации [драфт $0]; дефект-классы→механика: 时辰-юнит-чекер · число-масштабы · broken-word/latin · заголовок-шаблон · банк-дельта 元/资质/赤城 · mined_delta-крэш-фикс [пак-13]; решения владельца: род «гу»/меры/стихи/春秋蝉; полигон: авто-QA ключевать слепыми метками**; **D39.19 = пере-прогон-преп ЗАЛЕНДЕН [6 фиксов: R1-FL-A CLI-exit-3 · R1-FL-B reject-set-livelock-закрыт · R1-FL-C x/text-в-Ш-2 · echo-сплит · read-model-naming · ниты]; golden version-only [masked=0]; парити EXACT; §8-манифест полон; gender-signoff закрыт; бэкенд готов к пере-прогону**; **D39.18 = blast-radius edit-единицы: c-lite (редактура чистого остатка вместо бланка всей единицы; вариант владельца (c)+fallback (b)) залендён `488c8d4`, no-flag путь байт-идентичен; + 4 read-модель-фикса пост-лендинг-ревью [quality-echo/status-first-flagged/export-pairs/detail], открытое решение владельцу = echo-метрика семантика; R1-FL-A/B/C deferred в пере-прогон-преп**; **D39.17-errata = runWave parent-cancellation баг [мой рубеж-2 пропустил, 2-я сессия поймала], фикс `5fc4860`**; **D39.17 = R1 драйвер-свитч ЗАЛЕНДЕН [волновой исполнитель черновик∥→банк-майнинг-стоп→редактура∥; редактор не пере-рендерит draft; Ш-1/Ш-2; golden-рерайт; read-модели per-unit]; полный рубеж-2 [5 линз вкл. синк-с-ресёрчем] = clean bill по несущим осям, 3 MINOR/NOTE-фикса (R1-FL-A CLI-exit-код · R1-FL-B mining-стоп-reject · R1-FL-C x/text-версия) в стенд-only mining-пути → пере-прогон-преп; ПАК-11 ЗАВЕРШЁН**; **D39.16 = арх-проход ЗАЛЕНДЕН: майнер-данные (百家姓/Палладий/частицы/суффиксы) вынесены в `internal/lang`+`configs/langpacks/` [граница компиль-enforced, байт-точно — парити EXACT, golden байт-идентичен]; FL-1/2/3+тест-путь; РАТИФИЦИРОВАНЫ 3 дивергенции: language.Tag ОТВЕРГНУТ [CLDR-инстабильность в вердиктах], DC-чекеры+снапшот-фолд DEFER [майнер offline/нейтральность]; общность структурно доказана; промт отработан→архив**; **D39.15 = директива владельца: изоляция языковых данных из `pipeline/` [движок общий · `internal/lang/`+`configs/langpacks/` данными-файлами · `x/text/language.Tag` вместо `isRuTarget` · снапшот-folded как промпты · алгоритмы не трогать]; архитектурный проход ПЕРЕД R1 [ре-секвенс]; поведенчески нейтрально zh→ru [golden байт-стабилен]; не минор-хант/не rewrite-ради-rewrite; промт `BACKEND_ARCH_CLEANUP_SESSION_PROMPT.md` 5-фазный [ресёрч→синтез→фикс-лист→исполнение→ревью]; ja→ru = тест общности §B5 позже**; **D39.14 = пак-11 continuation ПРИНЯТ и залендён [R2 майнер паритет-EXACT · R3 банкнота 12-точек · R4 DC-чекеры+export--pairs · R5 арм-конфиги · R1-аддитив; рубеж-2 D39.13-долга погашен: 3 MINOR/PARTIAL-находки [FL-1 bankTokenBudget-фолд · FL-2 banknote-телеметрия-резюм · FL-3 emission-top-N-кап], все латентны → R1-продолжение; R1 драйвер-свитч резидуал; clean bill по деньгам/wire/порту]**; **D39.13 = пак-11 Block A ПРИНЯТ и залендён [WS2 целиком (вкл. src→dst-блок редактора = закрытие D30.1) + WS1a/b/c-инфра + WS4-ядро; 2 девиации ратифицированы; резидуал R1–R5 в PACK11_REPORT; промт остаётся активным; рубеж-2 приёмки — долг]**; **D39.12 = план `architecture/11-implementation-plan.md` РАТИФИЦИРОВАН [три рубежа: ревью-2 F1–F11 → 7-агентный адверсариал → подтверждающий пас; пер-волновой снапшот + инвариант секвенирования = «переоплата ОДНА»; EditCeilingOut=3200; лемматизатор дефолт B; 4 гейтнутых арма]; бэкенд-пак ЕДИНОЙ сессией — `BACKEND_PLAN11_SESSION_PROMPT.md`**; **D39.11 = директива владельца: стройка ТОЛЬКО после дизайн-синтез сессии с верифицированными алгоритмами; хендофф №5**; **D39.10 = exp16: WHICH подтверждена [V-C recall 0.97, $0] / WHAT→банкнота+Палладий [canon-recovery <70%], 9B-споттер не нужен, Z1→облако, ре-аудит exp14b чист [errata не требуется]; исследовательская программа ЗАВЕРШЕНА → бэкенд-пак слоёв 1+4**; **D39.9 = Q4a: верность НЕ на translate-стадии [flash уже верен, pro ×3.67 не ратифицирован], смысл ломает glm-РЕДАКТОР [свап-арм приоритетен], DET-пол 0.261; exp14b-правила дефектны → $0-ре-аудит в exp16**; **D39.8 = слепое чтение: планка не пройдена никем, дефекты распределены [читатель подтвердил floor-null], битва качества → дефект-классы [时辰-юниты, числа, gender-enforce, стих, регистр]**; **D39.7 = exp15 залендён REV.2: «граница вредит» отозван [артефакт окна судьи], все когезия-эффекты под floor 0.126, «sequential нигде не лучше» LOO-stable [не ратифицированный зелёный свет], фертильность 1.20/0.39, $12.79/$15; гейт = слепое чтение владельца**; **D39.6 = research/20 банк-майнинг залендён [детектор-лестница V-A/B/C, алиас-ярусы, banknote-v1 с 12 гейт-точками, §B5 плагины P1–P6, §D-пре-рег]; полигон-стадия после exp15**; **D39.5 = пак-1.5+F1–F9 залендены [tmctl export с manifest/drift-гардами · fold-first санитайзер · bounded глосс · пример zh-ru]; экстракция полигона впредь через tmctl export**; **D39.4 = адверсариал-долг ПОГАШЕН [8 осей: 0 CRIT/1 HIGH/6 MED], пак-1.5 придержан под фикс-лист F1–F9 в §T4**; **D39.3 = пакет банк-майнинга W1.5 [диспозиция H15/V4-п4] ратифицирован, research/20-промт с HOLD до фриза exp15**; **D39.2 = трек-A пак-1 залендён `d3f6b34`: trust-gated suppressor [терм-дрейф закрыт в КОДЕ] + export-contract нормализация + pair-сеам + реестры + quality-report; адверсариал-долг за 529**; **D39.1 = research/19 залендён: конфликт exp14↔research/18 разрешён [эмиссия≠окно≠связность], Go-спека чанкера+когезии, волновая архитектура W0–W3 [вводная владельца: параллелизм], пре-рег эмпирики Q0–Q5; оркестратор-ревью снято владельцем**; **D39 = АРХ-РЕСЕТ: синк-аудит сломанного телефона [65 находок, 0 refuted, `08-sync-audit-ledger.md`] + целевая 7-слойная архитектура [`09-target-architecture.md`] + фазовый план [трек A build-now ∥ трек B ресёрч, пере-прогон после]; формализует фантомный «D35.7» как цель слоя 1; терм-дрейф код-корень жив [сид-воркэраунд]; редактор 4-мандата-full-regen = причина инверсий**; D35 = пивот качество-первым; D36 = приёмка research/18; D37 = приёмка exp14: претензия-1=промпт-рычаг; D38 = приёмка exp14b: «только gpt-5.4» ОПРОВЕРГНУТО [mistral/deepseek-pro чинят], фронтир в дефолт НЕ нужен, корень терм-дрейфа = статус-draft сида; **D38.1 = слепой h2h P1a↔F-disc залендён [ChatGPT «фронтир сильнее» / Claude «near-parity» расходятся, СХОДЯТСЯ: дефекты = инфра] → РАЗВОРОТ «мерить→строить», выдан BACKEND_INFRA_PACK; D38.2 = консолидация/док-гигиена: спент exp-скрипты в `eval/exp12|13|14|14b/`, статус-доки+.puml актуализированы; D38.3 = инфра-пак читаемости залендён (санитайзер-классы strip+export + число/omission-гард), верифицирован исполнением [build/vet/test зелёные, 3 span-дефекта запинены]; D38.4 = аудит полноты exp14/14b: чэнъюй-рычаг забыт near-term→дописан в дискурс-промпт; inversion-гард D37 §2г не строился (число/omission ≠ полярность)→editor-swap = защита от инверсий (приоритет↑); нарезка = re-run-арм; гард-тумблер вкл. при resnapshot; D38.5 = компоненты resnapshot залендены+верифицированы [reseed-сид eb409f2 · дискурс+чэнъюй editor v3 0ac5f7a с few_shot-тумблером] → следующий шаг единый resnapshot + пере-прогон**). Ответ на вопросы бэкенд-сессии (PROGRESS §«Вопросы от бэкенда», §«[НУЖНО РЕШЕНИЕ] перед Фазой 1» — с ревизии D31 в `archive/PROGRESS-2026-07-04-10.md`) и полигона (think-режим). Каждое решение прошло адверсариальную панель из 3 критиков (research / экономика / исполнимость в коде Фазы 0); ни одно не отклонено, все уточнены. Это **контракт Фазы 1** — бэкенд исполняет отсюда; при конфликте с буквой 01-decisions/02-mvp-plan — источник истины здесь (потом сольём в основные доки). @@ -809,3 +809,38 @@ API-529-долг закрыт: 8-осевой refute-by-default воркфлоу ## D39.25 — Архитектурная директива владельца: в движке НЕТ понятия «18+» — generic content-labels × provider-capabilities; refusal-обработка причино-агностична (25.07, оркестратор №7). ✅ **Директива (владелец, 25.07, при ревью промта пака-17):** не городить 18+-костыль. Движок несёт ОДИН generic-механизм: **content-label** книги/глав (данные книги — «пометочка на фронте») × **capability провайдера** (данные models.yaml) × выбор цепочки/политика (конфиг). «adult» — ЗНАЧЕНИЕ данных; Go-идентификаторов/веток «18+/adult/канал B» в движке нет. Мысленный тест второго лейбла: archaic-register (D19.1-эхо grok на архаике — та же фигура «свойство контента × способность модели») обязан добавляться данными. **Проактивный роутинг по лейблу = ToS-гигиена, не оптимизация**: провайдер без способности не должен ПОЛУЧИТЬ контент (DeepSeek/Anthropic без adult-capability — строки данных), независимо от того, откажет ли. **Refusal-обработка generic**: D12-таксономия детектит ФАКТ отказа (hard/soft), причина (эротика/политика/прочее) — только операторская диагностика; путь один — регенерация → эскалация по цепочке лейбла → flag+skip (D2); параметризуется политика цепочки в конфиге, не код. **Честно 18+-специфичное (вне движка):** L3 = политика ВХОДА (человеческий уровень, спека D22.7 у владельца) · ToS-флаги = данные · пометка в экспорте/ридере = фронт. Продуктовое имя «канал B» остаётся в доках; инженерная форма — лейблы. Норматив: `12-go-style-notes.md` §0 п.6; промт пака-17 переписан под эту форму ДО запуска сессии. + +## D39.26 — Дизайн пака-17 «generic content-labels × provider-capabilities» РАТИФИЦИРОВАН В РЕДАКЦИИ §14: лейблы ВНЕ хешей (wire-судьба = резолвнутая модель пер-стадийно), резолв ДО валидации, один хоп из цепочки лейбла; вокабуляр лейблов и редактор — владельцу (25.07, оркестратор №8). ✅ + +**Отчёт:** `docs/archive/reports/PACK17_DESIGN_2026-07-25.md` — §0–13 дизайн + **§14 пост-панельная ревизия отдельным слоем** (метод D39.24: эхо → 7 инвентаризаций → 11 адверсариальных агентов → ревизия, тело не переписано). Сессия сама отменила три своих решения и перевернула две рекомендации. **Принято в редакции §14: тело §0–13 читать ТОЛЬКО через неё** (при расхождении побеждает §14). + +**Верификация приёмки (пропорциональная, инлайн-исполнением — всё пере-выведено мной, ни один клейм не принят с чужих слов):** +- **Денежный кейстоун M1 ре-деривирован независимо** (питон-канон по `book.go:214-228` против `testdata/golden/capture.golden:6`): все пять дайджестов совпали посимвольно — сегодня `c2021b1b…cab0df` · поле убрано `58883ff5…b39822` · `content_labels:null` `29a3031d…8c87b` · **omitempty-хвост при пустых лейблах = байт-в-байт `c2021b1b…`** · с `["adult"]` `0e2f3111…c9d2c`. Заморозка `"adult":false` на 7-й позиции канона — единственный путь без пере-оплаты стенда (Ф7: замер остатка пака-16 поедет на этих же книгах). +- **Фантом-гард D-ссылок (норма 9): ни одной фантомной** — существуют и говорят заявленное D2 · D3 · D4 п.1 · D6.2 · D12 · D13.6 · D14 п.1 · D15 п.2 (+спека `backend/docs/D15.2-*.md`) · D19 п.1 · D19.1 · D20.2-Q1/Q2 (`:245`) · D20.4 (`:247` — read-only аудит без ключей действительно в фикс-листе) · D22.5/D22.6/D22.7 (`:276`) · D25 п.4 (`:310`) · D30.1 · D39.20/22/24/25. +- **Спот-чеки несущих фактов (мои исполнения):** единственный `Complete` в проде `stagerun.go:442` + единственный `r.client(` `:410`, failover без вызывающих · `repair.go:384` синтетическая стадия теряет `Channel` (⇒ ассерт обязан ключеваться на данных книги) · `Stage.Channel` = НОЛЬ рантайм-читателей (только `pipeline.go:341,549,569`) · `Escal.Chains` = валидация `pipeline.go:578` + `CheckKeys` `models.go:508` · `BriefHash` в ОБЩЕМ билдере обеих волн при пер-стадийном `stageSnap` с волновым фильтром `waveStages` ⇒ **§14.1 верна** · `reachableModels` = сырое `st.Model ∪ st.EscalateTo ∪ repair(ТОЛЬКО при `Gates.Repair.Enabled`)` ⇒ **§14.2 верна** · `escMu` через `defer` + пин `waverun_test.go` «перерасход ≤ 1 хоп» (бюджет 0.001 < хоп ≈0.00182, `workers:4`), `Waves.Workers` дефолт 1 ⇒ **§14.3-отмена лока-на-итерацию верна** · `chains.default[0]=deepseek-v4-pro` = `escalate_to` драфта (`pipeline-c1.yaml:100` vs `:51`) ⇒ неограниченный дедуп упал бы на шиппинге · golden пинит `esc_model="fake-fallback"` на ОТКАЗАВШЕМ хопе (`capture.golden:24`) ⇒ **§14.6.1-вынос верен** · `style_check_version` фолдится БЕЗУСЛОВНО (payload `capture.golden:3`) ⇒ **§14.6.2-условие верно** · ровно 13 файлов вне git несут `adult:` + `example/book.yaml:9` ⇒ терпимость отставки обязательна · порядок `runAttempt`: `GetCheckpoint:337` → `Reserve:379` → `client:410` → `Complete:442` ⇒ **§14.5.6 верна** (реплей ничего не отправляет; ассерт до резерва). +- **Неточности отчёта, выводов не меняющие:** манифест «`accept-rebill` грепом пусто» — 9 попаданий, ВСЕ в `backend/docs/D15.2-*.md` (в коде/CLI действительно нет, клейм в силе); «23 сайта `LoadPipeline`» включает строку определения (1 прод + 21 тест). + +**РАТИФИЦИРОВАНО (моё решение, редакция §14 целиком):** +1. **Лейблы НЕ входят ни в один хеш (§14.1) — и это разрядка D20.2-Q3** («первый рантайм-потребитель `Adult` обязан ЯВНО назначить слой»): назначенный слой = **РЕЗОЛВНУТАЯ модель стадии + её wire-фолд, пер-стадийно и пер-волново** (`stageSnap`); лейбл, маршрутизирующий только редактора, двигает ТОЛЬКО edit-волну — оплаченный драфт резюмится за $0. Провенанс набора лейблов — шапка отчёта (B6.1), не хеш. Канон brief заморожен: `"adult":false` остаётся 7-м полем, omitempty-хвост НЕ нужен. Шестое условие байт-идентичности принято: `stageSnap.Escalate*` сохраняют имя/тег/позицию/правило заполнения, любой фолд хопов — строго аддитивный указатель+omitempty. +2. **Порядок РЕЗОЛВ → ВАЛИДАЦИЯ → все читатели видят резолвнутое (§14.2).** Лейблы приходят в `LoadPipeline` тем же швом, что `pair`; резолвнутые поля — `yaml:"-"` (конвенция `PromptPath`); «достижимое» лейбл-зависимо (`st.EscalateTo`/`chains.default` под лейблом НЕДОСТИЖИМЫ); дедуп применяется только к цепочкам активных лейблов ИСПОЛНЯЕМОГО конфига (поправка §14.8.4: `chains.adult` в 5 конфигах, `pipeline-c2.yaml:66` → kimi, но C2 неисполняем `CheckRunnable`); резолв работает и на read-путях (`export.go` пере-считывает снапшот). +3. **Q4 = B3-A′ (переворот сессии принят): ОДИН хоп = `chain[0]`**, `len(chain)>1` = громкая ошибка «мульти-хоп не построен» (никакого тихого усечения), `escalation.budget_usd > 0` ОБЯЗАТЕЛЕН на загрузке для route-лейбла (иначе «гейт, который не может выстрелить»), `escMu` — как сегодня. Полный обход цепочки остаётся спроектированным (§5 + 6 добавленных форм) и ждёт данных. +4. **Q1 = КНИГА** по аргументу §14.4 (**гарантия против стоимости**): авто-скрина нет и не будет в этом паке, поэтому пер-главная разметка сводит ToS-гарантию к точности ручного чтения. `labelsFor()` объявляется БЕЗ аргумента с ассертом книго-константы — форма не обещает того, чего механизм не держит. Диапазоны глав (идиома `until_ch` реальна) остаются данно-формным расширением и возвращаются только вместе с решением владельца принять ручной риск. +5. **Q3 = D12 сохраняется** (отказ РЕДАКТОРА под лейблом терминален, flag+skip без хопа — дрейф стиля дороже потери юнита). **Q5 = `chains.default` остаётся мёртвым** в этом паке. **Q6 = механизм `terminal` строим, значение не заводим**; из примера реестра `prohibited` УБРАТЬ (§14.8.2 — два из трёх выходов будущего L3 не воспроизводить в примере), будущий L3-скрин подключается НАЗВАННЫМ пер-лейбловым хуком политики, а не через `terminal`. +6. **Вокабуляр и форма данных (§14.5):** книга — `content_labels:`, провайдер/модель — `accepts_labels:` (РАЗНЫЕ ключи: свойство контента ≠ разрешение получателя); пер-модельный оверрайд — `*[]string`, только СУЖАЕТ (nil = наследовать, указатель на пустой = «ни одного», модельный ⊆ провайдерского); реестр политик — УПОРЯДОЧЕННЫЙ СПИСОК (map-порядок в Go не хранится), «первая политика, претендующая на стадию, выигрывает», равное притязание = громко; эффективный список хопов — упорядоченное объединение с дедупом ПОСЛЕ резолва. Отставки `permissive` (громко при наличии) и `adult:` книги (громко только на `true`; `false`/отсутствие терпимо — 13 файлов вне git) — Go-идентификатор БЕЗ слова adult, тег = замороженный ключ данных. +7. **Отставка `Stage.Channel` — В ТОМ ЖЕ диффе (§14.8.1):** канал, его enum и блок изоляции D4.1 уходят вместе с `permissive`, иначе `providerPermissive` возвращает false ВСЕГДА и выживший `channel: adult` даёт операторский тупик; два существующих adult-теста перепи́сываются/удаляются тем же диффом (иначе семантически ложны). +8. **Рантайм-ассерт — в `runAttempt` ДО `Reserve`, через `clientFor(model, labels)`** (компиль-энфорс: ни один будущий путь на провод не получит клиента, не объявив контент). Место ассерта НЕ переносится до `GetCheckpoint` (реплей провайдеру ничего не отправляет — ToS-экспозиции нет; перенос отнял бы $0-реплей); негативный тест обязан гонять СВЕЖИЙ вызов и ассертить идентичность ОШИБКИ, а не дельту `spend`. +9. **Отказы загрузки — за `forWrite`, резолв — всегда (§14.8.3):** книга, помеченная ПОСЛЕ оплаты, обязана остаться читаемой (`status`/`report`/`export` = $0, D20.4), иначе единственный выход — снять лейбл, то есть тихий обход; на read-пути то же самое = громкое предупреждение + флаг в шапке отчёта. +10. **`failover.go` — УДАЛИТЬ в этом паке** (моё решение, отклоняю рекомендацию §14.5.8 «дать конструктору лейблы»): вызывающих нет, файл несёт nil-panic-дыру D4 п.1 и пересылает тот же запрос другому провайдеру — ровно то, что лейбл-механизм запрещает; если local→cloud фолбэк когда-нибудь понадобится, он родится под лейблами с первой строки. Удаление тестов файла — объявить в цензе `^func Test` исполнением. Гард-тест шва остаётся: `\.Complete(` вне `internal/llm` и вне `stagerun.go` пуст, с ИМЕНОВАННЫМ аллоулистом `live_conformance_test.go` (второй сем реален, §14.5.7). + +**ДОБОР ОРКЕСТРАТОРА — три находки, которых нет ни в теле, ни у панели (все проверены моими исполнениями):** +- **(A) Один лейбл `adult` схлопывает ратифицированную развязку D14 п.1 (HIGH, данные+продукт).** D14 п.1: ToS DeepSeek §3.4(5) запрещает *sexually explicit*, а «для violence-фрагментов (не sexually explicit) DeepSeek остаётся допустим» — верифицировано по первоисточнику. Единственное значение «adult» гонит violence-тяжёлую книгу (наш приёмочный класс) ЦЕЛИКОМ мимо DeepSeek: переводчик → mistral, редактор → не-dspro, то есть пак тихо пере-решает ратифицированного интерим-редактора (D39.22) и умножает выходную цену. Механизм это УЖЕ держит данными (упорядоченный реестр + `label_models` + две цепочки), поэтому вокабуляр (`violence` / `sexually-explicit` против единого `adult`) — решение владельца, а не сессии; ратифицирую его как ОБЯЗАТЕЛЬНУЮ развилку перед заводкой первой лейблованной книги, но НЕ блокирую стройку (значение = строка данных). +- **(B) `reasoning:"off"` — тихий выход из обоих гейтов на аддитивном провайдере (MED-HIGH).** Отчёт §4 утверждает, что grok-редактор «обязан объявить `reasoning_max_tokens>0`, иначе загрузка падает». Проверил: гейт `pipeline.go:541` внешним условием `st.Reasoning != "off"` — а шиппинг-стадия edit объявляет ровно `reasoning: "off"` (`pipeline-c1.yaml`, no-op для dspro). Для grok это НЕ no-op: `capabilities.reasoning {control: effort, off_effort: none}` (`models.yaml:188-190`) шлёт явный `reasoning_effort:"none"` ⇒ деньги как раз честны (`AdditiveReasoningTokens` = 0 законно), но мы попадаем в ратифицированную ЭХО-зону D19.1 п.2 («reasoning-off + плотный CJK = свойство класса моделей, DeepSeek и ОБА grok-слага») при билингв-редакторе, который видит плотный исходник, — а гейт `echoMineViolation` физически не может выстрелить: `echoes_when_thinking_off` стоит ТОЛЬКО у deepseek (`models.yaml:38`), обобщение D19.1 в данные не доехало. Итог: какую бы ветку ни выбрали для лейблованного редактора на аддитивном провайдере, ОДИН гейт молчит. **Закрытие обязательно** (форму выбирает сессия и аргументирует): либо `echoes_when_thinking_off: true` у xai как ДАННЫЕ — тогда `off` становится громким, либо аддитивный гейт расширяется на резолвнутую модель независимо от `off`. +- **(C) Рейт-гард деградирует МОЛЧА в «неограниченно» (MED).** `rateGuard()` возвращает nil для модели вне `reachableModels`, а nil трактуется как без-лимита (`ratelimit.go:92-97`) — в отличие от `r.client`, который падает громко. Лейблованный переводчик — ровно `mistral-large-2512` с `rate_limit.max_concurrency: 2` (~48% retry-fails под N-∥). Расширение `reachableModels` (п.2) закрывает это механически, но приёмка обязана утверждать гарды ПОЗИТИВНО (тест, что резолвнутая лейблованная модель получила свой гард), а не выводить из общего фикса. + +**НА ВЛАДЕЛЬЦЕ (деньги/продукт/18+ — стройку не блокируют, оба ответа = строки данных):** **вокабуляр лейблов** (единый `adult` против `violence`/`sexually-explicit` — находка A: цена гарантии против цены прогона и сохранения dspro-редактора) · **Q2 редактор под лейблом** (кандидаты только из способных: grok-4.3 ИНТЕРИМ — exp04 мерил его билингвально, ранг-1 верность, ратифицированный первичный судья эротики D22.6, но $1.25/$2.50 против $0.435/$0.87 + развилка (B); mistral отвергнут как несущий D39.20; local-8b — скрининг; glm-5 = ОДНА строка данных, но только после сверки ToS/AUP Z.AI по первоисточнику — угадывать ToS запрещено) · **Q1 денежное следствие книжной гранулярности** (лейблованная книга едет по цене permissive-тира целиком). + +**СКОУП-ВЫНОСЫ (пинги сессии приняты — норма 5):** (1) `escalation_model` = ОТВЕТИВШАЯ модель — ВНЕ пака-17: golden пинит `esc_model` на отказавшем хопе, маскировка это не скрывает ⇒ вердикт-изменение, отдельная ратификация с санкционированным пере-капчером. (2) Два нита общности из петель (Detail-строки чекеров из данных · множитель ×2 `lintTimeUnits`) — УСЛОВНО: только в БАЙТ-НЕЙТРАЛЬНОЙ форме (фолд лишь при отличии от дефолта) и с доказательством исполнением, иначе `CheapGateVersion`/`pack.Version()` двигают снапшот стендовых книг и убивают $0-резюм драфта под замер остатка пака-16; при недоказуемости — отложить. (3) **D22.7 НЕ снимается этим паком:** ратифицированное «пер-чанковый L3-скрин ОБЯЗАТЕЛЕН до первой erotica-книги в проде» остаётся отдельным гейтом — оптовая ратификация пака-17 разрешением на первую erotica-книгу НЕ является; `action: terminal` — book-level отказ входа, механизм СЛАБЕЕ D22.7. (4) Ратифицированный D20.2-Q2 (`--accept-rebill[=usd]` с порогом `min($0.50, 5%×ProjectedBookUSD)`) в коде/CLI отсутствует (живёт только в спеке) — открытая петля, не пак-17. + +**Границы гарантии (в контракт, не в код):** инвариант формулируется как «egress прогонов ДВИЖКА»: механизм не утверждает ничего о НЕОБЪЯВЛЕННОМ контенте (лейблы — данные владельца) и об eval-стороне (`eval/*.py` зовут провайдеров сами). Судья 18+ — eval-сторона (проба-гейт D22.6), в пак не входит. + +**Метод фазы 1 подтверждён как норма:** сессия принесла три отмены и два переворота СВОИХ решений с грунтовкой по коду — это ровно поведение, которое приёмка поощряет (нормы 5/10); мой рубеж-2 добавил три находки и ноль опровержений её §14. **Фаза 2** размечена «ровно так»-списком в `docs/BACKEND_PACK17_CHANNEL_B_SESSION_PROMPT.md` (инварианты: golden байт-идентичен без пере-капчера · парити EXACT · `-race` · сэндбокс-репродукции через настоящий драйвер · дифф `^func Test` исполнением · сессия не коммитит). diff --git a/docs/architecture/09-target-architecture.md b/docs/architecture/09-target-architecture.md index c2bbf228..d2abb8fe 100644 --- a/docs/architecture/09-target-architecture.md +++ b/docs/architecture/09-target-architecture.md @@ -18,7 +18,7 @@ > | 6 Export | ✅ ПОСТРОЕН: `checks.ExportNormalize` на каждом финале; санитайзер-классы strip+export | D39.2 · D38.3 | > | 7 Гигиена | ЧАСТИЧНО: реестр role→инъекция · вынос `foldModelWire` · снос сирот/`gatesEnabled` — сделаны; **target-aware гейты — ОТКРЫТО** (ru-target-долг = ограничение, D39.24 §15.3; едет с канал-B/таргет-работой) | D39.2 · паки 11–16 | > -> §1 «как есть» читать как снимок ДО стройки (const-чанкер · glm-редактор · мёртвые `STMDepth`/`OverlapTokens` — всего этого больше нет). §4 отработан целиком: трек B исполнен (exp15/exp16 — программа ЗАВЕРШЕНА, D39.7/D39.10), гейт пере-прогона пройден фактом rerun2 (D39.20; планка ≤2 НЕ пройдена, эксп ЗАКРЫТ D39.22, редактор = deepseek-v4-pro интерим). Канал B — пак-17 (дизайн); инженерная форма переопределена **D39.25**: в движке НЕТ понятия «18+» — generic content-labels × provider-capabilities, refusal причино-агностичен; «18+ линия» в §6 читать как продукт-линию, не механизм движка. +> §1 «как есть» читать как снимок ДО стройки (const-чанкер · glm-редактор · мёртвые `STMDepth`/`OverlapTokens` — всего этого больше нет). §4 отработан целиком: трек B исполнен (exp15/exp16 — программа ЗАВЕРШЕНА, D39.7/D39.10), гейт пере-прогона пройден фактом rerun2 (D39.20; планка ≤2 НЕ пройдена, эксп ЗАКРЫТ D39.22, редактор = deepseek-v4-pro интерим). Канал B — пак-17: **дизайн РАТИФИЦИРОВАН D39.26** (лейблы вне хешей — назначенный слой D20.2-Q3 = резолвнутая модель стадии пер-стадийно/пер-волново · резолв ДО валидации, «достижимое» лейбл-зависимо · один хоп `chain[0]` · гранулярность = книга · `content_labels`(книга) ⊆ `accepts_labels`(модель) · `Stage.Channel`/`permissive`/D4.1-блок отставляются одним диффом), фаза 2 = стройка; инженерная форма переопределена **D39.25**: в движке НЕТ понятия «18+» — generic content-labels × provider-capabilities, refusal причино-агностичен; «18+ линия» в §6 читать как продукт-линию, не механизм движка. --- diff --git a/docs/archive/reports/PACK17_DESIGN_2026-07-25.md b/docs/archive/reports/PACK17_DESIGN_2026-07-25.md new file mode 100644 index 00000000..f0d79986 --- /dev/null +++ b/docs/archive/reports/PACK17_DESIGN_2026-07-25.md @@ -0,0 +1,344 @@ +# ПАК-17, ФАЗА 1 — ДИЗАЙН: generic content-labels × provider-capabilities (канал B «вживую») + +> **Ревью-шапка оркестратора №8 (25.07, приёмка пропорциональная — инлайн-пасс исполнением, без воркфлоу; РАТИФИЦИРОВАНО `D39.26`).** **Принято В РЕДАКЦИИ §14: тело §0–13 читать ТОЛЬКО через неё** (при расхождении побеждает §14). +> Пере-выведено мной, не с чужих слов: **M1 ре-деривирован независимо** — все пять дайджестов посимвольно (`c2021b1b…cab0df` = `capture.golden:6`; omitempty-хвост при пустых лейблах байт-в-байт тот же); **фантом-гард D-ссылок чист** (D2/D3/D4.1/D6.2/D12/D13.6/D14.1/D15.2/D19/D19.1/D20.2-Q1,Q2/D20.4/D22.5-22.7/D25.4/D30.1/D39.20-25 существуют и говорят заявленное); спот-чеки подтвердили §14.1 (`BriefHash` book-global в общем билдере обеих волн при пер-стадийном `stageSnap`), §14.2 (сырое `reachableModels`; `chains.default[0]` = `escalate_to` драфта), §14.3 (`escMu`-пин «перерасход ≤ 1 хоп»; `Waves.Workers` дефолт 1), §14.5.6 (`GetCheckpoint:337` → `Reserve:379` → `client:410` → `Complete:442`), §14.6.1 (golden пинит `esc_model` на ОТКАЗАВШЕМ хопе), §14.6.2 (`style_check_version` фолдится безусловно), 13 файлов вне git с `adult:`. +> **Ноль опровержений §14; три добора оркестратора (в D39.26):** (A) единый лейбл «adult» схлопывает ратифицированную violence-развязку D14 п.1 (DeepSeek допустим на violence) ⇒ вокабуляр лейблов — решение владельца; (B) `reasoning:"off"` — тихий выход из аддитивного гейта (`pipeline.go:541` внешним условием) И из эхо-гейта (`echoes_when_thinking_off` только у deepseek, обобщение D19.1 п.2 в данные не доехало) ⇒ закрытие обязательно; (C) рейт-гард молча деградирует в «неограниченно» (`ratelimit.go:92-97`) при лейблованном переводчике mistral `max_concurrency:2`. +> **Неточности, выводов не меняющие:** манифестное «`accept-rebill` грепом пусто» — 9 попаданий, все в `backend/docs/D15.2-*.md` (в коде/CLI действительно нет); «23 сайта `LoadPipeline`» включает строку определения. +> **Скоуп-выносы приняты:** `escalation_model`=ответившая (вердикт-изменение, отдельная ратификация) · два нита общности — условно (байт-нейтральная форма + доказательство исполнением) · D22.7 паком НЕ снимается · `--accept-rebill` (D20.2-Q2) — открытая петля. **Разметка фазы 2 — в промте пака-17.** + +> **Статус: ДИЗАЙН-ОТЧЁТ, СТОП ПЕРЕД РАТИФИКАЦИЕЙ.** Сессия: бэкенд, 2026-07-25. Промт: `docs/BACKEND_PACK17_CHANNEL_B_SESSION_PROMPT.md` (фаза 1). Кода НЕ трогал — дерево чистое (`git status --porcelain` пусто на старте и на сдаче, кроме этого файла). Ратифицированная база: D39.25 (директива владельца: в движке нет понятия 18+) · D22.7 (L3 = политика входа) · D19 (переводчик канала B = Mistral) · D12/D2 (лестница отказов) · D4.1 (изоляция типом) · D15.2 §13-Q3 (первый рантайм-потребитель обязан назначить слой снапшота). + +## §0. Эхо-блок (что я понял — ДО работы) + +1. **Скоуп фазы 1:** только дизайн B1–B6 + адверсариальный селф-ревью; ни строчки кода; отчёт → СТОП → ратификация. +2. **Инвариант №1 (архитектурный):** в движке НЕТ понятия «18+/adult/канал B». Механизм generic: content-label книги (данные книги) × capability провайдера (данные models.yaml) × политика цепочки (конфиг). «adult» — ЗНАЧЕНИЕ данных. +3. **Инвариант №2:** refusal-обработка причино-агностична — детектим ФАКТ отказа (D12), причина = операторская диагностика; путь один: регенерация → эскалация по цепочке лейбла → flag+skip (D2). +4. **Инвариант №3 (жёсткая линия):** L3 не строим, не анализируем; `eval/data/refusal_corpus/*` не открывал (проверяемо: ни одного чтения оттуда). +5. **Инвариант №4:** live-вызовы с 18+ контентом — только по санкции владельца; дизайн и будущие тесты — на mock-провайдере и СИНТЕТИЧЕСКИХ безобидных фикстурах. +6. **Инвариант №5:** канал A байт-идентичен — golden без пере-капчера, парити EXACT; adult-механика включается ТОЛЬКО явной маркировкой. +7. **Инвариант №6:** capability-исключения (DeepSeek/Anthropic без adult) — СТРОКИ ДАННЫХ, не Go-литералы; гарантия «label ⊄ capabilities → провайдер не получает контент» компилируемая/тестируемая, fail-loud. +8. **Мысленный тест генеральности:** второй лейбл (archaic-register) добавляется ДАННЫМИ, без правки Go. +9. **Не делать:** L3-классификатор · live 18+ без санкции · реальный 18+ текст в репо · пар/книго/провайдер-литералы в Go · расширение скоупа без пинга. +10. **Канал вопросов:** конфликт промта с кодом → пинг оркестратору через владельца (в §5/§6 ниже — 4 таких пинга и 3 вопроса владельцу). + +## §1. Метод и что верифицировано исполнением + +Метод — образец пака-16 (D39.24): эхо → инвентаризации → дизайн → адверсариальные линзы → ревизия отдельным слоем. + +1. Онбординг: CLAUDE.md → `docs/README.md` → D-лог целиком по несущим блокам (D2/D3/D4/D12/D14/D19/D22/D39.20–D39.25) → `architecture/12-go-style-notes.md` §0 → нормы промтов §7–11. +2. Личное чтение кода (не по памяти): `internal/config/{pipeline,models,book}.go`, `internal/pipeline/{disposition,escalation,stagerun,snapshot,waverun,runner,repair,clients}.go`, `configs/models.yaml`, `configs/pipeline-c1.yaml`, `prompts/zh-ru/editor.md`. +3. Семь параллельных read-only инвентаризаций (снапшот/деньги/отчётность/транспорт/тесты/конфиги/refusal-поток), каждая с требованием `file:line` + цитата; их выводы ниже перепроверены точечно мной. +4. **Ключевой численный факт проверен МОИМ исполнением** (не агентским): brief-канон golden-книги даёт ровно записанный в фикстуре `brief_hash` — см. §7 манифест, строка M1. Это фундамент §B5. + +## §2. Инвентаризация: 8 фактов, на которых стоит дизайн + +**Ф1. Сегодняшняя adult-поверхность в Go — ровно 6 точек, все load-time.** `config.Book.Adult` (`backend/internal/config/book.go:32`) · `config.Stage.Channel` `""|sfw|adult` (`pipeline.go:166`) · `config.Provider.Permissive` (`models.go:60`) + `Models.providerPermissive` (`models.go:271-276`) · `Pipeline.CheckAdultChannel` (`pipeline.go:336-346`) · enum-валидация канала (`pipeline.go:549-553`) · D4.1-изоляция типом (`pipeline.go:569-576`). Единственный вызов из движка — `runner.go:147`, тоже load-time. + +**Ф2. Рантайм-влияния на выбор модели у книги НЕТ вообще.** Выбор модели 100% статичен из конфига: `r.client(...)` вызывается только с `model ∈ {st.Model, st.EscalateTo, Gates.Repair.Model}` (`runner.go:299-323`, `stagerun.go:410`). Единственное книжное свойство, меняющее поведение рантайма, — `TargetLang`, и оно гейтит ГЕЙТЫ (`isRuTarget`/`isCJKTarget`) и выбирает ДАННЫЕ (`lang.*For`), но никогда модель. `Stage.Channel` имеет НОЛЬ рантайм-читателей. + +**Ф3. Единственная точка-удавка на провода — одна, и она уже есть.** `(*Runner).runAttempt` (`stagerun.go:326`) — единственный вызов `r.client(model)` (`stagerun.go:410`) и единственный `client.Complete(...)` во всём продовом коде (`stagerun.go:442`). Через неё проходят ВСЕ три класса вызовов: праймари (`stagerun.go:131`), эскалационный хоп (`escalation.go:132`), ремонт (`repair.go:389`). Failover-декоратор (`internal/llm/failover.go`) — мёртвый код: `NewFailoverClient` не имеет ни одного вызывающего вне своих тестов. Следствие: один клиент = один провайдер = одна модель, второго пути на провод нет. + +**Ф4. Ремонтный путь ТЕРЯЕТ стадийный канал.** `repair.go:386`: `rst := config.Stage{Name: st.Name, Role: roleRepair, Model: model}` — синтетическая стадия копирует только Name/Role/Model, `Channel` отбрасывается. Любой ассерт, ключёванный на `st.Channel`, слеп на ремонтных вызовах; ассерт на `(лейблы книги/чанка, model)` — не слеп. Это решает форму B4. + +**Ф5. `escalation.chains` — мёртвые данные рантайма.** Единственные потребители: валидация существования моделей (`pipeline.go:578-584`) и префлайт ключей под бюджетом (`models.go:507-518`). Исполняется ТОЛЬКО single-hop через `stage.escalate_to` (`escalation.go:90,132`). При этом `chains.adult` во всех 4 шиппинг-конфигах = **[grok-4.3], ОДИН элемент** (`configs/pipeline-c1.yaml:101`, `pipeline-arm-{glm,mistral,deepseek-pro}.yaml`). То есть «мульти-хоп по цепочке лейбла» сегодня по данным = один хоп. + +**Ф6. `Book.Adult` фолдится в снапшот транзитивно — и документация это ОТРИЦАЕТ (док↔код).** `Adult bool json:"adult"` внутри канона `BriefHash()` (`book.go:221,228`) → `snap.BriefHash` (`snapshot.go:338,413`) → оба волновых snapshotID → `Request.SnapshotID` в каждом `RequestHash` (`render.go:247,271-274`). А комментарий `pipeline.go:331-332` утверждает: «Adult stays wire/verdict-NEUTRAL (no snapshot layer … never a hash input)» — **неверно**. Проверено численно (§7/M1): убрать `"adult":false` из канона = `c2021b1b…` → `58883ff5…`, то есть обязательный `--resnapshot` и пере-оплата КАЖДОЙ книги. + +**Ф7. Байт-стабильность brief-канона — это защита денег следующего платного прогона, а не косметика.** На стенде 5 book.yaml, все с `adult: false`; `rerun2/book-dspro.yaml` и `book-mistral.yaml` по шапке «IDENTICAL to book.yaml (same book_id + all BriefHash fields, so the shared paid draft resumes at $0)». D39.20 зафиксировал $0-резюм драфта на трёх армах, а пак-16 оставил ОТКРЫТУЮ петлю (замер остатка ремонта на пост-профилактическом прогоне, D39.24 §15.1) — она поедет на следующем платном прогоне тех же книг. Сдвиг `BriefHash` = потеря $0-резюма драфта. + +**Ф8. Тестовая поверхность adult = 2 теста, оба load-only, исполняемого adult-пути нет.** `config_test.go:37-64` (`CheckAdultChannel`, чистые in-memory структуры) и `runner_test.go:1552-1572` (`NewRunner`+`Close`, `TranslateBook` НЕ вызывается). НЕ покрыто: ветка «escalate_to должен быть permissive» (`pipeline.go:573-575`), enum-валидация канала, `providerPermissive` напрямую, любой хоп на adult-стадии, refusal→хоп→УСПЕХ→ре-гейт (все «хоп вылечил» тесты гоняют `cjk_artifact`), `soft_refusal`→хоп, `content_filter`→хоп. Ни одна фикстура не ставит `adult: true`. Мока на Go-шве не существует вообще: подделка живёт на HTTP (`httptest`, `runner_test.go:60-76`), ответы ключуются ПО ТЕЛУ запроса (имя модели / `max_tokens` / маркер в источнике). + +## §3. B1 — Схема content-labels и гранулярность + +### Вариант 1 (рекомендуемый): лейблы книги + capability провайдера + реестр политик в ран-конфиге + +**Данные книги** (`book.yaml`): `content_labels: [