diff --git a/CLAUDE.md b/CLAUDE.md index cbef57af..52609bed 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -21,13 +21,13 @@ Go-бэкенд издательского художественного пер | **Фронт** | `frontend/` | нет — лендит оркестратор | читать можно; пинги, итоги и вопросы — ЗОННЫЙ журнал `frontend/docs/frontend-PROGRESS.md` (решение владельца 02.08/04.08; в `docs/PROGRESS.md` фронт НЕ пишет), туда же пишет и оркестратор; продуктовые требования — `docs/product-requirements.md`, НЕ из памяти | | **Платформа** | `platform/` (SaaS control plane: пользователи/квоты/очередь/HTTP; движок дёргает процессами, D39.81) | нет — лендит оркестратор | читать можно; пинги и итоги — ЗОННЫЙ журнал `platform/docs/platform-PROGRESS.md` (решение владельца 04.08), в `docs/PROGRESS.md` не пишет | -Координация — журнал `docs/PROGRESS.md` (секции «Бэкенд»/«Полигон»/«Память»/«Голос и состояние»/«Ридер-IDE»; сверху CURRENT-STATE). Записывай туда краткие итоги своей сессии. Закрытые хроники вынесены в слайсы `docs/archive/PROGRESS-*.md` — НЕ читать при онбординге, только по конкретной ссылке. Параллельные сессии — норма: чужие незакоммиченные файлы в дереве не трогать; сессия считается ЖИВОЙ, пока владелец не сказал обратное. +Координация — журнал `docs/PROGRESS.md` (секции «Бэкенд»/«Полигон»/«Память»/«Голос и состояние»/«Ридер-IDE»; сверху CURRENT-STATE). Записывай туда краткие итоги своей сессии — **кроме фронта и платформы: их итоги/пинги ТОЛЬКО в зонных журналах** `frontend-PROGRESS.md`/`platform-PROGRESS.md` (решение владельца 04.08, D39.100). Закрытые хроники вынесены в слайсы `docs/archive/PROGRESS-*.md` — НЕ читать при онбординге, только по конкретной ссылке. Параллельные сессии — норма: чужие незакоммиченные файлы в дереве не трогать; сессия считается ЖИВОЙ, пока владелец не сказал обратное. ## Источники истины (по убыванию) 1. **`docs/architecture/05-decisions-log.md`** — ратифицированный контракт; при конфликте с любым другим доком побеждает он; сверху файла — карта актуальности (что чем superseded), свежая голова — С ХВОСТА файла. **Правило чтения (онбординг-диета 25.07): карта + живая голова (эра D39.x); корпус D1–D38 = справочник — по ссылкам/grep по D-номеру, целиком НЕ читать.** 2. `docs/experiments/00-provider-quirks.md` — wire-квирки провайдеров (читать ПЕРЕД правкой адаптеров/вызовами провайдеров). -3. `docs/architecture/09-target-architecture.md` (7 слоёв; статус стройки — шапка-таблица) · `12-go-style-notes.md` (норматив общности §0) · `10-prompt-architecture.md` (промпт-тема). +3. `docs/architecture/09-target-architecture.md` (7 слоёв; статус стройки — шапка-таблица) · `12-go-style-notes.md` (норматив общности §0) · `10-prompt-architecture.md` (промпт-тема) · `14-api-contract/` — **ратифицированный контракт API v0 фронт↔платформа** (OpenAPI 3.1 + компаньон, D39.99). 3а. `docs/product-requirements.md` — реестр «что продукт обязан уметь» (производный от ЖИВОГО брифа владельца `START_PROMT.MD` V0–V5 + находок H6–H18; статусы сверены кодом, актуализирует оркестратор при лендингах). Новые V-идеи владельца разбираются сюда, не остаются невидимыми. 4. `docs/architecture/01-decisions.md` (Р1–Р10), `02-mvp-plan.md`, `04-unhappy-paths.md`, `06-memory-risk-registry.md` — тела исторические, читать через ⚠-баннеры 25.07. 5. `docs/research/*` — фактура; часть под ⚠ superseded/построено-баннерами — читай баннер прежде содержимого. @@ -56,4 +56,4 @@ Go-бэкенд издательского художественного пер 1. Этот файл → `docs/README.md` (карта) → CURRENT-STATE в `docs/PROGRESS.md`. Непонятный жаргон/сокращения — `docs/glossary.md`. 2. `docs/architecture/05-decisions-log.md`: карта актуальности (шапка) + живая голова (D39.x). Целиком НЕ читать — корпус D1–D38 по ссылкам/grep по мере надобности. -3. По роли: Бэкенд — `backend/README.md` + `03-implementation-notes.md` (через баннер) + `12-go-style-notes.md`; Полигон — `eval/README.md` + `experiments/00` + `09-pilot-protocol.md`; Фронт/продукт — `docs/product-requirements.md` + `research/16` (через ревью-шапку); всем — шапка-таблица `09-target-architecture.md` (статус слоёв). +3. По роли: Бэкенд — `backend/README.md` + `03-implementation-notes.md` (через баннер) + `12-go-style-notes.md`; Полигон — `eval/README.md` + `experiments/00` + `09-pilot-protocol.md`; Фронт/продукт — `docs/product-requirements.md` + `research/16` (через ревью-шапку) + контракт `architecture/14-api-contract/`; Платформа — `platform/README.md` + зонный журнал + `research/23` + контракт 14; всем — шапка-таблица `09-target-architecture.md` (статус слоёв). diff --git a/docs/ORCHESTRATOR_SESSION_PROMPT.md b/docs/ORCHESTRATOR_SESSION_PROMPT.md index 0b81c95f..20f327d0 100644 --- a/docs/ORCHESTRATOR_SESSION_PROMPT.md +++ b/docs/ORCHESTRATOR_SESSION_PROMPT.md @@ -2,7 +2,7 @@ ## ХЕНДОФФ №8 → №9 (26.07.2026, вечер) -> **Счётчик ролей — канонический ОДИН:** «оркестратор №N» (сейчас №12 — хендофф 02.08.2026 ночью, №11 закрыт после D39.95; состояние передачи — D39.94 + PROGRESS CURRENT-STATE, отдельной записки нет). «Передача роли №6» в заголовке файла и «ХЕНДОФФ №8→№9» — исторические номера эстафеты документа, текущим счётчиком НЕ являются (фидбек новой сессии 02.08). +> **Счётчик ролей — канонический ОДИН:** «оркестратор №N» (сейчас №13 — хендофф 04.08.2026, №12 закрыт после D39.101; состояние передачи — D39.101 + 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-лога). @@ -12,7 +12,7 @@ **Норма «дисциплина ответа» (владелец 26.07, для Opus-класса моделей — вставлять в каждый сессионный промт):** эрудиция ≠ улика (грунт `file:line`/замер или пометка «мнение») · не пересказывать промт · плотность, не объём · без шаблонных оговорок и советов вне скоупа · комментарии 1–2 строки, улики — в отчёт. -**Норма приёмки и усилий (владелец 30.07, ужесточает пропорциональность 25.07):** тяжёлый агентный аппарат (воркфлоу-верификаторы, панели) — ТОЛЬКО поверх серьёзных перестроек и дизайнов; в остальном сессиям доверяем. Значительные изменения → промт сессии несёт цикл «план → синк по вопросам → чтение доков полигона/оркестратора → исполнение → самоверификация ТОЙ ЖЕ сессией». Оркестратор: КОРОТКАЯ приёмка чтением отчёта · общее планирование над репо · досинхронизация команды (полигону — инструкции смотреть на бэкенд, бэкенду — на полигон-экспы) · правка недосинхронизированных мест. Токены беречь: болтливость сессий подрезать промтами, свои усилия — тоже. +**Норма приёмки и усилий (владелец 30.07; ⚠ часть «короткая приёмка чтением отчёта» АМЕНДИРОВАНА владельцем 03.08 — приёмка ВСЕГДА адверсариальная, блок «Анти-паттерны приёмки» ниже; экономия остаётся для промтов/планирования):** тяжёлый агентный аппарат (воркфлоу-верификаторы, панели) — ТОЛЬКО поверх серьёзных перестроек и дизайнов; в остальном сессиям доверяем. Значительные изменения → промт сессии несёт цикл «план → синк по вопросам → чтение доков полигона/оркестратора → исполнение → самоверификация ТОЙ ЖЕ сессией». Оркестратор: КОРОТКАЯ приёмка чтением отчёта · общее планирование над репо · досинхронизация команды (полигону — инструкции смотреть на бэкенд, бэкенду — на полигон-экспы) · правка недосинхронизированных мест. Токены беречь: болтливость сессий подрезать промтами, свои усилия — тоже. **Норма самопроверки сессий (владелец 01.08, «ВСЕГДА. НА ВАЖНЫХ»):** промт ЛЮБОЙ важной сессии (бэкенд-паки, ресёрчи, платные полигон-пакеты) ОБЯЗАН нести явный мандат самопроверки исполнением; на мелких задачах — самопроверка меньше, без тяжёлого аппарата. В мандат включать урок D39.61: «вывод на агрегате до вскрытия единиц запрещён — перед сравнительным выводом открыть хотя бы одну единицу с каждой стороны»; для денег — два независимых пути счёта; помнить «леджер = нижняя граница» (строка 78). **Триаж находок (урок 02.08):** триаж многоисточниковых свипов/ревью завершать МАШИННОЙ сверкой «каждая рекомендация → живой носитель (строка/дописка/D-закрытие)», не глазами — глазной триаж уронил 5 из ~95 рекомендаций (ведро D и др., D39.72/73). @@ -25,7 +25,7 @@ ## Кто ты -Ты — **оркестратор** проекта TextMachine (Go-бэкенд издательского художественного перевода ранобэ/вебновелл zh/ja/en→ru мультиагентным LLM-пайплайном; инвариант общности §0.1: ЛЮБАЯ книга/пара/структура, пара = ось данных). Владелец стартует рабочие сессии по промтам, которые пишешь ты («Бэкенд» → `backend/`, «Полигон» → `eval/`+`docs/experiments/`, ресёрч → `docs/research/`); они отчитываются владельцу, он пересылает отчёты тебе. Владелец — твой связной между всеми сессиями: короткие записки для пересылки (промты живут файлами, записки — компактные). +Ты — **оркестратор** проекта TextMachine (Go-бэкенд издательского художественного перевода ранобэ/вебновелл zh/ja/en→ru мультиагентным LLM-пайплайном; инвариант общности §0.1: ЛЮБАЯ книга/пара/структура, пара = ось данных). Владелец стартует рабочие сессии по промтам, которые пишешь ты («Бэкенд» → `backend/` · «Полигон» → `eval/`+`docs/experiments/` · ресёрч → `docs/research/` · «Фронт» → `frontend/` · «Платформа» → `platform/`); они отчитываются владельцу, он пересылает отчёты тебе. Прогресс/пинги фронта и платформы — ТОЛЬКО в зонных `frontend-PROGRESS.md`/`platform-PROGRESS.md` (D39.100): читай их при каждом лендинге зоны. Владелец — твой связной между всеми сессиями: короткие записки для пересылки (промты живут файлами, записки — компактные). **Зона записи:** `docs/` + корневые онбординг-доки. Чужие зоны читать/ревьюить; коммитишь их работу ты после приёмки (сессии не коммитят; исключение — пре-рег фризы полигона). **Функции:** (1) внешнее ревью каждого пакета ДО коммита; (2) ратификация решений D-блоками; (3) хендофф-промты; (4) синхронизация доков; (5) ответы владельцу с честной калибровкой. @@ -47,7 +47,7 @@ - **Свип зонных решений владельца (урок D39.99 п.4):** при каждом лендинге зоны вычитать из зонного журнала НОВЫЕ «решения владельца» и вынести на confirm списком; решение, живущее только в зонном доке при противоречащем каноне, — дефект синхронизации, чинится ратификацией или опровержением, не молчанием. - **Анти-паттерны приёмки:** приёмка проверяет НАПРАВЛЕНИЕ и решения пака, не только клеймы отчёта. Шесть ловушек: след отчёта (проверяешь лишь названные автором места) · связность вместо истинности (форма отчёта убеждает сама) · соглашательство с чёткой позицией (распространенная ошибка ллм моделей склонных соглашаться с человеком) · рационализация задним числом · слепой участок общих моделей обученных на одинх и тех же данных (выводы одной модели усиливают уверенность в правильности другой) · экономия усилия на неудобном. Механика-минимум: ≥1 верификатор выносит мнение по промту+диффу ДО чтения отчёта · ≥1 ищет дефекты ВНЕ карты отчёта · экспериментальный клейм без ре-рана (хотя бы редуцированного) в D-ноте помечается «со слов сессии», не «исполнением» · «решение владельца», известное только со слов сессии, НЕ ратифицируется — список confirm/deny владельцу ДО лендинга, если решение несущее · к утверждениям самой приёмки та же дисциплина «заявление=команда» (догадку фактом не подавать) · оценочные эпитеты в ноты не писать. - **Пре-рег дисциплина полигона:** фриз коммитом ДО платных вызовов (единственный коммит сессии); изменения после = новый experiment-ID; девиации — явно в отчёте; стоп-гейты по бюджету легитимны; «если не влезает — стоп и пинг, не резать молча». -- **Лендинг:** микро-дефекты доков чинишь сам с пометкой «испр. оркестратором»; отчёты получают ревью-шапку; код не правишь — находки в фикс-лист; коммиты скоуп-раздельные, стейджинг пофайловый; `git status` перед каждым коммитом (в дереве бывают ≥2 живые сессии) + **`git diff --cached` перед `commit`** — коммит уносит ВЕСЬ индекс: чужой staged `git mv` уедет в твой коммит (инцидент 77dd9b8); `add` общего файла сметает чужую секцию — diff-контент/`add -p`. **Лендинг, двигающий файлы или состав активных промтов, обновляет `docs/README.md` тем же коммитом** (норма D39.80; урок 02.08: README объявлял заленденный пак «можно запускать» с мёртвой ссылкой — поймал не процесс, а новая сессия). Статус/голову README не несёт вовсе — единственный носитель состояния = PROGRESS CURRENT-STATE. **Перед коммитом ратификации — механический чек головы:** `grep "голова D" docs/PROGRESS.md` обязан показать номер ТОЛЬКО ЧТО ратифицированной ноты (голова отставала дважды: D39.81 и D39.83 — оба раза «Текущее» обновлено, число головы забыто). +- **Лендинг:** микро-дефекты доков чинишь сам с пометкой «испр. оркестратором»; отчёты получают ревью-шапку; код не правишь — находки в фикс-лист; коммиты скоуп-раздельные, стейджинг пофайловый; `git status` перед каждым коммитом (в дереве бывают ≥2 живые сессии) + **`git diff --cached` перед `commit`**; коммит — ТОЛЬКО pathspec-формой `git commit -- <путь>`, стейдж и коммит одной командой (git-канон v2, D39.98) — голый коммит уносит ВЕСЬ индекс: чужой staged `git mv` уедет в твой коммит (инцидент 77dd9b8); `add` общего файла сметает чужую секцию — diff-контент/`add -p`. **Лендинг, двигающий файлы или состав активных промтов, обновляет `docs/README.md` тем же коммитом** (норма D39.80; урок 02.08: README объявлял заленденный пак «можно запускать» с мёртвой ссылкой — поймал не процесс, а новая сессия). Статус/голову README не несёт вовсе — единственный носитель состояния = PROGRESS CURRENT-STATE. **Перед коммитом ратификации — механический чек головы:** `grep "голова D" docs/PROGRESS.md` обязан показать номер ТОЛЬКО ЧТО ратифицированной ноты (голова отставала дважды: D39.81 и D39.83 — оба раза «Текущее» обновлено, число головы забыто). - **Findings-ledger процесс (концерн 5):** каждая находка — явная диспозиция до закрытия; вопросы «к бэкенду» из ресёрчей маршрутизируются обратно; completeness-critic на границах фаз. - **Ратификация:** D-блоки (образцы D39.х), PROGRESS-запись; владельцу — деньги сверх мелочи, скоуп-сдвиги, продукт, 18+. - **Стиль с владельцем:** прямота, честная калибровка (verified ≠ гипотеза), признавай ошибки явно, без жаргона и сокращений в продуктовых ответах; каждое ревью: вердикты → что ратифицировано → что нужно от владельца. @@ -86,5 +86,5 @@ **Чего НЕ делать (тоже по переписи):** полировать промты сверх нормы выше (потолок канала — 5/180) · параллельные сессии без крайней нужды (13/180 — все коллизии оттуда) · процессы тяжелее этих строк. **Свобода сессий + верификация > предписание** (0/180 инцидентов класса «слишком много свободы»; лучшие решения паков 14/15 родились в размеченной свободе). -**Пропорциональность (поправка владельца 25.07 — токены сессий жгутся, экономить где можно):** весь аппарат выше — ПО ДЕЛУ, решает оркестратор по весу пака. **Тяжёлый** (дизайн / wire-двигающий / новый механизм / межпакетные швы) → полный аппарат: эхо-протокол, двухфазность, манифест заявление=команда, воркфлоу-приёмка. **Лёгкий** (механические хвосты, точечные фиксы, док-правки) → короткий пошаговый промт «куда посмотреть, что сделать», без церемоний; приёмка — инлайн-проверкой, не воркфлоу. Градация — на твоей совести; ошибка в сторону лёгкости чинится дельтой, ошибка в сторону тяжести — невозвратные токены. +**Пропорциональность (поправка владельца 25.07 — токены сессий жгутся, экономить где можно):** весь аппарат выше — ПО ДЕЛУ, решает оркестратор по весу пака. **Тяжёлый** (дизайн / wire-двигающий / новый механизм / межпакетные швы) → полный аппарат: эхо-протокол, двухфазность, манифест заявление=команда, воркфлоу-приёмка. **Лёгкий** (механические хвосты, точечные фиксы, док-правки) → короткий пошаговый промт «куда посмотреть, что сделать», без церемоний; приёмка — инлайн-проверкой, не воркфлоу (⚠ инлайн ≠ неадверсариально: минимум анти-паттернов — мнение до отчёта, поиск вне карты — действует и здесь, владелец 03.08). Градация — на твоей совести; ошибка в сторону лёгкости чинится дельтой, ошибка в сторону тяжести — невозвратные токены. 11. **Сэндбокс-репродукции через драйвер** (урок пака-16, 25.07): пак, меняющий ОТГРУЖАЕМЫЕ байты или добавляющий исполняемый механизм, самопроверяется и принимается ГОНЯЯ код через настоящий драйвер (overlay-тесты, mock-провайдер, сквозные сценарии), не чтением диффа: девять дефектов фазы 2 пака-16 прошли тесты автора и 4-линзовое чтение — поймало только исполнение панели/приёмки. diff --git a/docs/POLYGON_PACKAGE4_SESSION_PROMPT.md b/docs/POLYGON_PACKAGE4_SESSION_PROMPT.md index 6562d31b..ce996241 100644 --- a/docs/POLYGON_PACKAGE4_SESSION_PROMPT.md +++ b/docs/POLYGON_PACKAGE4_SESSION_PROMPT.md @@ -4,9 +4,9 @@ > **Дельта 01.08 №2 (свип полноты D39.66):** при переупаковке в пилот-преп-промт добрать строку 85 бэклога: Bertalign GOLD-пары + spot-check (D29.2в) · fidelity-каскад R2 shadow (D25.2) · exp08 v3 (D21.8); echo-калибровка D25.7 остаётся здесь residual-ом (не потеряна). > **Дельта 01.08 (оркестратор №9):** P4 fidelity-хвост (D21.9) из residual ЗАКРЫТ — D39.61, «цены верности не обнаружено», эмпирика P4 superseded весами 0731. Остальной residual (судья-дублёр D22.6 · echo-калибровка D25.7 · миграция `memory_eval` с gemini-2.5-flash, EOL 16.10 · пилот-пре-рег) жив, переупакуется в пилот-преп-промт при активации Ф2.5. > Как отдельная сессия пакет №4 **НЕ запускался**. Отработана только **Задача 1 (сид-мн.ч.)** — влита в сид v2 внутри exp13 (D32, `guzhenren-seed-v2.yaml`). **Открыто (пилот/18+/echo-трек — ортогонально бэкенд-курсу, в паки НЕ вносить):** -> - **Задача 2 (fix-лист D22.8):** (а) content-filter матчер подстрокой + самотест; (б) параметризация языка/жанра `explicit_judges.py`; (в) **миграция судьи `memory_eval.py` с gemini-2.5-flash** (EOL 16.10.2026 — `00-provider-quirks.md:74`); **(ж) проба судьи-дублёра 18+ (D22.6) — НАЗВАННЫЙ БЛОКЕР ПИЛОТА** (`09-pilot-protocol.md`, CURRENT-STATE). +> - **Задача 2 (fix-лист D22.8):** (а) content-filter матчер подстрокой + самотест; (б) параметризация языка/жанра `explicit_judges.py`; (в) **миграция судьи `memory_eval.py` с gemini-2.5-flash** (EOL 16.10.2026 — `00-provider-quirks.md`, секция календаря deprecations); **(ж) проба судьи-дублёра 18+ (D22.6) — НАЗВАННЫЙ БЛОКЕР ПИЛОТА** (`09-pilot-protocol.md`; бэклог — строка 64). > - **Задача 3 (D25):** echo-калибровка (D25.7); дополнения пре-регистрации пилота (D25.2/25.6/25.8 → `09-pilot-protocol.md`); minimal-pairs shadow fidelity (совместить с корпусом пилота). -> - **Задача 4 (D21.9):** P4 fidelity-хвост (35 пар); wire-аудит темп-свипа; D22.8-минорки (U+FF70 kana, append-only провенанс, judge-raw). +> - **Задача 4 (D21.9):** ~~P4 fidelity-хвост (35 пар)~~ **ЗАКРЫТ D39.61 (дельта 01.08 выше) — не исполнять**; живое: wire-аудит темп-свипа; D22.8-минорки (U+FF70 kana, append-only провенанс, judge-raw). > > **Порядок (обновлено 25.07, пост-D39.22):** это ПИЛОТ-трек, downstream текущего курса «разработка бэкенда» (эксп пере-прогона ЗАКРЫТ D39.22; exp14 закрыт D37, его промт в архиве). При активации пилот-препа — переупакую residual в свежий промт (или гони отсюда, слаги судей — live-фактчеком `/models`); судья-дублёр 18+ (п.2ж) остаётся НАЗВАННЫМ БЛОКЕРОМ пилота. Гигиена D39.20: авто-QA слепых пакетов ключевать слепыми метками. 18+: только существующие артефакты `eval/data`, счётчики/метаданные в отчёт. @@ -14,11 +14,11 @@ ## Кто ты и что делаешь -Ты — **полигон-сессия** (eval) TextMachine, пакет №4. Зона записи: `eval/` + `docs/experiments/` + курация сида `/home/ubuntu/books/gu-zhenren/guzhenren-seed.yaml` (вне git) — плюс своя секция в `docs/PROGRESS.md` → «## Полигон». **Ничего не коммитить** — лендинг у оркестратора. Приоритет №1 гейтит этап B приёмки; остальное — ратифицированная очередь D22.8/D25. +Ты — **полигон-сессия** (eval) TextMachine, пакет №4. Зона записи: `eval/` + `docs/experiments/` + курация сида `/home/ubuntu/books/gu-zhenren/guzhenren-seed.yaml` (вне git) — плюс своя секция в `docs/PROGRESS.md` → «## Полигон». **Ничего не коммитить, КРОМЕ пре-рег фриза** (единственный коммит сессии, ДО платных вызовов — исключение git-канона v2, D39.98); остальной лендинг у оркестратора. Приоритет №1 гейтит этап B приёмки; остальное — ратифицированная очередь D22.8/D25. ## Онбординг (~40 мин) -1. `CLAUDE.md` → CURRENT-STATE в `docs/PROGRESS.md` → отчёт «## Приёмка Ф1 … этап A» (разбор D10 и класс промахов). +1. `CLAUDE.md` → CURRENT-STATE в `docs/PROGRESS.md` → отчёт «Приёмка Ф1 … этап A» (ныне в архив-слайсе `docs/archive/PROGRESS-2026-07-10-13.md` — по прямой ссылке, слайс целиком не читать). 2. `docs/architecture/05-decisions-log.md`: **D24.2/D24.4 (сид), D25.6–25.8 (твои задачи из внешней критики), D22.8 (fix-лист)**, D21.9 (висящие поручения). 3. `eval/README.md` + `docs/experiments/00-provider-quirks.md` (шапка: правило двух направлений). @@ -45,7 +45,7 @@ ### 4. Висящие хвосты (D21.9, если останется ёмкость) -- **Fidelity-хвост P4** (35 пар; сырьё продублировано в `/home/ubuntu/books/gu-zhenren/research15-probes/`) — гейтит анти-эхо wiring. +- ~~**Fidelity-хвост P4**~~ **ЗАКРЫТ D39.61 — не исполнять** (сырьё в `/home/ubuntu/books/gu-zhenren/research15-probes/` остаётся для истории). - Wire-аудит пре-шаг temp-свипа; (г/д/е) D22.8-минорки: U+FF70 kana-корзина, append-only провенанс ретраев, judge-raw без `[:600]`. ## Дисциплина diff --git a/docs/PROGRESS.md b/docs/PROGRESS.md index 9099af91..e4bfd326 100644 --- a/docs/PROGRESS.md +++ b/docs/PROGRESS.md @@ -10,7 +10,7 @@ > - **ЕДИНЫЙ БЭКЛОГ — секция «Бэклог» ниже** (одна таблица, единственный трекер; каждая петля обязана иметь диспозицию: решено / отложено-с-записью / отклонено; ведёт оркестратор). **СЧЁТ ОЧЕРЕДИ на 04.08 (D39.99, скриптом по таблице; обновлять при каждом лендинге):** всего **103** строки · зона бэкенд **54** строго (ячейка ровно «бэкенд») / **67** широко (ячейка содержит «бэкенд»; прежние 58/66 считались префиксом — определения зафиксированы) · **блокеров очереди 0**, платные прогоны разблокированы (117 закрыта) · «скоро» **20** (2·4·18·46·49·55·99·100·101·103·108·109·113·114·116·118·119·120·121·125); строка 5 — НА ПРИЁМКЕ; остальное «когда-нибудь». ⚠ **Счёт — НИЖНЯЯ граница долга, а не потолок:** трекер содержит только замеченное, и 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+). -## Бэклог (ЕДИНЫЙ, собран 26.07, актуализация 02.08 D39.80; правки — только через оркестратора) +## Бэклог (ЕДИНЫЙ, собран 26.07, актуализация 04.08 D39.99/D39.101; правки — только через оркестратора) Закрытые строки здесь НЕ хранятся — они уходят в D-лог с номером решения. **ID строки стабилен навсегда** (не перенумеровывается и не переиспользуется — на «строку N» ссылаются доки и промты, D39.80). Вес: «блокер-очереди» = мешает текущему шагу · «скоро» = ближайшие 1–2 касания · «когда-нибудь» = записано, не потеряно. Длинная строка начинается жирным лидом — таблица сканируется по лидам. **Зонные бэклоги (решение владельца 02.08, D39.84):** фронт и платформа ведут СВОИ бэклоги (`frontend/docs/BACKLOG.md` · `platform/BACKLOG.md`) — их строки сюда НЕ заходят; здесь движок/полигон/доки, включая движковые стыки фронта (зона «бэкенд», как 99–102); строки 96/97 переехали в платформенный (П-1/П-2), надгробия-указатели сохранены. @@ -19,7 +19,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 · **02.08 вечер (D39.92): владелец напомнил про заход — статус: промт жив, заход был ПРЕРВАН владельцем, находки только в истории той сессии (вопрос: вытащит ли их владелец), пере-запуск — по подрезке D39.90 п.5 ($1.20), промт подрежет оркестратор перед выдачей** → **04.08 ПЕРЕ-ЗАПУСК ИСПОЛНЕН** (скоуп резался релеем, тело промта не правилось): артефакты в дереве, пинг — секция «Полигон»; предыдущий ⚠ «артефакта в дереве НЕТ» относится к прерванному заходу 02.08 и ЗАКРЫТ | полигон/ресёрч | **НА ПРИЁМКЕ №13** (заход исполнен 04.08, артефакты в дереве не залендены) | замер → дизайн → решение | 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), промт подрежет оркестратор перед выдачей** → **04.08 ПЕРЕ-ЗАПУСК ИСПОЛНЕН, промт заархивирован (`archive/prompts/`, D39.101)** (скоуп резался релеем, тело промта не правилось): артефакты в дереве, пинг — секция «Полигон»; предыдущий ⚠ «артефакта в дереве НЕТ» относится к прерванному заходу 02.08 и ЗАКРЫТ | полигон/ресёрч | **НА ПРИЁМКЕ №13** (заход исполнен 04.08, артефакты в дереве не залендены) | замер → дизайн → решение | 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 (оркестратор) | @@ -75,7 +75,7 @@ | 48 | Направленная банкнота — вернуться по замеру покрытия терминолога | бэкенд | когда-нибудь | отдельное решение | D39.42 | | 48а | **Серийный шаринг банка** — РЕАЛИЗАЦИЯ (экспорт подписанного глоссария как сид-YAML следующей книги серии; спойлер-окна плющатся в since_ch=0); контракт round-trip держится тестом, самой фичи нет | бэкенд | когда-нибудь (перед второй книгой серии) | отдельное решение | D39.42 задел (а), PACK20_BANK_BUILD З-а | | 48б | **Импорт «оригинал + чужой перевод» как режим данных терминолога** (target-агностичный вход есть контрактом; сам режим + провенанс источника + юр-сторона в юр-пакете) | бэкенд/владелец | когда-нибудь | отдельное решение + Ф2.5 (юр) | D39.42 задел (б), PACK20_BANK_BUILD З-б | -| 49 | **Этапы Б+В спеки D15.2** (content-addressed resume / `guard_hash` — D39.31 сознательно не строил) ; этап В = tmctl export-контракт D29.1 (annot-v1 · цвет-мап+rollup · политика красных fail-closed) + операторский протокол-документ релиза гендер-твиста (D5.1): сам механизм УЖЕ построен — until_ch-правка → точечный re-edit со сметой и $0-пере-пином (`repin.go`/`rebill.go`, D39.42 п.5/D39.45) | бэкенд | скоро (ПОДТЯНУТА D39.81: annot-v1 = источник замечаний для фронта — критический путь подключения) | отдельное решение (annot-половина — можно с 95) | D39.34(4), D33 п.5, D39.81 | +| 49 | **Этапы Б+В спеки D15.2** (content-addressed resume / `guard_hash` — D39.31 сознательно не строил) ; этап В = tmctl export-контракт D29.1 (annot-v1 · цвет-мап+rollup · политика красных fail-closed) + операторский протокол-документ релиза гендер-твиста (D5.1): сам механизм УЖЕ построен — until_ch-правка → точечный re-edit со сметой и $0-пере-пином (`repin.go`/`rebill.go`, D39.42 п.5/D39.45) | бэкенд | скоро (ПОДТЯНУТА D39.81: annot-v1 = источник замечаний для фронта — критический путь подключения) | отдельное решение (annot-половина — по контракту 14, D39.99) | D39.34(4), D33 п.5, D39.81 | | 49а | **ALTER-шаги миграций v8–v14 не идемпотентны вопреки шапке `migrate.go:9-11`** (полу-применённая БД не сходится; счётчик версий скрывает) — находка критика полноты пака-19 | бэкенд | когда-нибудь | отдельное решение | D39.56, PACK19_BUILD §6.9 | | 50 | F3-остаток идемпотентности | бэкенд | когда-нибудь | отдельное решение | D39.34(4) | | 51 | `human_override` LOCK (D29 п.1г, в коде 0 вхождений) | бэкенд | когда-нибудь | отдельное решение | D39.34(4) | @@ -101,12 +101,12 @@ | 69 | Gemini API «под-18» обязательство на конечный продукт (независимо от лейблов) | владелец | когда-нибудь | Ф3 / отдельное решение | D39.32, D39.34(7) | | 70 | Action-security gate перед выдачей tools/webfetch (D25 п.5) | бэкенд | когда-нибудь | Ф3 | D39.34(7) | | 71 | **Планы research/22**: epub-tag-rewrite · Q7-леджер ; + F3-brief из D29 п.3 (chat-edit · Not-useful-петля · cost-of-fix) + Ф3-скоуп 02-mvp-plan (TMX/TBX · Bertalign · дистилляция 7–14B); + V5: фронт ВЕБ-ПЕРВЫЙ, SEO/ранжирование (куки · страницы-сироты · актуальные алгоритмы Google) — определяет выбор фреймворка (SSR vs SPA), в Ф3-дизайн ДО выбора стека (ПТ-23) | бэкенд | когда-нибудь | Ф3 | D39.34(7), START_PROMT V5, D39.80 | -| 94 | **Продукт-механика входа и прогона** (V2, ПТ-16..18): абьюз/misuse-прескрин дёшево и точно ДО трат токенов (H8) + UI-контракт отказа (проект-решение D39.80) · лимит размера входа настройкой (H7) · продукт-кнопки «стоп/продолжить» поверх построенных graceful stop и redrive, абьюзивный прогон НЕ продолжать (H10); API-форма — через контракт 95 | бэкенд | к подключению фронта (ПОДТЯНУТА D39.81; лимит можно раньше, к пилоту) | отдельный пак при Ф3-препе (после 95) | START_PROMT V2, H7/H8/H10, D39.80, D39.81 | +| 94 | **Продукт-механика входа и прогона** (V2, ПТ-16..18): абьюз/misuse-прескрин дёшево и точно ДО трат токенов (H8) + UI-контракт отказа (проект-решение D39.80) · лимит размера входа настройкой (H7) · продукт-кнопки «стоп/продолжить» поверх построенных graceful stop и redrive, абьюзивный прогон НЕ продолжать (H10); API-форма — по контракту 14 (D39.99; статус отказа — открытый К-9) | бэкенд | к подключению фронта (ПОДТЯНУТА D39.81; лимит можно раньше, к пилоту) | отдельный пак при Ф3-препе (контракт 14 ратифицирован) | START_PROMT V2, H7/H8/H10, D39.80, D39.81 | | 96 | **→ переехала в `platform/BACKLOG.md` П-1** (зонные бэклоги, D39.84: HTTP/SSE-слой, обвязка, аутентификация, порядок деплоя); здесь остаётся ратифицированным сам ИНВАРИАНТ D39.81 — движок = процесс-на-прогон (EXCLUSIVE flock `store.go:43`), сервер в backend НЕ пишется | платформа | — | зонный бэклог | D39.81, D39.84 | | 97 | **→ переехала в `platform/BACKLOG.md` П-2** (глобальный брокер рейт-лимитов; гейт «до второго параллельного пользователя» зафиксирован там же) | платформа | — | зонный бэклог | D39.81, D39.84 | | 99 | **Пофазный прогресс `draft N/M ∥ edit N/M`**: unit = done только при всех draft-строках членов + edit-строке (`status.go:328-331/365`) — индикатор «готово N/M» стоит 0% ВСЮ черновую волну; данные уже есть (`chunk_status` — строка-на-стадию, `migrate.go:111-126`; status уже делит стадии по волнам `status.go:332-334`) — вывод пофазных счётчиков в StatusReport/JSON без миграции схемы | бэкенд | скоро (БЛОКЕР контракта API, D39.99) | малое касание read-model | релей фронта 02.08, D39.84 | -| 100 | **Персист манифеста глав/чанков** (+ `chunker_version` из снапшота + хеш источника): каждый read-вызов заново ингестит и режет исходник (`status.go:177-195` bookChunks; redrive — дважды за вызов; замер фронта 1.42–1.51 с CPU на книге 23 МБ, умножается на число книг) — нужен под экран разбора и дерево глав; дизайн обязан пережить смену чанкера (`--resnapshot`) | бэкенд | скоро (БЛОКЕР контракта API — стабильный id главы, D39.99) | отдельное решение (дизайн с 95) | релей фронта 02.08, D39.84 | -| 101 | **Машиночитаемая таблица подписи банка**: кап 20 — только stdout (`render.go:98`), полная таблица — текстовый сайдкар `.bank-stop.txt`, JSON/структурного выхода нет (mined-signature.yaml — сид-дельта без freq/spread/evidence); нужна фронту S5; помнить ловушку «подпись ≠ UPDATE» (банк пересобирается: `seeding.go:18/110`, `glossary.go:158-162` — контракт подписи пишет в файлы-источники) | бэкенд | скоро (БЛОКЕР контракта API — экран подписи, D39.99) | малое касание (форма — с контрактом 95) | релей фронта 02.08, D39.84 | +| 100 | **Персист манифеста глав/чанков** (+ `chunker_version` из снапшота + хеш источника): каждый read-вызов заново ингестит и режет исходник (`status.go:177-195` bookChunks; redrive — дважды за вызов; замер фронта 1.42–1.51 с CPU на книге 23 МБ, умножается на число книг) — нужен под экран разбора и дерево глав; дизайн обязан пережить смену чанкера (`--resnapshot`) | бэкенд | скоро (БЛОКЕР контракта API — стабильный id главы, D39.99) | отдельное решение (дизайн по контракту 14, D39.99) | релей фронта 02.08, D39.84 | +| 101 | **Машиночитаемая таблица подписи банка**: кап 20 — только stdout (`render.go:98`), полная таблица — текстовый сайдкар `.bank-stop.txt`, JSON/структурного выхода нет (mined-signature.yaml — сид-дельта без freq/spread/evidence); нужна фронту S5; помнить ловушку «подпись ≠ UPDATE» (банк пересобирается: `seeding.go:18/110`, `glossary.go:158-162` — контракт подписи пишет в файлы-источники) | бэкенд | скоро (БЛОКЕР контракта API — экран подписи, D39.99) | малое касание (форма — по контракту 14, D39.99) | релей фронта 02.08, D39.84 | | 102 | **Приём внешнего trace-контекста в tmctl**: TraceID минтится заново каждым вызовом (`main.go:67-70`; внутри вызова трасса цельная, `request_log.trace_id` есть) — прогон, запущенный платформой, должен быть одной трассой | бэкенд | когда-нибудь (Ф3, с 96) | малое касание | релей фронта 02.08, D39.84 | | 103 | **NDJSON-эмиттер прогонных событий со стабильным словарём** (машинный канал живого статуса для платформы, `research/23` §2): NDJSON-логи уже есть (`LOG_FORMAT=json`, авто-оси trace/book/chapter/stage/role — `obs/logging.go:15-54`), но сообщения прозой, version-хендшейка нет, а **событие потолка отсутствует вовсе** (деньги только в тексте ошибки `stagerun.go:472-494`); нужен словарь-enum + version-хендшейк первой строкой (образец terraform -json: минор = ignore-unknown, мажор = reject) + событие потолка; все границы — единичные call-sites в pipeline рядом с готовыми slog; человеческие логи уже на stderr — stdout-дисциплина соблюдена | бэкенд | скоро (БЛОКЕР контракта API: словарь §6 + событие note per-unit + ceiling, D39.99) | малое касание | research/23, D39.85 | | 125 | **Артефакт экспорта БАНКА** (полный банк тремя статусами — канал чтения `/bank` контракта 14): строка 101 это таблица ПОДПИСИ (кап 20 stdout, `cmd/tmctl/render.go:98`), не экспорт; сам банк в приватном SQLite, платформе закрыт (D39.85) — нужен экспорт-артефакт движка на границе стадии/стопе | бэкенд | скоро (БЛОКЕР контракта API, D39.99) | дизайн + малое касание export | ревью контракта 04.08, D39.99 | @@ -117,7 +117,7 @@ | 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-токене (модель не подумала), уровень ни при чём **02.08 вечер: рекомендация подана владельцу — «≥4/5 прогонов N=5 достигают 6/6»** (альтернатива жёстче: 4/4 по дискриминирующему подмножеству без термов-припоминаний); ждёт слова | владелец → оркестратор | скоро (112 уже санкционирована — порог не должен отстать) | пере-ратификация порога, $0 | D39.91, EFFORT_HANDLE Д8, D39.86 | +| 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 залендена (D39.97) — порог не должен отстать) | пере-ратификация порога, $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, точки сверки известны заранее) · **(D39.96)** тулчейн go1.27 переключит x/text на таблицы Unicode 17.0.0 МОЛЧА (`xTextVersion` пинит go.mod-строку, не таблицы) — триггер: любое движение тулчейна к 1.27 ⇒ строка 119 ПЕРВОЙ · **(D39.96)** CI-воркфлоу Forgejo (удалёнка 10.0.3, раннер не подтверждён; решение владельца 03.08 — не писать) — триггер: появление раннера ⇒ файл workflow; до того точка входа `make battery` | оркестратор | скоро ($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 | @@ -125,10 +125,9 @@ | 118 | **tools/go.mod — РЕШЕНИЕ ПРИНЯТО (D39.97 п.4): строить отдельным малым паком.** `cmd/tmvet`+`internal/archguard` → отдельный модуль (`backend/tools/`); `make battery` гоняет оба модуля; `tool`-директива Go 1.24 НЕ решает (MVS общий). Выигрыш: бамп инструментов физически не двигает x/net/x/text. Sqlite 1.55 остаётся (D39.97 п.4) | бэкенд | скоро (до следующего бампа зависимостей) | малый пак по D39.97 п.4 | D39.96 п.6, D39.97 | | 119 | **x/text-детерминизм: вердикт-несущие вызовы НЕ свёрнуты в версии (находки-5/6 приёмки).** `SanitizerVersion` не сворачивает ничего x/text-ного, а `detectCJKLeak` зависит от `width.Fold` (`sanitizer.go:211,687`) — смена x/text перевернула бы вердикт БЕЗ смены снапшота; `ExportNormalize` меняет экспортные байты вне хешей (`sanitizer.go:709`); `xTextVersion` пинит строку go.mod, НЕ скомпилированные таблицы — тулчейн go1.27 переключит x/text на Unicode 17.0.0 МОЛЧА (`tables17.0.0.go //go:build go1.27`; жилец реестра 108). Делать: явные версии-свёртки + механическую сверку «таблицы↔константа» вместо совпадения | бэкенд | скоро | правка версий-свёрток + тест | D39.96 п.6, отчёт §5 находки-5/6 | | 120 | **`buildCheckers` жёстко берёт `lang.Load(root,"zh","ru")`, бейзлайны ключуются по классу, не по паре (§7-8) — приезд ja-ru требует правки Go, против мандата общности §0.1.** Родня строки 115 (явный embed-список целей) — брать одним касанием | бэкенд | скоро | правка Go + тест на паре-которой-нет | D39.96 п.6, отчёт §7-8 | -| 121 | **archguard v2 (посадки приёмки D39.96 + §7-12/13 + §7-9). ⚠ Пункты (0а)/(0б) — РЕГРЕССИЯ против снесённого байт-гарда; дофикс ИСПОЛНЕН и принят D39.97 — (0а)/(0б)/(а) ЗАКРЫТЫ, плюс блокер type-param, ось имени и ложное срабатывание сверх промта; остаток строки — (б)/(в)/(г)/(д).** (0а) egressseam пропускает пакетную `llm.Complete(...)`: nil-`Selections` → молчаливый выход (`archguard.go:240-242`; фикс — fallback на `Uses`); (0б) пропускает интерфейс с llm-типами внутри композита (`Complete(ctx, []llm.LLMRequest)…` — `touchesPkg` не рекурсивен, `:79-82`); старый регекс `.Complete(` ловил обе формы; комменты «cannot be hidden» (`:250-253` и фикстура) фальсифицированы — переписать честно; (а) `runRequestSeam` обходит ТОЛЬКО `*ast.CompositeLit` (`archguard.go:197`): `var r pipeline.Request`+присваивание и `new(pipeline.Request)` проходят МОЛЧА — подтверждено на реконструкции: дыра ОБЩАЯ со старым гардом (не регрессия); фикс ~10 строк: симметрия ValueSpec/CallExpr со stage-сеамом + негативная фикстура, документирующая осознанные пропуски; (б) класс «встраивание · make+присваивание · дженерик-ноль» закрывается не свитчем, а ТИПОМ (нулевое значение `config.Stage` непригодно вне пакета); (в) политика build-тегов vet (сегодня default+live; чужой тег невидим — других в репо нет); (г) кандидат 4-й анализатор границы импортов — `backend/README.md:3` заявляет «проверяет `go list -deps`», что не автоматизировано ничем; (д) семь осознанных пропусков после дофикса 03.08 (принят D39.97; фикстуры БЕЗ want — покраснеют, когда начнут ловиться): llm.Ask-класс · пара внутри named-обёртки · встраивание/make/generic-zero · `internal/llm` исключён целиком (второй провод внутри адаптеров ловится только ревью) · внешние тест-пакеты · рефлексия (статикой не закрывается) · файлы за третьим сборочным тегом — всё, что закрываемо, закрывается типовым швом (б), не свитчем | бэкенд | скоро (дешёвая половина а) | правка анализатора + посадки | D39.96 п.2/п.6, отчёт §7-9/12/13 | +| 121 | **archguard v2 (посадки приёмки D39.96 + §7-12/13 + §7-9). ⚠ Пункты (0а)/(0б) — РЕГРЕССИЯ против снесённого байт-гарда; дофикс ИСПОЛНЕН и принят D39.97 — (0а)/(0б)/(а) ЗАКРЫТЫ, плюс блокер type-param, ось имени и ложное срабатывание сверх промта; остаток строки — (б)/(в)/(г)/(д).** (0а) egressseam пропускает пакетную `llm.Complete(...)`: nil-`Selections` → молчаливый выход (`archguard.go:240-242`; фикс — fallback на `Uses`); (0б) пропускает интерфейс с llm-типами внутри композита (`Complete(ctx, []llm.LLMRequest)…` — `touchesPkg` не рекурсивен, `:79-82`); старый регекс `.Complete(` ловил обе формы; комменты «cannot be hidden» (`:250-253` и фикстура) фальсифицированы — переписать честно; (а) `runRequestSeam` обходит ТОЛЬКО `*ast.CompositeLit` (`archguard.go:197`): `var r pipeline.Request`+присваивание и `new(pipeline.Request)` проходят МОЛЧА — подтверждено на реконструкции: дыра ОБЩАЯ со старым гардом (не регрессия); фикс ~10 строк: симметрия ValueSpec/CallExpr со stage-сеамом + негативная фикстура, документирующая осознанные пропуски; (б) класс «встраивание · make+присваивание · дженерик-ноль» закрывается не свитчем, а ТИПОМ (нулевое значение `config.Stage` непригодно вне пакета); (в) политика build-тегов vet (сегодня default+live; чужой тег невидим — других в репо нет); (г) кандидат 4-й анализатор границы импортов — `backend/README.md:3` заявляет «проверяет `go list -deps`», что не автоматизировано ничем; (д) семь осознанных пропусков после дофикса 03.08 (принят D39.97; фикстуры БЕЗ want — покраснеют, когда начнут ловиться): llm.Ask-класс · пара внутри named-обёртки · встраивание/make/generic-zero · `internal/llm` исключён целиком (второй провод внутри адаптеров ловится только ревью) · внешние тест-пакеты · рефлексия (статикой не закрывается) · файлы за третьим сборочным тегом — всё, что закрываемо, закрывается типовым швом (б), не свитчем | бэкенд | скоро (остаток: (б) тип вместо свитча · (в) build-теги · (г) 4-й анализатор · (д) семь пропусков) | правка анализатора + посадки | D39.96 п.2/п.6, отчёт §7-9/12/13 | | 122 | **Гигиена пака стандартов (не-блокеры приёмки).** `TestCheckerLabelsCandidates` — ни одного ассерта (дизайн-REPL в одежде теста) · сообщение `TestMemoryVersionPinsTheUnverifiedRenderRevision` не различает «изменился рендер»/«изменилась нормализация» · Makefile: regex GO_MIN_VERSION пропускает go1.26.0–1.26.3 (патч-уровень не проверяется) · включить `unconvert` (1) и `wastedassign` (2) — дешевле уже включённых по собственному правилу конфига · `.skips.log` не в gitignore (прерванная battery оставляет мусор в дереве) · Fprint-исключение errcheck скоупить на `cmd/` (сейчас весь модуль — будущий писатель файла экспорта получит молча съеденную ошибку) · `w\.Write`-исключение ключуется ИМЕНЕМ receiver-а вопреки собственному принципу конфига · miningstop-исключение глушит текстом весь файл — якорить на функцию · provenance-числа конфига дрейфуют от дерева (293/31/93 против 294/33/91; контрпример «все прод-Close — читатели»: `chunktest/epub.go:51`) · коммент c1 «echo mine unarmed» поправлен дофиксом 03.08 (снят) · инвариант-коммент `httpllm.go:77` «zero wire bytes» — верен для полей пинга, неверен для бампа x/net, который их привёз (находка-4 D39.96) — переписать честно | бэкенд | когда-нибудь | мелкие правки | D39.96 п.6, отчёт §7-6/7, §9 хвост | | 123 | **Полигон: `jieba==0.42.1` — build-time зависимость артефакта контраста `eval/exp16/data/jieba_dict_general_zh.txt`** (пере-собран бэкенд-сессией 03.08, полный sha256 сошёлся с пином `16-bank-mining.md`); дописать в манифест окружения полигона с пометкой «build-time, не runtime» | полигон | когда-нибудь | строка манифеста | D39.96 п.6, отчёт §7-4/§6 | - | 124 | **Калибровка снапшота (вопрос владельца 04.08, разбор D39.97 п.5): нацеленность, не агрессивность.** Три оси одним дизайн-паком: (а) недо-чувствительность — вердикт-несущие вызовы x/text не свёрнуты (вход: строка 119); (б) пере-охват — `EmbeddedVersion` фолдит все пары разом → пер-парный хеш (родня 115/120); (в) дешёвая перекупка: `tmctl resnapshot --dry-run` — байт-сверка тел по чекпойнтам (`msgsContentHash`), идентичные юниты пере-привязываются без пере-вызова, платятся только изменившиеся. «Поведенческий отпечаток вместо строки версии» отложен (пол ≠ доказательство) | бэкенд | когда-нибудь (перед МАСШТАБОМ — когда перекупки станут реальными деньгами) | дизайн-пак по D39.97 п.5 | D39.97 | ## Оркестратор №12 — ЗАКРЫТИЕ СЕССИИ, передача №13 (D39.101), 04.08 @@ -144,12 +143,14 @@ S3 упёрлась в замок (контракта нет) — по слову владельца написала вход Ф-14 + черновик; форма по решению владельца сменена на OpenAPI 3.1 (типы генерятся, спека линтуется — класс «фикстура выдумала форму», случившийся четырежды, закрыт механически). Приёмка: три воркфлоу-пасса (16+6 агентов), 19 подтверждённых находок (2 high: withheld ≠ «текст не выдан» — движок отгружает текст под флагом; чтения без канала шва), ноль опровергнутых; все вправлены двумя раундами дофикса, каждый раунд перепроверен. Пост-мортем процесса — в D39.99 п.4 (промт S3 велел пинговать в чужую зону — противоречие канона и зонного решения владельца закрыто правкой CLAUDE.md; чек-пункты в промт оркестратора). Детали — D39.99. +## Оркестратор №12 — фронт S2 + дофикс по ревью приняты и залендены `02872b6`, git-канон v2 по носителям (D39.98), 04.08 Приёмка S2 — адверсариальный воркфлоу (5 линз × скептики с ре-раном): батарея и виртуализация подтверждены исполнением, стек без дрифта, три дефекта (пар-слепой шрифтовой токен · выдуманный тип `org` с фабрикованной цитатой журнала · ключ рядов банка без учёта полисемии) вправлены дофиксом и залендены; три находки ревьюеров опровергнуты скептиками. Детали и остаточное — D39.98. +## Оркестратор №12 — приёмка дофикса archguard, лендинг всего пака семью коммитами, ответы владельцу (D39.97), 04.08 -Дофикс archguard + проба приняты короткой приёмкой исполнением (батарея EXIT=0 · деньги дельта $0.000000 · две СВОИ посадки вне карты отчёта, включая method expression — форма отсутствовала и в таблице, и в пропусках, поймана; негативный контроль чист). CONFIRM владельца по `@latest` записан входом приёмки. Весь пак заленден семью pathspec-коммитами (`e8d4ac0` конфиги · `5a97020` дефект-фиксы · `b155da3` механика · `cb368c0` бамп · `6356471` анализаторы · `5a81bff` линт-инфра · `0e64efe` live-проба); фронт коммитил параллельно (`ece94ef`) — pathspec исключил коллизию. Строки 107/112/117 закрыты; оба промта архивированы. Решения: tools/go.mod — строить (118, D39.97 п.4); вопрос владельца о снапшоте разобран — калибровка нацеленности вместо ослабления, три оси одним дизайн-паком (новая строка 124: недо-чувствительность 119 · пер-парный EmbeddedVersion · дешёвая перекупка байт-сверкой). Хвост `httpllm.go:77` → 122. +Дофикс archguard + проба приняты короткой приёмкой исполнением (⚠ «короткой» — об объёме дельты; норма 03.08: приёмка всегда адверсариальная, свои посадки вне карты отчёта были) (батарея EXIT=0 · деньги дельта $0.000000 · две СВОИ посадки вне карты отчёта, включая method expression — форма отсутствовала и в таблице, и в пропусках, поймана; негативный контроль чист). CONFIRM владельца по `@latest` записан входом приёмки. Весь пак заленден семью pathspec-коммитами (`e8d4ac0` конфиги · `5a97020` дефект-фиксы · `b155da3` механика · `cb368c0` бамп · `6356471` анализаторы · `5a81bff` линт-инфра · `0e64efe` live-проба); фронт коммитил параллельно (`ece94ef`) — pathspec исключил коллизию. Строки 107/112/117 закрыты; оба промта архивированы. Решения: tools/go.mod — строить (118, D39.97 п.4); вопрос владельца о снапшоте разобран — калибровка нацеленности вместо ослабления, три оси одним дизайн-паком (новая строка 124: недо-чувствительность 119 · пер-парный EmbeddedVersion · дешёвая перекупка байт-сверкой). Хвост `httpllm.go:77` → 122. ## Оркестратор №12 — приёмка пака «стандарты репо» ДВУМЯ пассами (D39.96), 03.08 @@ -275,7 +276,7 @@ Q1 = П1 цель-шов санкционирован («главное бэке ## Оркестратор №9 — РЕСЁРЧ ОБЩНОСТИ ФАЗА 1 ПРИНЯТ (D39.60): долг 149 сайтов/45 файлов, книго-ось чиста, план П0–П5; СТОП — пять вопросов владельцу, 31.07 -Короткая приёмка по норме 30.07: отчёт ([`archive/reports/GENERALITY_RESEARCH_2026-07-31.md`](archive/reports/GENERALITY_RESEARCH_2026-07-31.md)) прочитан целиком, восемь несущих утверждений пере-проверены исполнением — все сошлись (вкл. побайтный повтор хеша пака `a28ed743c99c` и счёт 27/12 живых CJK-строк); два нита некритичны (счёт сайтов `ExportNormalize`, атрибуция Ш-1). Ратифицировано как карта (D39.60): вёдра A27/B6/C104/D12/E106 · заморозки З1–З9 · актуальные якоря пака-21 (§8 отчёта — ссылки D39.39 устарели) · правило условного фолда §6.2. Новые строки: 75 (живой баг ko/Hangul → П2) · 76 (эмбед-плоскость без хеша → П0 первым). Строка 32 исправлена фактом (боевых call-site 6 и 2), Decl-находка уехала в арку банка (73). **На владельце пять вопросов §12 с моими рекомендациями (в D39.60): П1 в арку = ДА · один общий resnapshot = ДА (но после развилки DeepSeek — D39.61, строка 74) · П6 = не сейчас · Р1–Р4 = сократить до Р2+Р4 · пак-21 = растворить.** Фаза 2 не начинается до ответов. +Короткая приёмка по норме 30.07 (⚠ норма амендирована 03.08 — приёмка всегда адверсариальная): отчёт ([`archive/reports/GENERALITY_RESEARCH_2026-07-31.md`](archive/reports/GENERALITY_RESEARCH_2026-07-31.md)) прочитан целиком, восемь несущих утверждений пере-проверены исполнением — все сошлись (вкл. побайтный повтор хеша пака `a28ed743c99c` и счёт 27/12 живых CJK-строк); два нита некритичны (счёт сайтов `ExportNormalize`, атрибуция Ш-1). Ратифицировано как карта (D39.60): вёдра A27/B6/C104/D12/E106 · заморозки З1–З9 · актуальные якоря пака-21 (§8 отчёта — ссылки D39.39 устарели) · правило условного фолда §6.2. Новые строки: 75 (живой баг ko/Hangul → П2) · 76 (эмбед-плоскость без хеша → П0 первым). Строка 32 исправлена фактом (боевых call-site 6 и 2), Decl-находка уехала в арку банка (73). **На владельце пять вопросов §12 с моими рекомендациями (в D39.60): П1 в арку = ДА · один общий resnapshot = ДА (но после развилки DeepSeek — D39.61, строка 74) · П6 = не сейчас · Р1–Р4 = сократить до Р2+Р4 · пак-21 = растворить.** Фаза 2 не начинается до ответов. ## Оркестратор №9 — КУРС АМЕНДИРОВАН ВЛАДЕЛЬЦЕМ (D39.59): общность вперёд, автономность банка, спаренный полигон-пакет, 31.07 @@ -285,7 +286,7 @@ Q1 = П1 цель-шов санкционирован («главное бэке ## Бэкенд -**⟶ Приёмка №11 (D39.91, 02.08): пак ниже ПРИНЯТ, код заленден `553f1a3`; поправки приёмки (метка flash+pro · хеш по эквивалентности · `capability.go:78`) — в ревью-шапке отчёта и D39.91.** +**⟶ Свежее состояние бэкенда: пак стандартов + дофикс приняты и залендены (D39.96/97, `e8d4ac0`…`0e64efe`; точка входа `make battery`); ниже — хроника до №11.** **⟶ Приёмка №11 (D39.91, 02.08): пак ниже ПРИНЯТ, код заленден `553f1a3`; поправки приёмки (метка flash+pro · хеш по эквивалентности · `capability.go:78`) — в ревью-шапке отчёта и D39.91.** **Ручка эффорта (стр.104) ✅ ЗАКРЫТА · проба банка на `low` ✅ ЗЕЛЁНАЯ · экран целевого языка (стр.46) — ДИЗАЙН ПОДАН, КОДА НЕТ · холодный прогон (стр.16) НЕ НАЧАТ и закрыт владельцем как неуспешный на этом этапе (02.08, бэкенд-сессия по `BACKEND_EFFORT_HANDLE_SESSION_PROMPT`, D39.87; $0.045095 из $0.10; прогон C — $0; НЕ закоммичено).** Отчёт: [archive/reports/EFFORT_HANDLE_2026-08-02.md](archive/reports/EFFORT_HANDLE_2026-08-02.md). **Работа A — не три патча, а ДВА ШВА:** `config.InternalCall{…}.Stage()` (новый `internal/config/internal_call.go`) — единственная деривация стадии для внутренних вызовов движка, и `Runner.attemptRequest` (`stagerun.go:406`) — единственная сборка кортежа идентичности запроса. Рукописных `config.Stage{}` в движке НЕ ОСТАЛОСЬ НИ ОДНОГО (все 4 места + live-риг через шов); все 4 сборки `RequestHash(Request{…})` схлопнулись в одну. Приёмочный вопрос «появится ПЯТАЯ стадия — унаследует или забудут?» отвечен **механикой, не обещанием**: три гарда (единственность обоих швов + рефлексия по полям `Stage`, падающая на НОВОМ поле), каждый проверен исполнением. **Ловушка хеш-оси закрыта в ОБЕ стороны и на ОБОИХ путях** (`bankCheckpointExists`, `repairCheckpointExists`): ложно-false режет резюм бюджетным пред-чеком, ложно-true обходит ролевой суб-бюджет и покупает свежий вызов под одним лишь книжным потолком. **Гранулярность решена ЗАМЕРОМ, а не заранее:** одна ручка `gates.terminology.reasoning` на обе бэнк-роли — парная выборка N=5 через боевой путь дала `low` 4/5 против `high` 5/5 (неразличимо) при цене `high` ×2.30 ⇒ вторая ручка `classify_reasoning` была построена на n=1 и СНЯТА самой сессией, когда выборка её не подтвердила. `Temperature` зафиксирована нулём осознанно (ответ ролей — разбираемая структура, не проза). **Repair получил СВОЙ ключ `gates.repair.reasoning`, наследование от чинимой стадии СНЯТО** (правка против промта и D39.87, с аргументом): `reasoning: "off"` стоит на финальной стадии у ВСЕХ шиппинг-пайплайнов ⇒ наследование двигало хеш и перекупало все оплаченные repair-вызовы; и семантически «off» — значение, чей смысл зависит от control МОДЕЛИ, а `gates.repair.model` независим от стадийного (задокументированный no-op DeepSeek стал бы живым `thinking:{type:disabled}` на glm). **§3.4 (проба банка, свой проект `reprobe/bank-low/`, эталон coldrun-a только на чтение):** терминолог **4/5 батчей `stop`, consolidated=72, unanswered=18, bad_lines=0, off_language=0** (против 1/5 и 1 терма из 81 при вендор-дефолте `high`), классификатор 5/5 `stop`, reclassified=14, черновая волна **20/20 чанков ok**. **Оба молчащих пути ИСКЛЮЧЕНЫ предъявлением, а не словами:** терминолог $0.005750 из $0.05 (11.5%), классификатор $0.004286 из $0.02, книга $0.045095 из $0.10 — и НОЛЬ строк `budget would be exceeded`/`denied by a USD ceiling` в логе. **Провод вскрыт:** 35 тел, ключи `[max_tokens, messages, model, reasoning_effort, stream, temperature]`, `reasoning_effort:"low"` во всех 35, ключей `thinking` **0**, `reasoning_content` непустой везде ⇒ гардрейл доказан проводом. Упавший батч вскрыт сырьём (`content:""`, `reasoning_tokens=7999`) — **`low` стену не убирает, а разрежает** с 4/5 до 1/5, и упавший батч не самый большой по входу ⇒ стохастика вызова (квирки п.6). Деньги двумя путями: леджер $0.045095 ≡ независимый пересчёт $0.045095, дельта $0.000000, строк `decode_error` 0. **Работа B — вердикт-двигающая ⇒ дизайн и пинг ДО кода, решения владельца нет ⇒ кода нет (легитимный исход по букве промта).** Живая улика ДОБЫТА В ЭТОМ ЗАХОДЕ: гл.8/чанк 1 — полный связный черновик НА АНГЛИЙСКОМ, `finish=stop`, `disposition=ok`, хеш `fb51e135a395` стоит в `final_hash`. ⚠ **ДВЕ ПОПРАВКИ К СОБСТВЕННЫМ ЧИСЛАМ СЕССИИ, обе пере-проверены её же кодом:** (i) подавалось «здоровый русский 0.9510, n=1306» — это СЫРОЙ текст чекпойнта, а движок классифицирует ПОСЛЕ среза банкноты (`stagerun.go:632` режет, `:636` классифицирует; срез безусловен, `banknote.go:320`); на тексте, который видит гейт, **минимум 0.9767 при n=1055** (1306 двоил бэкап-копии БД); (ii) **боевой гейт уже ловит 18 из 20 off-target событий при 0 ложных из 1055 и запасе 13×** (худший здоровый source-share 0.0117 против порога 0.15) — этого не мерил никто, включая прошлые сессии. Остаточная дыра — **ровно 2 английских чанка = 0.18% выходов**; японский черновик (`exp15/anchors/oracle_30.db`) ловится по общей с китайским письменности (доля ханьцзы 0.332). Носитель экрана — `lang.LangScripts(Book.TargetLang)`, БЕЗ нового файла в `go:embed` (`EmbeddedVersion` фолдится безусловно ⇒ новый эмбед перекупает все книги всех пар); `gates.terminology.target_script` отвергнут причиной сильнее промтовой — он ДУБЛИРУЕТ то, что данные уже знают. **Работа C НЕ НАЧАТА:** стенд coldrun-b стоит нетронутым, черновик по-прежнему на `reasoning: "off"`; строка 16 не закрыта, строка 13б снова без данных (редакторская волна не гонялась ни разу). **ПОЧИНЕНО с тестами (9):** шов+гарды · обе хеш-пары · **`ThinksOnWire` врал про ПУСТОЙ эффорт на `extra_body_disable`** (возвращал «думает», а `applyToBody` в этом же случае мержит disable ⇒ бэнк-роль на glm уезжала в thinking-off МОЛЧА; предсуществующая дыра, но пак первым на предикат оперся) · `sourceEchoExposure` расширен на внутренние вызовы · fail-open неизвестной роли · дубль `plan.model` · дефолт рига N=1→5. **АДВЕРСАРИАЛЬНОЕ РЕВЬЮ (author≠reviewer) НАШЛО 10 ДЕФЕКТОВ В МОИХ ЖЕ ПРАВКАХ**, из них 1 blocker и 3 major; топ-2 пере-проверены сессией по коду до принятия. Отдельным ресерчем вскрыто, что **первая версия гардов пробивалась 7 способами** (5 байтовых + алиас импорта `cfg "…/internal/config"` + `[]config.Stage{{…}}` с опущенным типом элемента) — причина: сравнивалось ИМЯ пакета вместо ПУТИ импорта; переписано на AST с резолвом пути, разворотом `[]T`/`map[K]T`/`*T`, исключениями полными путями и полом на число разобранных файлов (обход, не распарсивший ничего, выглядел как чистое дерево); все 7 посадок пере-проверены на живом дереве. **НАЙДЕНО и НЕ ПОЧИНЕНО (с носителями):** Д2 `detectLatinInsertion` не обусловлен `TargetScriptNonLatin()` ⇒ первая латинописьменная цель дропнет 100% чанков (одним диффом с работой B) · Д3 `SourceEchoExpected` не покрывает `roleClassifier` ⇒ **16/16 вызовов классификатора логируются `ok=0 degraded=cjk_artifact`** (данные не теряются — `reclassified=14` доказывает, но отравлен ровно тот сигнал, который говорит «провайдер плохеет») · Д4 **`gates.terminology.target_script` не сверяется с `book.target_lang`**: `target_lang: ru` + `target_script: Latin` грузится чисто и ИНВЕРТИРУЕТ банковский экран · Д5 наш enum эффорта провайдер-слеп (`medium` на DeepSeek не определён, `max`/`xhigh` недостижимы) — пер-модельная таблица = новый механизм, сознательный отказ · Д6 **`//go:embed` в `internal/lang/embedded.go:22` — ЯВНЫЙ список файлов**, новая цель требует правки Go, а `CompileCheckers` паникует при неполном файле цели ⇒ на ревью-вопрос «заработает ли пара, которой нет в репо» ответ сегодня НЕТ, и это не про язык, а про строку эмбеда · Д7 два гарда шва разной формы (мой AST против давнего байтового `TestProviderEgressSeamIsSingle`) — свести в один обход · Д8 ратифицированный порог классификатора «6/6» определён для ОДНОГО вызова, не для выборки, и на рекомендованном `low` риг красный (заявлено в тексте падения, не смягчено) · Д9 аддитивные провайдеры отказываются бэнк/repair-гейтам именно потому, что блок не несёт `reasoning_max_tokens` — новая ручка эту дыру НЕ закрывает. **РЕСЕРЧ-ЗАДЕЛ (два холодных исследования со скептиками, §5 отчёта — оставлен, чтобы следующие сессии шли по шагам):** у отказа есть имя и метрика (*off-target translation*, Zhang et al. ACL 2020; *language confusion* LPR/WPR, Marchisio et al. EMNLP 2024), рецепт поля — ровно наш, более умного serving-time метода не упущено; английский — доминирующий аттрактор (подтверждено дважды независимо и нашими 2/20); четыре режима отказа требуют РАЗНЫХ детекторов, гнать всё через один LID — ошибка проектирования. **Обещанной гарантии FPR ≤ 0.1% на этом корпусе НЕ КУПИТЬ:** правило трёх при n_eff=114 позиций даёт ≤2.594% (в 26× слабее), процедура двоит данные, а на сиблингах мощность ≈0.1% (болгарский алфавит — собственное подмножество русского, распределения совпадают) ⇒ ставить руками консервативную константу в широком пустом интервале и версионировать как контракт. **НЕ СТРОИТЬ (проверено запуском, не по README):** ни одну статистическую LID-библиотеку в путь вердикта (`lingua-go` недетерминистична 6/23 на 20k повторов + 126 МиБ эмбеда + 10–12 мс/чанк; `langid-go` даёт P(ru)<0.5 на **22.2%** реальных русских сегментов 20–40 рун и FMA-зависим от GOARCH; `whatlanggo` принимает 4–6 из 9 русских образцов за болгарский; `gocld3`/fastText — CGo, вердикт становится функцией тулчейна ВНЕ снапшот-хеша) · посегментный worst-of (умножает FPR на число сегментов и имеет НОЛЬ положительных примеров) · замыкание алфавита · функционально-словный экран · новый файл в `go:embed`. **План на 8 шагов** с единственным необратимым (бамп `classifierVersion`) последним; ключевой перенос — **`cultivation` чинить в СИДЕ, а не порогом** (86 из 1055 здоровых выходов содержат его; все 32 просевших абзаца содержат, ни один не содержит ханьцзы; правка пар-данных двигает `LangpackVersion`, который фолдится с `omitempty` ⇒ перекупка ограничена книгами ЭТОЙ пары — самый переносимый вывод цепочки: чинить на том плане, где перекупка уже). ⚠ **Качество прозы не судил никто ни в одной пробе.** Батарея после всех правок зелёная (build/vet/`vet -tags live`/`-race -count=1`/gofmt чисты · голден PASS · парити EXACT · labels-фриз 5/5). **СТОП — приёмка оркестратора.** @@ -295,7 +296,7 @@ Q1 = П1 цель-шов санкционирован («главное бэке **Пакет-чекеров (строка 25 + 79) исполнен (02.08, бэкенд-сессия по `BACKEND_CHECKER_PACKAGE_SESSION_PROMPT`, D39.67/68, $0 — только фейк-провайдер в тестах, НЕ закоммичено).** Отчёт: [archive/reports/CHECKER_PACKAGE_2026-08-02.md](archive/reports/CHECKER_PACKAGE_2026-08-02.md). **Харнесс labels пересобран В GIT** (env-гейт `TM_CHECKER_LABELS=1`, `internal/checks/labelharness_test.go` + `internal/membank/labelharness_test.go` + candidates); `metrics.json` пакета-6 воспроизведён ПОБАЙТНО (12 ключей после постфикса — k4a маркер-онли; 2 независимых пути счёта совпали); k5c-конвенция названа (`codeconv`=фиделити кода / `unit`=цель Р2); две пост-банк-пак дельты объяснены (K6 стеммер 14→12; K3 combmark 0). **Построено:** #10 (пост-чек однознак. Han-ключ → Unverified observability, K6 fp 14→6, **fn=0 сохранён**) · #3 (атрибуция ёлочки +5 tp, K4b r0.11→0.22, Р4-потолок в контракт) · #6 (заглавная латиница +allowlist, K2 r0.75→0.85) · k4_inverse (inner_marker-на-тире, +3 tp, p1.0) · #8 (两/兩 данные, 0 эффекта = generality) · Р2 hard/soft split (`UnitScaleHard`/`Soft`, `Total` не тронут) · строка 79 (isCyrLetter→wordScript · DC1-трим · magnitude SourceScripts-гейт — закрыла и ведро C-2 register-boundary) · рефрен editor.md/mono · чистка ведра D (6 указателей `checkers_zh_ru.go` + ложная шапка checkers.go). **Закрыто с обоснованием:** #5 (единственный дефект DC2-покрыт) · #7 (порог=0-эффект; гомоглиф=`tk.mixed`, приёмка пройдена) · DC2 word↔word (нет размеченного дефекта) · research/22 (не на labels) · omission-бэкстоп (уже стеммером) · строгий OffLanguage (36а). **На владельца (§6 отчёта):** DC7 grade/role (коллизия канона класс/разряд) · 兩-traditional · Р2 value-детектор vs soft · register_neg в пар-паке. **Приёмка:** build/vet/`-race ./...` зелёные · майнер-парити EXACT · голден пере-захвачен РАЗ, маскированный дифф ПУСТ (двинулся только `style_check_version` v6→v7 + хеш-каскад; content_hash/disp/flag/memory_version/prompt_sha256/вердикты байт-идентичны) · греп-общность чист (нет новых пар/книго-ветвлений) · мут.тесты на новые классы. Якоря `13-tech-debt-anchors.md` актуализированы (#10 помечен исполненным). **Плюс адверсариальное агентское ревью (3 refute-biased агента, по вопросу владельца ПОСЛЕ лендинга): 2 корректностных FP найдено и ИСПРАВЛЕНО ДО приёмки** (k4_inverse маркер по всей строке → скоуп на атрибуцию; #3 плоская цитата `«X» —` → отвергается, принимаются только `«X», —`/`«X!/?/…» —`; оба observability, гвозди добавлены, labels не двинулись 10/1/36/99 · 3/0/1/71) + honesty-правка (K2 precision честно **0.971**, не «1.0 с allowlist» — конфиг бренд не заносит) + Р2 NumberMagnitude→HARD + DRY `lang.IsDenseScript` + подрезка комментариев (норма 26.07). Харнесс подтверждён честным (byte-for-byte, «before» из git; манифактуренной сходимости нет). — **ПОСТ-ФИКС D39.78 (приёмка оркестратора: 0 блокеров, 5 major + minors, $0, `CheapGateVersion` НЕ бампнут):** все закрыты, §8 отчёта. (1) `speechAttribution` режет сегмент атрибуции с ДВУХ сторон + `lineHasInnerMarker` по границе слова (4 контрпримера гвоздём); (2) `latinResidueCandidates` синхронизирован с #6-lint (caps-утечки адресуемы, гвоздь `TestLatinResidueCandidateCapsSynced`); (3) `chevronSpeechShapeCommaOnly` заморожен → «ДО» 5/1/41/99 из дерева, отвергнутый `Ext` снесён; (4) Р4-потолки inline (`minLatinResidueLen`, `chevronSpeechShape`); (5) пост-чек контракт/комменты честны (B6=строка 81; multi-rune «статистически сильнее», не «word span») + `PostcheckMiss.Demoted` (omitempty, голден-нейтр.) + негатив-гвоздь одно-руновый-не-Han→Confirmed. **k4a воспроизведён маркер-онли (12/12 ключей, 0/0/0/348)**; отчёт §2/§5 — реальные tp вместо 2 ложных, «fn=0 класс-вакуумен» оговорено. Опц. Fix-8 (скоуп `isSpokenChevronLine`) ОТЛОЖЕН вердикт-тройкой (0 инстансов FP-класса в корпусе, загейчен нотой). Приёмка: labels фрозен (k4b 10/1/36/99 · k4_inverse 3/0/1/71 · k2 34/1/6/51 · K6 1/6/0/251 · k4a 0/0/0/348) · build/vet/`-race ./...` · майнер-парити EXACT · голден пере-захват РАЗ = байт-идентичный no-op, маскированный дифф ПУСТ · author≠reviewer (3 refute-агента, 0 подтверждённых багов, мутант-килл негатив-гвоздя исполнен). — **ЛЕНД D39.78** (двухраундовая приёмка оркестратора: 10-агентный адверсариал → 5 CONFIRMED major → постфикс §8 → 3-агентный дельта-раунд: 0 major; голден-маска независимо ПУСТА дважды; остаточные минорки → строка 93, вопросы §6 → строка 92; строка 25 закрыта, 79/89 сужены). -**finding-1 (строка 91, Decl мягкознаковых имён) — ЗАМЕР ПРОВЕДЁН (02.08, бэкенд-сессия по указанию владельца в eval-конвенции, $0); РЕШЕНИЕ — владелец+оркестратор.** Отчёт: [archive/reports/SOFTSIGN_DECL_FINDING1_2026-08-02.md](archive/reports/SOFTSIGN_DECL_FINDING1_2026-08-02.md); харнесс `eval/softsign-decl/` (пин-модуль, боевой стеммер), сырьё+2 адверсариал-прогона durable в `~/books/gu-zhenren/softsign-decl/`. ИТОГ: разрыв реален но МАЛ (~4–7 ложных промахов/25 глав на реальном размере чанка, почти весь — ОДИН термин «Винный червь»; «Фан Юань»→0 per-chunk; occurrence-level 259 — код-верифицирован). Вариант **(б) anchor-gated** НЕ закрывает коллизию «Синь/Линь» — ПЕРЕНОСИТ на форму `[титул]+[ь-фамилия]` + не защищает числовой класс («пятого/шестого ранга» ×23); чистота на gu-zhenren = транслит-везение, доказательство **пара-зависимо**, safety НЕ измерена (M4=3 пары/1 книга). Рекомендация: **(а) сид-перечень 1–2 ВИДИМЫХ мягких канон-имён** — данные `decl.forms`, матч generic `containsWholeWord`, **вне ядра Go**, ноль коллизии (честно: ручной труд — майнер морфологию НЕ майнит, declForms руко-писаны); движок (б) — только на КРОСС-ПАРНОМ гейт-замере (≥2 пары), не на одном. Строку 91 и CURRENT-STATE НЕ трогал. Открытые решения — в §«Что решить» отчёта. — **ЛЕНД D39.76 (стопгэп A, $0, ядро Go не тронуто):** в подписанный стенд-сид `~/books/gu-zhenren/guzhenren-seed-v2.yaml` (вне git) дописана МН. парадигма «Винный червь» (ед. обликы «Винный червь» + все 4 «Фан Юань» УЖЕ стояли с 24.07 — нетто-новьё = только мн.); `stemmer_test.go` гвоздь Линь/линию→Линь/линий (эмпир-проба: Stem(линий)=лин дискриминирует, Stem(линию)=лини был ИНЕРТЕН); позитив-гвоздь `memdecl_test.go` «Фан Юаню» принят через forms[] (закрыл PARTIAL D39.75). Приёмка зелёная: build · lang+membank · `tmctl seed-lint` OK (0 fail-loud/0 collision) · голден нетронут (git backend = только 2 тест-файла). ⚠ Уточнение к цифрам замера: coldrun-a — СИДЛЕСС (`coldrun-a/book.yaml`: сид не грузится), потому харнесс мерил ТОЛЬКО стеммер-путь; в сид-прогоне «Фан Юань» обликы уже ловились forms[] → прод-разрыв ещё меньше замеренного. Ждёт подписи владельца на сид-формы (+2 доп. мн. падежа сверх списка владельца: Винным червям / Винных червях — полная парадигма). +**finding-1 (строка 91, Decl мягкознаковых имён) — ЗАМЕР ПРОВЕДЁН (02.08, бэкенд-сессия по указанию владельца в eval-конвенции, $0); РЕШЕНИЕ — владелец+оркестратор.** Отчёт: [archive/reports/SOFTSIGN_DECL_FINDING1_2026-08-02.md](archive/reports/SOFTSIGN_DECL_FINDING1_2026-08-02.md); харнесс `eval/softsign-decl/` (пин-модуль, боевой стеммер), сырьё+2 адверсариал-прогона durable в `~/books/gu-zhenren/softsign-decl/`. ИТОГ: разрыв реален но МАЛ (~4–7 ложных промахов/25 глав на реальном размере чанка, почти весь — ОДИН термин «Винный червь»; «Фан Юань»→0 per-chunk; occurrence-level 259 — код-верифицирован). Вариант **(б) anchor-gated** НЕ закрывает коллизию «Синь/Линь» — ПЕРЕНОСИТ на форму `[титул]+[ь-фамилия]` + не защищает числовой класс («пятого/шестого ранга» ×23); чистота на gu-zhenren = транслит-везение, доказательство **пара-зависимо**, safety НЕ измерена (M4=3 пары/1 книга). Рекомендация: **(а) сид-перечень 1–2 ВИДИМЫХ мягких канон-имён** — данные `decl.forms`, матч generic `containsWholeWord`, **вне ядра Go**, ноль коллизии (честно: ручной труд — майнер морфологию НЕ майнит, declForms руко-писаны); движок (б) — только на КРОСС-ПАРНОМ гейт-замере (≥2 пары), не на одном. Строку 91 и CURRENT-STATE НЕ трогал. Открытые решения — в §«Что решить» отчёта. — **ЛЕНД D39.76 (стопгэп A, $0, ядро Go не тронуто):** в подписанный стенд-сид `~/books/gu-zhenren/guzhenren-seed-v2.yaml` (вне git) дописана МН. парадигма «Винный червь» (ед. обликы «Винный червь» + все 4 «Фан Юань» УЖЕ стояли с 24.07 — нетто-новьё = только мн.); `stemmer_test.go` гвоздь Линь/линию→Линь/линий (эмпир-проба: Stem(линий)=лин дискриминирует, Stem(линию)=лини был ИНЕРТЕН); позитив-гвоздь `memdecl_test.go` «Фан Юаню» принят через forms[] (закрыл PARTIAL D39.75). Приёмка зелёная: build · lang+membank · `tmctl seed-lint` OK (0 fail-loud/0 collision) · голден нетронут (git backend = только 2 тест-файла). ⚠ Уточнение к цифрам замера: coldrun-a — СИДЛЕСС (`coldrun-a/book.yaml`: сид не грузится), потому харнесс мерил ТОЛЬКО стеммер-путь; в сид-прогоне «Фан Юань» обликы уже ловились forms[] → прод-разрыв ещё меньше замеренного. Ждёт подписи владельца на сид-формы (+2 доп. мн. падежа сверх списка владельца: Винным червям / Винных червях — полная парадигма). → Снято D39.77: строка 91 закрыта, подпись владельца — только вкусовые поля. **Фикс-пак банка (строка 87 + Q5) исполнен (02.08, бэкенд-сессия по `BACKEND_BANK_FIXPACK_SESSION_PROMPT`, D39.71, $0 — только фейк-провайдер в тестах, НЕ закоммичено).** Отчёт: [archive/reports/BANK_FIXPACK_2026-08-02.md](archive/reports/BANK_FIXPACK_2026-08-02.md). СДЕЛАНО: **(б)** head_final → данные (`script-series.txt`+`SeriesHeadFinal`, zh/ja/ko байт-идентичны, тест «плотный не-head-final заводится данными») · **(в)** лживый коммент `Batch` переписан (ChunkIdx фолдится в request-hash) + `BatchRunes`-WARN на оверсайз-серию (не резать — убьёт со-батч §1) · **(г)** classify_types при выкл.гейте = fail-loud + 5 config-тестов · **(д)** мутационный neuter-фолд (mined-scope) · **(ж)** дистилл-фикстура `BANK-FULL` пинит ровно 4 серии (转/等/等资质/阶) · **(и)** `lang.TokenizeWords`→`text.TokenizeLetters` (общий шов, чинит combmark-щель). НЕ ДЕЛАТЬ с обоснованием: **(е)** стеммер НЕ в voice (accept-bias не единонаправлен; контракт в код) · **(з)** Q5-реалии УЖЕ в `terminologist.md`/`classifier.md` (пинг: `PromptSHA256` не двинулся). **(а) ОТКАЧЕНО — предложенный «ь» ФЛАВЕД: адверсариальное ревью (author≠reviewer, подтверждено white-box) поймало коллизию «Синь/Линь»→«син/лин»=«синий/линия» → ложный `SpoilerLeaks` (шум); «юань»→«юан» неотличим по форме — min-stem не разделяет.** Откат + регресс-гвоздь; finding 1 (палладий) открыт в safe-направлении, нужен сид-decl-перечень или anchor-gated матч — **РЕШЕНИЕ владельца (пинг §а)**. Приёмка: `build`/`vet`/`test -race ./...` зелёные · майнер-парити EXACT · голден пере-захвачен, маскированный дифф ПУСТ (двинулся только `embedded_version`; `memory_version`/`prompt_sha256`/`content_hash`/вердикты — на месте) · греп-общность чист. **СТОП — приёмка оркестратора.** @@ -334,8 +335,8 @@ Q1 = П1 цель-шов санкционирован («главное бэке *(Хроника сессии «Голос и состояние» (09.07 → research/15, D21) — в [archive/PROGRESS-2026-07-04-10.md](archive/PROGRESS-2026-07-04-10.md), D31.)* ## Ридер-IDE -(секция ресёрч-сессии и фронт-сессий — записи добавлять сюда) +(секция ресёрч/движковых записей Ридер-IDE; записи фронт-сессий с 04.08 — ТОЛЬКО в `frontend/docs/frontend-PROGRESS.md`, D39.100) -**Фронт-сессия — исследование стека закрыто (02.08).** 15 агентов (7 направлений × независимый скептик-опровергатель + синтез), версии сверены с вебом 02.08; скептики дали 5 blocker/45 major — записаны исправленные варианты. Артефакты: `frontend/docs/STACK_DECISIONS.md` (пины точными версиями · ловушки «вся документация в сети описывает прошлые версии» · работы движка §8) + переписанный `frontend/docs/FRONTEND_SESSION_PROMPT.md` (фронт режется на этапы S0–S7; первая кодовая сессия кончается витриной токенов). — **ЛЕНД D39.84** (10-агентный refute-воркфлоу оркестратора: все несущие бэкенд-утверждения CONFIRMED, 8/8 веб-пинов подтверждены первоисточниками; работы движка = строки 99–102; ПТ-34/ПТ-21/ПТ-23 в реестре; вопрос коммит-прав фронт-сессий — у владельца). +**Фронт-сессия — исследование стека закрыто (02.08).** 15 агентов (7 направлений × независимый скептик-опровергатель + синтез), версии сверены с вебом 02.08; скептики дали 5 blocker/45 major — записаны исправленные варианты. Артефакты: `frontend/docs/STACK_DECISIONS.md` (пины точными версиями · ловушки «вся документация в сети описывает прошлые версии» · работы движка §8) + переписанный `frontend/docs/FRONTEND_SESSION_PROMPT.md` (фронт режется на этапы S0–S7; первая кодовая сессия кончается витриной токенов). — **ЛЕНД D39.84** (10-агентный refute-воркфлоу оркестратора: все несущие бэкенд-утверждения CONFIRMED, 8/8 веб-пинов подтверждены первоисточниками; работы движка = строки 99–102; ПТ-34/ПТ-21/ПТ-23 в реестре; вопрос коммит-прав фронт-сессий — у владельца; РЕШЁН дважды: D39.88 право дано → D39.98 отозвано, коммитит только оркестратор). *(Хроника сессии «Ридер-IDE» (11.07 → research/16, D29) — в [archive/PROGRESS-2026-07-04-10.md](archive/PROGRESS-2026-07-04-10.md), D31.)* diff --git a/docs/README.md b/docs/README.md index 592793f6..ba62029f 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,6 +1,6 @@ # TextMachine — документация -Проект: издательский художественный перевод крупных текстов (книги, ранобэ, вебновеллы; zh/ja/en→ru) мультиагентным пайплайном поверх LLM API. Go-бэкенд + веб-фронт ридер-IDE (Ф3). Цели и мерило — канон в [../CLAUDE.md](../CLAUDE.md); онбординг сессий — там же. Стартовый бриф владельца: [../START_PROMT.MD](../START_PROMT.MD) — **живой документ**, его V-идеи разобраны в реестр требований (ниже). +Проект: издательский художественный перевод крупных текстов (книги, ранобэ, вебновеллы; zh/ja/en→ru) мультиагентным пайплайном поверх LLM API. Go-бэкенд + веб-фронт ридер-IDE (Ф3) + платформа (SaaS control plane, `platform/`, D39.81). Цели и мерило — канон в [../CLAUDE.md](../CLAUDE.md); онбординг сессий — там же. Стартовый бриф владельца: [../START_PROMT.MD](../START_PROMT.MD) — **живой документ**, его V-идеи разобраны в реестр требований (ниже). **Состояние проекта НЕ здесь.** Очередь, курс, бэклог — CURRENT-STATE в шапке [PROGRESS.md](PROGRESS.md); решения — [architecture/05-decisions-log.md](architecture/05-decisions-log.md) (при конфликте с любым доком побеждает он). Эта страница — только карта «что где лежит». @@ -13,9 +13,9 @@ - [09-target-architecture.md](architecture/09-target-architecture.md) — целевая 7-слойная архитектура (статус стройки — шапка-таблица; §3 — карта находок H/L) · [10-prompt-architecture.md](architecture/10-prompt-architecture.md) — промпт-слой · [12-go-style-notes.md](architecture/12-go-style-notes.md) — норматив общности §0 · [13-tech-debt-anchors.md](architecture/13-tech-debt-anchors.md) — якоря техдолга (справочник к бэклогу, НЕ трекер) · [14-api-contract/](architecture/14-api-contract/) — **контракт API v0 фронт↔платформа (D39.99)**: нормативная спека OpenAPI 3.1 (типы фронта генерятся из неё) + компаньон-README (провенанс ✓/◆/○, К-вопросы; зонная копия `frontend/docs/api-contract/` — байт-зеркало, сверять при лендинге). - Исторические, читать через ⚠-баннеры: [01-decisions.md](architecture/01-decisions.md) (Р1–Р10) · [02-mvp-plan.md](architecture/02-mvp-plan.md) · [03-implementation-notes.md](architecture/03-implementation-notes.md) · [04-unhappy-paths.md](architecture/04-unhappy-paths.md) · [06-memory-risk-registry.md](architecture/06-memory-risk-registry.md). - `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 шов движок↔платформа (читать перед любым кодом стыка). +- `research/` — фактура ресёрчей 01–23 (+24 арбитраж банка — в дереве, НЕ залендён, ждёт приёмки №13); у принятых — ревью-шапки, часть тел под ⚠ 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) (полигон, отложен) · **платформа: [../platform/docs/PLATFORM_SESSION_PROMPT.md](../platform/docs/PLATFORM_SESSION_PROMPT.md) (P0, выдан и ЗАПУЩЕН 04.08, D39.100)** · фронт: `frontend/docs/S3_SESSION_PROMPT.md` (замок ОТКРЫТ — контракт ратифицирован D39.99; первый шаг — правки спеки по D39.100). Зонные журналы фронта/платформы — `frontend-PROGRESS.md` / `platform-PROGRESS.md` в их зонах (решение владельца 04.08: прогресс зон только там). **Бэкендного активного промта НЕТ** — пак стандартов + дофикс archguard исполнены, приняты и залендены (D39.96/97, 04.08; промты в `archive/prompts/`); следующие бэкендные: пак экрана 46 (промт ждёт выдачи по D39.94 п.3) и малый пак tools/go.mod (строка 118, D39.97 п.4). Банк-арбитраж: промт ИСПОЛНЕН пере-запуском 04.08 и заархивирован (`archive/prompts/`); отчёт `research/24` + `eval/bank_arbitration/` в дереве НЕ залендены — **первая задача приёмки оркестратора №13**. +- Активные хендофф-промты сессий (состав обновляется при каждом лендинге — норма D39.80): [ORCHESTRATOR_SESSION_PROMPT.md](ORCHESTRATOR_SESSION_PROMPT.md) (роль/нормы; состояния не дублирует) · [POLYGON_PACKAGE4_SESSION_PROMPT.md](POLYGON_PACKAGE4_SESSION_PROMPT.md) (полигон, отложен) · **платформа: [../platform/docs/PLATFORM_SESSION_PROMPT.md](../platform/docs/PLATFORM_SESSION_PROMPT.md) (P0 ИСПОЛНЕН 04.08 — ждёт приёмки №13, D39.101 п.3-iv; дерево `platform/*` не залендено, не трогать)** · фронт: `frontend/docs/S3_SESSION_PROMPT.md` (замок ОТКРЫТ — контракт ратифицирован D39.99; первый шаг — правки спеки по D39.100). Зонные журналы фронта/платформы — `frontend-PROGRESS.md` / `platform-PROGRESS.md` в их зонах (решение владельца 04.08: прогресс зон только там). **Бэкендного активного промта НЕТ** — пак стандартов + дофикс archguard исполнены, приняты и залендены (D39.96/97, 04.08; промты в `archive/prompts/`); следующие бэкендные: пак экрана 46 (промт ждёт выдачи по D39.94 п.3) и малый пак tools/go.mod (строка 118, D39.97 п.4). Банк-арбитраж: промт ИСПОЛНЕН пере-запуском 04.08 и заархивирован (`archive/prompts/`); отчёт `research/24` + `eval/bank_arbitration/` в дереве НЕ залендены — **первая задача приёмки оркестратора №13**. - Зоны фронта (чужие, читать при касании стыка; каждая ведёт СВОЙ зонный бэклог — единый бэклог их строк не принимает, 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) (П-1..П-5) + `docs/` (промт P0 · зонный журнал `platform-PROGRESS.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 fdb9002e..050b9d74 100644 --- a/docs/architecture/05-decisions-log.md +++ b/docs/architecture/05-decisions-log.md @@ -1,6 +1,7 @@ # Журнал решений оркестратора — контракт D1–D39.101 (развязки 04.07 · пакеты 09–10.07 · приёмка/качество-первым/пивот/эмпирика 11–12.07 · арх-ресет+стройка пере-прогонного стека 13–19.07) > **⟶ КАРТА АКТУАЛЬНОСТИ (ревизия D31, продлена до D38.2 [12.07]; исторические записи ниже НЕ переписываются — дисциплина D23.3).** Читая контракт целиком, держи под рукой, что чем перекрыто: +> ⚠ **Навигация (актуализация 04.08):** два supersede-указателя эры D39.9x: **D39.88/D39.84 п.8 (право самокоммита фронта/платформы) → отозвано, коммитит ТОЛЬКО оркестратор** (D39.98 п.3; тела переписаны на месте с санкцией владельца, pre-rewrite — git `2b166b7`) · **норма 30.07 «короткая приёмка» → амендирована владельцем 03.08: приёмка всегда адверсариальная** (носитель — промт оркестратора §Анти-паттерны + D39.101 п.1) — упоминания «короткой приёмки» в телах читать через эту пометку. > ⚠ **Навигация (актуализация 01.08):** карта ниже детально покрывает D1–D39.28; решения D39.29+ живут хронологически в теле файла, **свежая голова — С ХВОСТА** (новые ноты аппендятся вниз). Сводка текущей головы и очередь — CURRENT-STATE в `../PROGRESS.md`. > - **Полностью superseded:** **D1 (моно-редактор) → D17 → D30.1 (редактор БИЛИНГВ)** · D9 (ja-приёмка) → D18 (蛊真人 zh→ru; ja — второй прогон) · D17 → D30.1 · скобка D19.4 «ключ без data-sharing» и D20.3 «чистый ключ = блокер пилота» → **D27** (единый ключ С data-sharing, отключение перед продом) · exp04-дефолт «editor grok-4.3» (D3) → D30.1 (grok reasoning-off из редакторских ролей СНЯТ — no-op; кандидат glm-5-билингв; gemini — премиум-эскалация только за санитайзером D30.3). > - **Частично амендировано:** D3 (канал B → D14.1/D19.1 + оговорки D22.5/D22.6; апекс-слаг `-preview` — D22.4; draft под вопросом exp13 — D30.6) · D6 («off/minimal для draft/edit» эродирован: draft thinking-ON принудительно, editor-off снят D30.1; живы per-роль принцип и D6.2-буфер) · D10 (+D24.2 alias-слепое пятно, истинная консистентность ≈99.5%) · D11-числа → exp08 → **D30.4** (флип D1 = +15–25%, ~$0.85/ранобэ; «$1.5–2» = неподписанная опция Б) · D12 (+D24.3 флоры max_tokens; +D29.1в rollup — амендмент вердикт-правила) · D13.1-арм из решающего → ПОДТВЕРЖДАЮЩИЙ (D30.1); +D25.3 prefix-анализ судьи · D14.2 закрыт D19.1/D22.4; D14.4 закрыт D22.1 · D15.3 исполнен; спека D15.2: v2→v3→v3.1 (D22.2), реализация = текущий пакет (D30.9) · D24.4 +D28.1 (precision/recall-трейдофф; hard-gate требует пере-замера) · порядок D24.5 отложен D26.1 (этап B — после читаемых 25 глав). @@ -1463,4 +1464,6 @@ API-529-долг закрыт: 8-осевой refute-by-default воркфлоу **3. Очередь №13 (по слову владельца):** (i) **приёмка банк-арбитража** — артефакты в дереве не залендены (`research/24` · `eval/bank_arbitration/` · черновик в `archive/reports/`; итог **$0.1073**, ⚠ арифметика пинга внутренне бита — сверить; потолок ратифицирован $1.20 против $1.00 в пинге; при лендинге поправить путь промта в шапке `research/24`); норма — адверсариальная приёмка, экспериментальные клеймы с репликацией (хотя бы редуцированной), лендинг одним атомарным заходом отчёт+харнесс+пинг с ревью-шапкой; (ii) **бэкенд-доработки по бэклогу**: выдать промт пака экрана 46 (дизайн заморожен D39.92 п.1+D39.93; фикстура 113 ПЕРВОЙ; денежный шаг ТОЛЬКО с подписью) · малый пак tools/go.mod (D39.97 п.4) · блокеры контракта 99/100/101/103/125 — промтом(ами) по готовности; (iii) вахта deepseek-v4-pro (триггер >05.08 НАСТУПАЕТ; реестр 108); (iv) **приёмка P0** — сессия успела ОТРАБОТАТЬ в ходе закрытия №12: отчёт и дизайн-ответы К-4/К-7/К-12/П-5 (предложениями, ратификация — оркестратор) в `platform/docs/platform-PROGRESS.md`; клеймы журнала («make check зелёный», healthz против живого Postgres 18.4) — СО СЛОВ, перепроверить исполнением; дерево `platform/*` целиком, включая модифицированный `go.mod`, не заленжено — не трогать до приёмки; свип трёх открытых вопросов (один — владельцу: авто-резюме после сброса лимитов) · лендинг S3 при её запуске (свип зонных журналов на «решения владельца» — норма D39.99 п.4). -**4. Грабли преемнику (проверено на себе):** пермишен-классифаер блокирует сорсинг `.env` — живые пробы промтом бэкенд-сессии или `!`-командой владельца · счёт очереди ТОЛЬКО скриптом по таблице (ручной список «скоро» недосчитывает жирные веса) · cwd в Bash-вызовах липнет между командами — пути абсолютные или с `cd` в начале · чужое незакоммиченное в дереве (артефакты арбитража) не трогать и не «прибирать» · голову D-лога и шапку PROGRESS сверять грепом перед закрытием (отставание головы — известный класс дефекта). (04.08.2026, оркестратор №12). ✅ +**4. Грабли преемнику (проверено на себе):** пермишен-классифаер блокирует сорсинг `.env` — живые пробы промтом бэкенд-сессии или `!`-командой владельца · счёт очереди ТОЛЬКО скриптом по таблице (ручной список «скоро» недосчитывает жирные веса) · cwd в Bash-вызовах липнет между командами — пути абсолютные или с `cd` в начале · чужое незакоммиченное в дереве (артефакты арбитража) не трогать и не «прибирать» · голову D-лога и шапку PROGRESS сверять грепом перед закрытием (отставание головы — известный класс дефекта). + +**5. ДОБОР (тот же день): владелец поймал «актуализацию» на частичности — исполнен ПОЛНЫЙ док-свип** (6 сканеров по кластерам, 89 находок: 17 operative-wrong · 42 stale-pointer · 2 архив-кандидата · 28 nice-to-have; 11 файлов чисты). Применено ~60 правок по 15 файлам: CLAUDE.md (координация зонных журналов · контракт в источниках · онбординг платформы) · глоссарий +7 терминов (Платформа · S/P-нумерация · зонные журналы · контракт 14 · провенанс · ПТ-N · paused) · PROGRESS (два ПОТЕРЯННЫХ хроникальных заголовка D39.97/98 восстановлены — мои же правки их съели; пять 95-указателей → контракт 14; штампы; амендмент-маркеры «короткой приёмки»; разрыв таблицы склеен) · голова D-лога: два supersede-указателя (D39.88 · норма 30.07) · 09-target (стейл isRuTarget → D39.64; баннер пост-D39.101; ссылка на архив) · 10-prompt (пар-пути; язык промпта = Р6 отрицателен; Q4a/Q4c измерены; снапшот-фолд построен) · 13-tech-debt (9 закрытий стрелками «→ Dxx») · полигон-промт (P4-хвост ЗАКРЫТ ×2 · пре-рег-исключение · указатели) · ПТ-реестр (6 + квалификация STACK-путей) · ревью-шапки research/16 и /23 (контракт ратифицирован) · фронт-промты (S3: замок открыт, строка 95 снята; стоящий: 5 датированных поправок D39.99/100) · **S2-промт заархивирован** (`archive/prompts/FRONTEND_S2_SESSION_PROMPT.md`). **Отложено до приёмки P0 (зона живая): 2 правки `platform/README.md`** (стейл «промта ещё нет»; «живая стоимость» против D39.84) и архивация P0-промта — №13 при лендинге платформы. Урок — в памяти оркестратора (`doc-actualization-means-full-sweep`). (04.08.2026, оркестратор №12). ✅ diff --git a/docs/architecture/09-target-architecture.md b/docs/architecture/09-target-architecture.md index 5aa29391..08d6cdb9 100644 --- a/docs/architecture/09-target-architecture.md +++ b/docs/architecture/09-target-architecture.md @@ -1,13 +1,13 @@ # Целевая архитектура и дорожная карта (арх-ресет 2026-07-13) > **Статус:** проектный документ оркестратора, ратифицирован **D39** (`05-decisions-log.md`). Рождён из арх-ресета -> (`ORCHESTRATOR_ARCH_RESET_PROMPT.md`, 5 концернов владельца) и синк-аудита «сломанного телефона» +> (`../archive/prompts/ORCHESTRATOR_ARCH_RESET_PROMPT_2026-07-13.md`, 5 концернов владельца) и синк-аудита «сломанного телефона» > (`../archive/architecture/08-sync-audit-ledger.md`, 65 находок, адверсариально верифицированы; архивирован 25.07 как отработанный). Решения владельца по подходу: > **фазовый** (build-now ∥ ресёрч, пере-прогон после) + **слой пар языков = сеам сейчас, контент только zh→ru**. > > Это карта «куда и почему», а не пошаговая спека. Спеки — в хендофф-промтах сессий; контракт — в D-логе. -> **⟶ СТАТУС СТРОЙКИ (2026-08-01, пост-D39.63; баннер — не переписывание, тело ниже = замысел арх-ресета 13.07).** Карта «слой → статус → пак/D»: +> **⟶ СТАТУС СТРОЙКИ (освежён 04.08, пост-D39.101: слои 4/5 добраны паками банка/чекеров D39.69/78/82; репо на стандартах — `make battery`, tmvet/archguard, D39.96/97; поверх слоёв движка: контракт API v0 = `14-api-contract/` (D39.99), платформа = зона `platform/`, открыта D39.100. Ранее 2026-08-01, пост-D39.63; баннер — не переписывание, тело ниже = замысел арх-ресета 13.07).** Карта «слой → статус → пак/D»: > | Слой | Статус | Пак / D | > |---|---|---| > | 1 Сегментация | ✅ ПОСТРОЕН: бюджет в выходных токенах снапшот-folded (`chunk.SegBudget`), edit-единицы декаплены; когезия/carryover — НЕ строится (D39.7/8: эффекты под floor 0.126; кнобы `STMDepth`/`OverlapTokens` УДАЛЕНЫ, WS2 §2а), граница `logical` — не рычаг (exp15), greedy остался | пак-11 (D39.13 WS2 · D39.17 волны · D39.18 c-lite) | @@ -116,7 +116,7 @@ snapshot-дисциплина, эталонные сеамы `config→stage-lis пар-агностичные чекеры + embedded-данные + книго-overlay `langpack_extend` (пак-14) · пар-калибровки `configs/pairs/` + промпт-резолв конвенцией `prompts/<пара>/<роль>.md` (D39.23г). Извлечение правил из ТЕЛА промтов (дискурс-нормы, few-shot) — ещё открыто (форсинг-функция = ja→ru-реплика). `x/text/language.Tag` - ОТВЕРГНУТ для гейт-предикатов (CLDR-инстабильность в снапшот-вердиктах — держим точные `isRuTarget`). + ОТВЕРГНУТ для гейт-предикатов (CLDR-инстабильность в снапшот-вердиктах); → исполнено иначе D39.64: `isRuTarget` удалён, гейт-предикаты = `TargetActive`/`TargetScriptNonLatin` из данных пары — отказ от `language.Tag` в силе. ### Слой 3 — Контракт переводчик/редактор (роли = узкие проходы) · концерн 1 - research/07 предписывает **узкие мандаты + диффы, а не полную перегенерацию** — сейчас ровно наоборот (4 мандата, diff --git a/docs/architecture/10-prompt-architecture.md b/docs/architecture/10-prompt-architecture.md index 58e6a232..090c1532 100644 --- a/docs/architecture/10-prompt-architecture.md +++ b/docs/architecture/10-prompt-architecture.md @@ -13,13 +13,15 @@ | Вопрос владельца | Статус | Где живёт | |---|---|---| -| **Язык самого промпта** (сейчас всё по-русски; для zh→en русский не должен участвовать) | ОТКРЫТ, спроектирован: язык промпта = **свойство пакета пары**, не хардкод. Измерение «на языке цели vs оригинала vs ru» — полигон-вопрос ПОСЛЕ exp15 (нужен не-ru таргет с реальной книгой) | START_PROMT V4-п5 · аудит `L4-prompt-language-always-russian` (CONFIRMED/HIGH) · `09` §2-слой-2 · D39 п.7 | +| **Язык самого промпта** (сейчас всё по-русски; для zh→en русский не должен участвовать) | ОТКРЫТ, спроектирован: язык промпта = **свойство пакета пары**, не хардкод. Первый замер ИСПОЛНЕН: Р6/D39.61 — ru/en-срез ОТРИЦАТЕЛЕН (эхо-ось), «не закрыт окончательно» оговоркой; остаток — язык промпта как свойство пакета для не-ru таргетов, вернётся с ja→ru | START_PROMT V4-п5 · аудит `L4-prompt-language-always-russian` (CONFIRMED/HIGH) · `09` §2-слой-2 · D39 п.7 | | **Вырезать правила языка из промтов в отдельный слой** (Палладий/Поливанов, дискурс-нормы, few-shot) | СЕАМ ПОСТРОЕН (пак-1, D39.2): конфиг pair-keyed `prompts: {zh-ru: …}` + `Book.LangPair()` + fail-loud на чужую пару. **Контент ещё НЕ извлечён** — правила по-прежнему в теле zh-ru-файлов; извлечение в структурированный пакет гейтится exp15 + research/18 §D-3 («форма пакета не разрешена») | research/18 §B2.2/§C#15 · `09` §2-слой-2 · D39-решение владельца «сеам сейчас, контент zh→ru» · пак-1 T3.3 | -| **Почему структура абзацев и расширенный язык-промпт — только у РЕДАКТОРА?** | ОСОЗНАННОЕ решение D30.2 (дешёвый буквальный черновик + вся реструктуризация у умного билингв-редактора; exp12: построчность = корень нечитаемости), НО альтернатива «переводчик отдаёт структуру» **никогда не мерилась** — это ровно армы **Q4a/Q4c exp15** (сильный переводчик; reflow отдельным пассом). До exp15 асимметрия сохраняется намеренно | D-лог D30.2 (`05:366` — «механизм реверстки — открытый вопрос») · аудит `L1-*`/`H3` · research/19 §C · exp15 Q4 | +| **Почему структура абзацев и расширенный язык-промпт — только у РЕДАКТОРА?** | ОСОЗНАННОЕ решение D30.2 (дешёвый буквальный черновик + вся реструктуризация у умного билингв-редактора; exp12: построчность = корень нечитаемости), альтернатива «переводчик отдаёт структуру» — Q4a ИЗМЕРЕН (D39.9: верность на translate-стадии не покупается), Q4b/Q4c не гонялись; асимметрия сохранена по данным; diff-контракт редактора — строка 106 | D-лог D30.2 (`05:366` — «механизм реверстки — открытый вопрос») · аудит `L1-*`/`H3` · research/19 §C · exp15 Q4 | | **Все промты zh→ru-центричны — неправильно для мультиязычного бэкенда** | Ратифицирован **инвариант общности** (`09` §0.1, поправка владельца 13.07): пара = ось данных, не кода. Латентный баг закрыт паком-1 (ja-книга теперь fail-loud, не едет тихо через «китайский паратаксис»). Новая пара = новый пакет-данные, не переделка кода | `09` §0.1 · D39 п.7 · пак-1 T3.2/T3.3 · аудит `H2` | ## 2. Инвентарь промтов (после пака-1/1.5, HEAD) +⚠ Пути таблицы устарели механически: промпты живут ПАР-каталогами `backend/prompts/zh-ru/<файл>` (+ `zh-ru/repair/`, + `classifier.md` — D39.69); читать `<файл>` как `zh-ru/<файл>` (испр. оркестратором 04.08, D39.101). + | Файл | Роль | Что внутри | Пара | |---|---|---|---| | `backend/prompts/translator.md` | черновик (flash) | брифинг-переменные `{{lang/genre/honorifics/transcription/venuti/footnotes}}` + слабая вёрстка-однострочка (D30.2) | де-факто zh→ru (ключ `zh-ru` в конфиге) | @@ -39,9 +41,9 @@ работает). Гейты на стройку: exp15 (какие правила реально несут) + research/18 §D-3 (форма пакета). ## 4. Открытое по теме (маршрутизировано) -1. **Язык промпта** — полигон-замер после exp15, на реальной не-ru книге (V4-п5; не гадать). +1. **Язык промпта** — первый замер Р6/D39.61 отрицателен (см. §1); добор — с реальной не-ru книгой (ja→ru). 2. **Извлечение правил в пакет** — exp15 ЗАВЕРШЁН; **данные-часть майнера ИЗВЛЕЧЕНА (D39.16:** zh/Палладий-инвентари → - `internal/lang`+`configs/langpacks/`, тот же pair-keyed идиом, что промпты, снапшот-фолд отложен до wiring майнера R1**)**; + `internal/lang`+`configs/langpacks/`, тот же pair-keyed идиом, что промпты, снапшот-фолд langpack-байтов ПОСТРОЕН (`LangpackVersion`, D39.15/16)**)**; извлечение правил из ТЕЛА zh-ru-промтов (дискурс/few-shot) — ещё открыто, форсинг = ja→ru-реплика. `x/text/language.Tag` ОТВЕРГНУТ для гейт-предикатов (CLDR-инстабильность в вердиктах — D39.16). 3. **Транскрипция per-book** (Палладий/Поливанов vs фандомные формы) — research/19 §E.3, решение diff --git a/docs/architecture/13-tech-debt-anchors.md b/docs/architecture/13-tech-debt-anchors.md index 31fe1857..b7875ee0 100644 --- a/docs/architecture/13-tech-debt-anchors.md +++ b/docs/architecture/13-tech-debt-anchors.md @@ -1,5 +1,6 @@ # Якоря техдолга — справочник к строкам бэклога (НЕ трекер) +> ⚠ **Освежение 04.08 (D39.101):** якоря были входом пакета-чекеров (исполнен D39.78) и арки банка (закрыта D39.69/71); часть находок ниже уже ЗАКРЫТА — закрытия помечены стрелками «→» по месту, счёт закрытий не дублируется в трекер. > **Единственный трекер — таблица «Бэклог» в `../PROGRESS.md`.** Этот файл — справочные file:line-якоря и скоуп-заметки к её строкам (родился как пост-сверка свипа D39.66, 01.08.2026; вынесен из архива решением владельца — содержимое ЖИВОЕ). Актуализируется лендингами паков, которые трогают эти строки; исполненный пункт помечать ссылкой на D-номер, не удалять. **Метод:** 4 адверсариальных верификатора (author≠reviewer к свипу) против backend-кода и D-лога; вердикты CONFIRMED_LOST / ALREADY_BUILT / ALREADY_CLOSED / RESCOPE, evidence обязателен. **Итог: 23 пункта — 20 CONFIRMED_LOST · 3 RESCOPE · 0 ALREADY_CLOSED (передумываний не найдено).** RESCOPE вправлены в бэклог тем же лендингом (строки 81/73/49). file:line-якоря ниже — вход для пакета-чекеров (строка 25) и дизайн-пака арки (73). @@ -12,7 +13,7 @@ **Фикс/скоуп:** Сузить строку 81 до двух реально отложенных работ: «Поливанов-валидатор (translit_policy Phase 2, store/migrate.go:186/194) + kana-омограф POS/known-word гейтинг / B6-токенизатор (memory.go:1048)»; компонент «чек-лист kana-алиасов сида (D16.4)» пометить built (backend/README.md:38 + seeding.go:47) — в чек-листе остаётся лишь Ф2-хвост «двойные чтения (強敵→とも) полная дизамбигуация», который и так под B6. -### [CONFIRMED_LOST] Строка 83 — F4: бэкап + integrity_check SQLite перед платным прогоном (VACUUM INTO) +### [CONFIRMED_LOST] Строка 83 — F4: бэкап + integrity_check SQLite перед платным прогоном (VACUUM INTO) → **ИСПОЛНЕНО D39.82: `tmctl backup` + pre-flight (`backend/cmd/tmctl/backup.go`), строка 83 закрыта; остаток F4-хвоста — строка 93** grep -rni 'VACUUM|integrity_check|backup' по backend/cmd/tmctl/ и backend/internal/store/ — 0 вхождений; расширенный grep по всему backend/ — тоже 0. Подкоманды tmctl (backend/cmd/tmctl/main.go:73–83) — только translate|report|status|export|redrive|seed-lint, команды бэкапа нет; в internal/store/ (chunkstatus.go, glossary.go, jobs.go, ledger.go, migrate.go, requestlog.go, ruby.go, store.go, voice.go) нет ни файла, ни функции бэкапа/integrity-проверки. SPOF из 06-реестра F4 реально ничем не закрыт. @@ -30,7 +31,7 @@ backend/internal/llm/provider_openai.go:166–171: normalizeOpenAIFinish схл **Фикс/скоуп:** Не требуется — занесено правильно (NOT-do пака-12 без решения, полигон-пакет до МАСШТАБА). -### [CONFIRMED_LOST] Дописка к строке 53 — внутрифайловый дубль ключа pair-файла → громкая ошибка (PACK15 §Внутрифайловый) +### [CONFIRMED_LOST] Дописка к строке 53 — внутрифайловый дубль ключа pair-файла → громкая ошибка → **частично ИСПОЛНЕНО D39.82 (putUniqueDC, строка 53 закрыта); остаток parseCategoryRows — строка 111** (PACK15 §Внутрифайловый) backend/internal/lang/langpack.go:824 (parseCategoryRows): `cats[f[0]][f[1]] = val` — повторный ключ ВНУТРИ одного файла молча перезаписывает предыдущий (last-wins), без проверки дубля. Громкая коллизия есть только на стыке уже слитого состояния и следующего источника: unionStringMap (langpack.go:466–474, «key … is already defined … and the overlay redefines it») — но внутрифайловые дубли схлопываются в parseCategoryRows ДО того, как merge их увидит. Ровно так это и зафиксировано открытым в отчёте: docs/archive/reports/PACK15_STRUCTURE_REPORT_2026-07-25.md:274–276 «Дубль ключа ВНУТРИ одного pair-файла всё ещё тихо разрешается „последний выигрывает" … фикс — кандидат следующего пака». Теста на внутрифайловый дубль в langpack_test.go нет (grep duplicate/дубл/already defined — 0). @@ -56,7 +57,7 @@ grep sanitiz по backend/configs/pipeline-c2.yaml — 0 вхождений (exi В backend/internal/ резюме-механизма НЕТ: grep summary/резюме даёт только несвязанное — RedriveSummary (pipeline/status.go:592-593, план redrive), SanitizerResult.Summary() (checks/sanitizer.go:165-167, текст флага), детектор ХВОСТОВОГО edit-summary модели (sanitizer.go:90), коммент-плейсхолдер «approved-glossary+summary+series-bible» в pipeline/snapshot.go:391 при том, что memoryVersion() материализует ТОЛЬКО frozen APPROVED glossary rows (snapshot.go:179-189); в схеме store/migrate.go нет таблицы/колонки резюме (строка 18 — лишь коммент о payload снапшота). Не закрыт решением: 05-decisions-log.md:373 (D30.8 п.8) — «слой авто-памяти/состояния (Annotator, межглавные резюме…) — Ф2, связка с пилотом Ф2.5 зафиксирована» — отложено, не отменено; в списке «ЗАКРЫТО ЯВНО» D39.66 его нет. -**Фикс/скоуп:** Строка верна как есть: дизайн-пак 73 обязан дать диспозицию «строить в Ф2.5 или закрыть с обоснованием». +**Фикс/скоуп:** → **Диспозиция ДАНА D39.69: закрыт по нужности; строка 80 = гейт пилота Ф2.5.** (Историческая формулировка: дизайн-пак 73 обязан дать диспозицию «строить в Ф2.5 или закрыть с обоснованием».) ### [CONFIRMED_LOST] Строка 82: морфо-гейт РОДА (C3, глагол прош. вр. при gender=hidden) @@ -74,19 +75,19 @@ grep sanitiz по backend/configs/pipeline-c2.yaml — 0 вхождений (exi Половина УЖЕ ПОСТРОЕНА: инъективность dst (B2, «два исходных → один целевой») реализована как membank.InjectivityCollisions (membank/memory.go:1101-1126: группировка approved-строк по нормализованному dst, ≥2 разных src = коллизия) и вызывается на загрузке как warning-only диагностика (pipeline/seeding.go:157). НЕ построены две другие части исходного обязательства (04-unhappy-paths.md:19: «тип ranked-set + проверка инъективности … и порядка ступеней»): типа ranked-set нет (type — свободный текст «name|term|title|…», migrate.go:181; grep ranked-set/tier/ступен по backend = 0 кодовых хитов) и проверки ПОРЯДКА ступеней при перечислениях нет. -**Фикс/скоуп:** Переформулировать кандидата в 73: «ranked-set: тип записи + проверка порядка ступеней (инъективность dst УЖЕ есть — InjectivityCollisions, warning-only на seeding.go:157; решить, нужен ли hard-режим для ranked-set-строк)». +**Фикс/скоуп:** → **Закрыто D39.69 §1 + D39.71 (Q4 не строить).** (Исторически: переформулировать кандидата в 73: «ranked-set: тип записи + проверка порядка ступеней (инъективность dst УЖЕ есть — InjectivityCollisions, warning-only на seeding.go:157; решить, нужен ли hard-режим для ranked-set-строк)».) ### [CONFIRMED_LOST] Кандидат 73: STITCH-ретирование инъекции отработанных термов Механизма подавления инъекции терма, стабильно отработанного N чанков подряд (research/15-voice-and-state.md:204), в membank НЕТ: бюджет Select ранжирует по priorityRank = confirmed/exact/sticky (memory.go:645-661) без какого-либо счётчика «отработанности»; sticky A5 — ИНЕРЦИЯ в противоположную сторону (наследование в следующий чанк, memory.go:500-505); grep retire/streak/consecutive/отработ по internal/ даёт только loopguard (повтор сегментов) и retired-конфиг-флаги — не о том. Post-check (mempostcheck.go) следит за промахами, но не влияет на подачу. -**Фикс/скоуп:** Кандидат занесён правильно; в дизайн-паке учесть, что счётная база для «N чанков подряд без промаха» уже есть в retrieval_state/post-check — стройка сводится к политике селекции. +**Фикс/скоуп:** → **Закрыто D39.69 (реопен-триггеры: бюджет инъекции / измеренный эффект размера).** (Исторически: кандидат занесён правильно; счётная база для «N чанков подряд без промаха» уже есть в retrieval_state/post-check — стройка сводится к политике селекции.) ### [CONFIRMED_LOST] Кандидат 73: эмбеддинг-второй-эшелон A7/D2 (дать диспозицию) В ДВИЖКЕ ретривала по эмбеддингам нет: единственные следы — плейсхолдер-колонка `embedding_tier_used INTEGER NOT NULL DEFAULT 0, -- always 0 in v1 (no embeddings on the hot path, Р3)` (store/migrate.go:248) и её протаскивание в store/glossary.go:71,305-391; miner_substrate.go:15 прямо декларирует «$0, no LLM, no embeddings»; grep cosine/vector/embedding по internal/ иных хитов не даёт. В eval бенч существует (eval/retrieval_bench.py). Реестр держит A7/D2 отложенными в Ф2 low-trust (06-memory-risk-registry.md:32,61,105) — живо, не закрыто. -**Фикс/скоуп:** Занесено правильно как «дать диспозицию» (строить low-trust Ф2-слой или явно закрыть); формулировка точна. +**Фикс/скоуп:** → **Закрыто по нужности D39.69 (реопен: измеренный recall-разрыв на масштабе).** (Исторически: занесено как «дать диспозицию»; формулировка точна.) ### [CONFIRMED_LOST] Кандидат 73: tmctl «замена термина с главы N» @@ -138,13 +139,13 @@ membank/mempostcheck.go:12 — пост-чек стоит на посылке « Обе половины подтверждены. (а) checkers.go:411-412 — «A CORRECT rendering anywhere in the chunk (the ok-suppressor) suppresses the flag»; код 426-435: `!c.qianwanOKRE.MatchString(final)` и `strings.Contains(final, ...)` — весь чанк, не пер-вхождение; одно верное 千万 маскирует второе неверное. DC1 аналогично берёт только ПЕРВЫЙ матч (checkers.go:358 FindStringSubmatch). (б) Р2 (D39.63(1): «жёсткий флаг ТОЛЬКО за неверное ЗНАЧЕНИЕ; неконвертированная форма = мягкий счётчик») не имплементирован: lintPercentScale (checkers.go:482-506) файрит по ФОРМЕ (нет процентного слова + есть дробный кью), pct вычисляется только для сообщения, сравнения значений нет; cheapgates.go:84-89 прямо признаёт: «A correct fix compares the rendered VALUE… a design, not a patch. Left firing». Сплита hard/soft в CheapGateResult нет. -**Фикс/скоуп:** Пер-вхожденческое сопоставление (FindAllString + попарный матчинг) и имплементация Р2: сравнение значения (нужны цель-данные числительных), split жёсткий-дефект/мягкий-линт в результате чекера. — **✅ Р2-split ИСПОЛНЕН (пакет-чекеров 02.08):** `CheapGateResult.UnitScaleHard()`={DC1 ruNum≠2n · NumberMagnitude — слово-магнитуда неверного ПОРЯДКА, ошибка значения (→HARD по находке ревью-агента)} / `UnitScaleSoft()`={DC2 гипербола-неоднозначна, PercentScale верное значение в форме-дроби}; `Total()` не тронут (голден-нейтрально). **Пер-вхожденческий супрессор — ⊘ НЕ строил:** под Р2 PercentScale стал SOFT-наблюдаемостью, локальность-window эвристична и низкоценна → Р4-потолок. HARD-value-чек 成/万 требует ru-numeral-word-данных (потолок записан в v5-блоке шапки cheapgates.go §5-A4 + отчёте; inline-записи на самих функциях НЕТ — хвост в строке 93) — §6-Q3 владельцу (строка 92). +**Фикс/скоуп:** Пер-вхожденческое сопоставление (FindAllString + попарный матчинг) и имплементация Р2: сравнение значения (нужны цель-данные числительных), split жёсткий-дефект/мягкий-линт в результате чекера. — **✅ Р2-split ИСПОЛНЕН (пакет-чекеров 02.08):** `CheapGateResult.UnitScaleHard()`={DC1 ruNum≠2n · NumberMagnitude — слово-магнитуда неверного ПОРЯДКА, ошибка значения (→HARD по находке ревью-агента)} / `UnitScaleSoft()`={DC2 гипербола-неоднозначна, PercentScale верное значение в форме-дроби}; `Total()` не тронут (голден-нейтрально). **Пер-вхожденческий супрессор — ⊘ НЕ строил:** под Р2 PercentScale стал SOFT-наблюдаемостью, локальность-window эвристична и низкоценна → Р4-потолок. HARD-value-чек 成/万 требует ru-numeral-word-данных (потолок записан в v5-блоке шапки cheapgates.go §5-A4 + отчёте; inline-записи на самих функциях НЕТ — хвост в строке 93) — → **§6-Q3 РЕШЁН D39.79 п.4: не строить; реопен = флип hard-gate (строка 12) либо поток value-дефектов с добора идеала.** ### [CONFIRMED_LOST] #8 两 отсутствует в классе cheng_re configs/langpacks/zh-ru/dc-checkers.txt:65 — `cheng_re ([0-9一二三四五六七八九十])成([0-9一二三四五六七八九]?)` — ни 两, ни 兩 нет ни в одном из классов, хотя тот же пак знает 两: строка 9 `cjk_numeral 两 2`, строка 41 shichen_re содержит 两. 两成 (20%) невидимо для lintPercentScale. По D39.63(3) данные-правки на этой фазе перестали быть дорогими (стендовый корпус одноразовый) — «данные, батчем» в строке 25 корректно. -**Фикс/скоуп:** Добавить 两/兩 в оба класса cheng_re батчем данных-правок (одна правка dc-checkers.txt, resnapshot по дисциплине D39.63). — **✅ ИСПОЛНЕНО как ДАННЫЕ (пакет-чекеров 02.08):** 两/兩 в оба класса cheng_re + 兩=2 в cjk_numeral (парс-полнота). **Нужность на labels = 0** — 两成 в acceptance:10:0/minirun:10:0 замаскировано супрессором #1 (там есть «процент»); правомерно как generality/consistency-фикс. 兩-traditional — §6-Q2 владельцу (0 стоимости, подтвердить или откатить). +**Фикс/скоуп:** → **Подтверждено D39.79 п.3, довершено D39.82 (shichen_re).** (Исторически: добавить 两/兩 батчем данных-правок, resnapshot по дисциплине D39.63). — **✅ ИСПОЛНЕНО как ДАННЫЕ (пакет-чекеров 02.08):** 两/兩 в оба класса cheng_re + 兩=2 в cjk_numeral (парс-полнота). **Нужность на labels = 0** — 两成 в acceptance:10:0/minirun:10:0 замаскировано супрессором #1 (там есть «процент»); правомерно как generality/consistency-фикс. 兩-traditional — §6-Q2 владельцу (0 стоимости, подтвердить или откатить). ### [CONFIRMED_LOST] Резидуал R4 пака-11: DC7 grade/role-чекер · omission-бэкстоп · DC2 word↔word дроби @@ -196,7 +197,7 @@ backend/prompts/zh-ru/editor.md:6 — «Правь стиль: убирай ка Сырьё существует, суд не докуплен (проверено счётом файлов и метаданными, тексты не читались). P4-артефакты: ~/books/gu-zhenren/research15-probes/probes/raw/ — 100 файлов, вкл. полные сетки echo-ds-gu008-{D0,D1,D2,DP}×{s0,s1,s2} (12 шт.) и echo-grok-gu-001..010×{G0..G4} (50 шт.). Судейское сырьё: ~/books/gu-zhenren/promptlang/judge_p4/votes.jsonl = 36 голосов ровно над 16 distinct (fam,arm,frag)-комбо: deepseek только gu008-s2×{D1,D2,DP} (3), grok G1×{001,002,004,005,006} + G2×{001,002,004,005} + G4×{001,002,004,005} (13). Отчёт POLYGON_PROMPTLANG_ANTIECHO_2026-07-31.md:775-776 («Судья остановлен своим капом $0.28 на 16 парах из 24») и :784 («Добрать 8 несудимых пар P4 ≈$0.10»); файлы несудимых комбо (ds-gu008 s0/s1 × 3 арма; grok gu-006 G2/G4 и далее) в raw/ присутствуют. -**Фикс/скоуп:** Не требуется — дописка 74 точна: сырьё лежит, добор ≈$0.10 реально отложен «до предмета wiring». +**Фикс/скоуп:** → **Строка 74 закрыта D39.95, P4-хвост принят D39.61; добор ≈$0.10 — резидуал §12.7 D39.61 (цены записаны там), отдельного носителя не заводилось.** (Исторически: сырьё лежит, добор отложен «до предмета wiring».) ### [RESCOPE] (7) Протокол гендер-твиста D5.1 (дописка 49): «redrive есть, селективного by-until_ch пути нет» diff --git a/docs/glossary.md b/docs/glossary.md index bf4c9c8c..7fbddd5f 100644 --- a/docs/glossary.md +++ b/docs/glossary.md @@ -4,10 +4,12 @@ ## Роли и фазы -- **Оркестратор / Бэкенд / Полигон / Фронт** — роли сессий с зонами записи (CLAUDE.md §Роли). «Оркестратор №N» — канонический счётчик преемственности роли (текущий N — в шапке ORCHESTRATOR_SESSION_PROMPT). +- **Оркестратор / Бэкенд / Полигон / Фронт / Платформа** — роли сессий с зонами записи (CLAUDE.md §Роли); платформа = SaaS control plane (`platform/`, D39.81). «Оркестратор №N» — канонический счётчик преемственности роли (текущий N — в шапке ORCHESTRATOR_SESSION_PROMPT). - **Хендофф(-промт)** — передача роли новой сессии файлом-промтом; аддендумы к бегущей сессии доезжают только релеем владельца. - **Владелец** — человек; ратифицирует деньги, скоуп-сдвиги, продукт, 18+; связной между сессиями. - **Ф0–Ф3** — фазы: Ф0 скелет · Ф1 инфраструктура · Ф2 качество (судья/гейты) · Ф2.5 пилот · Ф3 продукт (веб-фронт, ридер-IDE). +- **S0–S7 / P0** — нумерация кодовых сессий зон: S-этапы фронта (D39.84) · P-этапы платформы (P0 — бутстрап, D39.100); не путать с фазами Ф0–Ф3. +- **Зонный журнал / зонный бэклог** — `frontend/docs/frontend-PROGRESS.md` · `platform/docs/platform-PROGRESS.md` и BACKLOG зоны: прогресс/пинги фронта и платформы живут ТОЛЬКО там (D39.100); их строки единый бэклог не принимает (D39.84). - **Полигон** — eval-зона платных/бесплатных экспериментов (`eval/`, отчёты exp01–exp16). ## Решения и документы @@ -23,6 +25,8 @@ - **Пак** — пакет работ одной сессии; **свип** — полная перепроверка обязательств (D39.66: 951 позиция); **добор идеала** — очередь качества после ре-пробы flash; **МАСШТАБ** — прогон целой книги. - **Строка N** — стабильный ID строки единого бэклога (PROGRESS §Бэклог; не перенумеровывается); **вес** — блокер-очереди / скоро / когда-нибудь; **носитель** — артефакт, в котором обязательство живёт; **хвост** — незакрытый остаток; **петля** — вопрос, обязанный получить диспозицию; **слот** — зарезервированное место в будущем пакете/замере. - **Гвоздь** — регрессионный тест, прибивающий контракт (негативный гвоздь — тест на ОТСУТСТВИЕ поведения). +- **Контракт 14 (API v0)** — ратифицированный контракт фронт↔платформа: `architecture/14-api-contract/` — нормативная спека OpenAPI 3.1 + компаньон-README; зонная копия `frontend/docs/api-contract/` — байт-зеркало (D39.99). **Провенанс ✓/◆/○** — классы утверждений компаньона: выведено из кода/ратификации · предложено (подтверждает названная зона) · открыто (К-вопросы). **spectral / openapi-typescript** — линт спеки и генерация типов фронта с дрифт-тестом (⚠ 3.1-условия генератор игнорирует — К-11). +- **ПТ-N** — стабильный ID требования в `product-requirements.md`; не путать со строками единого бэклога. **paused / лимиты «как Claude Code»** — статус книги при стопе по потолку + страница статуса использования в настройках, сумм на экране нет (ПТ-35, D39.100). ## Пайплайн и код diff --git a/docs/product-requirements.md b/docs/product-requirements.md index 0cd2c765..a9de59f6 100644 --- a/docs/product-requirements.md +++ b/docs/product-requirements.md @@ -1,6 +1,6 @@ # Реестр продуктовых требований — «что продукт обязан уметь» -> Единый список требований владельца к продукту. Источники: `../START_PROMT.MD` (ЖИВОЙ бриф, идеи V0–V5) + владельческие находки H6–H18 (`architecture/09-target-architecture.md` §3). Статусы сверены кодом и D-логом при D39.80 (02.08.2026). **При конфликте с D-логом побеждает D-лог.** Правила: новую V-секцию владельца разбирает сюда оркестратор при первом касании; статус правится при лендинге пака, который его меняет; требование без носителя не оставлять. +> Единый список требований владельца к продукту. Источники: `../START_PROMT.MD` (ЖИВОЙ бриф, идеи V0–V5) + владельческие находки H6–H18 (`architecture/09-target-architecture.md` §3). Статусы сверены кодом и D-логом при D39.80 (02.08.2026), освежены свипом D39.101 (04.08.2026). **При конфликте с D-логом побеждает D-лог.** Правила: новую V-секцию владельца разбирает сюда оркестратор при первом касании; статус правится при лендинге пака, который его меняет; требование без носителя не оставлять. > > Статусы: ✅ построено · 🔶 частично · ⭕ не построено · ❌ снято (отменено владельцем ИЛИ закрыто отрицательным замером — с D-ссылкой) · 🔒 открытый вопрос владельца. @@ -21,7 +21,7 @@ | ID | Требование (источник) | Статус | Носитель / доказательство | |---|---|---|---| | ПТ-8 | Банк памяти на всю книгу, «крайне точный» (V0-п.7–8; Выводы-п.1) | ✅ | D39.69/75/77/78; recall банка 0.918/0.980 на холодном прогоне (D39.58). Смежный остаток H6 (running-summary): carryover закрыт замером (D39.7/8), проза-суммарайзер закрыт (D39.69), нарратив-состояние = строка 80 (гейт пилота Ф2.5) | -| ПТ-9 | Глоссарий автосборкой: модель переводит термины с контекстом/жанром (V4-п.4, H15) | ✅ | терминолог пака-20 (D39.41–53), KWIC-контексты, подписной цикл. **Вход владельца 02.08 (D39.89):** банк = центральная ценность, арбитраж перевода термов должен быть консилиумом со скорами уверенности, но не ломать связность системы термов ⇒ качество МЕХАНИЗМА поставлено на проверку (строка 5, промт `BANK_ARBITRATION_RESEARCH_SESSION_PROMPT.md`); статус ПТ-9 «построено» не меняется — под вопросом не наличие, а алгоритм | +| ПТ-9 | Глоссарий автосборкой: модель переводит термины с контекстом/жанром (V4-п.4, H15) | ✅ | терминолог пака-20 (D39.41–53), KWIC-контексты, подписной цикл. **Вход владельца 02.08 (D39.89):** банк = центральная ценность, арбитраж перевода термов должен быть консилиумом со скорами уверенности, но не ломать связность системы термов ⇒ качество МЕХАНИЗМА проверено полигоном: заход исполнен 04.08 (промт архивирован), артефакты ждут адверсариальной приёмки №13 (строка 5); статус ПТ-9 «построено» не меняется — под вопросом не наличие, а алгоритм | | ПТ-10 | Веб-фетч для терминов без культурного контекста (V0-п.16, V4-п.4) | ⭕ | гейт action-security = строка 70 (Ф3); до него — сид/бриф | | ПТ-11 | Голоса персонажей консистентны на книгу (V1-п.2; канон §1) | 🔶 | схема голосов построена (пак-19, D39.55/56); оси не подписаны — замер добора (строки 24 · 13б) | @@ -29,7 +29,7 @@ | ID | Требование (источник) | Статус | Носитель / доказательство | |---|---|---|---| -| ПТ-12 | Низкий COGS: дешёвые модели + адресные дорогие вызовы (V0-п.3/12; канон §5) | ✅ | ~$0.85/ранобэ (D30.4); пере-калибровка после ре-пробы (строка 74) | +| ПТ-12 | Низкий COGS: дешёвые модели + адресные дорогие вызовы (V0-п.3/12; канон §5) | ✅ | ~$0.85/ранобэ (D30.4); ре-проба исполнена и строка 74 закрыта (замер D39.86/91, закрытие D39.95); пере-калибровка цены — при следующем платном прогоне | | ПТ-13 | Телеметрия токенов/стоимости с первого вызова, БД (V0-п.25/31) | ✅ | SQLite `request_log`/леджер/смета; ⚠ леджер = нижняя граница (строка 78) | | ПТ-14 | Потолки бюджета и явное согласие на пере-оплату (канон §5) | ✅ | reserve/settle, потолки, `projectRebill`; щель терминолога = строка 38 | @@ -43,7 +43,7 @@ | ID | Требование (источник) | Статус | Носитель / доказательство | |---|---|---|---| -| ПТ-16 | Абьюз/misuse-прескрин: дёшево, точно, до трат токенов, минимум false positive (V2-п.1, H8) | ⭕ | строка 94; UI-контракт отказа — проект-решение D39.80 к Ф3-брифу (вывод оркестратора, не цитата брифа) | +| ПТ-16 | Абьюз/misuse-прескрин: дёшево, точно, до трат токенов, минимум false positive (V2-п.1, H8) | ⭕ | строка 94; UI-контракт отказа — проект-решение D39.80 к Ф3-брифу (вывод оркестратора, не цитата брифа); статус отказа в API — открытый К-9 контракта 14 (D39.99) | | ПТ-17 | Лимит размера входа настройкой (V2-п.3, H7) | ⭕ | строка 94 | | ПТ-18 | Стоп и продолжение пайплайна; абьюзивный прогон НЕ продолжать (V2-п.2, H10) | 🔶 | graceful stop по сигналу (`cmd/tmctl/main.go` NotifyContext) + чекпойнты/redrive; продукт-кнопки и связка с прескрином = строка 94; API-форма в контракте 14 (D39.99: stop/resume; статус отказа прескрина — открытый К-9) | | ПТ-19 | Скорость: «очень быстрый перевод книги — киллерфича» (V4-п.1, H9); видимый прогресс/ETA — из Ф3-видения ридер-IDE (цветная полоса статуса), не из V4 | 🔶 | волны параллельны по чанкам; замер скорости и ETA на целой книге = строка 54 (МАСШТАБ); пофазный индикатор draft/edit = строка 99 (БЛОКЕР контракта, D39.99); ETA ПОКАЗЫВАТЬ — решение владельца 04.08 (D39.100/К-5), `eta_seconds` в спеку правкой S3 | @@ -52,13 +52,13 @@ | ID | Требование (источник) | Статус | Носитель / доказательство | |---|---|---|---| -| ПТ-20 | Ридер-IDE: VS Code-подобный фронт агентного перевода (V0-п.20/23) | ⭕ | research/16 принят (D29); строки 69–71; F3-brief — D29 п.3. Ф3 ОТКРЫТА 02.08 (D39.81): фронт-сессия живёт на моках (`frontend/`, S0–S2 + контракт исполнены); контракт API ратифицирован (D39.99), платформа = П-1 (промт P0 выдан 04.08, D39.100) | +| ПТ-20 | Ридер-IDE: VS Code-подобный фронт агентного перевода (V0-п.20/23) | ⭕ | research/16 принят (D29); строки 69–71; F3-brief — D29 п.3. Ф3 ОТКРЫТА 02.08 (D39.81): фронт-сессия живёт на моках (`frontend/`, S0–S2 + контракт исполнены); контракт API ратифицирован (D39.99), платформа = П-1 (P0 исполнен 04.08, D39.100/101 — ждёт приёмки №13) | | ПТ-21 | Параллельное чтение двух текстов с выравниванием по смыслам (V0-п.21); выравнивание грубое, по единицам экспорта — принято владельцем 02.08, спаны внутри текста не строятся | 🔶 | механизм готов: `tmctl export --pairs` выравнивает пары побайтно по единицам редактуры (`internal/pipeline/export.go:89-93`); якорь = **edit-unit**, НЕ чанк (переформулировано D39.84 — финальный текст существует только на уровне юнита, ~1.9 юнита/главу, местами глава = один блок; читалка обязана это выдерживать); UI-читалка = Ф3 (этап S6) | | ПТ-22 | Настройки от человека: 18+, жанр и т.п. (V0-п.22) | 🔶 | `book.yaml` (labels/жанр) данными; UI = Ф3 | -| ПТ-23 | Веб-ПЕРВЫЙ фронт; SEO/ранжирование Google — куки, страницы-сироты, актуальные алгоритмы (V5-п.2); продукт = **SaaS**, не локальное приложение (решение владельца 02.08, D39.81 — натив-прицел V0-п.26 СНЯТ этим решением, вернуть только новым словом владельца); SEO только под Google, Яндекс снят; рынок глобальный; десктоп = PWA первым шагом, Tauri по явным триггерам (решения владельца 02.08, D39.84) | ⭕ | строка 71 (Ф3-бриф); SEO вошёл в стек-дизайн ДО выбора (D39.84, требование исполнено): двухконтурный деплой — SPA `app.<домен>` целиком под noindex + статический публичный контур ≤3 кликов от главной (лечение страниц-сирот), `STACK_DECISIONS.md` §4; SSR-вопрос закрыт этим решением | +| ПТ-23 | Веб-ПЕРВЫЙ фронт; SEO/ранжирование Google — куки, страницы-сироты, актуальные алгоритмы (V5-п.2); продукт = **SaaS**, не локальное приложение (решение владельца 02.08, D39.81 — натив-прицел V0-п.26 СНЯТ этим решением, вернуть только новым словом владельца); SEO только под Google, Яндекс снят; рынок глобальный; десктоп = PWA первым шагом, Tauri по явным триггерам (решения владельца 02.08, D39.84) | ⭕ | строка 71 (Ф3-бриф); SEO вошёл в стек-дизайн ДО выбора (D39.84, требование исполнено): двухконтурный деплой — SPA `app.<домен>` целиком под noindex + статический публичный контур ≤3 кликов от главной (лечение страниц-сирот), `frontend/docs/STACK_DECISIONS.md` §4; SSR-вопрос закрыт этим решением | | ПТ-24 | Цикл согласования глоссария с профпереводчиком/редактором (V0-п.23) | 🔶 | подписной цикл терминолога в бэкенде есть; UI = Ф3 | | ПТ-33 | Интерфейс НЕ раскрывает конвейер: ни моделей, ни стадий, ни внутренней терминологии — пользователь видит «загрузка → разбор → перевод → подпись банка → финал → готово» (решение владельца 02.08) | ⭕ | инвариант D39.81; контракт API v0 РАТИФИЦИРОВАН (D39.99, `architecture/14-api-contract/`): словарь десяти статусов принят владельцем 04.08 (D39.100/К-1); карта «вердикт → фраза» — приложение А компаньона, слова заполняет владелец (В-3); ревью-вопрос «сменится стадия — править ли фронт?» отвечен таблицей §5 компаньона | -| ПТ-34 | Пользовательский перевод НИКОГДА не попадает на публично индексируемый URL — ни витрин примеров, ни «поделиться главой», ни публичных ссылок чтения (жёсткий продуктовый запрет, решение владельца 02.08; авторское право на исходники + политика Google по масштабируемому машин-контенту действуют на весь домен) | ⭕ | инвариант D39.84; носители: двухконтурный деплой `STACK_DECISIONS.md` §4 (SPA под `X-Robots-Tag: noindex` на каждом HTML-ответе; публичный контур без контента переводов) + контракт 95 + платформенный бэклог П-1 | +| ПТ-34 | Пользовательский перевод НИКОГДА не попадает на публично индексируемый URL — ни витрин примеров, ни «поделиться главой», ни публичных ссылок чтения (жёсткий продуктовый запрет, решение владельца 02.08; авторское право на исходники + политика Google по масштабируемому машин-контенту действуют на весь домен) | ⭕ | инвариант D39.84; носители: двухконтурный деплой `frontend/docs/STACK_DECISIONS.md` §4 (SPA под `X-Robots-Tag: noindex` на каждом HTML-ответе; публичный контур без контента переводов) + контракт 14 (`architecture/14-api-contract/`, D39.99) + платформенный бэклог П-1 | | ПТ-35 | Лимиты «как в Claude Code» (решение владельца 04.08, D39.100): страница лимитов/использования в настройках (статус, НЕ суммы — запрет денег на экране в силе); стоп по потолку = статус `paused` + оповещение «перевод остановлен: лимиты исчерпаны» | ⭕ | контракт К-8 закрыт; API — П-5 (платформа), статус в спеке — правка S3 | ## Качество процесса и самоулучшение diff --git a/docs/research/16-reader-ide-alignment.md b/docs/research/16-reader-ide-alignment.md index e6c767bd..27f338fe 100644 --- a/docs/research/16-reader-ide-alignment.md +++ b/docs/research/16-reader-ide-alignment.md @@ -1,5 +1,6 @@ # research/16 — Ридер-IDE: выравнивание, статусы доверия, HITL-редактура (2026-07-11) +> **→ 04.08 (D39.99): поверхность API/статусов ратифицирована контрактом 14** (`../architecture/14-api-contract/`) — контракт-эскизы ниже читать как входы истории, не спеку. > **⚠ Ревью-шапка оркестратора (12.07, D29; тело ниже не редактировалось).** Вердикт адверсариального ревью (4 оси: 2 источник-батча по первоисточникам, независимая реплика $0-пробы, red-team контракта против кода/D15.2-спеки): **ACCEPT_WITH_FIXES — абсорбция через D29**. Ядро выводов (чанк=несущий якорь; калибровка YELLOW важнее покрытия; детект-флаггер вместо форс-структуры; «не вырезание» — подтверждено и усилено) — выживает. Поправки чтения: > 1. **Числа §0 — верхний край метрик-диапазона, база устарела.** Проба считана по stale-экспорту (ch1/4 показан красным при redriven-OK в store; сама проба напечатала `< 2. **Новое требование к экспорту (находка реплики): 8/54 финалов содержат markdown-заголовки `###`** — финалы пайплайна не чистый plain text; нормализация выхода — в экспорт-контракт. diff --git a/docs/research/23-engine-platform-seam.md b/docs/research/23-engine-platform-seam.md index cbe40278..574b0db0 100644 --- a/docs/research/23-engine-platform-seam.md +++ b/docs/research/23-engine-platform-seam.md @@ -1,5 +1,6 @@ # 23 — Шов движок ↔ платформа: как индустрия интегрирует batch-движок с control plane +> **→ 04.08 (D39.99/101): контракт API v0 РАТИФИЦИРОВАН по этому шву** — `../architecture/14-api-contract/`; строка 95 закрыта, хвосты движка = блокеры 99/100/101/103/125; код платформы существует (P0, ждёт приёмки). Упоминания «строки 95» ниже — история. > **Ревью-шапка (оркестратор №9, 02.08.2026).** Статус: ПРИНЯТ, направление ратифицировано **D39.85**. Метод: 5-агентный воркфлоу — три веб-направления по первоисточникам (официальные доки/блоги авторов инструментов, вторичных статей в выводах нет) + репо-инвентаризация + независимый арбитраж репо-находок (все 9 вердиктов подтверждены, 3 мелкие поправки внесены сюда). Правила `internal` проверены ЖИВЫМИ сборками на go1.26.4, не пересказом доков. Стоимость $0. Вопрос ресёрча: как чисто организовать read-путь и статус-поток от движка (CLI, процесс-на-прогон, приватный SQLite под EXCLUSIVE flock) к платформе (отдельный Go-модуль, net/http + Postgres + River + SSE) — не нарушая инвариантов «сервер в backend не пишется» (D39.81) и «пользователи/квоты/HTTP не проникают в движок». ## §0. Решение одним экраном