From 3b1fe9aff9e1a7a86af37a1b91571678c5d2a7ec Mon Sep 17 00:00:00 2001 From: heaven Date: Sat, 15 Aug 2026 18:30:49 +0300 Subject: [PATCH] Reland session 16 doc closes lost to the temp rollback: exit 13 erratum, seam lesson, D39.133 handover, journal sections from backend migrate and polygon phase D --- docs/ORCHESTRATOR_SESSION_PROMPT.md | 3 +- docs/PROGRESS.md | 71 ++++++++++++++++++++++++- docs/README.md | 2 +- docs/architecture/05-decisions-index.md | 1 + docs/architecture/05-decisions-log.md | 7 ++- 5 files changed, 80 insertions(+), 4 deletions(-) diff --git a/docs/ORCHESTRATOR_SESSION_PROMPT.md b/docs/ORCHESTRATOR_SESSION_PROMPT.md index bcd6fb63..5214b6d8 100644 --- a/docs/ORCHESTRATOR_SESSION_PROMPT.md +++ b/docs/ORCHESTRATOR_SESSION_PROMPT.md @@ -1,6 +1,6 @@ # Промт: роль ОРКЕСТРАТОР TextMachine (канонический счётчик №N — в первой строке ниже) -> **Счётчик ролей — канонический ОДИН, и номер выдаёт тот, кто пишет промт** (норма D39.112 п.6: №15 однажды вписал в CURRENT-STATE «№16» для параллельной сессии, которой промта не писал — это второй носитель состояния; параллельного оркестратора называть РОЛЬЮ, пока номер не выдан): «оркестратор №N» (сейчас **№16** — хендофф 09.08.2026, №15 закрыт после D39.125; состояние передачи и очередь — D39.124 и CURRENT-STATE). +> **Счётчик ролей — канонический ОДИН, и номер выдаёт тот, кто пишет промт** (норма D39.112 п.6: №15 однажды вписал в CURRENT-STATE «№16» для параллельной сессии, которой промта не писал — это второй носитель состояния; параллельного оркестратора называть РОЛЬЮ, пока номер не выдан): «оркестратор №N» (сейчас **№17** — хендофф 15.08.2026, №16 закрыт после D39.133; состояние передачи и очередь — D39.132/D39.133 и CURRENT-STATE). **Позиция и первые задачи хендоффа №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-лога). @@ -97,6 +97,7 @@ - `/tmp` волатилен (скрипты воркфлоу переписывай при рестарте); артефакты — на диск стенда; книга и производные — ВНЕ git; `.env` не читать; PUML не рендерить; `.claude/settings.local.json` не коммитить. - Промт-архивация: только отработанные, с баннером-исходом; residual-трекеры (POLYGON_PACKAGE4) держать активными. - Эскалации сессий: настоящие развилки эскалируй быстро и решай сам (образцы эры №6: B-hybrid Q4a, вариант-2 расширения, оракул-поправка) — сессии приносят развилки вместо тихих девиаций, это норма, поощряй. +- **Шов, у которого одна сторона менялась, принимается перечислением ВСЕХ каналов другой стороны** (урок приёмки P6, D39.132): промт потребительской половины перечислял exit-контракт — и сессия, и её ревью сверили его, но канал `status --json` того же пака движка (exit 2 при flagged) упустили все; поймала только панель приёмки с мандатом «перечисли команды движка, которые зовёт платформа, и что каждая может вернуть». В промт/приёмку шва — явный шаг «инвентарь каналов+кодов чтением чужого кода», не список из головы автора промта. ## Нормы хендофф-промтов (анти-рассинк; владелец 25.07: «lack of sync оркестратор↔бэкенд↔полигон порождает недопонимание и миссимплементацию») diff --git a/docs/PROGRESS.md b/docs/PROGRESS.md index 88bf4a6b..2928a771 100644 --- a/docs/PROGRESS.md +++ b/docs/PROGRESS.md @@ -1,6 +1,6 @@ # Журнал прогресса -> **⟶ ТЕКУЩЕЕ СОСТОЯНИЕ** (на 2026-08-15, голова D39.132; приёмки S3.6/S3.7 — D39.127/129, приёмка P5 — D39.130, приёмка эмиттера — D39.131, приёмка P6+дофикс — D39.132). Оркестраторов ДВА (решение владельца 07.08): этот — движок/платформа/фронт/доки; параллельный (РОЛЬЮ, без номера — счётчик один, D39.112 п.6) — приёмка полигона. Одновременно не запускаются; CURRENT-STATE ведут оба, чужие строки не трогают. Норма изоляции панелей после инцидента отката чужих файлов — D39.113, гардрейлы в CLAUDE.md. +> **⟶ ТЕКУЩЕЕ СОСТОЯНИЕ** (на 2026-08-15, голова D39.133 — передача №16→№17; приёмки S3.6/S3.7 — D39.127/129, приёмка P5 — D39.130, приёмка эмиттера — D39.131, приёмка P6+дофикс — D39.132). Оркестраторов ДВА (решение владельца 07.08): этот — движок/платформа/фронт/доки; параллельный (РОЛЬЮ, без номера — счётчик один, D39.112 п.6) — приёмка полигона. Одновременно не запускаются; CURRENT-STATE ведут оба, чужие строки не трогают. Норма изоляции панелей после инцидента отката чужих файлов — D39.113, гардрейлы в CLAUDE.md. > - **Эра №15 закрыта — семь приёмок, все ПРИНЯТЫ и залендены**; лента, коммиты и разборы — D39.109–123 (D-лог) и реестр нот `architecture/05-decisions-index.md`; снимок прежних бюллетеней этой шапки — архив-слайс `-08-02-04`. > - **ЖИВОЕ:** полигон эксп-22/23 — дерево ЗАЛЕНДЕНО 10.08 с ревью-шапками приёмки №16 (числа подтверждены независимым пересчётом; **выводы НЕ ратифицированы** — владелец 10.08 признал постановку неполной), **фаза Д ИДЁТ (заказ 10.08)**: промт `docs/POLYGON_EXP2223_REDO_SESSION_PROMPT.md` (staged полигоном), потолок фазы $4.50 словом владельца (ход — секция «Полигон» ниже); при ратификации фазы Д в D-ноту: декой-правило + обязательный кросс-семейный опровергатель приёмки (одобрены владельцем 10.08) · фронт: S3.5–S3.7 ИСПОЛНЕНЫ и ПРИНЯТЫ (D39.127/D39.129, лендинги `57e6bd1`/`3e465bd`), контракт **0.2.2** в каноне, i18n-механизм построен (ПТ-36 🔶) — **гейт S4 ПАЛ (P5 принят D39.130): S4-промт по слову владельца** (вход: экраны библиотеки/загрузки на живом `POST /books` · находки приёмки S3.7 · спек-правка 0.2.3) · **платформа P5 ИСПОЛНЕНА и ПРИНЯТА в три раунда (D39.130, `69d485a`)**: интейк книг `POST /books` с сентинелом хранилища · стоп/резюм с намерением в Postgres · Prometheus · Go-floor 1.26.6; развилка `book.yaml`: бета = форма Б (стройка следующим касанием зоны), движковая форма = строка 170 · **эмиттер ИСПОЛНЕН и ПРИНЯТ (D39.131, `9cfe080`, дофикс до лендинга)**: `events.jsonl` (StreamVersion 1.1) + exit 4 потолок / 5 graceful / полоса отказов 10–19 + пер-вызовный репэйр-гейт; строки 103/135/165/102 закрыты; движковая половина PD-113/PD-196 построена D39.131 · **платформа P6 + дофикс ИСПОЛНЕНЫ и ПРИНЯТЫ (D39.132)**: потребительская половина шва (exit-коды одним словарём, `unit_done` присваиванием, scope потолка, TM_TRACE_ID против усыновления) + интейк формы Б + дев-стенд с сидом — **PD-113/PD-196 ЗАКРЫТЫ, шов закрыт с обеих сторон, major в регистре платформы 0**; деплой-порядок против деадлока v15 записан и исполним (`tmplatformctl books --migratable`), сам `tmctl migrate` — дерево бэкенда ЖДЁТ ПРИЁМКИ (строки 174/175 закрываются ею; exit 13 ратифицирован направлением) · эскроу (136) — следующим денежным промтом (П-18). > - **Открыто на владельце:** Приложение А контракта (148: реконструкция с баннером или заново) · продуктовое слово «остановлена: лимиты» (В-3) · К-13/Ф-31 (paused_reason один — «свой потолок» и «нет кредита» неразличимы) · В-4/Ф-30 (глава без заголовка) · фри-тир PD-104 (ноль на бете против автогранта $5 с суточным потолком) · порог 116 · мини-проба флора 44 (одобрена, промт не выдан) · подпись денежного шага 46 · лист В-3+К-6 · авто-резюм paused (вопрос платформы) · приёмка S4 фронта (бежит) и бэкенд-migrate (дерево ждёт — закрывает 174/175) · **строка 172: цены DeepSeek ×2.3–4.7 с 16.08 — СТОП-решение и пере-пин, носителя-промта нет** · **СТОП ja-оси фазы Д** (гардрейл 18+ на `isekai_majutsushi_jp`, 3 чанка из 184: выбросить помеченное или сменить книгу) · **возражение Sol по проходу `tier` эксп-23** (пере-судить починенным ригом или оставить с записанным возражением — PROGRESS «Полигон») · ~~поле `title` в `BookIntake`~~ РЕШЕНО 14.08: ратифицировано в 0.2.3 (замечание 12 S3.5, владелец подтвердил; исполняет S4) · фронт-вопросы зонного журнала: В-7 (плотность интерфейса; держит и Ф-54 — обрезку центра на зуме) · В-8 (слово состояния в дереве) · **В-9 (какие языки интерфейса обещает продукт — механизм готов, ПТ-36)** · Ф-38 (вкладка «Замечания») · граница ПТ-33 для добавочных полей `BankTerm` (черновик S3.5/S3.6, D39.127 п.2б). @@ -275,6 +275,34 @@ **§8. Открытое / грабли для приёмки.** (а) Миграция v15 поднимает пол схемы: `OpenReadOnly` громко отказывает БД старее бинаря, а платформа читает `status --json` ПЕРЕД спавном (`bookMeter`) ⇒ на апгрейде движка над старой книгой первый `status` упадёт, пока не отработает write-команда. Свойство преexisting для любой миграции, но у платформы теперь есть путь, который на него наступает — назвать вслух, лечить не в этом паке. (б) `redrive` удаляет строки диспозиций ДО прогона, поэтому базовая линия счётчиков окажется ниже, чем в прошлом прогоне: `progress` честно уедет вниз на число сброшенных юнитов (работа действительно отменена); `unit_done` при этом НЕ пере-объявляется (реестр). (в) Объём: 2 строки на юнит на волну (`unit_done`+`progress`) + `spend` на каждый платный вызов ⇒ ~6 строк на юнит (замерено на пробе: 2 юнита → 15 строк) ⇒ на 4276-юнитной книге ~26k строк (~4 МБ) и столько же мелких SQLite-транзакций; при WAL/NORMAL это единицы секунд, но цифра названа. (г) Пере-нарезка книги минтит новые id юнитов ⇒ новые ключи реестра ⇒ юниты будут объявлены заново; у платформы главы в этот момент и так пере-материализуются — за ней решение, сбрасывать ли счётчики глав. +### Микро-касание «`tmctl migrate`» (строка 174 — деадлок деплоя v15) — исполнено, дерево на лендинг (14.08) + +Зона `backend/` только (`git status` в начале и в конце; чужие `docs/POLYGON_EXP2223_REDO_SESSION_PROMPT.md`, `docs/experiments/23-editor-tier.md`, `eval/*`, `frontend/*`, `platform/*` не трогал — платформенные читал read-only). $0: ни одного платного вызова, ни одной сетевой ручки. Промт закрывает §8(а) собственной приёмки эмиттер-пака. + +**§1. Что построено.** + +1. **`tmctl migrate --config book.yaml`** (`cmd/tmctl/migrate.go`) — write-open проекта БЕЗ прогона через `store.Migrate` (flock → шов `beforeApply` → миграции → `recoverReservations`) → печать `schema vN -> vM` / `already at schema vM` / `created … at schema vM`. Ни LLM, ни сети, ни ключей, ни денег. +2. **Конфиг-стек минимальный — только `config.LoadBook`** (прецедент `backup`): `LoadModels` отказывает конфигу с ценами старше 120 дней (строка 146), и $0-миграция поверх полного стека воспроизвела бы ровно тот деадлок, который лечит. Проверено исполнением: с ценами 200-дневной давности `status` = 10, `migrate` = 0; без `models.yaml` вообще — то же. +3. **Типизированный отказ схемы**: `store.SchemaMismatchError{Path,Found,Expected}` вместо двух прозаических ошибок `OpenReadOnly` (обе стороны + «файл есть, но не применено ничего» = v0, раньше это был exit 1 «проект сломан»). Класс `pipeline.RefusalSchemaMismatch` → **exit 13** в полосе 10–19; в тексте стабильный машинный токен `schema_mismatch found=N expected=M`. Классификация store-открытий сведена в ОДНУ экспортированную `pipeline.RefuseStoreOpen` (её зовут и `openRunner`, и `migrate`); неопознанный отказ остаётся вне полосы (exit 1) — полоса обещает «ничего не произошло», и по ней потребитель ЖДЁТ, а не чинит. +4. **Расширение сверх буквы промта, называю явно**: write-путь тоже ОТКАЗЫВАЕТ БД новее бинаря (`store.migrate`, до `recoverReservations`). Раньше `Open` открывал её молча и писал в неё кодом, который её схемы не знает, — при том что read-only путь ровно это запрещал. Для деплоя это обязательно: иначе `migrate` на такой БД «успешно» врёт и самолечение платформы («поймал 13 → migrate → повтор») уходит в вечный цикл. +5. **Restore point — ПОД ЛОКОМ и только когда шаг реально применяется** (шов `beforeApply` в `store.Migrate`), имя `<метка>-pre-migrate.db`. Посылка промта «write-open уже делает бэкап» НЕ подтвердилась: бэкап живёт в `preflightBackup` у translate/redrive. + +**§2. Что нашла адверсариальная панель (4 линзы × 2 опровергателя, субагенты — разрешены промтом) и что с этим сделано.** Три линзы независимо воспроизвели ОДИН major, которого я не увидел: бэкап брался ДО флока и в том же секундном неймспейсе, что и платный путь. Следствия, воспроизведённые исполнением: (а) занятый проект получал полную VACUUM-копию под живым писателем и отказ 12 — и так на КАЖДЫЙ повтор; (б) повтор в ту же секунду падал с exit 1 («backup already exists») вместо 12, то есть вне полосы; (в) хуже всего — `migrate` → спавн прогона в ту же секунду ронял `translate` в его же pre-flight-гарде с exit 1, а это ровно та последовательность, ради которой команда сделана. То есть на строку 173 я наступил, хотя промт прямо просил не наступать. Исправлено швом под локом + отдельным именем; обе половины теперь закрыты тестами, которые ловят мутацию (см. §3). Ещё из панели: exit 1 на БД без `schema_version` (закрыто, п.3), «свойство «бэкап ДО шага» ничем не проверялось» (закрыто), «`RefuseStoreOpen` default-ветка без теста» (закрыто), формулировка деплой-порядка в моём README вела к миграции СТАРЫМ бинарём (исправлено), фикстура теста правит пакетную переменную `migrations` (restore переведён на `defer`). **§2а. ВТОРОЙ адверсариальный заход — по ИСПРАВЛЕННОМУ диффу (38 агентов, 0 ошибок; 3 линзы × 2 опровергателя + критик полноты).** Из 17 находок пережили верификацию 3, и главная — снова моя, в самом шве. + +1. **MAJOR, найдено двумя линзами независимо, воспроизведено на 2.6 ГБ базе: шов сидел внутри общего 10-секундного `opTimeout`.** `open()` заводил ОДИН бюджет на всё открытие и отдавал его и шву, и шагам, и recovery. Бэкап — единственная работа, чья стоимость растёт с книгой; на большой книге он съедал бюджет, и первый же шаг падал `context deadline exceeded` → **exit 1 вне полосы отказов**, после уже оплаченной полной копии, а повтор писал ещё одну копию (метка секундная, имена не совпадают) — деплой не сходился и заливал том. Проверено вживую агентом на бинаре из этого дерева: копия 2.5 ГБ записана, миграции нет, exit 1; повтор — ещё 2.5 ГБ. **Починено:** каждая фаза берёт СВОЙ бюджет (`schemaBaseline` · `applyStep` на шаг · recovery), а шов не бежит ни под каким дедлайном пакета — работа каллера, его и границы. Побочно закрыт латентный дефект: один 10-секундный бюджет на всю 15-шаговую цепочку. Тест `TestTheSeamIsNotChargedToTheStoreOperationBudget` (бюджет ужат до 150 мс вместо десятисекундного сна; `opTimeout` стал `var` ради тестируемости) — мутация «вернуть общий дедлайн» ловится. +2. **MINOR: тест на имя restore point проверял константу, а не вызов.** `TestTheMigrationRestorePointNeverCollidesWithThePaidPath` не звал `migrateCmd` вовсе, поэтому пережил бы отказ продакшена от суффикса; связывал их только сквозной тест, зависящий от попадания в одну секунду. **Переписан** — гоняет реальный `migrateCmd`, снимает имя, которое выбрал продакшен, и требует, чтобы «голая» метка осталась свободной под pre-flight платного пути. Мутация «убрать суффикс на вызове» ловится детерминированно (и сквозной тест её ловит 10/10, а не «1 из 15» — измерено). +3. Третья находка — дубль первой другой линзой. + +Правки после ревью: `store/store.go`, `store/migrate.go` + два теста; `README.md`, `main.go`, `refusal.go`, `runner.go`, `cmd/tmctl/migrate.go` с досмотра не менялись (сверено по патчу) — в репозиторий ревьюеры не лазили, мутации им были предписаны в копию. + +**§3. Проверки — исполнением, не чтением.** `cd backend && make battery` **EXIT=0** (`-race`, golangci-lint 0 issues), пропущены только `TestHelperEventsRun`, `TestHelperKillLoop` (хелпер-процессы; корпусные — `battery-stand`, стенд-данных нет). Тестов **794 → 810** (+16 функций, изменённых/удалённых tracked-тестовых файлов — 0, проверено `git diff --name-only`). Голден бит-в-бит (`TestGoldenDeterminism` зелёный): промпты, провод и снапшоты не тронуты. **Мутационный прогон своего же кода (8 мутаций, все CAUGHT, дерево после — байт-идентично):** бэкап вне лока → падает locked-подтест; бэкап после шагов → падает шов-тест и money-тест CLI; имя бэкапа как у платного пути → падает сквозной тест; шов на no-op → падают два; `default`-ветка `RefuseStoreOpen` в полосу → падает refusal-тест; снятие гарда «новее бинаря» → падают три; пропуск `recoverReservations` → падают money-тесты; From/To местами → падают пять. **Живая проба на РЕАЛЬНЫХ БД стенда (копии в скрэтчпаде, оригиналы не тронуты):** `coldrun-a` v14 (149 чекпойнтов, $0.126068) — `status --json` = 13 с токеном `found=14 expected=15` → `migrate` v14→v15 → `status` = 0; `acceptance` v7 → v15 (весь ALTER-хвост v8–v14 разом); в обоих `committed` не сдвинулся ни на цент, чекпойнты целы, restore point лежит в ПРЕД-миграционной версии и с зелёным integrity; занятый проект (flock держит чужой процесс) — 12 дважды и каталога `backups/` не появилось вовсе; БД с версией 99 — 13 в обе стороны (`status` и `migrate`), файл не тронут. Транзакционность применения ШАГА проверена тестом (сорванный шаг оставляет версию прежней и не оставляет своих объектов); формулировку уточняю по замечанию критика — закрыт именно шаг, а не весь класс «крэш посреди migrate»: повтор после срыва заново снимает restore point, и эти копии никто не подчищает. Строку 49а не чинил и новых ALTER не вводил. **После правок второго захода** батарея пере-прогнана (EXIT=0, lint 0 issues, голден зелёный), мутаций стало 10 из 10 пойманных (+«вернуть общий дедлайн», +«снять суффикс на вызове»), живая проба на реальных v14/v7 книгах ПЕРЕ-снята новым бинарём: те же переходы, `committed` тот же до цента (0.126068 / 0.408077), restore point в ПРЕД-миграционной версии, `status` после — 0. + +**§4. Деньги и PD-158 (проверено кодом и исполнением, как требовал промт).** `recoverReservations` трогает ТОЛЬКО `reserved_usd` (`store/store.go:226`, `UPDATE spend SET reserved_usd = 0 …`); `committed_usd` не читается и не пишется, чекпойнты не трогаются. Формула потолка PD-158 (аргумент = committed + прирост, БЕЗ reserved) стоит ровно на этом свойстве и НЕ ломается: `migrate` перед спавном делает `status` честнее — leftover-reserved зануляется тем же правилом, что и у `translate`, и только под флоком, то есть живую резервацию идущего прогона занулить невозможно (проект занят ⇒ 12). Settle-инвариант: `committed == SUM(checkpoints)` командой не двигается, поэтому `migrate`, случившийся между выходом процесса и расчётом платформы, расчёта не искажает; `reserved` легитимно ноль в любой момент (advisory, восстановим). + +**§5. Платформе (пинг оркестратора в их журнал — их зона, я только читал).** (а) **Зоны сошлись на 13 независимо друг от друга** (вскрыто критиком второго захода; моя прежняя формулировка «их `exit.go` числа 13 не знает» была неверна уже на момент написания): их живое незакоммиченное дерево P6 держит `ExitSchemaMismatch = 13` (`ingest/exit.go:68`) и отдельную причину `ReasonSchemaMismatch` (`books/parse.go:76,300-304`) — ожидающую, загрузку не удаляющую. Движковый контракт совпал: exit 13 в полосе 10–19, класс `schema_mismatch`, токен `schema_mismatch found=N expected=M` на stderr. Сверять больше нечего — только ратифицировать (см. п. «е»). Это ровно то, чего ждёт их PD-201 (самолечение вместо стоп-мира). (б) **Направление важно**: `found < expected` — чинится `migrate`; `found > expected` — `migrate` тоже вернёт 13 и НЕ соврёт успехом, чинится обновлением бинаря. (в) **`deploy/README.md:134-148` их зоны: шаг 2 гонит `migrate` ДО установки нового бинаря** — старый бинарь уже на своей голове схемы, значит это no-op и деадлок остаётся; порядок обязан быть «дренаж → новый бинарь на место → `migrate` ИМ по книгам из `--migratable` → прогоны». Их гейт `Migratable() = !Live && !Resumable && !Unsettled` (`pgstore/books.go:396`) с движковой стороны подтверждаю: миграция уводит файл выше запиненного бинаря попытки, поэтому сметать можно только книги без открытых попыток — это записано и в шапке `cmd/tmctl/migrate.go`. (г) **Их же деплой-док цитирует мёртвую строку**: `deploy/README.md:127` приводит старый текст ошибки («schema vN … expects vM»), которого движок больше не печатает — теперь `schema_mismatch found=N expected=M`. (д) **Дыра неверного порядка — тихая**: no-op-миграция выходит с 0, поэтому сметание СТАРЫМ бинарём даёт полностью зелёный прогон при сохранившемся деадлоке; числом «мигрировал» и «уже был на голове» не различаются — это честная цена отказа от `--json` (см. §6). (е) **Ратификация**: полоса отказов в `05-decisions-log.md` (D39.131 п.2а), в CURRENT-STATE `PROGRESS.md:233` и в `15-money-path.md` перечислена как 10 · 11 · 12 · 19 — exit 13 сейчас ЕДЕТ НЕРАТИФИЦИРОВАННЫМ в обеих зонах сразу; нужна нота или эррата оркестратора, плюс закрытие строки 174 и ближней половины 175. (ж) **Откат движка после сметания стал ручным**: read-only и write-пути отказывают БД новее бинаря, а `tmctl restore` не существует и restore point никто не подчищает — откат на старую сборку требует ручного `cp` бэкапа по каждой книге. Назвать в рантбуке зоны; чинить — отдельной строкой, если владелец сочтёт нужным. + +**§6. Чего НЕ делал (осознанно).** Строку 49а не чинил (не мой скоуп; применение шага и так атомарно — доказано тестом). Секундную метку `backupStamp` (строка 173) не менял — свою половину вывел из-под неё именем, коллизия `translate`↔`translate` остаётся как была. `--json` у `migrate` не делал: решение платформы читается ЧИСЛОМ (0 / 12 / 13), а человеческая строка уже несёт переход — **но у этого довода есть названная дыра** (критик второго захода): нулём «мигрировал» и «уже был на голове» не различить, а это ровно то, что производит неверный порядок деплоя (сметание старым бинарём даёт зелёный прогон при живом деадлоке). Если платформа захочет различать программно — это машинная поверхность на одну строку, решение владельца/оркестратора. Замороженную usage-строку `invocation.go` не трогал (её пинит тест; `backup`/`seed-lint` в ней тоже нет — вопрос оркестратору, чинить ли разом). `store.SchemaVersion` завёл и УБРАЛ, когда шов сделал его беспотребительским (мёртвую ссылку на него в комментарии теста критик поймал — вычищена). **Унаследованное, назвать и не чинить молча:** `config.LoadBook` по-прежнему статит `source_file`/`glossary_seed`/`mined_*`, поэтому книгу с заархивированным исходником не мигрировать (exit 10), хотя деньги её БД целы — гейт на ТЕКСТ на схемной операции, преexisting; `dbExists` в `migrateCmd` определяется ДО флока (TOCTOU самоограничен: созданная в окне БД уже на голове, шов не выстрелит; удалённая — exit 1 и ничего не применено). Дерево НЕ коммитил. + *(Закрытая хроника пакетов №0–№4 (04–10.07) перенесена в [archive/PROGRESS-2026-07-04-10.md](archive/PROGRESS-2026-07-04-10.md) — ревизия D31.)* *(Хроника пакетов 11–12.07 (пакет-5, D15.2-этап-А, санитайзер-фикс D33) — в [archive/PROGRESS-2026-07-10-13.md](archive/PROGRESS-2026-07-10-13.md).)* @@ -379,6 +407,47 @@ (секция параллельной сессии — записи добавлять сюда) +**15.08 · ФАЗА Д — сырьё снято, выводы ПОНИЖЕНЫ финальным аудитом. НЕ закрыта.** + +Куплено и отсужено: ось Д3 en→ru (7 армов × 16 ед., пол, банк 25 терминов, контам-проба +жильцами) · ось Д6 ja→ru разведка (3 арма × 9 ед.) · Д1 добивка gemini 15/16 с журналом +попыток · Д7 самооценка 6 клеток · Д5 канон-вскрытие 24 записи. Расход фазы **$5.901** по +фазам ФД-A…ФД-G (второй путь — сумма `cost_usd` по 563 клеткам `dv-*.json`, сходится). +Агент-сессий 50 из 80. Отчёт — `23-editor-tier.md` Д1/Д3/Д6/Д7/Д9/Д10/Д11. + +**Что аудит (адверсариальный, другое модельное семейство + свой пере-счёт) снял с фазы:** +1. **Д2 БЫЛ ЗАКРЫТ ВАШИМИ РУКАМИ, а отчёт объявлял его открытым** («каталог ответов пуст»). + `~/books/editor-tier/sol-tier` — 16 ответов Sol, `sol-border` — 32. Пере-счёт + `solscore.py tier`: **T2 vs R0 +8.69, p=0.0002, РАЗЛИЧИМ** при пороге 2.60 — тогда как + семейство Claude дало +0.50 ниже порога. Это и есть **записанное возражение Sol**, и оно + ПРОТИВОРЕЧИТ несущему выводу пака 23. Требует вашего слова: пере-судить `tier` починенным + ригом или оставить с записанным возражением. +2. **Ось Д4 пере-классифицирована в ОПИСАТЕЛЬНУЮ** по её же пре-регу (свой пол 2.21 хуже + прайора 2.12; правило Э-3/Д0.3 требовало пере-классификации «тогда же»). **H-2а и H-2б + больше не несущие выводы.** Семейства при этом разошлись (claude −2.21 · sol −3.11, + эскалация к адъюдикации с дефектными контролями). +3. **H-3 «на en перепис не нужен» — ОПРОВЕРГНУТА, вывод держится**: E0/D0 +1.56, p=0.0059, + выше порога и с поправкой на позиционный наклон. +4. Загрязнения: `E3` на 5 ед. из 16 = нетронутый черновик (пустые клетки критика), `E4` + побайтно равен эталону на 12 из 16; заявление «E4 вдвое дешевле» снято как ложное. +5. Половины шумового пола совпадают побайтно (ja 3 из 6, en 1 из 10) — дефект «близнеца» + воспроизведён, пороги были занижены. + +**15.08 ВЕЧЕР — ВТОРОЕ СЕМЕЙСТВО ЗАКРЫТО ПО ВСЕМ ТРЁМ ОСЯМ** (Sol, прогон владельца): +ja **CONFIRM** (claude +2.83 порог 2.10 · sol +3.28 порог 2.97 — оба перешли) · en **ЭСКАЛАЦИЯ +К АДЪЮДИКАЦИИ** (claude перешёл, sol нет: его пол вдвое шире) · gemini **не подтверждено ни +одним** (−0.10 против +2.53, оба ниже порога). Контроли Sol чисты: 32/32 · 18/18 · 30/30. +Единственное двухсемейное подтверждение фазы пришло с РАЗВЕДОЧНОЙ японской оси. + +**Открыто на владельце:** решение по возражению Sol по `tier` (расхождение +8.69 против +0.50) · японская нога H-4 (второй редактор +на ja не покупался, ~$0.05) · санкция замены ja-книги (`enkan_no_hate_ja` вместо +`isekai_majutsushi_jp`; в CURRENT-STATE до сих пор висит как СТОП). + +**Долги полигона:** селфтест `sud.py` падает на всех трёх новых осях · гейт наклона не +построен · `conformance` красный (58 требований без улик, 3 провала) · ФД-C потрачено $0.3348 +против закоммиченного потолка $0.300 (подъём до $0.360 не закоммичен) · дерево НЕ закоммичено, +кроме фризов покупающего кода — лендит оркестратор. + *(Память · Голос и состояние · Ридер-IDE — ЗАКРЫТЫЕ секции (D39.125): темы исполнены/переехали в зонные журналы; хроника — в архив-слайсах. Фронт пишет ТОЛЬКО в frontend-PROGRESS.md.)* diff --git a/docs/README.md b/docs/README.md index 7d2cb7fe..a7f25266 100644 --- a/docs/README.md +++ b/docs/README.md @@ -17,7 +17,7 @@ - `research/` — фактура ресёрчей 01–27; у принятых — ревью-шапки, часть тел под ⚠ superseded: **читай баннер прежде содержимого**. Ключевые для навигации: 15 голос · 16 ридер-IDE · 17 внешняя критика · 18 рычаги качества · 19 нарезка · 20 банк-майнинг · 21 обзор транспорта · 22 доменные харнессы · 23 шов движок↔платформа (транспорт superseded D39.106) · 25 холодное ревью шва — форма D39.106, отвергнутые альтернативы, требования к эмиттеру (читать перед любым кодом стыка) · 24 арбитраж банка (ПРИНЯТ D39.102: консилиум закрыт классом, вход фикс-пака банка — §G) · 26 официальные практики Anthropic (D39.121: записка-план, сниппеты хендоффов, карта «уже делаем/перенять»). - [PROGRESS.md](PROGRESS.md) — журнал: CURRENT-STATE + **ЕДИНЫЙ БЭКЛОГ** (единственный трекер) + живой хвост хроники. НЕ источник решений. - `scripts/counts.py` — **производные числа доков считаются им, а не руками** (голова по трём носителям · счёт очереди и зон · вес открытых строк регистра платформы · полнота реестра нот); `--check` даёт ненулевой код на расхождении; `--lint` — линтер file:line-якорей живых доков (D39.126). Его же зовёт зонный хук `scripts/githooks/pre-commit` при коммите, задевающем D-лог или PROGRESS — предупреждает, не блокирует. Заведено по D39.112 п.5б: голова отставала трижды у трёх разных оркестраторов. -- Активные хендофф-промты сессий (состав обновляется при каждом лендинге — норма D39.80): [ORCHESTRATOR_SESSION_PROMPT.md](ORCHESTRATOR_SESSION_PROMPT.md) (роль/нормы; состояния не дублирует) · **Полигон: [POLYGON_EXP2223_REDO_SESSION_PROMPT.md](POLYGON_EXP2223_REDO_SESSION_PROMPT.md)** — фаза Д доводки эксп-22/23 ИДЁТ (заказ владельца 10.08, потолок фазы $4.50; выводы 22/23 заморожены до неё) · [POLYGON_PACKAGE4_SESSION_PROMPT.md](POLYGON_PACKAGE4_SESSION_PROMPT.md) (отложен) . **Фронт: [../frontend/docs/S4_SESSION_PROMPT.md](../frontend/docs/S4_SESSION_PROMPT.md)** — S4 выдан 14.08 (гейт пал D39.130, запуск одобрен владельцем: библиотека/загрузка/прогресс + спек-правка 0.2.3) · **Платформа: активного промта НЕТ** — P6 + дофикс ИСПОЛНЕНЫ и ПРИНЯТЫ (D39.132, промты в `platform/docs/archive/`); следующий пак — P7 (читающая поверхность), промт после приёмки бэкенд-migrate · **Бэкенд: [BACKEND_MIGRATE_SESSION_PROMPT.md](BACKEND_MIGRATE_SESSION_PROMPT.md)** — `tmctl migrate` ИСПОЛНЕН (дерево в `backend/` ЖДЁТ ПРИЁМКИ оркестратора; отчёт — PROGRESS «Бэкенд»). Эмиттер шва ИСПОЛНЕН и ПРИНЯТ (D39.131, промт в архиве). Все ОТРАБОТАННЫЕ промты — в `archive/prompts/`, отчёты с ревью-шапками — в `archive/reports/`; статусы паков — CURRENT-STATE и D-лог, здесь не дублируются. Зонные журналы фронта/платформы — `frontend-PROGRESS.md` / `platform-PROGRESS.md` в их зонах (прогресс зон только там, D39.100). +- Активные хендофф-промты сессий (состав обновляется при каждом лендинге — норма D39.80): [ORCHESTRATOR_SESSION_PROMPT.md](ORCHESTRATOR_SESSION_PROMPT.md) (роль/нормы; состояния не дублирует) · **Полигон: [POLYGON_EXP2223_REDO_SESSION_PROMPT.md](POLYGON_EXP2223_REDO_SESSION_PROMPT.md)** — фаза Д доводки эксп-22/23 ИДЁТ (заказ владельца 10.08, потолок фазы $4.50; выводы 22/23 заморожены до неё) · [POLYGON_PACKAGE4_SESSION_PROMPT.md](POLYGON_PACKAGE4_SESSION_PROMPT.md) (отложен) . **Фронт: [../frontend/docs/S4_SESSION_PROMPT.md](../frontend/docs/S4_SESSION_PROMPT.md)** — S4 выдан 14.08 (гейт пал D39.130, запуск одобрен владельцем: библиотека/загрузка/прогресс + спек-правка 0.2.3) · **Платформа: активного промта НЕТ** — P6 + дофикс ИСПОЛНЕНЫ и ПРИНЯТЫ (D39.132, промты в `platform/docs/archive/`); следующий пак — P7 (читающая поверхность), промт после приёмки бэкенд-migrate · **Бэкенд: [BACKEND_MIGRATE_SESSION_PROMPT.md](BACKEND_MIGRATE_SESSION_PROMPT.md)** — `tmctl migrate` ИСПОЛНЕН, но НЕ ПРИНЯТ: код в main коммитом владельца `535581d` (15.08, слово владельца — не инцидент; вместе со снапшотом живой работы S4) — **приёмка оркестратора ПОСТ-ФАКТУМ обязательна ДО деплоя**; отчёт — PROGRESS «Бэкенд». Эмиттер шва ИСПОЛНЕН и ПРИНЯТ (D39.131, промт в архиве). Все ОТРАБОТАННЫЕ промты — в `archive/prompts/`, отчёты с ревью-шапками — в `archive/reports/`; статусы паков — CURRENT-STATE и D-лог, здесь не дублируются. Зонные журналы фронта/платформы — `frontend-PROGRESS.md` / `platform-PROGRESS.md` в их зонах (прогресс зон только там, D39.100). - Зоны фронта (чужие, читать при касании стыка; каждая ведёт СВОЙ зонный бэклог — единый бэклог их строк не принимает, 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..П-14) + `docs/` (зонный журнал `platform-PROGRESS.md` · регистр дефектов · архив промтов P0–P5). - `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-index.md b/docs/architecture/05-decisions-index.md index be305378..50863a60 100644 --- a/docs/architecture/05-decisions-index.md +++ b/docs/architecture/05-decisions-index.md @@ -185,3 +185,4 @@ | D39.130 | 14.08 | Приёмка платформы P5 в три раунда (69d485a): интейк книг с сентинелом хранилища, стоп/резюм с намерением, Prometheus; ратификации Go-floor 1.26.6 + book.yaml формой Б; строка 170, дописка 165 (PD-196) | ЖИВОЕ: гейт S4 фронта пал — S4-промт по слову владельца (вход: POST /books + находки S3.7 + спека 0.2.3); стройка формы Б — следующим касанием зоны | жив | платформа деньги контракт шов | | D39.131 | 14.08 | Приёмка эмиттер-пака (9cfe080, дофикс до лендинга): events.jsonl + exit 4/5/полоса 10-19 + пер-вызовный репэйр-гейт; строки 103/135/165/102 закрыты; ратификации: сужение класса 11, eta из темпа прогона, unit_done присваиванием (предложение платформе), кап эскалации оставлен | ЖИВОЕ: движковая половина PD-113/PD-196 построена — остаток у платформы (П-15: маппинг exit-кодов/scope/присваивание); деадлок деплоя v15 = строка 174 ДО деплоя бинаря; StreamVersion 1.1 | жив | шов деньги бэкенд платформа | | D39.132 | 15.08 | Приёмка платформы P6 + дофикс: потребительская половина шва (exit-словарь, unit_done присваиванием, scope, TM_TRACE_ID) + интейк формы Б + дев-стенд; PD-113/PD-196 закрыты, 0 major; ратификации: day_usd вне шаблона (владелец), пере-подпись PLATFORM_DIRECTION §3, второй гейт батареи, exit 13 направлением, PD-241-направление; фикс-лист ФП-1..8 закрыт дофиксом (exit 2 status-канала) | ЖИВОЕ: шов закрыт с обеих сторон; строки 174/175 + финал exit 13 — приёмкой бэкенд-migrate; строка 176 движку (паника = exit 2, PD-212) | жив | шов деньги платформа приёмка | +| D39.133 | 15.08 | Закрытие сессии оркестратора №16, передача №17; первые задачи: приёмка migrate пост-фактум (код в main без приёмки, до деплоя) → строка 172 → приёмка S4 → промт P7 | ЖИВОЕ: очередь — CURRENT-STATE | жив | хендофф оркестратор | diff --git a/docs/architecture/05-decisions-log.md b/docs/architecture/05-decisions-log.md index cbf01ca9..cdaba7ad 100644 --- a/docs/architecture/05-decisions-log.md +++ b/docs/architecture/05-decisions-log.md @@ -1,7 +1,8 @@ -# Журнал решений оркестратора — контракт D1–D39.132 (живой файл: карта · эрраты · живые тела · голова D39.106+; тела закрытых эр — в слайсах `docs/archive/architecture/`, указатель ниже; реестр всех нот — `05-decisions-index.md`) +# Журнал решений оркестратора — контракт D1–D39.133 (живой файл: карта · эрраты · живые тела · голова D39.106+; тела закрытых эр — в слайсах `docs/archive/architecture/`, указатель ниже; реестр всех нот — `05-decisions-index.md`) > **⟶ КАРТА АКТУАЛЬНОСТИ (ревизия D31, продлена до D38.2 [12.07]; исторические записи ниже НЕ переписываются — дисциплина D23.3).** Работая с контрактом (греп номера: живой файл → слайсы, целиком НЕ читать — D39.125), держи под рукой, что чем перекрыто: > ⚠ **Эррата 09.08 (D39.125):** D39.111 п.1 предписывал промту S3 «максимум = баланс МИНУС открытые холды» — формула ОШИБОЧНА (вычитание дважды), исправлена D39.115 п.2(а): максимум = Balance КАК ЕСТЬ; тело D39.111 живёт ниже в этом файле (голова D39.106+). +> ⚠ **Эррата 15.08 (D39.132):** D39.131 п.2(а) перечисляет полосу отказов «10 конфиг · 11 источник · 12 лок · 19 безымянный» — читать через D39.132 п.2(г): полоса ДОПОЛНЕНА **exit 13 = `schema_mismatch`** (обе зоны сошлись на числе независимо; ратифицирован направлением, финализация — приёмкой бэкенд-пака `tmctl migrate`, ею же закрываются строки 174/175 бэклога). > ⚠ **Навигация (актуализация 07.08, эра D39.1xx):** append-only-дисциплина (D23.3) означает, что > НЕВЕРНЫЙ ФАКТ внутри старой ноты не переписывается, а получает эрратау — и тогда он опасен ровно > тем, что грепающий его найдёт ПЕРВЫМ, а эрратау ниже может не дочитать. Поэтому поправки к фактам @@ -509,3 +510,7 @@ **2. Ратификации.** (а) **`day_usd` убран из платформенного шаблона книги** (решение владельца 15.08): трата прогона ограничена купленным объёмом (холд+`--ceiling-usd`), дневная ось на платформе дублирующая; в движке остаётся операторской опцией, обработка `daily_ceiling`/409 — предохранитель. **PD-199 закрыт этим же решением: `null` на проводе подтверждён**, слово в контракт не заводится. (б) **`PLATFORM_DIRECTION` §3 пере-подписан**: oapi-codegen «взять — доказано» → кандидат при P7; sqlc — привязан к P7 (масса запросов читающей поверхности); River-факт поправлен. (в) **Второй гейт батареи принят** (`TM_PLATFORM_TEST_ENGINE_BIN`+`_BOOK_TEMPLATE`, форма как у БД-гейта; с обоими гейтами скипов 0). (г) **exit 13 = `schema_mismatch` ратифицирован НАПРАВЛЕНИЕМ**: обе зоны сошлись на числе независимо (платформа — ждущий класс, движок — полоса 10–19); финализация и закрытие строк 174/175 — приёмкой бэкенд-пака migrate. (д) **PD-241 (стоп пользователя переименовывается в `paused/credit_exhausted`, если потолок приехал тем же дрейном) — направление: намерение стопа выигрывает НА СТАТУСЕ**, деньги не затронуты; исполнение — следующим касанием зоны, отменяется одной репликой владельца. **3. Исправления оркестратора при лендинге и хвосты.** Регистр: откачено переименование PD-198→PD-199 и удалена строка-дубль (246→245; «ID стабилен навсегда»); PD-200/PD-180 — по секциям; счёт-базис журнала «396→403» заменён воспроизводимым (359→416, PD-234). Новые остатки — строками PD-217…PD-223, PD-241…PD-245 (тяжелее прочих: PD-217 — книга на `daily_ceiling`/вечном холде блокирует апгрейд движка без выхода). Единый бэклог: строка 176 — движку `recover`/другой код на панику (exit 2 коллизия с completed-with-flags, PD-212). Урок приёмки — знанием: **шов, у которого движковая половина менялась под потребителем, проверяется перечислением ВСЕХ каналов движка** (exit-контракт сверили — status-канал упустили и сессия, и её ревью; поймала только панель). Очередь: приёмка бэкенд-migrate (дерево ждёт в `backend/`) → приёмка S4 → промт P7. (15.08.2026, оркестратор №16) ✅ + +## D39.133 — ЗАКРЫТИЕ СЕССИИ №16, передача №17 (15.08). ✅ + +Сессия №16 (09–15.08): лендинги D39.126–132 (докс-пак 167 · приёмки S3.7 · P5 в три раунда · эмиттер шва · P6+дофикс). Состояние, очередь и открытое на владельце — CURRENT-STATE и D39.132 п.3 (не дублируются). Первые задачи №17 по очереди: **приёмка бэкенд-migrate ПОСТ-ФАКТУМ** (код в main коммитом владельца `535581d` БЕЗ приёмки — обязательна до деплоя; закрывает строки 174/175, финализирует exit 13 по эррате шапки) → строка 172 (цены DeepSeek 16.08 — на владельце) → приёмка S4 → промт P7 платформы. Роль-промт обновлён этим же коммитом. (15.08.2026, оркестратор №16) ✅