From 27c516d9ff4fd505fd02c6240af7bba9a2465388 Mon Sep 17 00:00:00 2001 From: "Claude (backend session)" Date: Sun, 2 Aug 2026 21:05:23 +0300 Subject: [PATCH] Close orchestrator eleven: owner decisions ratified with standards prompt issued, line 46 design frozen closed-set, executed prompt archived, tracker onboarding and log ranges refreshed --- docs/BACKEND_REPO_STANDARDS_SESSION_PROMPT.md | 56 +++++++++++++++++++ docs/ORCHESTRATOR_SESSION_PROMPT.md | 4 +- docs/PROGRESS.md | 31 ++++++---- docs/README.md | 2 +- docs/architecture/05-decisions-log.md | 38 ++++++++++++- ...FFORT_HANDLE_SESSION_PROMPT_2026-08-02.md} | 2 + 6 files changed, 118 insertions(+), 15 deletions(-) create mode 100644 docs/BACKEND_REPO_STANDARDS_SESSION_PROMPT.md rename docs/{BACKEND_EFFORT_HANDLE_SESSION_PROMPT.md => archive/prompts/BACKEND_EFFORT_HANDLE_SESSION_PROMPT_2026-08-02.md} (99%) diff --git a/docs/BACKEND_REPO_STANDARDS_SESSION_PROMPT.md b/docs/BACKEND_REPO_STANDARDS_SESSION_PROMPT.md new file mode 100644 index 00000000..e4b7ad9f --- /dev/null +++ b/docs/BACKEND_REPO_STANDARDS_SESSION_PROMPT.md @@ -0,0 +1,56 @@ +# Промт бэкенд-сессии: индустриальные стандарты репозитория — линтер · CI · бамп зависимостей · гарды-в-analyzer (строки 107 · 112 · Д7) + +**Мандат:** решение владельца 02.08 (D39.92): «делаем по стандартам индустрии: CI, линтер, бамп x/net и всех библиотек; осторожный, затем полный подход; спилить самописные AST-тест-гарды в пользу штатной формы». Ограничение владельца, равное по силе самому мандату: **стандарты не должны мешать разрабатывать, тормозить и приводить модели к хакам.** + +**Онбординг:** CLAUDE.md → `docs/README.md` → CURRENT-STATE в `docs/PROGRESS.md` → голова D39.91–92 в `05-decisions-log.md` → `backend/README.md` + `12-go-style-notes.md`. Контекст предмета: отчёт `archive/reports/EFFORT_HANDLE_2026-08-02.md` §1.3(2), §5.5, Д7; D39.90 п.7; строка 107 трекера. + +## §0. Скоуп, деньги, стоп-правила + +- Зона записи: `backend/` ТОЛЬКО. НЕ коммитить — лендит оркестратор. `git add`/`commit` не запускать вовсе; `.env` не читать. +- Деньги: этапы 0–C и E — **$0**. Этап D (бамп зависимостей) включает живую мини-пробу провода: потолок **$0.50**, каждый цент в леджер, тела предъявить. +- **Анти-хак-правило (владелец):** запрещено «зеленить» линтер обходами — переименованиями без смысла, пустыми обёртками, дроблением функций ради метрики, гашением через рефактор-мусор. Спорное правило линтера → ВЫКЛЮЧИТЬ правило в конфиге с одной строкой причины — это честнее, чем хак в коде. Голый `//nolint` без причины запрещён (включить `nolintlint`). +- **СТОП-пинги оркестратору:** этап A даёт >1000 находок → пинг с числами ДО любых правок · этап B требует правок >30 файлов разом → пинг с планом · этап D меняет поведение провода (красный квирк-тест, флейк пробы, новый заголовок/фрейминг) → СТОП, откат бампа, пинг. Молча продавливать нельзя ни одно из трёх. +- Мандат самопроверки (CLAUDE.md 12.07): ревью ИСПОЛНЕНИЕМ своего кода и конфигов; адверсариальные посадки для этапа E обязательны; спорное — author≠reviewer. + +## Этап 0 (15 минут, независим от остального): строка 112 — санкционированная правка пяти шиппинг-конфигов + +`stages[draft].reasoning: "off"` → `"low"` в: `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`. Санкция владельца 02.08 (D39.92); перекупка снапшотов старых книг принята, новые книги $0. + +- ⚠ **НЕ ТРОГАТЬ** `reasoning: "off"` на РЕДАКТОРСКИХ/финальных стадиях (`c1:77` · `c2:51` · `arm-glm:43` · `arm-deepseek-pro:43`) — они осознанные (D39.91 Д11: на glm это живой thinking-off от таймаутов ×3, на dspro — no-op-страховка эхо-мины). +- ⚠ У arm-mistral черновик — проверь МОДЕЛЬ стадии прежде чем править: ключ имеет смысл только там, где стадия резолвится в reasoning-модель; no-op на не-reasoning модели можно оставить `"off"` с комментарием, но реши ЯВНО и запиши. +- После правки: `tmctl status --config` на каждом из пяти + полная батарея. В отчёт: дифф построчно, что не тронуто и почему. + +## Этап A ($0-замер, НИЧЕГО не чинить): объём находок стандартного набора + +1. `golangci-lint` ПИНОВАННОЙ версией (бинарь вне репо, версию в отчёт) — дефолтный набор + `staticcheck, errcheck, unused, ineffassign, misspell, nolintlint` в **report-only** на `./backend/...`. +2. Отчёт ЧИСЛАМИ: находки по правилам × по пакетам × prod/test раздельно. Ни одной правки на этом этапе — это замер, санкционированный владельцем как первый шаг (D39.90 п.7). + +## Этап B (состав и режим — предложение, решение с оркестратором) + +- Предложить `.golangci.yml`: каждое правило ВКЛ/ВЫКЛ с обоснованием ЧИСЛОМ из этапа A (не вкусом). База: `go vet` уже чист — зафиксировать. +- Режим внедрения: baseline «только новый/правленый код» (`--new-from-rev`) против big-bang по правилам с малым хвостом (например, всё с ≤20 находками — big-bang, остальное — baseline). Предложить, НЕ исполнять до ответа на СТОП-пинг, если хвост большой. +- `exhaustruct` НЕ включать глобально (16 находок, 15 в тестах — замерено §5.5); точечно на `config.Stage`/`pipeline.Request` рассмотреть — это ровно класс исходного бага. + +## Этап C (CI + Makefile: одна команда для всех) + +- `Makefile` (или `make.go`): цели `build · vet · lint · test · battery` — где `battery` = ровно текущая ручная батарея (`build && vet && vet -tags live && gofmt -l && test -race -count=1` + голден/парити/labels/K6 по env-флагам). Сессии перестают собирать её руками. +- CI-воркфлоу: проверь `git remote -v`; если удалёнки/раннера нет — файл workflow подготовить (`go build/vet/lint/test`), обязательной точкой входа до его оживления становится `make battery`. Пины версий тулчейна и линтера в конфиге, не latest. +- Прекоммит: у фронта уже стоит самоустанавливающийся гейт (`7832be7`, `frontend/scripts/githooks/`) — НЕ ломать и НЕ дублировать; если расширяешь на backend-пути, только согласованной правкой через оркестратора (это смежная зона). + +## Этап D (бамп зависимостей — осторожно: x/net это наш транспорт) + +- Бамп прямых зависимостей `go.mod` (включая `x/net` 0.26 → текущий, `x/tools` под этап E). Go toolchain — только если требуется, отдельной строкой в отчёте. +- ⚠ `x/net/http2` — транспорт ко ВСЕМ провайдерам. После бампа обязательны: полная батарея · голден (PASS без пере-захвата — вердикты не двигаются) · **живая мини-проба провода на КАЖДЫЙ провайдер** из `models.yaml` (1 короткий вызов; потолок $0.50 суммарно; сверить: тела, ключи запроса, `reasoning_content`, finish_reason, отсутствие новых заголовков/фреймингов против `00-provider-quirks.md`). Любое расхождение = СТОП-пинг, откат. + +## Этап E (гарды → analyzer; снос тест-гардов ТОЛЬКО после доказанного паритета) + +Предмет: `synthetic_stage_seam_test.go` (два AST-гарда + пол числа файлов) и давний байтовый `TestProviderEgressSeamIsSingle` (Д7) → ОДИН обход на `x/tools/go/analysis` с `types.Info` (алиасы/дот-импорты закрываются по построению), запуск через `go vet -vettool=` из `make battery`/CI. + +- **Инварианты — предмет контракта, не форма:** (i) `config.Stage` строится вне лоадера только швом `InternalCall.Stage()`; (ii) `pipeline.Request` собирается только в `attemptRequest`; (iii) egress-инвариант старого гарда — перенести его словарь исключений осознанно, не копипастой; (iv) рефлексионный `TestInternalCallDecidesEveryStageField` — НЕ трогать, он не про обход дерева и в analyzer не нуждается. +- **Паритет посадками:** все 12 известных обходов (5 байтовых + алиас + `[]config.Stage{{…}}` из отчёта §1.3; `var`-форма, `new()`, hoisted `Request` + алиас-литерал + слайс — посадки приёмки D39.91) воспроизвести как тест-кейсы АНАЛИЗАТОРА (`analysistest`). Analyzer обязан ловить все 12 + иметь эквивалент пола «я реально видел файлы». +- ⚠ **Известная слепая зона `go/packages`:** старый гард ходил и по `eval/` ВНЕ Go-модуля (исторически там жил четвёртый сайт дефекта). Реши явно: гонять analyzer и на eval-модуле, или закрыть этот класс иначе — и запиши решение. +- Снос `_test.go`-гардов — ПОСЛЕДНИМ коммитом пака, только при 12/12 у analyzer. До того оба механизма живут параллельно. + +## Отчёт + +`docs/archive/reports/REPO_STANDARDS_<дата>.md`: эхо-шапка · числа этапа A · состав+режим B с обоснованиями · что даёт `make battery` · дифф бампа и предъявление живой пробы D · паритет-таблица 12 посадок E · снесённое/оставленное · найдено-не-починено с носителями · «заявление = команда» на каждое число. **СТОП — приёмка оркестратора.** diff --git a/docs/ORCHESTRATOR_SESSION_PROMPT.md b/docs/ORCHESTRATOR_SESSION_PROMPT.md index 6221024b..752ca794 100644 --- a/docs/ORCHESTRATOR_SESSION_PROMPT.md +++ b/docs/ORCHESTRATOR_SESSION_PROMPT.md @@ -2,12 +2,14 @@ ## ХЕНДОФФ №8 → №9 (26.07.2026, вечер) -> **Счётчик ролей — канонический ОДИН:** «оркестратор №N» (сейчас №10 — хендофф 02.08.2026 вечером, №9 закрыт после D39.85; записка-передача — у владельца). «Передача роли №6» в заголовке файла и «ХЕНДОФФ №8→№9» — исторические номера эстафеты документа, текущим счётчиком НЕ являются (фидбек новой сессии 02.08). +> **Счётчик ролей — канонический ОДИН:** «оркестратор №N» (сейчас №12 — хендофф 02.08.2026 ночью, №11 закрыт после D39.95; состояние передачи — D39.94 + PROGRESS CURRENT-STATE, отдельной записки нет). «Передача роли №6» в заголовке файла и «ХЕНДОФФ №8→№9» — исторические номера эстафеты документа, текущим счётчиком НЕ являются (фидбек новой сессии 02.08). **Позиция и первые задачи хендоффа №8→№9 (26.07) — ИСТОРИЧНЫ И ИСПОЛНЕНЫ** (малая пачка 14а+14б → D39.54 · пак-19 → D39.55/56 · холодный мини-прогон → D39.58 · пак-21 «чекеры» → растворён D39.62, исполнен пакетом D39.78) — здесь не пересказываются (историзировано D39.80: файл нёс протухшую очередь как второй носитель состояния). **ЕДИНЫЙ БЭКЛОГ = секция «Бэклог» в PROGRESS.md — единственный трекер.** Текущее состояние и очередь — ТОЛЬКО PROGRESS CURRENT-STATE; онбординг стандартный (CLAUDE.md → README → CURRENT-STATE → голова D-лога). **Дельта норм от №8 (сверх §1–11, всё уже в D-логе):** нормы замеров D39.46/47 — в каждый промт (арм-без-фактора · дедуп+декой · критик полноты на КАЖДУЮ фазу · право сессии сказать «этого делать не надо»); приёмка = execute-first воркфлоу-верификаторами, деньги сверяются из сырья несколькими путями, своя мутация ВНЕ списка сессии — второй рубеж; цитаты только дословные (овер-атрибуция — типовой провал ресёрчей И приёмок); **глаз владельца на артефакт — рабочий рубеж**: его «а это нормально?» дважды за 26.07 вскрывало пропущенное двумя рубежами (жанровый словарь как класс; утечка промпт-комментариев на провод) — прайми его артефактами, не пересказом. Мультисессионный git: стейдж по содержимому; мутации — только на закоммиченном дереве; в Bash — абсолютные пути (три ложные тревоги №8 были скриптовыми ошибками, не дефектами кода). +**Дельта норм от №10–№11 (02.08, всё уже в D-логе — здесь только указатели):** отчёт с секцией «пошаговый план» сверяется ПО ПУНКТАМ плана, не по сводке — на сжатии сводкой теряется именно то, у чего нет числа (D39.90 п.9); каждое «отложено/вернуться» получает строку бэклога или жильца реестра 108 ТЕМ ЖЕ лендингом (иначе теряются загейченные реопены); счёт очереди в CURRENT-STATE — только скриптом по таблице, при каждом лендинге; закрытая строка уходит из таблицы в D-лог, а её протухшие гейты в ДРУГИХ строках пере-диспозиционируются тем же касанием (прецедент: строка 44 при закрытии 104); приёмка кода = исполнением с СОБСТВЕННЫМИ адверсариальными посадками в гарды, не повтором посадок автора (D39.91: 5 независимых посадок); шапку-диапазон D-лога бампать при КАЖДОМ аппенде ноты (промашка №11, поймана речеком владельца). + **Норма «дисциплина ответа» (владелец 26.07, для Opus-класса моделей — вставлять в каждый сессионный промт):** эрудиция ≠ улика (грунт `file:line`/замер или пометка «мнение») · не пересказывать промт · плотность, не объём · без шаблонных оговорок и советов вне скоупа · комментарии 1–2 строки, улики — в отчёт. **Норма приёмки и усилий (владелец 30.07, ужесточает пропорциональность 25.07):** тяжёлый агентный аппарат (воркфлоу-верификаторы, панели) — ТОЛЬКО поверх серьёзных перестроек и дизайнов; в остальном сессиям доверяем. Значительные изменения → промт сессии несёт цикл «план → синк по вопросам → чтение доков полигона/оркестратора → исполнение → самоверификация ТОЙ ЖЕ сессией». Оркестратор: КОРОТКАЯ приёмка чтением отчёта · общее планирование над репо · досинхронизация команды (полигону — инструкции смотреть на бэкенд, бэкенду — на полигон-экспы) · правка недосинхронизированных мест. Токены беречь: болтливость сессий подрезать промтами, свои усилия — тоже. diff --git a/docs/PROGRESS.md b/docs/PROGRESS.md index d84e7c5d..9bda01e7 100644 --- a/docs/PROGRESS.md +++ b/docs/PROGRESS.md @@ -1,11 +1,11 @@ # Журнал прогресса -> **⟶ ТЕКУЩЕЕ СОСТОЯНИЕ** (на 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`; этот файл — ЖУРНАЛ.** +> **⟶ ТЕКУЩЕЕ СОСТОЯНИЕ** (на 2026-08-02, голова D39.95). +> - ⚠⚠ **ПЕРЕДАЧА ОТ ОРКЕСТРАТОРА №11 → №12 (D39.94, 02.08).** Пак 104 ПРИНЯТ и заленден `553f1a3` (строка 104 закрыта, D39.91); решения владельца ратифицированы (D39.92–93). **Задачи преемника:** (1) приёмка пака по `BACKEND_REPO_STANDARDS_SESSION_PROMPT.md`, когда бэкенд отработает (образец — D39.91; этап 0 промта = пять шиппинг-конфигов на `low`, санкция есть); (2) выдать промт пака экрана 46 — порядок и ограничения в D39.94 п.3 (фикстура 113 первой; денежный шаг ТОЛЬКО с подписью владельца). **ОТКРЫТО НА ВЛАДЕЛЬЦЕ (ответа нет):** 116 (порог «≥4/5 при N=5» подан) · строка 5 (находки прерванного банк-ресёрча или пере-запуск; промт подрезать до $1.20 ПЕРЕД выдачей) · мини-проба 44 «low+16k» (~$0.05) · подпись денежного шага 46. **Вахта:** маппинг эффорта `deepseek-v4-pro` меняется «early August 2026» (реестр 108, триггер >05.08). **Источник истины по РЕШЕНИЯМ — `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 перед любым платным прогоном. -> - **Стек:** draft deepseek-v4-flash thinking-ON (+банкнота) **⚠0731** → терминолог (та же модель, батчи, экран `target_script`) → editor deepseek-v4-pro БИЛИНГВ ИНТЕРИМ (вендором НЕ тронут; glm-5 резерв) → судья gemini (Ф2, полигон); канал B Mistral+grok; ~$0.85/ранобэ (D30.4) — пере-калибровка после развилки 74. +> - **Курс (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`, так чтобы четвёртое такое место не могло появиться молча. **Пак ИСПОЛНЕН И ПРИНЯТ (D39.91, код `553f1a3`; промт заархивирован)** — работы A+проба зелёные, работа B стала паком экрана 46 (дизайн заморожен D39.92 п.1+D39.93), прогон C не стартовал ⇒ строка 16 ЖИВА и оси голоса 13б по-прежнему без данных. Текущий бэкендный промт — `BACKEND_REPO_STANDARDS_SESSION_PROMPT.md` (D39.92: линтер/CI/бампы + пять конфигов на `low`). Перекупок нет (D39.63). +> - **Горизонт (D39.62/67, освежён D39.95):** ре-проба flash ИСПОЛНЕНА и строка 74 закрыта (D39.86/91; порог 6/6 → пере-ратификация выборочным, строка 116; пробы 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 · строка 112 перед любым платным прогоном на шиппинг-конфигах (до лендинга этапа 0 промта стандартов они покупают пустые ответы). +> - **Стек:** draft deepseek-v4-flash thinking-ON (+банкнота) **⚠0731** → терминолог (та же модель, батчи, экран `target_script`) → editor deepseek-v4-pro БИЛИНГВ ИНТЕРИМ (⚠ вендор АНОНСИРОВАЛ смену маппинга эффорта pro «early August 2026» — вахта в реестре 108; glm-5 резерв) → судья gemini (Ф2, полигон); канал B Mistral+grok; ~$0.85/ранобэ (D30.4) — пере-калибровка после лендинга 112. > - **ЕДИНЫЙ БЭКЛОГ — секция «Бэклог» ниже** (одна таблица, единственный трекер; каждая петля обязана иметь диспозицию: решено / отложено-с-записью / отклонено; ведёт оркестратор). **СЧЁТ ОЧЕРЕДИ на 02.08 (D39.90, обновлять при каждом лендинге; считать скриптом по таблице, не на глаз):** всего **95** строк · зона бэкенд **46** строго / **61** широко · **блокеров очереди 0** (104 → «на приёмке») · «скоро» **13** (2·4·5·18·46·49·55·95·107·108·109·112·113); остальное «когда-нибудь». ⚠ **Счёт — НИЖНЯЯ граница долга, а не потолок:** трекер содержит только замеченное, и 02.08 дважды за $0 свежие глаза вытащили из кода дефекты, которых в нём не было (релей фронта → строки 99/100/102; приёмочное ревью → третий шов `repair.go:384` в 104 и честность `quality.go:436` в 105). Лента ✅ выше — про ЗАКРЫТЫЕ паки, читать её как «долга нет» неверно (разбор — вопрос владельца 02.08, D39.89). > - Архивы хроники: `archive/PROGRESS-2026-07-04-10.md` (D31) · `-10-13` (D39.6-гигиена) · `-13-25` (стройка паков 11–16, rerun2) · **`-25-31` (паки 17–20 · мини-прогон · полигон-пакеты 5–8 · ToS · холодный прогон; D39.26–58)**. Записи ниже — живой хвост (эра D39.59+). @@ -18,7 +18,7 @@ | **— ВИСИТ НА ВЛАДЕЛЬЦЕ —** | | | | | | | 2 | Четыре вопроса границы «алгоритмического идеала» (Annotator · семантический судья · ja→ru §B5 · ru-target до/после) | владелец | скоро (гейт «добора идеала» перед МАСШТАБОМ) | отдельное решение | D39.33, D39.38 | | 4 | **Ре-чек ToS по триггерам** — первый ИСПОЛНЕН 31.07, дельт вердиктов нет (D39.57); предмет Google-мониторинга перевешен на цепочку договора (PUP · Additional ToS · Google APIs ToS); следующие: квартал 25.10.2026 · первая лейблованная книга · любая правка `accepts_labels` | владелец/полигон | скоро (следующий триггер 25.10.2026) | отдельное решение (правило) | D39.32, D39.57 | -| 5 | **Судья-с-декоем/36б «второе мнение» → РАСШИРЕНО ДО АРБИТРАЖА БАНКА (D39.89), ПРОМТ ВЫДАН.** Бэкенд-стройка ЗАКРЫТА дизайном (D39.69): маршрут = полигон-ЗАМЕР нужности рецензента-другого-семейства ПОВЕРХ §1+§2 (Q2); переживёт замер → тонкая колонка наблюдаемости, не гейт. **Вход владельца 02.08 добавил в тот же замер четыре вопроса, которых в Q2 не было:** (i) калибровка САМООЦЕНКИ моделей как сигнала (числа против слов · устойчивость · **сравнимость между моделями**), (ii) взвешенный арбитраж против равноправного «консилиума без голоса», (iii) **связность системы термов как ограничение** — единица арбитража обязана быть КЛАСТЕРОМ (семья корня · серия · регистр · алиас-граф), а не строкой (по-терминный argmax возвращает классом дефект, вылеченный со-батчингом, D39.65 стр.21), (iv) инжект/фетч отдельной осью (мерить послушание и ВРЕД, не recall). Приоры против наивной формы уже есть: судья = катастроф-экран, не ранжировщик (D39.46) · канал отказа нестабилен, размах 0.375 (D39.50) · согласие прогонов слабое, Жаккар 0.077–0.40 (D39.50). Гейт всего — **голд-набор** (ядро: сид v2 53 `approved` + BANK-FULL 150 + банк coldrun-a; мини-голд алиасов §E-1 research/20 ждёт владельца с 17.07). Промт `BANK_ARBITRATION_RESEARCH_SESSION_PROMPT.md` (потолок $2.00, суб-потолки, пре-регистрация; легитимный исход — «закрыть по нужности»). ⚠ **ЗАХОД 02.08 ЗАПУЩЕН И ДОСРОЧНО ЗАКРЫТ ВЛАДЕЛЬЦЕМ — «требуются фиксы в бэкенд» (D39.90). Артефакта в дереве НЕТ:** ни `docs/research/24-*`, ни `eval/bank_arbitration/`, ни свежих файлов в `~/books` ⇒ **находки того захода НЕ сохранены; если они ценны — их надо вынуть из истории сессии, иначе работа повторяется с нуля.** Рекомендация оркестратора №10 к пере-запуску (ПОДРЕЗАТЬ, а не гонять целиком): **держать** §3-A (критика кода, $0 — она и вскрывает нужные бэкенд-фиксы), **B1** голд (гейт всего) и **B3** формы консилиума с контролем «одна модель N раз»; **свернуть** B2 (калибровка уверенности) до под-пробы внутри B3 — как отдельная работа она дорога, а приоры D39.46/D39.50 уже сильно против неё; **отложить** §5-C (инжект/фетч) до бэкенд-доработок, потому что мерить послушание инъекции без движка нечем. Потолок с $2.00 к $1.20 | полигон/ресёрч | **скоро (пере-запуск подрезанным скоупом — по слову владельца)** | замер → дизайн → решение | D39.50 п.6, D39.58, D39.69, D39.70 (Q2), D39.89, **D39.90** | +| 5 | **Судья-с-декоем/36б «второе мнение» → РАСШИРЕНО ДО АРБИТРАЖА БАНКА (D39.89), ПРОМТ ВЫДАН.** Бэкенд-стройка ЗАКРЫТА дизайном (D39.69): маршрут = полигон-ЗАМЕР нужности рецензента-другого-семейства ПОВЕРХ §1+§2 (Q2); переживёт замер → тонкая колонка наблюдаемости, не гейт. **Вход владельца 02.08 добавил в тот же замер четыре вопроса, которых в Q2 не было:** (i) калибровка САМООЦЕНКИ моделей как сигнала (числа против слов · устойчивость · **сравнимость между моделями**), (ii) взвешенный арбитраж против равноправного «консилиума без голоса», (iii) **связность системы термов как ограничение** — единица арбитража обязана быть КЛАСТЕРОМ (семья корня · серия · регистр · алиас-граф), а не строкой (по-терминный argmax возвращает классом дефект, вылеченный со-батчингом, D39.65 стр.21), (iv) инжект/фетч отдельной осью (мерить послушание и ВРЕД, не recall). Приоры против наивной формы уже есть: судья = катастроф-экран, не ранжировщик (D39.46) · канал отказа нестабилен, размах 0.375 (D39.50) · согласие прогонов слабое, Жаккар 0.077–0.40 (D39.50). Гейт всего — **голд-набор** (ядро: сид v2 53 `approved` + BANK-FULL 150 + банк coldrun-a; мини-голд алиасов §E-1 research/20 ждёт владельца с 17.07). Промт `BANK_ARBITRATION_RESEARCH_SESSION_PROMPT.md` (потолок $2.00, суб-потолки, пре-регистрация; легитимный исход — «закрыть по нужности»). ⚠ **ЗАХОД 02.08 ЗАПУЩЕН И ДОСРОЧНО ЗАКРЫТ ВЛАДЕЛЬЦЕМ — «требуются фиксы в бэкенд» (D39.90). Артефакта в дереве НЕТ:** ни `docs/research/24-*`, ни `eval/bank_arbitration/`, ни свежих файлов в `~/books` ⇒ **находки того захода НЕ сохранены; если они ценны — их надо вынуть из истории сессии, иначе работа повторяется с нуля.** Рекомендация оркестратора №10 к пере-запуску (ПОДРЕЗАТЬ, а не гонять целиком): **держать** §3-A (критика кода, $0 — она и вскрывает нужные бэкенд-фиксы), **B1** голд (гейт всего) и **B3** формы консилиума с контролем «одна модель N раз»; **свернуть** B2 (калибровка уверенности) до под-пробы внутри B3 — как отдельная работа она дорога, а приоры D39.46/D39.50 уже сильно против неё; **отложить** §5-C (инжект/фетч) до бэкенд-доработок, потому что мерить послушание инъекции без движка нечем. Потолок с $2.00 к $1.20 · **02.08 вечер (D39.92): владелец напомнил про заход — статус: промт жив, заход был ПРЕРВАН владельцем, находки только в истории той сессии (вопрос: вытащит ли их владелец), пере-запуск — по подрезке D39.90 п.5 ($1.20), промт подрежет оркестратор перед выдачей** | полигон/ресёрч | **скоро (пере-запуск подрезанным скоупом — по слову владельца)** | замер → дизайн → решение | D39.50 п.6, D39.58, D39.69, D39.70 (Q2), D39.89, **D39.90** | | 6 | **Строка Gemini в `accepts_labels`** — ждёт слова владельца о подписи интерпретации сужения как разрешения; ре-чек 31.07 понизил приоритет: подпись даёт ПРАВО, но не судью 18+ (фильтр неконфигурируем D22.6 + обход запрещён договором) — возвращаться при вопросе, требующем именно права | владелец | когда-нибудь | отдельное решение | D39.32, D39.57 | | 7 | Q2 «редактор под `sexually-explicit`» (grok-4.3 интерим · glm-5 после сверки ToS Z.AI · mistral вон) | владелец | когда-нибудь (перед первой explicit-книгой) | отдельное решение | D39.27 п.7 | | 8 | D22.7 пер-чанковый L3-скрин — несня­тое предусловие первой erotica-книги в проде, отдельный гейт | владелец | когда-нибудь | отдельное решение | D22.7, CURRENT-STATE (оркестратор) | @@ -36,7 +36,6 @@ | 18 | **Эмиссия головы 蛊**: сид-половина = чек-лист (определяющий терм книги сидится `allow_short`, D39.50); эмиссия-КАНАЛ демотирован до ИЗМЕР-ГЕЙТА (Q7): полигон-замер «меняет ли эмиссия головы рендер композитов» — строить ТОЛЬКО по эффекту и ПОСЛЕ #10 (однознаковый пост-чек чинится чекер-паком); перед стройкой резолвить K-гейт и KWIC-грязь одиночной головы | полигон → бэкенд | скоро (санкция Q7 D39.70 — после #10, очередью с ре-пробой) | полигон-замер → решение | D39.58, D39.60, D39.69 | | 24 | **Остаток: авто-режим флага** (проект Б не гонялся) · оси голоса A–D (профили не подписаны; черновик готов — `coldrun-a/SIGN-PACKAGE.md` §3) ; + слот инъекции голоса и решение gates.voice при ненулевых осях (D39.55/D21 п.2) · слой-2 voice не строим до доказательства слоя-1 · сверить until_ch 白凝冰 при курации сида (D19.3в) | бэкенд | когда-нибудь (первый прогон добора идеала) | добор идеала | D39.40, D39.58 | | **— ТЕКУЩАЯ ОЧЕРЕДЬ (D39.59) —** | | | | | | -| 74 | ⚠ **DeepSeek-V4-Flash-0731: боевая черновая форма покупает пустые ответы. РЕ-ПРОБА ИСПОЛНЕНА (D39.86, $0.114378 из $0.15): блокер ВОСПРОИЗВЕДЁН на боевой форме — 0 из 9 вызовов пригодны при `max_tokens=8496`. РАЗВИЛКА — НА ВЛАДЕЛЬЦЕ; платных прогонов до его слова нет.** Числа пере-выведены приёмкой из сырья. **(а) флор 16000 — ФАЛЬСИФИЦИРОВАН** (4/5 пустых при 16992; `reasoning_content` 15–21 тыс. симв. — модель переводит главу ВНУТРИ размышления; вендорская норма вывода для `high` = 384K, ×45 к флору) ⇒ строка 44 закрыта этим замером. **(б) `reasoning_effort:"low"`** — волна оживает (20/22 `stop`, 18/20 чанков, латентность 9–44 с); стадийная ручка проходит `echoMineViolation` БЕЗ амендмента (гейт инспектирует МЕХАНИЗМ `control`, не значение; у deepseek `ReasoningNone` ⇒ `low` уходит на провод, thinking не выключается) — **но для БЭНК-РОЛЕЙ посылка об амендменте ЖИВА** (ручки нет вовсе, единственный дата-путь `extra_body` гейт банит) ⇒ (б) = правка Go (строка 104), НЕ строка конфига; цена: эхо 3/20 · **1/18 выход на английском** (строка 46) · волна **$0.028195** all-in / $0.019489 flash-only · доккомменты гейта (`models.go:440-448`, `capability.go:52-58`) обязаны быть приведены в соответствие тем же решением, иначе защита читается как полная, а боевой конфиг её обходит по неохраняемому каналу. **(в) ждать** — вендор молчит (changelog новее 31.07 нет, сверено 02.08). **(в′) thinking OFF — ЗАМЕРЕНО** (карантинная копия конфига вне git, боевой гейт цел): 0 пустых из 22 · терминолог 5/5 · волна $0.012287 · **но эхо-мина ЖИВА 4/20** и качество прозы не судилось никем ⇒ разворот ратифицированного гардрейла, требует читки качества, не рекомендация. **(г) черновик на `deepseek-v4-pro`** — 0 правок Go, но ≈**×8.9** к (б) (≈$0.174 на волну 20 чанков из единственного хопа; «×3.1» = только отношение цен за токен, pro выдал 9059 выходных токенов против медианы 2330 у flash-low) и ⚠ **на pro ручка эффорта НЕ работает** (вендор-маппинг `low→high`), а смена маппинга pro объявлена вендором на «early August 2026» — то есть сейчас. Ручка #77 (ре-ген эха перед эскалацией, D39.64, дефолт 0) — тем же решением; при включении помнить общий счётчик attempt с length-ре-геном + рост `maxTokensForAttempt`. ⚠ **НЕ замерено:** `regenerate_before_escalate: 2` (×4 бюджета — конфиг-ручка, ноль правок Go); ×2 дал отдачу 1/5 и это ЕДИНСТВЕННЫЙ живой автоматический путь (эскалация закрыта КЛАССОМ флага, доказано `escalated=0` при профинансированном хопе). Остаток §12.7 (8 несудимых fidelity-пар ≈$0.10 · ja-вход ≈$0.005 · prefill-continuation research/21 §1.17) — при предмете wiring; полигон-слоты Q2 (36б-замер) и Q7 (эмиссия головы, после #10) — прежней очередью. **Порог классификатора 6/6 ВЗЯТ** ($0.000390, `finish=stop`; дискриминирующая часть 4/4 — 元石/灵泉 стоят в промпте дословно) — эта половина строки ЗАКРЫТА. ✅ **РАЗВИЛКА РЕШЕНА ВЛАДЕЛЬЦЕМ 02.08 (D39.87): вариант (б)** — `low` для черновика ПЛЮС правка Go, дающая ручку ролям без неё (строка 104), ПЛЮС экран целевого языка (строка 46) как условие безопасности; (в′) отклонён (разворот гардрейла без читки качества), (г) отклонён по цене и по неуправляемости эффорта у pro. Промт выдан — `BACKEND_EFFORT_HANDLE_SESSION_PROMPT.md`; строка закрывается приёмкой этого пака | владелец → бэкенд | **в работе (промт выдан D39.87)** | правка по строкам 104 и 46 + добивка прогона (строка 16) | D39.61, D39.63, D39.64, POLYGON_PROMPTLANG_ANTIECHO §12.4, D39.83, **D39.86, D39.87** | | 78 | **Леджер денег = НИЖНЯЯ граница**: «2xx body decode failed (call IS billed)» — провайдер списал, исходная попытка в `request_log` НЕ попадает (≤$0.009/сессия); дизайн фикса ГОТОВ (GENERALITY_PHASE2 §5.6: `BilledDecodeFails` + per-billed-attempt settle с `Estimated=true`), но это money/ledger-путь — не $0-хастл. **Живое число (D39.86):** на ре-пробе 74 — 3 таких вызова на 14, неизвестность **$0.015111** при леджере $0.114378 (13% захода); движок засеттлил оценку и честно напечатал `estimated-cost rows: 3` ⇒ канал ВИДЕН, но `decode_error` при этом ещё и терминален (не retryable, не escalatable) — 3 из 7 терминальных флагов пробы A | бэкенд | когда-нибудь (money-паком) | отдельное решение (дизайн §5.6) | D39.61, D39.64, D39.86 | | 79 | **Граница ПЛОТНОСТИ письма для серий**: `enabled` через Go-константу `cjkScriptNames` — новый плотный скрипт требует правки Go (head-finality уже в данных script-series.txt; пре-существующая граница, D39.75). Первые два компонента строки (isCyrLetter→`isTargetWordLetter` · magnitude `SourceScripts`-гейт) исполнены пакетом-чекеров, D39.78 | бэкенд | когда-нибудь | следующий пак общности / касание чекеров | D39.64, D39.78 | | 90 | **Ф2-кандидаты 02-mvp-плана без носителя** (свип-хвост, D39.73): CometKiwi/T-index метрики судьи · Batch API судьи (экономия) · llama-server-интеграция локали · стриминг — взять/закрыть при пилот-препе; + H16 самоулучшение (V3-п.2, ПТ-26): дизайн петли по данным судьи — тем же препом | полигон/бэкенд | когда-нибудь (Ф2.5) | пилот-преп-промт (с 85) | 02-mvp-plan, D39.66, D39.73, D39.80 | @@ -70,7 +69,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.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** | +| 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** · **02.08 вечер (D39.92): владелец пере-поставил задачу closed-set** («вернуло НЕ тот язык, что просили»; полноценный LID — только запасной флаггер вне пути вердикта; проверку изолировать отдельным слоем) — ресёрч §5.1–5.3 отвечает постановке, форма (а)+изолированный модуль подтверждена, слой-0 владельца (полоса len(out)/len(in)) добавить замером на фикстуре 113 | владелец → бэкенд | **скоро (порядок §5.4: сначала 113, шаг 6 — под подпись)** | правка Go по плану §5.4 | D39.39(д), D39.86, **D39.90** | | 47 | M2-кэш / доктрина Д2 — кандидат на отдельную ратификацию | оркестратор/бэкенд | когда-нибудь | отдельное решение | D39.42 | | 48 | Направленная банкнота — вернуться по замеру покрытия терминолога | бэкенд | когда-нибудь | отдельное решение | D39.42 | | 48а | **Серийный шаринг банка** — РЕАЛИЗАЦИЯ (экспорт подписанного глоссария как сид-YAML следующей книги серии; спойлер-окна плющатся в since_ch=0); контракт round-trip держится тестом, самой фичи нет | бэкенд | когда-нибудь (перед второй книгой серии) | отдельное решение | D39.42 задел (а), PACK20_BANK_BUILD З-а | @@ -112,16 +111,24 @@ | 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 | | 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) · **+Д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 | +| 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-обходом в ОДИН тем же решением формы **02.08 вечер (D39.92): САНКЦИЯ ЦЕЛИКОМ** («по стандартам индустрии»; анти-хак-правило в промте) — промт выдан: `BACKEND_REPO_STANDARDS_SESSION_PROMPT.md` (этапы 0/A–E, три СТОП-пинга) | бэкенд | скоро (промт выдан, ждёт сессии) | пак по промту → приёмка оркестратора | 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` стоит на РЕДАКТОРЕ осознанно — это другой случай, не трогать без отдельного разбора **02.08 вечер (D39.92): САНКЦИЯ — править все пять, перекупка старых книг при следующем прогоне принята** | бэкенд | скоро (этап 0 промта `BACKEND_REPO_STANDARDS_SESSION_PROMPT.md`) | правка данных + батарея | 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 | | 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 | +| 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-токене (модель не подумала), уровень ни при чём **02.08 вечер: рекомендация подана владельцу — «≥4/5 прогонов N=5 достигают 6/6»** (альтернатива жёстче: 4/4 по дискриминирующему подмножеству без термов-припоминаний); ждёт слова | владелец → оркестратор | скоро (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.92:** вендор анонсировал смену МАППИНГА эффорта `deepseek-v4-pro` «early August 2026» ⇒ квирк 3а («low→high, эффорт не настраивается») может устареть (триггер: аномалия редакторского арма ИЛИ дата > 05.08 ⇒ пере-проба маппинга + сверка changelog; абсорбция в `00-provider-quirks.md` — полигоном). Норма 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 — ЗАКРЫТИЕ СЕССИИ И ПЕРЕДАЧА №12 (D39.94), 02.08 + +Итог сессии: приёмка пака ручки эффорта исполнением — принят, заленден `553f1a3`, строка 104 закрыта (D39.91); решения владельца ратифицированы: 46 → closed-set «не тот язык» изолированным пакетом с именованными причинами (D39.92 п.1 + D39.93), 107 → санкция целиком, промт `BACKEND_REPO_STANDARDS_SESSION_PROMPT.md` выдан, 112 → санкция (этап 0 промта); вендор-сверка DeepSeek: 0731 не деградация, а смена политики дефолта thinking=high; вахта на смену маппинга v4-pro (реестр 108). Преемнику: приёмка пака стандартов + выдача промта экрана 46. На владельце: 116 · строка 5 · мини-проба 44 · подпись шага 6 по 46. Очередь: 97 строк · «скоро» 15 · блокеров 0. Пост-скриптум закрытия: `0909e86` — коммит `START_PROMT.MD` ПО ЯВНОМУ СЛОВУ владельца (разовое исключение из гардрейла, прекоммит-гейт обойдён `--no-verify` осознанно; правило «не коммитить» в силе); V5-п.2 из диффа уже разобран как ПТ-23, невидимых требований нет. Второй речек владельца («перечитай онбординг») добил хвосты: строка 74 закрыта (её буква «закрывается приёмкой пака» исполнилась в D39.91), промт EFFORT_HANDLE заархивирован, карта README и буллеты Курс/Горизонт/Стек освежены — D39.95; очередь после закрытия 74 — 96 строк. + +## Оркестратор №11 — РЕШЕНИЯ ВЛАДЕЛЬЦА ПО 46/107/112 РАТИФИЦИРОВАНЫ, ПРОМТ СТАНДАРТОВ ВЫДАН, ВЕНДОР-СВЕРКА DEEPSEEK (D39.92), 02.08 + +Владелец: 46 — пере-постановка closed-set («вернуло не тот язык, что просили», LID только запасной флаггер, проверку изолировать) — ресёрч бэкендеров ЗАПИСАН (§5.1–5.3 отчёта EFFORT_HANDLE) и отвечает постановке; два расхождения замером (гарантия FPR≤0.1% не покупается на n=114 — порог константой-контрактом; L2/L4 отвергнуты числами этой книги, реопен через реестр 108), слой-0 (полоса длин) — добавить замером на фикстуре 113. 107 — САНКЦИЯ целиком: CI+линтер+бамп x/net и библиотек, «осторожно, затем полностью», анти-хак-правило; выдан `BACKEND_REPO_STANDARDS_SESSION_PROMPT.md` (этап 0 = строка 112 · A замер · B состав · C Makefile/CI · D бамп с живой пробой ≤$0.50 · E гарды→analyzer, паритет 12 посадок, Д7). 112 — САНКЦИЯ (перекупка принята). Вендор-сверка по правилу 10.07: 0731 = офиц. релиз flash, бенчи вверх — «модель хуже» интернет НЕ подтверждает, наш отказ = смена ПОЛИТИКИ ДЕФОЛТА thinking=high на плотном хане; ⚠ анонс смены маппинга эффорта v4-pro «early August 2026» — вахта в реестре 108. Миграция черновика — замер по слову владельца, не решение. Открыто на владельце: 116 (рекомендация «≥4/5 при N=5» подана) · строка 5 (вытащить находки прерванного захода или пере-запуск $1.20) · подпись шага 6 по 46. + ## Оркестратор №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. diff --git a/docs/README.md b/docs/README.md index af44f226..9665aae1 100644 --- a/docs/README.md +++ b/docs/README.md @@ -15,7 +15,7 @@ - `experiments/` — эмпирика полигона: [00-provider-quirks.md](experiments/00-provider-quirks.md) — **читать перед любым вызовом провайдера**; [08-cost-model-v2.md](experiments/08-cost-model-v2.md) — денежная модель; [09-pilot-protocol.md](experiments/09-pilot-protocol.md) — пилот Ф2.5; остальные 01–16 — отчёты закрытых экспериментов (судьба — в баннерах/D-логе). - `research/` — фактура ресёрчей 01–22; у принятых — ревью-шапки, часть тел под ⚠ superseded: **читай баннер прежде содержимого**. Ключевые для навигации: 15 голос · 16 ридер-IDE · 17 внешняя критика · 18 рычаги качества · 19 нарезка · 20 банк-майнинг · 21 обзор транспорта · 22 доменные харнессы · 23 шов движок↔платформа (читать перед любым кодом стыка). - [PROGRESS.md](PROGRESS.md) — журнал: CURRENT-STATE + **ЕДИНЫЙ БЭКЛОГ** (единственный трекер) + живой хвост хроники. НЕ источник решений. -- Активные хендофф-промты сессий (состав обновляется при каждом лендинге — норма D39.80): [ORCHESTRATOR_SESSION_PROMPT.md](ORCHESTRATOR_SESSION_PROMPT.md) (роль/нормы; состояния не дублирует) · [POLYGON_PACKAGE4_SESSION_PROMPT.md](POLYGON_PACKAGE4_SESSION_PROMPT.md) (полигон, отложен). [BACKEND_EFFORT_HANDLE_SESSION_PROMPT.md](BACKEND_EFFORT_HANDLE_SESSION_PROMPT.md) (**текущий бэкендный**, D39.87: ручка эффорта для ролей без неё · экран целевого языка · добивка холодного прогона; предшественник coldrun-b отработан фазами A/B и заархивирован, D39.86) · [BANK_ARBITRATION_RESEARCH_SESSION_PROMPT.md](BANK_ARBITRATION_RESEARCH_SESSION_PROMPT.md) (**ресёрч+полигон**, D39.89: арбитраж банка — критика текущего кода · голд · калибровка уверенности моделей · формы консилиума · инжект/фетч · рекомендации; расширение Q2 строки 5, запуск по слову владельца). Фронт-промт — в чужой зоне `frontend/docs/`. +- Активные хендофф-промты сессий (состав обновляется при каждом лендинге — норма D39.80): [ORCHESTRATOR_SESSION_PROMPT.md](ORCHESTRATOR_SESSION_PROMPT.md) (роль/нормы; состояния не дублирует) · [POLYGON_PACKAGE4_SESSION_PROMPT.md](POLYGON_PACKAGE4_SESSION_PROMPT.md) (полигон, отложен). [BACKEND_REPO_STANDARDS_SESSION_PROMPT.md](BACKEND_REPO_STANDARDS_SESSION_PROMPT.md) (**текущий бэкендный**, D39.92: линтер/CI/Makefile · бамп зависимостей с живой пробой провода · гарды→analyzer с паритетом посадок; этап 0 = пять шиппинг-конфигов на `low`, строка 112; предшественник — ручка эффорта — исполнен, ПРИНЯТ D39.91 и заархивирован) · [BANK_ARBITRATION_RESEARCH_SESSION_PROMPT.md](BANK_ARBITRATION_RESEARCH_SESSION_PROMPT.md) (**ресёрч+полигон**, D39.89; ⚠ заход 02.08 ПРЕРВАН владельцем, находки в дерево не попали — перед пере-выдачей промт ПОДРЕЗАТЬ по D39.90 п.5: §3-A+B1+B3, B2 → под-проба, §5-C отложен, потолок $1.20; вопрос владельцу о находках прерванной сессии открыт, D39.94 п.4). Фронт-промт — в чужой зоне `frontend/docs/`. - Зоны фронта (чужие, читать при касании стыка; каждая ведёт СВОЙ зонный бэклог — единый бэклог их строк не принимает, D39.84): [../frontend/](../frontend/) — веб-интерфейс: промт фронт-сессий S0–S7 + [STACK_DECISIONS.md](../frontend/docs/STACK_DECISIONS.md) (пины версий точными числами и ловушки, сверены с вебом 02.08) + [BACKLOG.md](../frontend/docs/BACKLOG.md) · [../platform/](../platform/) — SaaS control plane: README-заглушка + [BACKLOG.md](../platform/BACKLOG.md). - `archive/` — история ([правила архива](archive/README.md)): закрытые промты (`prompts/`) · отчёты с ревью-шапками (`reports/` — на них ссылаются приёмки) · исполненные арх-доки (`architecture/`) · слайсы хроники `PROGRESS-*.md`. Инструкции оттуда не исполнять. - Диаграммы: [../backend/docs/components.puml](../backend/docs/components.puml) · [../backend/docs/pipeline.puml](../backend/docs/pipeline.puml) — дом рядом с кодом (D39.80), правятся бэкендом одним коммитом с кодом; вручную НЕ рендерить (владелец смотрит PlantUML-расширением VS Code). diff --git a/docs/architecture/05-decisions-log.md b/docs/architecture/05-decisions-log.md index f4b8c591..f670de1d 100644 --- a/docs/architecture/05-decisions-log.md +++ b/docs/architecture/05-decisions-log.md @@ -1,4 +1,4 @@ -# Журнал решений оркестратора — контракт D1–D39.91 (развязки 04.07 · пакеты 09–10.07 · приёмка/качество-первым/пивот/эмпирика 11–12.07 · арх-ресет+стройка пере-прогонного стека 13–19.07) +# Журнал решений оркестратора — контракт D1–D39.95 (развязки 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`. @@ -1352,3 +1352,39 @@ API-529-долг закрыт: 8-осевой refute-by-default воркфлоу **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). + +## D39.92 — РЕШЕНИЯ ВЛАДЕЛЬЦА 02.08 (вечер): строка 46 пере-поставлена как closed-set «не тот язык, что просили», строка 107 САНКЦИОНИРОВАНА целиком (CI+линтер+бампы, промт выдан), строка 112 САНКЦИОНИРОВАНА, вендор-сверка DeepSeek исполнена. ✅ + +**1. Строка 46 — переформулировка владельца ратифицирована как ПОСТАНОВКА задачи.** Слово владельца: нужен не языковой детектор, а детектор «вернуло НЕ на том языке, что просили» (closed-set, нулевая гипотеза «текст на N», аттракторы: en · язык источника · сиблинги N); полноценный LID — максимум запасной флаггер ВНЕ пути вердикта; «сбой» — четыре режима (эхо · уход в другой язык · дрейф в середине · мета/деградация), гнать всё через один детектор — ошибка проектирования; в коде проверку изолировать отдельным слоем. **Констатация приёмки: ресёрч бэкендеров ЗАПИСАН и отвечает этой постановке почти пункт-в-пункт** (`EFFORT_HANDLE_2026-08-02.md` §5.1–5.3, живые носители — строки 46/113/108): four-modes = Guerreiro (разные детекторы на режим, §5.1); closed-set и аттракторы подтверждены (en — доминирующий аттрактор, наши 2/20 английские); эхо у нас ловится БЕЗ LID и лучше Левенштейна — `sourceScriptShare` 18/20 при 0 FP и запасе 13× (для zh→ru письменности далёкие); слой «скрипт детерминированно» = и есть предлагаемый экран `targetScriptShare` на `lang.LangScripts` (шаг 4 плана §5.4 — ЧИСТОЙ изолированной функцией, ровно «изолировать отдельно»); abstain-вердикт есть (пол 200 букв); срез терминов/латиницы = `cultivation` в сиде. **Расхождения с текстом владельца — ДВА, оба замером на нашем корпусе:** (а) гарантия Неймана–Пирсона FPR ≤ 0.1% на этом корпусе не покупается — независимых позиций 114, правило трёх даёт ≤ 2.594% (в 26 раз слабее), а калибровка порога на той же выборке двоит данные ⇒ порог ставится консервативной КОНСТАНТОЙ в пустом интервале [0.0000; 0.9767] и версионируется как контракт (не как тюнинг); (б) замыкание алфавита (L2) и посегментный worst-of LR (L4) на СЕГОДНЯШНЕМ корпусе отвергнуты числами (болгарский алфавит ⊂ русского — L2 нулевой; у L4 ноль положительных примеров и умножение FPR на число сегментов; lingua-go недетерминистична 6/23 на 20k повторов даже в closed-set режиме — в путь вердикта нельзя, как ЗАПАСНОЙ офлайн-флаггер вне вердикта допустима) — это отказ ПО ДАННЫМ ОДНОЙ КНИГИ, при сиблинг-инциденте реестр 108 возвращает вопрос (дискриминатор уже назван: плотность ы/э/ё ниже ожидания). Слой 0 владельца (отношение длин len(out)/len(in) вне полосы пары) в ресёрче НЕ рассматривался — добавить ЗАМЕРОМ на корпус-фикстуре строки 113 (дёшево, решит фикстура). **Исполнение:** форма (а) из D39.90 п.3 + изолированный модуль; порядок §5.4 в силе (фикстура 113 → чистая функция → офлайн-дифф → бамп `classifierVersion`); ⚠ денежный шаг 6 (бамп версии = снапшот всех книг) — ПО-ПРЕЖНЕМУ под отдельную подпись владельца, сегодня не санкционирован. + +**2. Строка 107 — САНКЦИЯ ЦЕЛИКОМ: «делаем по стандартам индустрии».** CI + линтер + бамп `x/net` и библиотек; подход «осторожный, затем полный»; самописные AST-тест-гарды заменить штатной формой, «спилив лишний мусор»; ограничение равной силы: **стандарты не должны мешать разрабатывать, тормозить и приводить модели к хакам** (в промте — анти-хак-правило: спорное правило линтера ВЫКЛЮЧАЕТСЯ с причиной, а не обходится в коде; голый nolint запрещён). Промт выдан: `docs/BACKEND_REPO_STANDARDS_SESSION_PROMPT.md` — этапы: 0) строка 112 · A) $0-замер report-only · B) состав+режим по числам · C) Makefile/`make battery`+CI · D) бамп с живой пробой провода ≤$0.50 (x/net/http2 = транспорт) · E) гарды→analyzer с паритетом 12 посадок, снос тест-гардов только после 12/12 (Д7 исполняется там же). Три СТОП-пинга: >1000 находок · >30 файлов правок разом · любое изменение поведения провода. + +**3. Строка 112 — САНКЦИЯ: править все пять шиппинг-конфигов сейчас** (`reasoning: "low"` на черновике), перекупка снапшотов старых книг при их следующем прогоне принята, новые книги $0. Внесено этапом 0 промта п.2; редакторские/финальные `off` не трогаются (Д11). + +**4. Строка 116 — рекомендация оркестратора подана владельцу:** порог классификатора пере-ратифицировать выборочным — **«≥4/5 прогонов N=5 достигают 6/6»** (пер-прогонный критерий 6/6 сохраняется, контракт становится выборочным; совпадает с замеренным `low` и дефолтом рига). Ждёт слова владельца; альтернатива, если хочет жёстче: порог по дискриминирующему подмножеству 4/4 без двух термов-припоминаний. + +**5. Вендор-сверка DeepSeek исполнена по правилу 10.07 (веб, не гадание).** Вопрос владельца: «полного лечения эха нет? модель хуже прежней? мигрировать?» Ответ тремя фактами: (а) наши замеры — `low` стену НЕ убирает, а разрежает (1/5 батчей всё ещё умирает на потолке с `reasoning=7999`), эхо лечится эскалацией (2/20 в пробе), т.е. РЕЖИМ УПРАВЛЯЕМ, но не вылечен; (б) интернет ДЕГРАДАЦИЮ НЕ подтверждает: 0731 = официальный релиз flash (re-post-train, бенчи ВВЕРХ, вкл. agentic) — наш отказ это не «модель хуже», а СМЕНА ПОЛИТИКИ ДЕФОЛТА (thinking по умолчанию `high`) на плотном хане, и ключ `reasoning_effort` — штатный вендорский рычаг, который мы теперь и используем; (в) ⚠ вендор анонсировал смену МАППИНГА эффорта `deepseek-v4-pro` «early August 2026» ⇒ квирк 3а («у pro эффорт не настраивается, low→high») может устареть со дня на день — **вахта заведена в реестр 108** (триггер: аномалия редакторского арма / дата > 05.08 ⇒ пере-проба маппинга + сверка changelog; абсорбция в 00-provider-quirks — полигоном по его зоне). Миграция черновика с deepseek — вопрос ЗАМЕРА, не решения сейчас: при работающем `low` приоритет низкий; кандидаты (glm-5, mistral, qwen) меряются той же пробой формы bank-low, когда/если владелец даст добро — строкой не заводится до его слова. + +**6. Строка 5 (банк-ресёрч) — статус подтверждён владельцу:** промт `BANK_ARBITRATION_RESEARCH_SESSION_PROMPT.md` жив, но заход по нему прерван владельцем досрочно, артефактов в дереве НЕТ (проверено №10) — находки существуют только в истории той закрытой сессии. Диспозиция пере-запуска ратифицирована (D39.90 п.5: §3-A+B1+B3, B2 → под-проба, §5-C отложен, потолок $1.20); промт будет подрезан оркестратором ПЕРЕД пере-выдачей. Вопрос владельцу открыт: вытащит ли он находки из истории прерванной сессии (тогда они входом в подрезанный заход), или пере-запуск с нуля. + +## D39.93 — Дизайн-ввод владельца по строке 46 (02.08, ночь): проверки выхода — ИЗОЛИРОВАННЫМ модулем с ИМЕНОВАННЫМИ причинами; деталь «переиспользовать FlagCJKArtifact» СНЯТА в пользу именованного флага. ✅ + +Слово владельца: «какая разница почему пришёл отказ — бэкенду надо ПРИЧИНУ назвать (эхо · не тот язык · вообще не ответила); я выступаю за степень изолированности кода» + классический вопрос «сколько стоит добавить пару». Следствия, вносимые в дизайн пака экрана ДО его выдачи: (1) детекторы выхода живут отдельным пакетом чистых функций (вход: текст + дата-план цели; выход: именованный вердикт + счёт), движок только вызывает и маппит в диспозицию; (2) **деталь §3.6 отчёта «переиспользовать `FlagCJKArtifact` для нового экрана» СНЯТА** — она экономила правку `escalatable()`, но ВРЁТ о причине (off-target-язык лёг бы в телеметрию как «артефакт исходной письменности»); правильно: новый именованный флаг + явное включение в белый список `escalatable()` (диспозиция та же: эскалируем, не ретраим); (3) пары: сам экран пар-слепой (скрипт-набор цели из `data/lang-script.txt`), новая пара = строка данных; известные ограничения — 115 (явный embed-список: новая ЦЕЛЬ сегодня требует правки Go) и семантика ПОДМНОЖЕСТВ письменностей для ja/ko (чисто китайский выход для →ja набирает 1.000 — решается в данных набором скриптов, не в Go). Попутно: предложение владельца по DeepSeek «поднять токены размышления при low» = ровно открытый замер строки 44 (вариация флора при `low` не проводилась; при `high` фальсифицировано D39.86) — мини-проба ждёт его санкции. + +## D39.94 — ЗАКРЫТИЕ СЕССИИ ОРКЕСТРАТОРА №11 (02.08): состояние передачи. ✅ + +**1. Сделано:** приёмка бэкенд-пака 104/46/16 исполнением — ПРИНЯТ, код `553f1a3`, строка 104 закрыта (D39.91) · решения владельца ратифицированы: 46 пере-поставлена closed-set, 107 санкционирована целиком, 112 санкционирована (D39.92) · дизайн-ввод по 46: изолированный пакет детекторов, именованные причины отказа, именованный флаг вместо реюза `FlagCJKArtifact` (D39.93) · выдан `BACKEND_REPO_STANDARDS_SESSION_PROMPT.md` (линтер/CI/бампы/гарды→analyzer; этап 0 = пять шиппинг-конфигов на `low`). + +**2. Ждёт исполнения:** бэкенд-сессия по промту стандартов; её приёмка — преемником по образцу D39.91 (батарея + фрозен-числа + посадки-паритет 12 обходов этапа E + предъявление живой пробы этапа D ≤$0.50). + +**3. Ждёт выдачи (преемник):** промт пака экрана 46. Порядок жёсткий: фикстура+регресс (113) → изолированный модуль с именованными вердиктами → офлайн-дифф по всем чекпойнтам (ожидание: ровно 2 строки меняются, СТОП при любой здоровой) → денежный шаг (бамп `classifierVersion`) ТОЛЬКО с подписью владельца. Ограничения: D39.92 п.1 (порог константой-контрактом · abstain 200 букв · слой-0 длин добавить замером · Hunspell/GlotScript/LID в путь вердикта НЕ строить) + D39.93 (именованный флаг + `escalatable()`; скрипт-НАБОРЫ цели в данных — ja/ko). Тем же диффом: Д2 (`detectLatinInsertion` под `TargetScriptNonLatin`) и Д3 (`SourceEchoExpected` для classifier) — строки 46/105. + +**4. Открыто на владельце (ответа при закрытии НЕТ):** 116 — форма порога классификатора (подано «≥4/5 прогонов N=5 дают 6/6»; альтернатива — 4/4 по дискриминирующему подмножеству) · строка 5 — вытащить находки прерванного банк-ресёрч-захода из истории той сессии ИЛИ пере-запуск с нуля; в обоих случаях промт ПОДРЕЗАТЬ перед выдачей по D39.90 п.5 (§3-A+B1+B3 · B2 → под-проба · §5-C отложен · потолок $1.20) · мини-проба строки 44 «low + потолок 16k на упавшем классе батчей» (~$0.05) — идея владельца, санкции нет · подпись денежного шага по 46 (когда дойдёт). + +**5. Вахты и грабли преемнику:** вендор-анонс смены маппинга эффорта `deepseek-v4-pro` «early August 2026» — реестр 108, триггер: дата >05.08 или аномалия редакторского арма; `medium` на DeepSeek не ставить (вендор документирует low/high/max — Д5, реестр 108); фронт-сессия ЖИВАЯ и коммитит сама (D39.88, только pathspec); дерево на закрытии чисто от бэкенд/докс-зон, незакоммиченное в дереве — фронта и `START_PROMT.MD`. + +**6. Очередь скриптом:** 97 строк · «скоро» 15 (2·4·5·18·46·49·55·95·107·108·109·112·113·114·116) · блокеров 0. + +## D39.95 — Пост-клоуз гигиена по речеку владельца: онбординг-хвосты добиты (02.08, ночь). ✅ + +Речек владельца «перечитай онбординг» вскрыл хвосты, пропущенные лендингами №11: (1) **строка 74 ЗАКРЫТА** — её собственная буква «закрывается приёмкой этого пака» исполнилась в D39.91, а строка осталась в таблице; развилка решена (б) ещё D39.87, обе половины замера исполнены (флор-фальсификация · low-оживление), остатки давно живут в именованных строках: конфиги → 112 · экран → 46 · холодный прогон → 16 · число флора → 44; очередь после закрытия — **96 строк** (счёт D39.94 «97» устарел этой нотой). (2) Промт `BACKEND_EFFORT_HANDLE` заархивирован с баннером приёмки, карта промтов README обновлена (текущий бэкендный — `BACKEND_REPO_STANDARDS`, банк-ресёрч помечен прерванным с диспозицией подрезки). (3) Буллеты CURRENT-STATE «Курс»/«Горизонт»/«Стек» освежены: ре-проба 74 — исполнена, не будущее; стоячее ограничение перед платными прогонами теперь — строка 112 (шиппинг-конфиги до лендинга покупают пустые ответы); «editor v4-pro вендором НЕ тронут» дополнено анонсом смены маппинга (вахта 108). (4) Шапка-диапазон этого файла и счётчик ролей в промте оркестратора доведены до D39.95. Урок в копилку №12: закрытие строки обязано триггерить греп по её НОМЕРУ во всех живых доках — буквы «закрывается X» в чужих строках и буллетах не закрываются сами. diff --git a/docs/BACKEND_EFFORT_HANDLE_SESSION_PROMPT.md b/docs/archive/prompts/BACKEND_EFFORT_HANDLE_SESSION_PROMPT_2026-08-02.md similarity index 99% rename from docs/BACKEND_EFFORT_HANDLE_SESSION_PROMPT.md rename to docs/archive/prompts/BACKEND_EFFORT_HANDLE_SESSION_PROMPT_2026-08-02.md index b8e589a6..def43c25 100644 --- a/docs/BACKEND_EFFORT_HANDLE_SESSION_PROMPT.md +++ b/docs/archive/prompts/BACKEND_EFFORT_HANDLE_SESSION_PROMPT_2026-08-02.md @@ -1,3 +1,5 @@ +> ✅ **ИСПОЛНЕН И ПРИНЯТ (D39.91, 02.08.2026, код `553f1a3`).** Отчёт: `../reports/EFFORT_HANDLE_2026-08-02.md` (ревью-шапка приёмки). Работа B выделена в пак экрана 46 (D39.92 п.1 + D39.93), работа C не стартовала (строка 16 жива). + # Промт бэкенд-сессии: РУЧКА ЭФФОРТА + ЭКРАН ЦЕЛЕВОГО ЯЗЫКА + ДОБИВКА ХОЛОДНОГО ПРОГОНА (строки 104 · 46 · 16) **Выдан 02.08.2026, оркестратор №10; решение владельца по развилке строки 74 (D39.87): вариант (б) — явный `reasoning_effort: "low"` для черновика ПЛЮС правка Go, дающая ручку тем ролям, у которых её нет.** Зона: `backend/` + стенд `~/books/gu-zhenren/coldrun-b/` + свой отчёт в `docs/archive/reports/`. **НЕ коммитить** — лендит оркестратор. **Первый деливерабл — эхо-блок ≤10 строк** (первым сообщением ДО работы: как понял скоуп / три работы и их СТОП-точки / потолки денег / что вне скоупа; подтверждения не жди — работай до СТОП-условий).