From f79d8be88b880d065f5dc195aff7ce682437ff12 Mon Sep 17 00:00:00 2001 From: "Claude (backend session)" Date: Sun, 2 Aug 2026 19:45:29 +0300 Subject: [PATCH] Accept effort-handle pack by execution: battery, second-path money, adversarial plantings and N=5 raw all confirmed; deviations ratified, D4-D9 deferrals get carrier rows --- docs/PROGRESS.md | 20 ++++++++++++----- docs/architecture/05-decisions-log.md | 22 ++++++++++++++++++- .../reports/EFFORT_HANDLE_2026-08-02.md | 2 +- 3 files changed, 36 insertions(+), 8 deletions(-) diff --git a/docs/PROGRESS.md b/docs/PROGRESS.md index 1504253f..d84e7c5d 100644 --- a/docs/PROGRESS.md +++ b/docs/PROGRESS.md @@ -1,7 +1,7 @@ # Журнал прогресса -> **⟶ ТЕКУЩЕЕ СОСТОЯНИЕ** (на 2026-08-02, голова D39.90). -> - ⚠⚠ **ПЕРЕДАЧА ОТ ОРКЕСТРАТОРА №10 → №11 (D39.90). ЗАДАЧА №1 ПРЕЕМНИКА — ПРИЁМКА бэкенд-пака строк 104/46/16.** Отчёт `archive/reports/EFFORT_HANDLE_2026-08-02.md` закоммичен с баннером «коммит ≠ ратификация»; **код сессии лежит в дереве НЕЗАКОММИЧЕННЫМ** (новые `backend/internal/config/internal_call.go`, `internal_call_test.go`, `backend/internal/pipeline/synthetic_stage_seam_test.go` + 10 правленых файлов) — **дерево НЕ чистить, `reset --hard`/`checkout` поверх него НЕ делать, фронт-сессия ЖИВАЯ и коммитит сама.** Приёмка = батарея с фрозен-числами исполнением + пере-вывод $0.045095 вторым путём из сырья + адверсариал по несущим клеймам (два шва · отсутствие перекупки · гарды · парная выборка N=5) → лендинг. **НА ВЛАДЕЛЬЦЕ два решения:** развилка (а)/(б)/(в) по строке 46 (выбор сессии — (а)) и строка 107 (форма гардов + линтер/CI, первым шагом $0-замер объёма находок). **Источник истины по РЕШЕНИЯМ — `architecture/05-decisions-log.md`; этот файл — ЖУРНАЛ.** +> **⟶ ТЕКУЩЕЕ СОСТОЯНИЕ** (на 2026-08-02, голова D39.91). +> - ✅ **ПРИЁМКА бэкенд-пака строк 104/46/16 ИСПОЛНЕНА (оркестратор №11, D39.91): пак ПРИНЯТ, код заленден `553f1a3` (13 файлов backend/, pathspec-форма), строка 104 ЗАКРЫТА.** Батарея пере-прогнана — 5/5 фрозен-чисел совпали; деньги пере-выведены вторым путём ($0.045095 ≡ usage×цены ≡ Σ `request_log`, дельта $0.000000); пять НЕЗАВИСИМЫХ посадок в гарды — все CAUGHT; N=5 сверен с сырьём. **Обе девиации пака РАТИФИЦИРОВАНЫ** (repair-ключ свой · `ThinksOnWire`). Поправки приёмки (метка «$0.031639 (flash)» = на деле flash+pro · хеш-клейм принят по эквивалентности · стейл-доккоммент `capability.go:78`) — в D39.91 и ревью-шапке отчёта; отложки Д4–Д9 получили носителей: НОВЫЕ строки **114** (Д4+доккоммент) · **115** (Д6 go:embed-общность) · **116** (Д8 порог 6/6) · реестр 108 (+Д5/Д9) · строка 107 (+Д7). **НА ВЛАДЕЛЬЦЕ три решения:** развилка (а)/(б)/(в) по строке 46 (выбор сессии И приёмки — (а)) · строка 107 (форма гардов + линтер/CI; первым шагом $0-замер объёма находок) · строка 112 (применять ли (б) к пяти шиппинг-конфигам и когда платить перекупку — теперь в связке со строкой 116). **Источник истины по РЕШЕНИЯМ — `architecture/05-decisions-log.md`; этот файл — ЖУРНАЛ.** > - **Сделано (сводно; детали — D-лог и архив-слайсы):** Ф0 ✅ · Ф1-инфра ✅ · арх-ресет D39 (7 слоёв, паки 11–16) ✅ · паки 17 «канал B» · 18 «долги» · 19 «голос/состояние» · 20 «банк+терминолог» ✅ (D39.26–28/31/41–56) · мини-прогон (D39.37) и ХОЛОДНЫЙ прогон (D39.58: recall банка 0.918/0.980, банк приходит переведённым) приняты · полигон-пакеты 5–8, ToS-речек (D39.57), Р6+P4 (D39.61) закрыты · **карта языковой привязки движка (D39.60): 149 сайтов/45 файлов, книго-ось чиста (4), ja→ru безопасно без правки Go, en→ru — нет** · Р1–Р4 закрыты целиком (D39.63: Р2 = ЗНАЧЕНИЕ, Р4 = норма потолка recall) · **ФАЗА 2 ОБЩНОСТИ ✅ (D39.64: П0 эмбед-хеш · П1 цель-шов · П2 скрипт-шов, ko-баг закрыт · П3 нарезка · П4 манифест-по-каналам; голден вердикт-нейтрален 0/172, майнер-парити EXACT)** · жанровый словарь отменён как класс (D39.47) · петля ремонта построена и НЕ включена (D39.38). > - **Курс (D39.59–78): ОБЩНОСТЬ ✅ → КАЧЕСТВО БАНКА ✅ (D39.69/75/77) → ПАКЕТ-ЧЕКЕРОВ ✅ (D39.78: строка 25 целиком; харнесс labels В GIT 12/12; K2 r0.85 · K4b r0.22 · K6 fp 14→6; Р2 hard/soft + Р4-потолки в контрактах).** **Текущее: МЕЛКАЯ ПАЧКА ✅ ПРИНЯТА И ЗАЛЕНДЕНА (D39.82: строки 89/53/83 закрыты · 93 сужена до остатков · F4-бэкап+pre-flight построен · register/жанр → книжный слой · DC7 пере-гейчен сид-покрытием → строка 98); решения §6 исполнены (D39.79/82); **РЕ-ПРОБА + ОТЛАДОЧНЫЙ ХОЛОДНЫЙ ПРОГОН coldrun-b САНКЦИОНИРОВАНЫ (D39.83: промт выдан и холодно аудирован — 3 major вправлены; потолки $0.15 ре-проба / $5 прогон; ступени 2+8 глав, автобанк по D39.77)**; ре-проба flash (строка 74) — по слову владельца; finding-1 ЗАКРЫТ (D39.77); онбординг-оверхол доков исполнен (D39.80); **ФРОНТ ОТКРЫТ владельцем (D39.81: продукт = SaaS; зоны `frontend/` + `platform/` живые, фронт работает на моках; движковая очередь НЕ пере-упорядочена — ранняя вставка одна: строка 95 «контракт API» $0; строки 96/97 и перевесы 49/94 заведены)**; **СТЕК ФРОНТА/ПЛАТФОРМЫ ЗАПИНЕН, 8 решений владельца ратифицированы (D39.84: SEO Google-only · PWA-первый · денег в MVP-UI нет · стоп-на-банке = параметр запуска, `--verify-bank` готов · перевод НИКОГДА на индексируемый URL = ПТ-34 · якорь чтения = edit-unit, ПТ-21; работы движка под фронт = строки 99–102; фронт/платформа ведут ЗОННЫЕ бэклоги — `frontend/docs/BACKLOG.md` · `platform/BACKLOG.md`, строки 96/97 → П-1/П-2; зоны залендены, фронт-промт S0–S7 в `frontend/docs/`)**; **ШОВ ДВИЖОК↔ПЛАТФОРМА РАТИФИЦИРОВАН ПО РЕСЁРЧУ (D39.85, `research/23`): NDJSON-поток событий → материализация в Postgres → SSE; артефакты границ стадий; анти-паттерны запрещены (живой SQLite не читать · HTTP в движок не тащить · read-пакет из ядра не выносить); строка 103 заведена, входы контракта 95 зафиксированы)**.** **coldrun-b ПРИНЯТ И ЗАЛЕНДЕН (D39.86): фазы A/B исполнены за $0.114378 из $0.15, фаза C заморожена чекпойнтом — легитимный исход по D39.83.** Блокер 0731 воспроизведён на боевой форме (0 из 9 пригодных при `max_tokens=8496`); **вариант (а) флор-16000 ФАЛЬСИФИЦИРОВАН** (4/5 пустых при 16992, добавка уходит в размышление); **(б) `reasoning_effort:"low"` оживляет волну, но требует правки Go** (у бэнк-ролей ручки нет — НОВАЯ строка 104; посылка об амендменте гейта неверна только для СТАДИЙНОЙ ручки); **(в′) thinking OFF замерен карантинно — эхо-мина ЖИВА на весах 0731 (4/20)**, флаг `echoes_when_thinking_off` сохраняет основание; **(г) pro ≈×8.9, а не ×3.1**, и на pro ручка эффорта не работает (вендор `low→high`, смена маппинга объявлена «early August 2026»). Порог классификатора **6/6 взят**; две дыры наблюдаемости закрыты; live-риг не собирался с D39.64 — починен. НОВЫЕ строки **104** (ручки синтетических стадий) и **105** (мис-вердикт классификатора + честность поверхностей); **46** повышена до «скоро» с живым носителем; **16 НЕ закрыта**. ✅ **РАЗВИЛКА 74 РЕШЕНА ВЛАДЕЛЬЦЕМ (D39.87): вариант (б)** — `reasoning_effort: "low"` черновику ПЛЮС правка Go, дающая ручку эффорта ролям, у которых её нет (строка 104), ПЛЮС экран целевого языка (строка 46). Мандат владельца на исполнение — «элегантно встроить в текущее решение по коду, чтоб было чисто»: правка обязана быть использованием СУЩЕСТВУЮЩЕГО поля `Stage.Reasoning`, одним швом на все три рукописные `config.Stage`, так чтобы четвёртое такое место не могло появиться молча. **Промт выдан** — `BACKEND_EFFORT_HANDLE_SESSION_PROMPT.md` (работы A/B $0 + проба банка ≤$0.10 + добивка прогона ≤$5, закрывающая строку 16 и впервые дающая данные по осям голоса для 13б). Перекупок нет (D39.63). > - **Горизонт (D39.62/67):** ре-проба flash (74; + платный порог 6/6 классификатора + пробы 36б-замера Q2/эмиссии Q7 по слову) → **ДОБОР ИДЕАЛА** (первым прогоном: оси голоса 24 · авто-режим · итерация №2 редакторов 65 · цена 16 · веса K1–K12 13а · вне-претрейн чекпоинт 55) → ВТОРАЯ ПАРА живьём (ja→ru; преп 81) → МАСШТАБ → пилот Ф2.5 (гейт резюме-строки 80; строки 62–68, 85) → Ф3 ридер-IDE (69–71). **Стоячие:** ToS-триггер 25.10 · Ш-2 до go1.27 · строка 74 перед любым платным прогоном. @@ -68,7 +68,7 @@ | 41 | golden: вторая фикстура С langpack (сейчас пинится только фолбэк-путь) ; + golden-счётчики голоса (хвост D39.58) | бэкенд | когда-нибудь | отдельное решение | D39.37(6) | | 42 | `prompt_override` — легальный обход гарантии слоя-2, сформулировать честно | бэкенд | когда-нибудь | отдельное решение | D39.37(7) | | 43 | `request_log` без скоупа/ретеншена + `first_flag_reason` = третье представление истории попыток (корень — неразведённые скоупы) | бэкенд | когда-нибудь | отдельное решение | D39.37(9) | -| 44 | **Флор — калиброванная константа без модели «thinking в completion»: МОДЕЛЬ ПОЛУЧЕНА замером (D39.86), сама строка сужена до выбора числа.** Замер боевой формы: при вендор-дефолте `high` размышление на плотном хане потолком НЕ ограничивается (8496 → 0/9 пригодных, 16992 → 1/5; вендорская норма вывода для `high` = 384K) ⇒ **флор не является рычагом против неограниченного думания — рычаг это `reasoning_effort`**; при `low` размышление 170–313 ток. и флор 8000 избыточен. Остаток строки: какое число ставить ПОСЛЕ развилки 74 (и помнить, что у `deepseek-v4-pro` эффорт не настраивается — вендор-маппинг `low→high`, quirks п.3а). ⚠ **РАСХОЖДЕНИЕ ТРЕКЕРА СНЯТО (D39.90):** строка 74 объявляла 44 «закрытой этим замером» — это верно только для ПОЛОВИНЫ «поднять флор» (фальсифицирована). Живой остаток — обратный: **опустить/пере-калибровать число по числам пробы `bank-low`**, где стена на `low` не исчезла, а разредилась (упавший батч: `content=""`, `finish=length`, `completion=7999`, `reasoning=7999` — тот же тяжёлый хвост, 1/5 вместо 4/5, и это стохастика вызова: батч не самый большой по входу). ⚠ **Флор при `low` НЕ варьировался ни разу** — упавший батч умер ровно на потолке 8000, так что «сколько ставить» остаётся незамеренным вопросом, а не выводом | бэкенд | когда-нибудь (при приёмке 104) | отдельное решение | D39.37(10), D39.86, **D39.90** | +| 44 | **Флор — калиброванная константа без модели «thinking в completion»: МОДЕЛЬ ПОЛУЧЕНА замером (D39.86), сама строка сужена до выбора числа.** Замер боевой формы: при вендор-дефолте `high` размышление на плотном хане потолком НЕ ограничивается (8496 → 0/9 пригодных, 16992 → 1/5; вендорская норма вывода для `high` = 384K) ⇒ **флор не является рычагом против неограниченного думания — рычаг это `reasoning_effort`**; при `low` размышление 170–313 ток. и флор 8000 избыточен. Остаток строки: какое число ставить ПОСЛЕ развилки 74 (и помнить, что у `deepseek-v4-pro` эффорт не настраивается — вендор-маппинг `low→high`, quirks п.3а). ⚠ **РАСХОЖДЕНИЕ ТРЕКЕРА СНЯТО (D39.90):** строка 74 объявляла 44 «закрытой этим замером» — это верно только для ПОЛОВИНЫ «поднять флор» (фальсифицирована). Живой остаток — обратный: **опустить/пере-калибровать число по числам пробы `bank-low`**, где стена на `low` не исчезла, а разредилась (упавший батч: `content=""`, `finish=length`, `completion=7999`, `reasoning=7999` — тот же тяжёлый хвост, 1/5 вместо 4/5, и это стохастика вызова: батч не самый большой по входу). ⚠ **Флор при `low` НЕ варьировался ни разу** — упавший батч умер ровно на потолке 8000, так что «сколько ставить» остаётся незамеренным вопросом, а не выводом | бэкенд | когда-нибудь (триггер «приёмка 104» НАСТУПИЛ — D39.91, ручка заленжена; «сколько ставить» остаётся НЕзамеренным — нужен вариационный замер флора при `low`) | отдельное решение | D39.37(10), D39.86, **D39.90** | | 45 | `max_tokens`-упоры (две единицы) — вернутся на en-книге ; halve-chunk-on-retry (research/22 §2 №7) ОТКЛОНЁН D39.74 — вернуться сюда же при живых упорах | бэкенд | когда-нибудь | отдельное решение (с en) | D39.37(11) | | 46 | **Экран целевого языка на выходе НЕ-ПОСЛЕДНЕЙ стадии — ЖИВОЙ НОСИТЕЛЬ ПОЛУЧЕН, класс поднят (D39.86).** Было: 38/40 дефектов латиницы живут в черновиках вне охвата гейтов (`waverun.go:486`). Стало: на ре-пробе 74 при `effort:low` **1 черновик из 18 пришёл ПОЛНЫМ связным переводом НА АНГЛИЙСКИЙ** и прошёл как `disposition=ok` — `classify` экранирует ИСХОДНУЮ письменность, пустоту, обрыв и отказ, а «не исходный и не целевой» не ловит ни один предикат (частично ловится лишь третий язык, ДЕЛЯЩИЙ письменность с источником, и ловится под ЛОЖНОЙ причиной `cjk_artifact`). ⚠ Последний рубеж УСЛОВЕН тройкой `isFinal && Gates.Sanitizer.Enabled && checkers.TargetActive()` (`chunkrun.go:52`), и **дыра на оси ЦЕЛИ двусторонняя**: (i) без данных цели слой 7 инертен ПО ОТСУТСТВИЮ (осознанный дизайн, `disposition.go:302-305`) ⇒ для не-русской цели рубежа нет вовсе; (ii) а с данными будущей ЛАТИНОПИСЬМЕННОЙ цели `detectLatinInsertion` (`checks/sanitizer.go:228`) сработает на ЧИСТОЙ целевой прозе и дропнет 100% чанков — внутри санитайзера он НЕ обусловлен `TargetScriptNonLatin()`, хотя доккоммент это объявляет (реальный гард только на репэйре — `quality.go:215`, `repair.go:208`), а частичный файл цели невозможен (`CompileCheckers` паникует). ⇒ **ревью-вопрос «заработает ли пара, которой в репо нет, без правки Go?» для →en/→de отвечается НЕТ**; кандидат фикса — тот же шов, что уже применён к репэйру. *(Контрпример «pipeline-c2.yaml — легальная сборка без санитайзера» проверен и СНЯТ: c2 неисполняем `CheckRunnable`, его санитайзер забукован строкой 33.)* Даже при включённом санитайзере худший исход — не потеря юнита, а ТИХО ОТГРУЖЕННЫЙ релейный перевод zh→en→ru, если билингв-редактор отрендерит русский с английского черновика. Область фикса — «выход любой НЕ-последней стадии», не «черновик» (`isFinal` позиционный, `stagerun.go:145`). ⚠ **ДИЗАЙН ПОДАН, КОДА НЕТ — СТОИТ НА РЕШЕНИИ ВЛАДЕЛЬЦА (D39.90).** Три поправки сессии к посылке, все замером: **(1) боевой гейт уже ловит 18 из 20** off-target событий (`sourceScriptShare > 0.15`, `disposition.go:224,275`; 0 ложных на 1055 здоровых, запас 13×) ⇒ остаточная дыра **2 чанка из ~1100 = 0.18%**, оба английские, японский ловится долей ханьцзы; **(2) второй рубеж существует, но стоит не там** — санитайзер поймал бы те самые байты («Latin insertion»), но `chunkrun.go:52` требует `isFinal`, а в двухстадийной топологии черновик НИКОГДА не финальный; тот же `isFinal` глушит на черновике латинный линт, флаггер голоса и глоссарный пост-чек; **(3)** здоровый минимум на тексте, который РЕАЛЬНО видит гейт (после среза банкноты), = 0.9767 при n=1055. **Развилка владельцу:** (а) предикат внутри `classify()` + бамп `classifierVersion` — двигает снапшот у всех книг, голден пере-захват один раз, на свежем стенде $0; (б) отдельный опциональный гейт вне `classify()` — снапшот не двигает, но это второй способ сказать «ответ непригоден», и он выключен по умолчанию; (в) языковой детектор. **Выбор сессии — (а).** Носитель данных — `lang.LangScripts(Book.TargetLang)`, НОВЫЙ go:embed-файл не заводить (`EmbeddedVersion` фолдится безусловно = перекупка всех книг всех пар); порог 0.50 не калиброван, а поставлен в середину пустого интервала. Три мины наивной реализации названы: новый флаг провалился бы мимо `escalatable()`/`retryable()` (⇒ переиспользовать `FlagCJKArtifact`), классификатор ложно флагался бы 16/16, экран слеп к ПОДМНОЖЕСТВАМ письменности (чисто китайский выход для →ja наберёт 1.000). Вторая половина дыры (`detectLatinInsertion` без `TargetScriptNonLatin()`) — чинить тем же диффом, для ru вердикты не двигаются. **Константы и хвосты дизайна, без которых подпись неполна:** порог **abstain 200 букв** (ниже экран воздерживается; самое короткое off-target событие 346 букв, ниже 200 падают лишь 5 из 1055 здоровых, все со счётом 1.0000) · ⚠ **опубликованная база «~1.5% off-target» НЕВЕРНА по знаменателю** — он пулит черновики с редакторскими выходами, а редактор такой отказ произвести не может; на ЧЕРНОВОЙ вызов база **3.02%**, то есть вдвое хуже · ⚠ **не проверено, что делает РЕДАКТОР с английским черновиком** — вытащит обратно в русский или отредактирует как английский; именно этот неизвестный решает, чем является остаточные 0.18%: потерей юнита или тихо отгруженным релейным zh→en→ru · английских черновика найдено ДВА (`fb51e135a395`, `4080ee8287af`), плюс японский в exp15 · **`cultivation` чинить в СИДЕ, а не порогом:** 86 из 1055 здоровых несут голое английское `cultivation` внутри беглого русского, и все 32 абзаца ниже 0.90 содержат именно его, ни один — ханьцзы; правка пар-данных двигает `LangpackVersion` с `omitempty` ⇒ перекупка ограничена книгами ЭТОЙ пары (чинить на плане, где перекупка уже) · Hunspell и GlotScript-эмбед — **не строить** · база замера = строка **113** | владелец → бэкенд | **скоро (ждёт выбора (а)/(б)/(в))** | решение владельца → правка Go | D39.39(д), D39.86, **D39.90** | | 47 | M2-кэш / доктрина Д2 — кандидат на отдельную ратификацию | оркестратор/бэкенд | когда-нибудь | отдельное решение | D39.42 | @@ -110,16 +110,22 @@ | 101 | **Машиночитаемая таблица подписи банка**: кап 20 — только stdout (`render.go:98`), полная таблица — текстовый сайдкар `.bank-stop.txt`, JSON/структурного выхода нет (mined-signature.yaml — сид-дельта без freq/spread/evidence); нужна фронту S5; помнить ловушку «подпись ≠ UPDATE» (банк пересобирается: `seeding.go:18/110`, `glossary.go:158-162` — контракт подписи пишет в файлы-источники) | бэкенд | к подключению фронта | малое касание (форма — с контрактом 95) | релей фронта 02.08, D39.84 | | 102 | **Приём внешнего trace-контекста в tmctl**: TraceID минтится заново каждым вызовом (`main.go:67-70`; внутри вызова трасса цельная, `request_log.trace_id` есть) — прогон, запущенный платформой, должен быть одной трассой | бэкенд | когда-нибудь (Ф3, с 96) | малое касание | релей фронта 02.08, D39.84 | | 103 | **NDJSON-эмиттер прогонных событий со стабильным словарём** (машинный канал живого статуса для платформы, `research/23` §2): NDJSON-логи уже есть (`LOG_FORMAT=json`, авто-оси trace/book/chapter/stage/role — `obs/logging.go:15-54`), но сообщения прозой, version-хендшейка нет, а **событие потолка отсутствует вовсе** (деньги только в тексте ошибки `stagerun.go:472-494`); нужен словарь-enum + version-хендшейк первой строкой (образец terraform -json: минор = ignore-unknown, мажор = reject) + событие потолка; все границы — единичные call-sites в pipeline рядом с готовыми slog; человеческие логи уже на stderr — stdout-дисциплина соблюдена | бэкенд | к подключению фронта (словарь — вместе с контрактом 95) | малое касание | research/23, D39.85 | -| 104 | **У СИНТЕТИЧЕСКИХ стадий нет ручек `reasoning`/`temperature` — бэнк-роли и repair всегда едут вендор-дефолтом (Д2 coldrun-b, D39.86).** Проводной шов ОДИН — `terminologist.go:515` (`config.Stage{Name, Role, Model}`, поля `Reasoning`/`Temperature` пусты; из `:568` до провайдера читается только `st.Name`), он ОБЩИЙ для обеих бэнк-ролей (render `:289` и classify `:396`); третье такое же место — `repair.go:384`, и его доккоммент `:377-378` декларирует ровно ту посылку, которую замер фальсифицировал («no reasoning setting, so the provider default holds — thinking stays ON»). У `config.TerminologyGate` ключа нет вовсе. **Живая цена:** на весах 0731 терминолог 4/5 батчей `length` с `completion=8000` ровно и пустым телом, банк консолидировал 1 терм из 81 (было 21/21 `stop` до смены весов) ⇒ **при выборе (б) по строке 74 это ОБЯЗАТЕЛЬНАЯ правка, иначе банк не собирается**. Дизайн обязан: (i) быть мультиязычным ран-скоупным ключом (не пар-данные), (ii) накрыть ВСЕ ТРИ шва, (iii) решить `temperature` осознанно тем же диффом, (iv) держать один режим и для `control=extra_body_disable` (на glm пустой эффорт даёт thinking:disabled — не дефолт, а ВЫКЛЮЧЕНО, то есть зона эха), (v) ⚠ ловушка хеш-оси: `bankCheckpointExists` строит Request БЕЗ Temperature/Reasoning (`terminologist.go:498-501`), а `runAttempt` — с ними (`stagerun.go:403-406`, `Reasoning` входит в `RequestHash`, `render.go:308`) — сегодня оси совпадают лишь потому, что оба значения нулевые; «минимальная» правка только `:515` разведёт пробу чекпойнта и вызов ⇒ ложный `paid=false` и обрыв прохода по потолку до первого вызова. ✅ **ИСПОЛНЕНА СЕССИЕЙ 02.08, НЕ ПРИНЯТА И НЕ ЗАЛЕНДЕНА (D39.90):** построено не три патча, а **ДВА ШВА** — `config.InternalCall{…}.Stage()` (новый `internal/config/internal_call.go`) и `Runner.attemptRequest` (`stagerun.go:406`); рукописных `config.Stage{}` в движке не осталось ни одного (все 4 места + live-риг), все 4 сборки `RequestHash(Request{…})` схлопнулись в одну; ловушка хеш-оси закрыта в обе стороны на обоих путях. Перекупки НЕТ (`gates.terminology` не фолдится в снапшот; кортеж воспроизведён побайтно — бэнк-пробник `8e4495006b978ed4` в обе стороны; голден PASS без пере-захвата). Гранулярность решена ЗАМЕРОМ: одна ручка `gates.terminology.reasoning` на обе роли (парная выборка N=5: `low` 4/5 против `high` 5/5 — неразличимо при цене `high` ×2.30), вторая ручка `classify_reasoning` построена на n=1 и СНЯТА самой сессией. `Temperature` зафиксирована нулём осознанно. ⚠ Гарды шва — самописный AST-обход (`synthetic_stage_seam_test.go`), первая байтовая версия пробивалась 7 способами; форма гарда вынесена в решение владельца → **строка 107**. ⚠ **Что приёмка обязана пере-проверить отдельно, потому что это ДЕВИАЦИИ и оговорки, а не заслуги:** (i) **наследование эффорта у repair СНЯТО** — вопреки букве промта и D39.87 ключ сделан своим (`gates.repair.reasoning`); девиация может быть верной, но она не ратифицирована; (ii) починен `ThinksOnWire` на `control=extra_body_disable` — предикат врал «думает» при ПУСТОМ эффорте, то есть бэнк-роль на glm молча уезжала в thinking-off (зона эхо-мины, жёсткий гардрейл); область правки — **ровно случай «ключ отсутствует»**, явный `off` предупреждался и до, и после (в `arm-glm:43` он стоит осознанно — «таймауты ×3»), это оставлено специально, **чтобы приёмка не искала регресса в армах**; (iii) вывод «одна ручка достаточна» опирается на N=5, где **2 из 6 термов (元石/灵泉) стоят дословно в `prompts/zh-ru/classifier.md`** ⇒ это припоминание, а не суждение, и падение `low` было ровно по дискриминирующему подмножеству (1/4 против 4/4) — единственный датум ПРОТИВ одной ручки; (iv) **качество прозы не судил никто ни в одной пробе** — `low` подтверждён только по детерминированным осям | бэкенд | **на приёмке преемника** | приёмка (батарея + деньги двумя путями + адверсариал) → лендинг | D39.86, COLDRUN_B_DEBUG §3.6/Д2, **D39.90** | | 105 | **Роль `classifier` мис-вердиктится как эхо + честность двух новых строк наблюдаемости (D39.86).** (а) `classifyOutput` даёт поблажку `SourceEchoExpected` только `roleTerminologist` (`chunkrun.go:37`), а ответ классификатора по формату состоит из исходных ханьских термов ⇒ доля исходного письма 0.20–0.29 > порога 0.15 на каждом батче: живой артефакт пробы 6/6 несёт `verdict=cjk_artifact` при `bad_lines=0`. Ущерб узкий — `runBankRoleBatches` кладёт `run.texts[i] = att.text` без проверки диспозиции (`terminologist.go:603`), посчитанные эхо-ставки (`quality.go:313-321`) берутся из `chunk_status`, куда бэнк-путь не пишет ⇒ портятся только строки `tmctl report`/лога; **латентно** (`classify_types` выключен во всех шиппинг-конфигах). ⚠ Цена дисциплинированного фикса, которую надо знать заранее: бамп `classifierVersion` (литерал, сам не двигается) меняет payload снапшота → snapshot id → `RequestHash` ⇒ промах ВСЕХ чекпойнтов книги, то есть `--resnapshot` + пере-покупка. (б) тем же касанием — честность поверхностей: строка `VOICE` берёт `rules=` из конфига ВРЕМЕНИ ОТЧЁТА (`quality.go:436`), поэтому включение `gates.voice` после прогона печатает «измерено, чисто» для неизмеренной книги (воспроизведено); и она печатается при выключенном гейте, если `SpoilerLeaks>0` (дизъюнкция — поведение верное, формулировка отчёта/коммента неверна); знаменатель `BANKNOTE` = `len(states)` включая призрачные строки `retrieval_state`, тогда как соседний агрегатор их фильтрует (`quality.go:259-260`) ⇒ после пере-чанковки покрытие занижается | бэкенд | когда-нибудь (ближайшее касание банка/наблюдаемости; (б) — дешёвая часть, вердиктов не двигает) | малое касание + вердикт-двигающая половина (а) через СТОП-решение | D39.86 | | 106 | **Слой 3 НЕ достроен: контракт редактора = full-regen, а целевой — узкие мандаты + ДИФФЫ.** `09-target-architecture.md:121-126` дословно: «research/07 предписывает узкие мандаты + диффы, а не полную перегенерацию — сейчас ровно наоборот (4 мандата, full-regen), что и породило хвост инверсий»; целевой контракт — редактор правит anchored search/replace-спанами с детерминированным Go-apply (ограниченный blast-radius, дешевле, аудируемо, структурно omission-safe). Пак-16 построил петлю РЕМОНТА (починка флагнутого спана постфактум), а не diff-контракт роли ⇒ это разные вещи. **Строки не было ни одной** — дыра учёта, найденная сверкой 02.08 (грепы `diff`/`мандат`/`span` по бэклогу = 0). Смежное: арм Q4b «diff-fidelity+style редактор» (`exp15:108`) не прогонялся НИ РАЗУ, хотя трек B объявлен завершённым | владелец → бэкенд | когда-нибудь (смена контракта ролей = решение владельца) | ресёрч-арм → дизайн → крупная стройка | 09 §Слой 3, D39.90 | -| 107 | **Конвенции Go-репозитория: самописные AST-гарды → `x/tools/go/analysis`, линтер и CI (вопрос владельца 02.08).** Предмет: `backend/internal/pipeline/synthetic_stage_seam_test.go` (395 строк) — архитектурный гард, запрещающий рукописные `config.Stage{}` мимо шва; ходит по ДЕРЕВУ через `go/parser` из обычного `_test.go` пакета `pipeline`, резолвит пакет по ПУТИ импорта (не по имени), несёт пол на число разобранных файлов. Механика правильная по НАМЕРЕНИЮ и уже поймала 7 обходов (байтовая версия пробивалась 5 способами, AST-версия — ещё 2: алиас импорта и `[]config.Stage{{…}}`), и слабое место одно: **нет типовой информации** (`go/packages`+`types.Info` вместо резолва по путям импорта), плюс каждый следующий инвариант породит ещё один такой обход. ⚠ **ТЕСТОВЫЙ ДОМ — СЛЕДСТВИЕ ЗАМЕРА, А НЕ НЕБРЕЖНОСТИ (отчёт §5.5, проверено запуском; моя формулировка «дом неверный» СНЯТА как над-клейм):** форма «архитектурное правило обычным тестом» — стандарт stdlib (`go/build/deps_test.go` держит так граф зависимостей, `go/types/errorcalls_test.go` — `ast.Inspect` по своим исходникам; аналог в Java — ArchUnit), а альтернатива **не проходит наше ограничение «падать на обычной батарее»**: `go test -vet=<свой анализатор>` → «-vet argument must be a supported analyzer», `GOFLAGS=-vettool` при `go test` игнорируется. Цена перехода на `x/tools/go/analysis` названа: он тянет `x/net` 0.26.0 → 0.54.0, **а `x/net/http2` — наш транспорт к провайдерам**. `golangci-lint` = 38.7 МБ бинарь и первый в проекте `.golangci.yml`; `exhaustruct` (инструмент ровно под исходный класс бага) даёт 16 находок, 15 из них в тестах. Настоящая развилка: принять ли бамп `x/net` ради типовой информации · заводить ли CI · остаётся ли гард тестом. Индустриальная форма — analyzer на `golang.org/x/tools/go/analysis` (+`multichecker`, запуск `go vet -vettool=` и в CI), где алиас/дот-импорт закрываются ПО ПОСТРОЕНИЮ. Отдельная половина вопроса: **в репозитории нет ни `.golangci.yml`, ни `Makefile`, ни CI-воркфлоу** (проверено) — батарея гоняется руками каждой сессией. ⚠ Владелец прав в опасении: включение стандартного набора на ~200 файлах даст большой хвост находок ⇒ **первый шаг работы — $0-ЗАМЕР** (прогнать набор в report-only и посчитать находки по правилам), и только потом решать состав + режим внедрения (baseline «только новый код» против big-bang) | владелец → бэкенд | скоро (решение владельца; блокирует форму будущих гардов) | $0-замер объёма → решение состава → пак | D39.90, отчёт EFFORT_HANDLE §1.3 | +| 107 | **Конвенции Go-репозитория: самописные AST-гарды → `x/tools/go/analysis`, линтер и CI (вопрос владельца 02.08).** Предмет: `backend/internal/pipeline/synthetic_stage_seam_test.go` (395 строк) — архитектурный гард, запрещающий рукописные `config.Stage{}` мимо шва; ходит по ДЕРЕВУ через `go/parser` из обычного `_test.go` пакета `pipeline`, резолвит пакет по ПУТИ импорта (не по имени), несёт пол на число разобранных файлов. Механика правильная по НАМЕРЕНИЮ и уже поймала 7 обходов (байтовая версия пробивалась 5 способами, AST-версия — ещё 2: алиас импорта и `[]config.Stage{{…}}`), и слабое место одно: **нет типовой информации** (`go/packages`+`types.Info` вместо резолва по путям импорта), плюс каждый следующий инвариант породит ещё один такой обход. ⚠ **ТЕСТОВЫЙ ДОМ — СЛЕДСТВИЕ ЗАМЕРА, А НЕ НЕБРЕЖНОСТИ (отчёт §5.5, проверено запуском; моя формулировка «дом неверный» СНЯТА как над-клейм):** форма «архитектурное правило обычным тестом» — стандарт stdlib (`go/build/deps_test.go` держит так граф зависимостей, `go/types/errorcalls_test.go` — `ast.Inspect` по своим исходникам; аналог в Java — ArchUnit), а альтернатива **не проходит наше ограничение «падать на обычной батарее»**: `go test -vet=<свой анализатор>` → «-vet argument must be a supported analyzer», `GOFLAGS=-vettool` при `go test` игнорируется. Цена перехода на `x/tools/go/analysis` названа: он тянет `x/net` 0.26.0 → 0.54.0, **а `x/net/http2` — наш транспорт к провайдерам**. `golangci-lint` = 38.7 МБ бинарь и первый в проекте `.golangci.yml`; `exhaustruct` (инструмент ровно под исходный класс бага) даёт 16 находок, 15 из них в тестах. Настоящая развилка: принять ли бамп `x/net` ради типовой информации · заводить ли CI · остаётся ли гард тестом. Индустриальная форма — analyzer на `golang.org/x/tools/go/analysis` (+`multichecker`, запуск `go vet -vettool=` и в CI), где алиас/дот-импорт закрываются ПО ПОСТРОЕНИЮ. Отдельная половина вопроса: **в репозитории нет ни `.golangci.yml`, ни `Makefile`, ни CI-воркфлоу** (проверено) — батарея гоняется руками каждой сессией. ⚠ Владелец прав в опасении: включение стандартного набора на ~200 файлах даст большой хвост находок ⇒ **первый шаг работы — $0-ЗАМЕР** (прогнать набор в report-only и посчитать находки по правилам), и только потом решать состав + режим внедрения (baseline «только новый код» против big-bang) · **+Д7 (приёмка D39.91):** давний БАЙТОВЫЙ гард `TestProviderEgressSeamIsSingle` (свой корень обхода, свой словарь исключений) свести с AST-обходом в ОДИН тем же решением формы | владелец → бэкенд | скоро (решение владельца; блокирует форму будущих гардов) | $0-замер объёма → решение состава → пак | D39.90, отчёт EFFORT_HANDLE §1.3 | | 112 | ⚠ **ПЯТЬ ШИППИНГ-КОНФИГОВ РЕПО ВСЁ ЕЩЁ НЕСУТ no-op `reasoning: "off"` НА ЧЕРНОВОЙ СТАДИИ — решение владельца (б) до них НЕ доехало (Д10 отчёта, D39.90).** Адреса проверены: `configs/pipeline-c1.yaml:49` · `pipeline-c2.yaml:26,39` · `pipeline-arm-mistral.yaml:30` · `pipeline-arm-glm.yaml:34` · `pipeline-arm-deepseek-pro.yaml:34`. Это ровно тот no-op, который отправил прогон в стену 0/9: на deepseek `off` = «не слать ничего» ⇒ вендор-дефолт `high`. Сессия сознательно их не трогала, потому что **правка двигает снапшот всем, кто этими конфигами пользуется** (перекупка), и вынесла вопрос наверх. ⚠ Не путать со стендом: правился только `coldrun-b/reprobe/bank-low/pipeline.yaml`, боевой `coldrun-b/pipeline.yaml` тоже НЕ тронут. **Решить: применять ли (б) к шиппинг-конфигам, каким именно, и когда платить перекупку** (на свежей книге — $0). ⚠ В `arm-glm:43` и `arm-deepseek-pro:43`/`c1:77` `off` стоит на РЕДАКТОРЕ осознанно — это другой случай, не трогать без отдельного разбора | владелец → бэкенд | скоро (иначе ратифицированное решение не действует в проде) | решение владельца → правка данных | D39.87, D39.90, EFFORT_HANDLE Д10 | | 113 | **Запас боевого гейта не зафиксирован тестом, а харнесс, давший число, УДАЛЁН (Д-хвост D39.90).** Числа «18 из 20 · 0 ложных на 1055 · запас 13× (0.0117 против 0.15)» и «санитайзер поймал бы английский черновик» получены ВРЕМЕННЫМ тестом в пакете pipeline (`splitBanknote`+`StripThink`+`sourceScriptShare`), который сессия удалила после снятия. Число ушло в контракт (строка 46), воспроизвести его нечем. **Делать:** корпус-фикстура в репо (~20 off-target + ~40 здоровых, с движковой предобработкой; снапшот НЕ двигает) + регресс-тест на реальный запас — это база, которую обязано побить любое предложение по 46. СТОП, если фикстура не воспроизводит 18/20 при 0 FP, или если запас меньше 3× | бэкенд | скоро (перед любой правкой по строке 46) | $0 фикстура + регресс-тест | D39.90, EFFORT_HANDLE §5.4 шаги 1–2, §7 | -| 108 | **Реестр ЗАГЕЙЧЕННЫХ ТРИГГЕРОВ + норма закрытия «по нужности».** ⚠ Первый жилец реестра, найденный тем же лендингом: **сиблинг-угроза экрана целевого языка** — выход на языке, БЛИЗКОМ к целевому (украинский/болгарский для ru): ни одного события не наблюдалось, но если появится, дискриминатор — плотность РУССКО-ЭКСКЛЮЗИВНЫХ букв (ы/э/ё) НИЖЕ ожидания, а НЕ замыкание алфавита (`EFFORT_HANDLE §5.4` шаг 8). Шесть остальных реопенов живут только в телах D-нот и не имеют места, где их поднимут: **МАСШТАБ** (uniformity-пасс D12 · эмбеддинг A7/D2 «реопен = измеренный recall-разрыв, только batch-time лейн» · STITCH «бюджет ИЛИ измеренный эффект размера инъекции» · канон-пин серий) · **вторая пара живьём** (C-триггер softsign-decl · автономная Decl-эмиссия) · **вторая книга того же жанра** (жанровый shared-слой) · **первая traditional-книга** (probe-литералы 时辰/千万/数十万 цельным дата-батчем) · **появление Go-кода платформы** (`go.work` — ⚠ `platform/go.mod` УЖЕ заведён, триггер наступил) · **перед стройкой fix-8** (ёлочный экстрактор атрибуции + корпус-замер). Норма D39.66 «каждое отложено обязано ТЕМ ЖЕ лендингом получить строку или явное закрытие» нарушена ≥6 раз ПОСЛЕ собственной ратификации, и класс потерь узкий — теряются именно ЗАГЕЙЧЕННЫЕ РЕОПЕНЫ. Лечение: короткий реестр триггер→что вернётся→источник, сверяемый на каждом переходе горизонта (горизонт расписан до Ф3, точки сверки известны заранее) | оркестратор | скоро ($0, гигиена трекера) | завести реестр + сверку в норму лендинга | D39.66, D39.90 | +| 114 | **Конфиго-слой ручки эффорта: два дешёвых хвоста приёмки (вне снапшота, $0 прогонов).** (а) **Д4 отчёта:** `gates.terminology.target_script` НЕ сверяется с `book.target_lang` — `target_lang: ru` + `target_script: Latin` грузится чисто и **ИНВЕРТИРУЕТ** банковский экран (ловит целевой, пропускает чужой); сверка при загрузке против `lang.LangScripts(TargetLang)` — тот же дата-план, что у экрана строки 46, громкий отказ на несовпадении. (б) **Находка-2 приёмки:** стейл-доккоммент `capability.go:78` — у константы `ReasoningExtraBodyDisable` до сих пор «effort "" leaves the provider default», противореча проводу (`applyToBody` мержит disable на `""`, комментарий в теле arm это прямо объясняет) и починенному `ThinksOnWire`; однострочник тем же касанием | бэкенд | скоро (мелкий пак или попутно со строкой 46) | правка Go, снапшот не двигает | D39.91, EFFORT_HANDLE Д4 | +| 115 | **`//go:embed` целевых данных — ЯВНЫЙ список файлов: новая ЦЕЛЬ требует правки Go (Д6 отчёта).** `internal/lang/embedded.go:22` перечисляет файлы поимённо, `CompileCheckers` паникует при неполном файле цели ⇒ на канон-вопрос «заработает ли пара, которой в репо НЕТ, без правки Go» ответ сегодня **НЕТ** — дыра в ратифицированной «ФАЗЕ 2 ОБЩНОСТИ ✅» (D39.64), и она не про язык, а про строку эмбеда. Решить форму: `embed data/*` (и как манифест фолдится в `EmbeddedVersion`, чтобы НЕ перекупать чужие пары) против явного списка как осознанного гейта полноты данных цели | оркестратор → бэкенд | когда-нибудь (триггер: первая новая целевая пара; учтён в реестре 108) | отдельное решение | D39.91, EFFORT_HANDLE Д6, D39.64 | +| 116 | **Порог классификатора «6/6» ратифицирован для ОДНОГО вызова, не для выборки — и на рекомендованном `low` риг N=5 КРАСНЫЙ: 4/5 (Д8 отчёта).** Контракт обязан стать выборочным («≥4/5 при N=5» или иная форма — решение) ДО применения (б) к любому конфигу, иначе рекомендация `low` противоречит собственному приёмочному числу. Честная граница чисел (D39.86, подтверждена приёмкой по сырью): 2 из 6 термов (元石/灵泉) стоят дословно в промпте классификатора = припоминание; падение `low` — ровно по дискриминирующему подмножеству (1/4 против 4/4); единственный промах — вызов на 91 completion-токене (модель не подумала), уровень ни при чём | владелец → оркестратор | скоро (вместе с решением по строке 112) | пере-ратификация порога, $0 | D39.91, EFFORT_HANDLE Д8, D39.86 | +| 108 | **Реестр ЗАГЕЙЧЕННЫХ ТРИГГЕРОВ + норма закрытия «по нужности».** ⚠ Первый жилец реестра, найденный тем же лендингом: **сиблинг-угроза экрана целевого языка** — выход на языке, БЛИЗКОМ к целевому (украинский/болгарский для ru): ни одного события не наблюдалось, но если появится, дискриминатор — плотность РУССКО-ЭКСКЛЮЗИВНЫХ букв (ы/э/ё) НИЖЕ ожидания, а НЕ замыкание алфавита (`EFFORT_HANDLE §5.4` шаг 8). Шесть остальных реопенов живут только в телах D-нот и не имеют места, где их поднимут: **МАСШТАБ** (uniformity-пасс D12 · эмбеддинг A7/D2 «реопен = измеренный recall-разрыв, только batch-time лейн» · STITCH «бюджет ИЛИ измеренный эффект размера инъекции» · канон-пин серий) · **вторая пара живьём** (C-триггер softsign-decl · автономная Decl-эмиссия) · **вторая книга того же жанра** (жанровый shared-слой) · **первая traditional-книга** (probe-литералы 时辰/千万/数十万 цельным дата-батчем) · **появление Go-кода платформы** (`go.work` — ⚠ `platform/go.mod` УЖЕ заведён, триггер наступил) · **перед стройкой fix-8** (ёлочный экстрактор атрибуции + корпус-замер). **+Два жильца приёмки D39.91:** Д5 — enum эффорта провайдер-слеп (`medium` на DeepSeek не определён, `max`/`xhigh` недостижимы; пер-модельную таблицу решено НЕ строить — механизм без носителя качества/денег, misconfig ограничен бюджетами и назван в доккомменте `ValidReasoningEffort`; триггер: первый живой инцидент кривого поведения уровня на проводе) · Д9 — аддитивные провайдеры отказываются бэнк/repair-гейтам, блок не несёт `reasoning_max_tokens` (fail-closed в лоадере; триггер: первая потребность гейта в аддитивной модели). Норма D39.66 «каждое отложено обязано ТЕМ ЖЕ лендингом получить строку или явное закрытие» нарушена ≥6 раз ПОСЛЕ собственной ратификации, и класс потерь узкий — теряются именно ЗАГЕЙЧЕННЫЕ РЕОПЕНЫ. Лечение: короткий реестр триггер→что вернётся→источник, сверяемый на каждом переходе горизонта (горизонт расписан до Ф3, точки сверки известны заранее) | оркестратор | скоро ($0, гигиена трекера) | завести реестр + сверку в норму лендинга | D39.66, D39.90 | | 109 | **Продуктовые требования БЕЗ строки-носителя (сверка 02.08):** **ПТ-6** структурные традиции целевого языка (короткие zh-абзацы → читаемые ru-структуры) — держится только редакторскими мандатами в пар-промптах, поверхности измерения нет, в составе Ф2-гейтов (52) структуры абзацев нет · **ПТ-7** «слабый оригинал: подправлять художественно или быть верным» — вопрос владельца, не заведён даже в блоке «висит на владельце»; после ответа: режим параметром запуска (данные, не ветка Go) + мандат в промпте + гейт «улучшение vs отсебятина» · **ПТ-22** продуктовый ИНТЕЙК настроек (сегодня = рукописный `book.yaml`; частично покрыт 67 в части «версия исходника») · **ПТ-10** сам механизм веб-фетча (tool-calling, провенанс/кэш добытого, инжект под правилом «книга = недоверенные данные») — есть только гейт безопасности 70. Гигиена реестра тем же касанием: ПТ-24 не проставлена 101, ПТ-1/ПТ-11 не проставлена 105, ПТ-2 не проставлены 46 и 34а | оркестратор/владелец | скоро ($0 — расписать носители) | завести строки/вопросы → диспозиции | D39.90, product-requirements | | 110 | **Детектор повторов лемм / защита авторских рефренов** (`04-unhappy-paths.md:97,130 п.5`): $0-минимум исполнен промптом (editor.md, пакет-чекеров 02.08), механизм явно не строился — «нет размеченного класса; связка с alignment/Bertalign». Строки-носителя не было; предмет живой, потому что отличить дефектный повтор от авторского рефрена без выравнивания нельзя | бэкенд/полигон | когда-нибудь (с корпусом пилота, строка 85) | размеченный класс → решение | 04-unhappy §5, D39.90 | | 111 | **Дубль ключа пар-файла: фикс накрыл половину.** D39.82 закрыл строку 53 через `putUniqueDC` в `parseDCCheckers`, но генерик-парсер категорий `parseCategoryRows` (`internal/lang/langpack.go:806-826`, строка `cats[f[0]][f[1]] = val`) по-прежнему МОЛЧА last-wins — а якорь техдолга указывал именно на него. Пар-данные с опечаткой-дублем тихо теряют первую строку | бэкенд | когда-нибудь (малое касание, с любой правкой langpack) | fail-loud + тест | 13-tech-debt-anchors, D39.82, D39.90 | +## Оркестратор №11 — ПРИЁМКА ПАКА РУЧКИ ЭФФОРТА: ПРИНЯТ И ЗАЛЕНДЕН (D39.91), 02.08 + +Задача №1 хендоффа исполнена целиком, всё исполнением: батарея с фрозен-числами пере-прогнана (5/5 совпали, голден без пере-захвата), деньги пере-выведены вторым путём из сырья (леджер $0.045095 ≡ независимый usage×цены ≡ Σ `request_log`, дельта $0.000000, decode/estimated 0), адверсариал — пять НЕЗАВИСИМЫХ посадок в гарды (алиас-литерал · `[]cfg.Stage{{…}}` · hoisted `Request` · `var` · `new()`) все CAUGHT, N=5 сверен с `classifier-6of6-{low,high}.json` побайтно (low 4/5 $0.001016 · high 5/5 $0.002335 · ×2.298 · промах = 91 ток., 1/4 дискриминирующих). Обе девиации строки 104 РАТИФИЦИРОВАНЫ (repair-ключ свой — подтверждён по пяти шиппинг-конфигам; `ThinksOnWire` — ровно случай «ключ отсутствует», провод не менялся). Две находки приёмки: метка «$0.031639 (flash)» врёт — это flash+pro черновой волны (flash-only $0.021289; суммы верны; скопировано и в D39.90 п.2) · стейл-доккоммент `capability.go:78`. Хеш-клейм «`8e4495006b978ed4` в обе стороны» невоспроизводим (старая форма удалена) — принят по эквивалентности. Код: **`553f1a3`** (13 файлов backend/, pathspec; чужое — фронт живой, `START_PROMT.MD` — не тронуто). Отложки Д4–Д9 → носители тем же лендингом: 114 · 115 · 116 · реестр 108 (+Д5/Д9) · 107 (+Д7); гейт строки 44 наступил — пере-диспозиционирована. Сверка §5.4 отчёта ПУНКТАМИ — потерь сжатия НЕТ (шаг 3 уже исполнен №10 в теле строки 46). Очередь скриптом: 97 строк · «скоро» 15 · блокеров 0. + ## Оркестратор №10 — ЗАКРЫТИЕ СЕССИИ И ПЕРЕДАЧА №11 (D39.90), 02.08 **Задача №1 преемника — приёмка бэкенд-пака 104/46/16** (отчёт закоммичен с баннером «коммит ≠ ратификация», код В ДЕРЕВЕ незакоммичен — не чистить). **Главный технический результат дня:** проба банка на `low` ЗЕЛЁНАЯ — терминолог 4/5 батчей `stop`, consolidated 72, против 1/5 и 1 терма из 81 на вендор-дефолте `high`; весь заход $0.045095 из $0.10, леджер ≡ независимому пересчёту ДО НУЛЯ; провод вскрыт (35 тел, `reasoning_effort:"low"` во всех, ключей `thinking` ноль) ⇒ **гардрейл DeepSeek доказан проводом.** ⚠ `low` стену не убирает, а разрежает (упавший батч: `completion=7999`, `reasoning=7999`). **Строка 46 переоценена в МЕНЬШУЮ сторону замером:** боевой гейт уже ловит 18 из 20, остаточная дыра 0.18%, но второй рубеж (санитайзер) на черновике не стоит вовсе из-за позиционного `isFinal` — и тем же `isFinal` глушатся латинный линт, флаггер голоса и глоссарный пост-чек. Развилка (а)/(б)/(в) — на владельце. **Строка 16 закрыта владельцем как неуспешная на этом этапе**, редакторская волна снова не гонялась ⇒ оси голоса без данных. **Банк-ресёрч запущен и досрочно закрыт владельцем, артефакта в дереве НЕТ** — находки не сохранены; пере-запуск подрезанным скоупом (держать A/B1/B3, свернуть B2, отложить C; потолок $1.20). **Дыры трекера заведены строками 106–111**, снято расхождение 74↔44, уточнён гейт 93; четыре ложных «долга» сняты как закрытые решениями (резолвер слоя 7 · чистый детектор · 36б · полярность). **Владельцу подняты в решение** форма архитектурных гардов и конвенции репо (строка 107): намерение `synthetic_stage_seam_test.go` верное и окупилось (7 пойманных обходов), дом неверный — analyzer на `x/tools/go/analysis` вместо самописного обхода; `.golangci.yml`/`Makefile`/CI в репо нет вовсе, первый шаг — $0-замер объёма находок. @@ -238,6 +244,8 @@ Q1 = П1 цель-шов санкционирован («главное бэке ## Бэкенд +**⟶ Приёмка №11 (D39.91, 02.08): пак ниже ПРИНЯТ, код заленден `553f1a3`; поправки приёмки (метка flash+pro · хеш по эквивалентности · `capability.go:78`) — в ревью-шапке отчёта и D39.91.** + **Ручка эффорта (стр.104) ✅ ЗАКРЫТА · проба банка на `low` ✅ ЗЕЛЁНАЯ · экран целевого языка (стр.46) — ДИЗАЙН ПОДАН, КОДА НЕТ · холодный прогон (стр.16) НЕ НАЧАТ и закрыт владельцем как неуспешный на этом этапе (02.08, бэкенд-сессия по `BACKEND_EFFORT_HANDLE_SESSION_PROMPT`, D39.87; $0.045095 из $0.10; прогон C — $0; НЕ закоммичено).** Отчёт: [archive/reports/EFFORT_HANDLE_2026-08-02.md](archive/reports/EFFORT_HANDLE_2026-08-02.md). **Работа A — не три патча, а ДВА ШВА:** `config.InternalCall{…}.Stage()` (новый `internal/config/internal_call.go`) — единственная деривация стадии для внутренних вызовов движка, и `Runner.attemptRequest` (`stagerun.go:406`) — единственная сборка кортежа идентичности запроса. Рукописных `config.Stage{}` в движке НЕ ОСТАЛОСЬ НИ ОДНОГО (все 4 места + live-риг через шов); все 4 сборки `RequestHash(Request{…})` схлопнулись в одну. Приёмочный вопрос «появится ПЯТАЯ стадия — унаследует или забудут?» отвечен **механикой, не обещанием**: три гарда (единственность обоих швов + рефлексия по полям `Stage`, падающая на НОВОМ поле), каждый проверен исполнением. **Ловушка хеш-оси закрыта в ОБЕ стороны и на ОБОИХ путях** (`bankCheckpointExists`, `repairCheckpointExists`): ложно-false режет резюм бюджетным пред-чеком, ложно-true обходит ролевой суб-бюджет и покупает свежий вызов под одним лишь книжным потолком. **Гранулярность решена ЗАМЕРОМ, а не заранее:** одна ручка `gates.terminology.reasoning` на обе бэнк-роли — парная выборка N=5 через боевой путь дала `low` 4/5 против `high` 5/5 (неразличимо) при цене `high` ×2.30 ⇒ вторая ручка `classify_reasoning` была построена на n=1 и СНЯТА самой сессией, когда выборка её не подтвердила. `Temperature` зафиксирована нулём осознанно (ответ ролей — разбираемая структура, не проза). **Repair получил СВОЙ ключ `gates.repair.reasoning`, наследование от чинимой стадии СНЯТО** (правка против промта и D39.87, с аргументом): `reasoning: "off"` стоит на финальной стадии у ВСЕХ шиппинг-пайплайнов ⇒ наследование двигало хеш и перекупало все оплаченные repair-вызовы; и семантически «off» — значение, чей смысл зависит от control МОДЕЛИ, а `gates.repair.model` независим от стадийного (задокументированный no-op DeepSeek стал бы живым `thinking:{type:disabled}` на glm). **§3.4 (проба банка, свой проект `reprobe/bank-low/`, эталон coldrun-a только на чтение):** терминолог **4/5 батчей `stop`, consolidated=72, unanswered=18, bad_lines=0, off_language=0** (против 1/5 и 1 терма из 81 при вендор-дефолте `high`), классификатор 5/5 `stop`, reclassified=14, черновая волна **20/20 чанков ok**. **Оба молчащих пути ИСКЛЮЧЕНЫ предъявлением, а не словами:** терминолог $0.005750 из $0.05 (11.5%), классификатор $0.004286 из $0.02, книга $0.045095 из $0.10 — и НОЛЬ строк `budget would be exceeded`/`denied by a USD ceiling` в логе. **Провод вскрыт:** 35 тел, ключи `[max_tokens, messages, model, reasoning_effort, stream, temperature]`, `reasoning_effort:"low"` во всех 35, ключей `thinking` **0**, `reasoning_content` непустой везде ⇒ гардрейл доказан проводом. Упавший батч вскрыт сырьём (`content:""`, `reasoning_tokens=7999`) — **`low` стену не убирает, а разрежает** с 4/5 до 1/5, и упавший батч не самый большой по входу ⇒ стохастика вызова (квирки п.6). Деньги двумя путями: леджер $0.045095 ≡ независимый пересчёт $0.045095, дельта $0.000000, строк `decode_error` 0. **Работа B — вердикт-двигающая ⇒ дизайн и пинг ДО кода, решения владельца нет ⇒ кода нет (легитимный исход по букве промта).** Живая улика ДОБЫТА В ЭТОМ ЗАХОДЕ: гл.8/чанк 1 — полный связный черновик НА АНГЛИЙСКОМ, `finish=stop`, `disposition=ok`, хеш `fb51e135a395` стоит в `final_hash`. ⚠ **ДВЕ ПОПРАВКИ К СОБСТВЕННЫМ ЧИСЛАМ СЕССИИ, обе пере-проверены её же кодом:** (i) подавалось «здоровый русский 0.9510, n=1306» — это СЫРОЙ текст чекпойнта, а движок классифицирует ПОСЛЕ среза банкноты (`stagerun.go:632` режет, `:636` классифицирует; срез безусловен, `banknote.go:320`); на тексте, который видит гейт, **минимум 0.9767 при n=1055** (1306 двоил бэкап-копии БД); (ii) **боевой гейт уже ловит 18 из 20 off-target событий при 0 ложных из 1055 и запасе 13×** (худший здоровый source-share 0.0117 против порога 0.15) — этого не мерил никто, включая прошлые сессии. Остаточная дыра — **ровно 2 английских чанка = 0.18% выходов**; японский черновик (`exp15/anchors/oracle_30.db`) ловится по общей с китайским письменности (доля ханьцзы 0.332). Носитель экрана — `lang.LangScripts(Book.TargetLang)`, БЕЗ нового файла в `go:embed` (`EmbeddedVersion` фолдится безусловно ⇒ новый эмбед перекупает все книги всех пар); `gates.terminology.target_script` отвергнут причиной сильнее промтовой — он ДУБЛИРУЕТ то, что данные уже знают. **Работа C НЕ НАЧАТА:** стенд coldrun-b стоит нетронутым, черновик по-прежнему на `reasoning: "off"`; строка 16 не закрыта, строка 13б снова без данных (редакторская волна не гонялась ни разу). **ПОЧИНЕНО с тестами (9):** шов+гарды · обе хеш-пары · **`ThinksOnWire` врал про ПУСТОЙ эффорт на `extra_body_disable`** (возвращал «думает», а `applyToBody` в этом же случае мержит disable ⇒ бэнк-роль на glm уезжала в thinking-off МОЛЧА; предсуществующая дыра, но пак первым на предикат оперся) · `sourceEchoExposure` расширен на внутренние вызовы · fail-open неизвестной роли · дубль `plan.model` · дефолт рига N=1→5. **АДВЕРСАРИАЛЬНОЕ РЕВЬЮ (author≠reviewer) НАШЛО 10 ДЕФЕКТОВ В МОИХ ЖЕ ПРАВКАХ**, из них 1 blocker и 3 major; топ-2 пере-проверены сессией по коду до принятия. Отдельным ресерчем вскрыто, что **первая версия гардов пробивалась 7 способами** (5 байтовых + алиас импорта `cfg "…/internal/config"` + `[]config.Stage{{…}}` с опущенным типом элемента) — причина: сравнивалось ИМЯ пакета вместо ПУТИ импорта; переписано на AST с резолвом пути, разворотом `[]T`/`map[K]T`/`*T`, исключениями полными путями и полом на число разобранных файлов (обход, не распарсивший ничего, выглядел как чистое дерево); все 7 посадок пере-проверены на живом дереве. **НАЙДЕНО и НЕ ПОЧИНЕНО (с носителями):** Д2 `detectLatinInsertion` не обусловлен `TargetScriptNonLatin()` ⇒ первая латинописьменная цель дропнет 100% чанков (одним диффом с работой B) · Д3 `SourceEchoExpected` не покрывает `roleClassifier` ⇒ **16/16 вызовов классификатора логируются `ok=0 degraded=cjk_artifact`** (данные не теряются — `reclassified=14` доказывает, но отравлен ровно тот сигнал, который говорит «провайдер плохеет») · Д4 **`gates.terminology.target_script` не сверяется с `book.target_lang`**: `target_lang: ru` + `target_script: Latin` грузится чисто и ИНВЕРТИРУЕТ банковский экран · Д5 наш enum эффорта провайдер-слеп (`medium` на DeepSeek не определён, `max`/`xhigh` недостижимы) — пер-модельная таблица = новый механизм, сознательный отказ · Д6 **`//go:embed` в `internal/lang/embedded.go:22` — ЯВНЫЙ список файлов**, новая цель требует правки Go, а `CompileCheckers` паникует при неполном файле цели ⇒ на ревью-вопрос «заработает ли пара, которой нет в репо» ответ сегодня НЕТ, и это не про язык, а про строку эмбеда · Д7 два гарда шва разной формы (мой AST против давнего байтового `TestProviderEgressSeamIsSingle`) — свести в один обход · Д8 ратифицированный порог классификатора «6/6» определён для ОДНОГО вызова, не для выборки, и на рекомендованном `low` риг красный (заявлено в тексте падения, не смягчено) · Д9 аддитивные провайдеры отказываются бэнк/repair-гейтам именно потому, что блок не несёт `reasoning_max_tokens` — новая ручка эту дыру НЕ закрывает. **РЕСЕРЧ-ЗАДЕЛ (два холодных исследования со скептиками, §5 отчёта — оставлен, чтобы следующие сессии шли по шагам):** у отказа есть имя и метрика (*off-target translation*, Zhang et al. ACL 2020; *language confusion* LPR/WPR, Marchisio et al. EMNLP 2024), рецепт поля — ровно наш, более умного serving-time метода не упущено; английский — доминирующий аттрактор (подтверждено дважды независимо и нашими 2/20); четыре режима отказа требуют РАЗНЫХ детекторов, гнать всё через один LID — ошибка проектирования. **Обещанной гарантии FPR ≤ 0.1% на этом корпусе НЕ КУПИТЬ:** правило трёх при n_eff=114 позиций даёт ≤2.594% (в 26× слабее), процедура двоит данные, а на сиблингах мощность ≈0.1% (болгарский алфавит — собственное подмножество русского, распределения совпадают) ⇒ ставить руками консервативную константу в широком пустом интервале и версионировать как контракт. **НЕ СТРОИТЬ (проверено запуском, не по README):** ни одну статистическую LID-библиотеку в путь вердикта (`lingua-go` недетерминистична 6/23 на 20k повторов + 126 МиБ эмбеда + 10–12 мс/чанк; `langid-go` даёт P(ru)<0.5 на **22.2%** реальных русских сегментов 20–40 рун и FMA-зависим от GOARCH; `whatlanggo` принимает 4–6 из 9 русских образцов за болгарский; `gocld3`/fastText — CGo, вердикт становится функцией тулчейна ВНЕ снапшот-хеша) · посегментный worst-of (умножает FPR на число сегментов и имеет НОЛЬ положительных примеров) · замыкание алфавита · функционально-словный экран · новый файл в `go:embed`. **План на 8 шагов** с единственным необратимым (бамп `classifierVersion`) последним; ключевой перенос — **`cultivation` чинить в СИДЕ, а не порогом** (86 из 1055 здоровых выходов содержат его; все 32 просевших абзаца содержат, ни один не содержит ханьцзы; правка пар-данных двигает `LangpackVersion`, который фолдится с `omitempty` ⇒ перекупка ограничена книгами ЭТОЙ пары — самый переносимый вывод цепочки: чинить на том плане, где перекупка уже). ⚠ **Качество прозы не судил никто ни в одной пробе.** Батарея после всех правок зелёная (build/vet/`vet -tags live`/`-race -count=1`/gofmt чисты · голден PASS · парити EXACT · labels-фриз 5/5). **СТОП — приёмка оркестратора.** **coldrun-b: фаза A ✅, фаза B ✅ — БЛОКЕР СТРОКИ 74 ВОСПРОИЗВЕДЁН НА БОЕВОЙ ФОРМЕ, фаза C ЗАМОРОЖЕНА развилкой владельца (02.08, бэкенд-сессия по `BACKEND_COLDRUN_DEBUG_SESSION_PROMPT`, D39.83; фаза B $0.114378 из $0.15; НЕ закоммичено).** Отчёт: [archive/reports/COLDRUN_B_DEBUG_2026-08-02.md](archive/reports/COLDRUN_B_DEBUG_2026-08-02.md). **Фаза A:** батарея воспроизведена числами (парити EXACT · labels 5/5 фрозен · голден PASS · `-race -count=1` зелёный); сквозняк = голден-тест; CLI-читаемость проверена read-only на БОЕВОЙ БД coldrun-a (sha256 БД до/после идентичен) — сильнее локальной модели; **2 дыры наблюдаемости починены $0** (счётчики банкноты и голос-флаггера считались, но не имели НИ ОДНОЙ поверхности вывода → строки `BANKNOTE`/`VOICE` в `report` + 5 тестов, включая тесты молчания и различение «не измерено»↔«измерено, чисто»; голден/`CheapGateVersion` не тронуты; новая строка независимо воспроизвела руками добытые числа coldrun-a 182/18-из-20/parse-fail 3). Стенд `coldrun-b` собран (пустой сид, `ceilings` 5.00/5.00, `pipeline.yaml` побайтно = эталону), ключи $0-проверены. **Фаза B (носитель — САМ боевой путь `tmctl translate --verify-bank` на отдельных проектах с потолком, принуждаемым движком; девиация от «расширить live-риг» аргументирована §2 отчёта):** при боевом `max_tokens=8496` (флор 8000 + `bankTokenBudget` 496) **0 из 9 вызовов пригодны** (8 `empty`, 1 `length`); **вариант (а) флор-16000 ФАЛЬСИФИЦИРОВАН** — 4/5 пустых при 16992, сырьё показывает 15–21 тыс. симв. `reasoning_content` (модель переводит главу ВНУТРИ размышления и не доходит до ответа), удвоение потолка добавляет ~2 тыс. симв. думания и не сходится. **Вендор-сверка сделана ДО диагноза:** changelog без записей после 31.07; `guides/thinking_mode` — **«default effort being `high`»** и маппинг flash `low→low` ⇒ запись квирков 04.07 («low/medium→high») УСТАРЕЛА (правка `00-provider-quirks.md` — оркестратору, зона). **Вариант (б) `reasoning_effort:"low"` РАБОТАЕТ и достижим ПРАВКОЙ ОДНОЙ СТРОКИ ран-конфига — амендмент `echoMineViolation` НЕ НУЖЕН** (посылка строки 74 неверна: гейт инспектирует МЕХАНИЗМ `control`, у deepseek `ReasoningNone`, где `low` уходит на провод, а `off`/`""` — no-op; thinking не выключается, вендорский тумблер — другой параметр; проверено исполнением): **18 из 20 чанков отгружено, 20 из 22 свежих вызовов `finish=stop`**, волна ≈$0.0257 против $0.02474 у coldrun-a, латентность 9–44 с. **Цена (б) названа честно:** эхо 3/20 (15% против 10% у coldrun-a; на таких N неразличимо) · **1 черновик из 18 пришёл ЦЕЛИКОМ НА АНГЛИЙСКОМ и прошёл гейт как `ok`** · **терминолог (б) НЕ лечит** — 4/5 батчей `length` с `completion=8000` ровно (на coldrun-a до смены весов было 21/21 `stop`), банк консолидировал 1 терм из 81, корень: бэнк-роли строят `config.Stage` без `Reasoning` (`terminologist.go:515,568`) и у `gates.terminology` ключа нет ⇒ они ВСЕГДА едут вендор-дефолтом `high`, что бы владелец ни выбрал для черновой стадии. **Порог классификатора 6/6 ВЗЯТ** ($0.000390, `finish=stop`; честная оговорка — 元石/灵泉 стоят дословно в `classifier.md`, дискриминирующее подмножество 4/4). **Попутно доказано живыми деньгами:** нарезка · волна на 4 воркерах · classify (поймал 3/3 эха и все `length`/`empty`) · эскалация одним хопом с ре-гейтом · банкнота (129 строк на 14/20 чанков) · майнер+банк (76 кандидатов, 100% dst в кириллице, 0 утечек письма) · банк-пауза exit 3 + сайдкары · **деньги `committed ≡ Σ checkpoints` двумя путями** (независимый пересчёт провайдерского usage по вендор-ценам сошёлся до 6-го знака на optB; расхождение $0.015110 на первой пробе = **строка 78 в живом виде**, 3 билленных 2xx с нечитаемым телом) · потолок физически выстрелил на 98.7% и отказал в хопах · F4-бэкап на каждом платном старте (первый боевой клиент) · graceful SIGINT посреди волны · **$0-резюм** (20 юнитов из `chunk_status` + 5 чекпойнтов, 0 вызовов, леджер байт-в-байт). **Найдено и НЕ починено (вердикт-двигающее → СТОП+пинг):** Д1 гейт черновой стадии не ловит выход на ТРЕТЬЕМ языке (последний рубеж есть — санитайзер даёт `Latin insertion`, но стоит только на ФИНАЛЬНОЙ стадии ⇒ не тихая порча, а потеря юнита + оплаченный впустую редактор; живой носитель к строке 46) · Д2 у бэнк-ролей нет ручки reasoning (шов назван, форма предложена, строить — после выбора владельца) · Д4 роль `classifier` мис-вердиктится как `cjk_artifact` (поблажка `SourceEchoExpected` дана только терминологу; ущерб телеметрийный — текст парсится, но каждый батч светится `ok=0`; латентно, `classify_types` выключен). **Починено:** обе дыры наблюдаемости + **live-риг не собирался с D39.64** (`undefined: cjkShare` после переезда на `sourceScriptShare` ⇒ per-adapter live conformance физически не запускался). **Проба C — thinking ВЫКЛЮЧЕН (по вопросу владельца «а выключить ризонинг нельзя?»; пере-замер клейма `echoes_when_thinking_off` на весах 0731, потому что вся эмпирика по нему снята на несуществующих весах Preview; пробная копия models.yaml ВНЕ git, боевой файл и гейт не тронуты):** выключатель в OpenAI-транспорте ЕСТЬ и документирован вендором (`extra_body {"thinking":{"type":"disabled"}}`; `reasoning_effort:"none"` в OpenAI-формате НЕ существует — `none` живёт только в Responses-API-колонке). Результат на тех же 20 чанках: **0 пустых из 22 вызовов · терминолог 5/5 `stop` (единственная конфигурация, где стадия банка жива БЕЗ правки Go) · выход не на целевом языке 0/18 · весь заход $0.014932 — в 2.6× дешевле (б)**; НО **эхо-мина ЖИВА на 0731: 4/20**, гейт поймал 4 из 4, эскалация вылечила 2 по $0.0024, ещё 2 не вылечены только пробным потолком $0.03 (`escalation hop denied by a USD ceiling` — деградация, не падение). ⚠ Качество прозы не судилось НИ В ОДНОЙ из трёх проб — канон D19.1/D21.9 стоит не только на эхе, поэтому C = ИЗМЕРЕННАЯ опция, не рекомендация: её принятие = разворот ратифицированного гардрейла и требует читки качества. **Развилка владельцу:** (а) фальсифицирована · (б) работает, но требует Д2 (правка Go) и делает Д1 условием безопасности · (в) вендор молчит · **(г) сменить модель черновика на `deepseek-v4-pro`** (вендором не тронут обновлением 0731; один хоп на боевом рендере отработал `stop` за $0.008706) — **0 правок Go и гейта, ценой ~×3.1 COGS черновика; не замерен волной, замер ~$0.03**. Ручка #77 не включалась. Батарея после всех правок зелёная. **СТОП — решение владельца по строке 74, затем приёмка оркестратора.** — **ЛЕНД D39.86** (приёмка оркестратора №10: батарея и все несущие счётчики пере-выведены независимо, деньги — из сырья двумя путями [$0.114378 леджер ≡ Σ чекпойнтов во всех 4 проектах · $0.099267 независимый пересчёт · $0.015111 неизвестности]; 9-осевой refute-воркфлоу со скептиком и арбитром на каждую ось — 6 CONFIRMED / 2 PARTIALLY / 0 REFUTED. Поправки в ревю-шапке отчёта: §3.3 верно только для СТАДИЙНОЙ ручки [для бэнк-ролей посылка об амендменте жива ⇒ (б) = правка Go] · §3.1 «нет пути вообще» слишком сильно, НО «бюджет не лечит» усилено [победивший вызов уложился НИЖЕ базового потолка ⇒ лечит стохастика] · волна (б) = $0.028195, не $0.0257 · (г) ≈×8.9, не ×3.1 · Д1 недооценён и дыра цели ДВУСТОРОННЯЯ · Д2 назван на 2/3 [третий шов `repair.go:384`] · строка VOICE говорит «сконфигурирован», не «отработал». Новые вендор-факты: дефолт эффорта `high`, у pro `low→high` и объявленная смена маппинга — в quirks п.3а/п.10. Новые строки 104/105; 46 повышена; 44 сужена; 78 и 13б уточнены; 16 НЕ закрыта). diff --git a/docs/architecture/05-decisions-log.md b/docs/architecture/05-decisions-log.md index 28ecdc04..f4b8c591 100644 --- a/docs/architecture/05-decisions-log.md +++ b/docs/architecture/05-decisions-log.md @@ -1,4 +1,4 @@ -# Журнал решений оркестратора — контракт D1–D39.90 (развязки 04.07 · пакеты 09–10.07 · приёмка/качество-первым/пивот/эмпирика 11–12.07 · арх-ресет+стройка пере-прогонного стека 13–19.07) +# Журнал решений оркестратора — контракт D1–D39.91 (развязки 04.07 · пакеты 09–10.07 · приёмка/качество-первым/пивот/эмпирика 11–12.07 · арх-ресет+стройка пере-прогонного стека 13–19.07) > **⟶ КАРТА АКТУАЛЬНОСТИ (ревизия D31, продлена до D38.2 [12.07]; исторические записи ниже НЕ переписываются — дисциплина D23.3).** Читая контракт целиком, держи под рукой, что чем перекрыто: > ⚠ **Навигация (актуализация 01.08):** карта ниже детально покрывает D1–D39.28; решения D39.29+ живут хронологически в теле файла, **свежая голова — С ХВОСТА** (новые ноты аппендятся вниз). Сводка текущей головы и очередь — CURRENT-STATE в `../PROGRESS.md`. @@ -1332,3 +1332,23 @@ API-529-долг закрыт: 8-осевой refute-by-default воркфлоу - **Дописано в строку 46:** порог abstain 200 букв · база off-target на ЧЕРНОВОЙ вызов **3.02%**, а не опубликованные ~1.5% (знаменатель пулил редакторские выходы — третья самопоправка сессии) · **не проверено, что редактор делает с английским черновиком** — от этого зависит, чем являются остаточные 0.18%: потерей юнита или тихо отгруженным релейным zh→en→ru · `cultivation` (86 из 1055 здоровых) чинить в СИДЕ, а не порогом · Hunspell/GlotScript-эмбед не строить. - **Строка 108 получила первого жильца:** сиблинг-угроза (выход на языке, близком к целевому) с дискриминатором «плотность ы/э/ё НИЖЕ ожидания, а не замыкание алфавита». **Строка 36б приведена в соответствие** собственному снятию (зона → полигон-замер через строку 5; прежняя форма «отдельный дизайн (Р4)» завышала счёт бэкенд-очереди). - **Норма, нарушенная этим же лендингом и потому названная вслух:** сжимая отчёт, я сохранил всё, у чего есть число, и потерял часть того, у чего числа нет. Для отчётов с секцией «пошаговый план следующей сессии» правило сверки — идти по ней ПУНКТАМИ, а не по сводке. + +## D39.91 — ПРИЁМКА бэкенд-пака строк 104/46/16 (оркестратор №11): пак ПРИНЯТ и заленден `553f1a3`, обе девиации РАТИФИЦИРОВАНЫ, две находки приёмки, все отложки Д4–Д9 получили носителей, строка 104 ЗАКРЫТА (02.08). ✅ + +**Мандат — D39.90 п.1 и задача №1 хендоффа. Всё ниже — исполнением, не чтением отчёта.** + +**1. Батарея с фрозен-числами: 5/5 совпали.** `build`/`vet`/`vet -tags live`/`gofmt` чисты, `go test -race -count=1 ./...` — все 14 пакетов ok (pipeline 82.2s). Голден PASS **без пере-захвата** · парити EXACT `n=13618 catastrophe{方源:0 蛊:1 蛊师:2 古月:22} recall@proposed=0.9655 (56/58)` · labels-фриз `k4b 10/1/36/99 · k4_inverse 3/0/1/71 · k2 34/1/6/51 · k4a 0/0/0/348` · K6 `tp=1 fp=6 fn=0 tn=251`. + +**2. Деньги вторым путём: сошлись до нуля тремя маршрутами.** Леджер Σ чекпойнтов $0.045095 ≡ мой независимый пересчёт usage×цены `models.yaml` (flash $0.034745 + pro $0.010350) ≡ Σ `request_log.cost_usd`; `decode_error` 0, `estimated` 0 (расхождения строки 78 не было). Разбивка по ролям сверена с логом: терминолог $0.005750 (5 вызовов, 4 stop/1 length) · классификатор $0.007706 = осн. $0.004286 + риг $0.003420 · черновик flash $0.021289 (23 вызова: 20 stop + 3 length-ретрая) + pro $0.010350 (2 эскалации). **НАХОДКА-1 приёмки:** §2.1 отчёта и D39.90 п.2 маркируют «$0.031639 (flash)» — на деле это **flash+pro черновой волны** ($0.021289+$0.010350); суммы и леджер верны, врёт метка. Поправлено ревью-шапкой отчёта; при цитировании черновая волна flash-only = $0.021289. + +**3. Адверсариал по несущим клеймам — все выдержали.** (а) Рукописных `config.Stage{}` в не-тестовом коде НОЛЬ (grep), единственный `Request{}`-литерал — внутри самого `attemptRequest` (`stagerun.go:407`); все четыре `RequestHash`-сайта едут через шов (`escalation.go:109`, `stagerun.go:420`, `terminologist.go:505`, `repair.go:353`). (б) Перекупки нет: `snapshot.go` паком не тронут (diff пуст), `Gates.Terminology` в снапшоте отсутствует, `repairSnap` нового ключа не фолдит; обратная сторона проверена и признана штатной — СМЕНА `gates.*.reasoning` потом двигает request-hash без resnapshot-гейта, но это тот же контракт, что у смены `gates.*.model` (перекупка ограничена классом вызовов гейта, видима леджером; доккоммент `TerminologyGate` это аргументирует). (в) Гарды: **пять НЕЗАВИСИМЫХ посадок приёмки** (алиас-импорт-литерал · `[]cfg.Stage{{…}}` · hoisted `Request` · `var`-форма · `new()`) — все CAUGHT с позициями, после удаления посадок гарды зелёные; рефлексионный гард полноты верифицирован чтением (XOR карт carried/deliberatelyZero корректен в обе стороны). (г) ⚠ Клейм «`8e4495006b978ed4` в обе стороны» НЕВОСПРОИЗВОДИМ как таковой (старая форма удалена из дерева, хеш не запинен тестом) — принят ПО ЭКВИВАЛЕНТНОСТИ: `RequestHash` длина-префиксует `req.Reasoning`, опущенное поле композитного литерала = `""` побайтно, плюс `TestBankProbeAndAttemptAddressOneCheckpoint` (боевой путь `Reserve`→`SettleWithCheckpoint`, 3 уровня эффорта) и голден без пере-захвата. (д) N=5 сверен с сырьём `classifier-6of6-{low,high}.json`: low 4/5 · $0.001016 · completion 91–1278 · промах run3=91 ток. с 1/4 по дискриминирующему подмножеству; high 5/5 · $0.002335 · 920–3104; цена ×2.298. (е) Провод: 35 тел `reasoning_effort:"low"`, ключей `thinking` 0, бюджетных WARN 0; `terminology finished`: consolidated=72 · unanswered=18 · reclassified=14 · bad_lines=0 · off_language=0. + +**4. Девиации строки 104 — обе РАТИФИЦИРОВАНЫ этой нотой.** (а) **Repair: ключ СВОЙ, наследование снято** (против буквы промта и D39.87) — деньги и семантика подтверждены исполнением: `reasoning: "off"` стоит на финальной стадии всех пяти шиппинг-конфигов (`c1:77` · `c2:51` · `arm-glm:43` · `arm-deepseek-pro:43`, + стенд `coldrun-b:44`) ⇒ наследование двигало хеш всех оплаченных repair-вызовов; и то же слово «off» на другой модели меняет СМЫСЛ (no-op deepseek → живой `thinking:{type:disabled}` на glm). Запинено `TestRepairStageTakesItsEffortFromItsOwnGate`. (б) **`ThinksOnWire`**: область правки ровно случай «ключ отсутствует» на `extra_body_disable` — провод (`applyToBody`: `""`→disable) существовал ДО пака и не менялся, менялся врущий предикат; явный `off` в армах предупреждался и до, и после (Д11); 8 кейсов теста на три control. (в) Вывод «одна ручка» принят с оговоркой Д8 (2/6 термов — припоминание; носитель Д8 — строка 116). (г) Качество прозы не судилось — остаётся на строках 16/13б, в контракт этой приёмки не входит. + +**5. НАХОДКА-2 приёмки: стейл-доккоммент `capability.go:78`.** Комментарий константы `ReasoningExtraBodyDisable` до сих пор говорит «effort "" leaves the provider default», противореча и проводу (`applyToBody` мержит disable на `""`), и inline-коменту самого arm, и новому предикату. Пак чинил ровно эту путаницу (D39.86-обязанность доккомментов) и хвост в 30 строках выше собственной правки не заметил. Однострочный фикс — носитель: строка 114 (тем же касанием, что Д4). + +**6. Носители отложек — гигиена D39.90 исполнена ТЕМ ЖЕ лендингом.** **114** = Д4 (`gates.terminology.target_script` не сверяется с `book.target_lang` — мисконфиг тихо ИНВЕРТИРУЕТ банковский экран) + находка-2 (оба — конфиго-слой ручки, вне снапшота, дёшево). **115** = Д6 (`//go:embed` в `lang/embedded.go:22` — ЯВНЫЙ список файлов: новая ЦЕЛЬ требует правки Go, `CompileCheckers` паникует на неполном файле цели ⇒ на ревью-вопрос общности ответ сегодня НЕТ — дыра в ратифицированной «ФАЗЕ 2 ОБЩНОСТИ ✅» D39.64, и она не про язык, а про строку эмбеда). **116** = Д8 (ратифицированный порог классификатора «6/6» определён для ОДНОГО вызова; на рекомендованном `low` риг N=5 красный — порог обязан стать выборочным контрактом ДО применения (б) где-либо; решается вместе со строкой 112). **Реестр 108** получил двух жильцов: Д5 (enum эффорта провайдер-слеп; решение оркестратора этой нотой — пер-модельную таблицу НЕ строить: новый механизм без носителя качества/денег, misconfig ограничен бюджетами и назван в доккомменте `ValidReasoningEffort`; триггер реопена — первый живой инцидент кривого поведения уровня на проводе) и Д9 (аддитивные провайдеры отказываются бэнк/repair-гейтам — блок не несёт `reasoning_max_tokens`; лоадер fail-closed; триггер — первая потребность гейта в аддитивной модели). **107** дописан Д7 (свести давний байтовый `TestProviderEgressSeamIsSingle` с AST-обходом в один — тем же решением формы гардов). Д1→46 · Д2→46 · Д3→105 · Д10→112 · Д11 закрыт — носители существовали до приёмки, сверено. + +**7. Сверка §5.4 отчёта ПУНКТАМИ (правило D39.90 п.9 — по плану, не по сводке): потерь сжатия НЕТ.** Шаги 1–2 (корпус-фикстура + регресс-тест запаса) → строка 113 ✓ · шаг 3 (два дока-дефекта: 0.9510→0.9767 на 1055, база 1.5%→3.02%) — УЖЕ исполнен №10 в теле строки 46, других публикаций неверных чисел grep не нашёл ✓ · шаги 4–6 (чистая функция → офлайн-дифф → бамп `classifierVersion` с подписью) → тело строки 46 ✓ · шаг 7 (`cultivation` в сиде, не порогом) → хвост 46 ✓ · шаг 8 (сиблинг строкой с триггером) → первый жилец 108 ✓. + +**8. Лендинг и очередь.** Пак закоммичен pathspec-формой: `553f1a3`, ровно 13 файлов backend/, чужие файлы (фронт-сессия ЖИВАЯ, её правки в дереве) и `START_PROMT.MD` не тронуты. Отчёту дана ревью-шапка ПРИНЯТ. Очередь скриптом по таблице: **97 строк (95 − закрытая 104 + новые 114/115/116) · «скоро» 15 (2·4·5·18·46·49·55·95·107·108·109·112·113·114·116) · блокеров 0 · «на приёмке» 0**; гейт строки 44 «при приёмке 104» наступил — строка пере-диспозиционирована (вариационный замер флора при `low` не проводился, вопрос числа жив). **На владельце без изменений три решения:** развилка (а)/(б)/(в) строки 46 — выбор сессии И приёмки: **(а)**; строка 107 (форма гардов + линтер/CI; первым шагом $0-замер); строка 112 (применять ли (б) к пяти шиппинг-конфигам и когда платить перекупку — теперь в связке со 116). diff --git a/docs/archive/reports/EFFORT_HANDLE_2026-08-02.md b/docs/archive/reports/EFFORT_HANDLE_2026-08-02.md index 29df8d70..ea4cf8bd 100644 --- a/docs/archive/reports/EFFORT_HANDLE_2026-08-02.md +++ b/docs/archive/reports/EFFORT_HANDLE_2026-08-02.md @@ -1,6 +1,6 @@ # Отчёт бэкенд-сессии: ручка эффорта · экран целевого языка · холодный прогон (строки 104 · 46 · 16) -> ⚠⚠ **ОТЧЁТ НЕ ПРИНЯТ. Коммит этого файла ≠ ратификация (оркестратор №10, 02.08, D39.90).** Файл закоммичен ТОЛЬКО чтобы артефакт не потерялся при смене сессий — приёмки не было: батарея независимо не пере-прогонялась, деньги вторым путём не пере-выводились, адверсариальный проход по правкам не гонялся. **Код сессии лежит в дереве НЕЗАКОММИЧЕННЫМ** (`backend/internal/config/internal_call.go` + `internal_call_test.go` + `pipeline/synthetic_stage_seam_test.go` — новые; `models.go`/`pipeline.go`/`capability.go`/`escalation.go`/`repair.go`/`runner.go`/`stagerun.go`/`terminologist.go`/`live_reprobe_test.go`/`capability_test.go` — правленые). **Дерево НЕ чистить, `reset --hard`/`checkout` поверх него НЕ делать.** Приёмка — задача №1 преемника: пере-прогнать батарею с фрозен-числами, пере-вывести $0.045095 вторым путём из сырья, адверсариально проверить несущие клеймы (два шва · отсутствие перекупки · гарды · парная выборка N=5), затем лендить. До приёмки числа отчёта — заявления сессии, а не ратифицированные факты. +> ✅ **ПРИНЯТ приёмкой оркестратора №11 (02.08, D39.91). Код заленден коммитом `553f1a3` (13 файлов backend/, pathspec-форма).** Приёмка исполнением: батарея пере-прогнана — все пять фрозен-чисел совпали (голден PASS без пере-захвата · парити EXACT `n=13618 {方源:0 蛊:1 蛊师:2 古月:22} recall 0.9655` · labels-фриз · K6 1/6/0/251); деньги пере-выведены вторым путём — леджер $0.045095 ≡ независимый пересчёт usage×цены ≡ Σ `request_log`, дельта $0.000000, `decode_error`/`estimated` 0; адверсариал — рукописных `config.Stage{}`/`Request{}` вне швов НОЛЬ (grep), **пять НЕЗАВИСИМЫХ посадок приёмки** (алиас-литерал · `[]cfg.Stage{{…}}` · hoisted `Request` · `var`-форма · `new()`) все CAUGHT; парная выборка N=5 сверена с сырьём `classifier-6of6-{low,high}.json` побайтно. **Обе девиации РАТИФИЦИРОВАНЫ** (repair-ключ свой — деньги+семантика подтверждены по пяти шиппинг-конфигам; `ThinksOnWire` — область правки ровно «ключ отсутствует», провод не менялся). **Поправки приёмки:** (1) §2.1 «$0.031639 (flash)» — на деле flash+pro черновой волны (flash **$0.021289** + pro $0.010350; итоги и леджер верны, врёт метка; так же скопировано в D39.90 п.2); (2) клейм «`8e4495006b978ed4` в обе стороны» невоспроизводим (старая форма удалена, хеш не запинен) — принят ПО ЭКВИВАЛЕНТНОСТИ (длина-префикс `Reasoning` + опущенное поле = `""` + `TestBankProbeAndAttemptAddressOneCheckpoint` + голден); (3) стейл-доккоммент `capability.go:78` («effort "" leaves the provider default» у `ReasoningExtraBodyDisable`) противоречит проводу и новому предикату — носитель: строка 114. Отложки Д4–Д9 получили носителей: 114 (Д4) · 115 (Д6) · 116 (Д8) · реестр 108 (Д5, Д9) · строка 107 (Д7). **Промт:** `docs/BACKEND_EFFORT_HANDLE_SESSION_PROMPT.md` (оркестратор №10, D39.87). **Дата:** 02.08.2026. **Не коммичено** — лендит оркестратор.