From 6b0e064463e48f498bfc12abc68fb914c1bf9413 Mon Sep 17 00:00:00 2001 From: "Claude (backend session)" Date: Sat, 22 Aug 2026 17:38:59 +0300 Subject: [PATCH] Record the acceptance of the platform fix pack, its four new register rows and the pack order that came out inverted --- docs/PROGRESS.md | 8 +++--- docs/architecture/05-decisions-index.md | 3 ++- docs/architecture/05-decisions-log.md | 26 ++++++++++++++++++- .../docs/PLATFORM_P8_REVIEW_SESSION_PROMPT.md | 14 ++++++++++ 4 files changed, 46 insertions(+), 5 deletions(-) diff --git a/docs/PROGRESS.md b/docs/PROGRESS.md index 1a06d989..03acefce 100644 --- a/docs/PROGRESS.md +++ b/docs/PROGRESS.md @@ -1,6 +1,6 @@ # Журнал прогресса -> **⟶ ТЕКУЩЕЕ СОСТОЯНИЕ** (на 2026-08-20, голова D39.153 — КУРС: движок и платформа до «работает и отдаёт результат», фронт ЗАМОРОЖЕН и P7 его НЕ размораживает (D39.147). **ОЧЕРЕДЬ №18** (единственный носитель — здесь): (а) **P7 платформы ПРИНЯТ С ФИКС-ЛИСТОМ и ЗАЛЕНДЕН, сессия закрыта владельцем 20.08** (D39.153; зонный фикс-лист из тринадцати пунктов плюс врезанный первым блокер свипа — пинг №18 в `platform/docs/platform-PROGRESS.md`, первым `ContractVersion` 0.3.0 при формах 0.4.0) · (а1) **контракт API v0 0.4.0 РАТИФИЦИРОВАН** (D39.152; PD-327 закрыт; зеркало фронта отстаёт ратифицированно, при разморозке `cmp`) · (б) **лендинг петель полигона (фаза Д) — ОТКРЫТ**: приёмка ФАЗЫ у параллельного оркестратора, лендинг за этим; ⚠ в дереве живая незакоммиченная и частично ЗАСТЕЙДЖЕННАЯ работа полигона — не трогать и не «прибирать», состав выяснять у зоны · (в) **следующие работы платформы, порядок ПЕРЕСТАВЛЕН 21.08 при выдаче промтов:** ревью-пак четырёх осей (`platform/docs/PLATFORM_P8_REVIEW_SESSION_PROMPT.md`) → дофикс-пак (`PLATFORM_P8_FIX_SESSION_PROMPT.md`: фикс-лист пинга №18 + строка 199а + sqlc с разбором СОБРАННЫХ запросов) → живой прогон книги насквозь (строка 202, гейт — холодный прогон движка). **Почему ревью первым:** он read-only и дёшев, а дофикс тогда берёт известное И найденное одним заходом вместо двух. ⚠ **Цена перестановки, названная вслух:** блокер свипа (расчёт денег и допуск прогонов встают для всей инсталляции, ручки нет) остаётся живым на всё время читающего пака. Принято потому, что **первого выката ещё не было** — рантбук деплоя был предусловием, а не фактом, — то есть блокер сегодня пред-продовый, а не действующий отказ. Появится реальный деплой раньше, чем дофикс — порядок пересматривается · (г) **контракт:** сквозная полоса прогресса следующим минором (строка 200, слово владельца 20.08) вместе с хвостами релеев (203) · (д) свободные бэкенд: 160 Этап 0, фикс-лист ФЧ строкой 197 (носителя-сессии нет по слову владельца); ⚠ строки 176/181/187 СНЯТЫ с таблицы при лендинге 20.08 — они закрыты ещё D39.149, а очередь всё это время звала 181 свободной работой (поймано ревью доков; остатки живут строками 194/196/197) · (е) фронтовый фрагмент pre-commit хука получает норму «жалуйся владельцу» — **решение владельца 21.08: ДА**, исполняется первым касанием зоны (пинг в её журнале). **Открытые обязательства, которых нет больше нигде:** веса `pro` — строка 172-г НЕ закрыта, прогон мерил классификатор на flash; дешёвый вход — спросить полигон, говорят ли что-то данные фазы Д (там pro гоняется редактором), отдельный замер не покупать без этого · `docs/experiments/00-provider-quirks.md` несёт протухшие цены DeepSeek («не изменились, flash $0.14/$0.28») — зона полигона, чинить пингом · санкция на платный прогон в архивном промте пака честности была РАЗОВОЙ · **норма плотности комментариев — ОТВЕЧЕНА владельцем 21.08:** режем ВОДУ, а не длину — счёт строк «пиши одну-две» негодный гейт и снят; уходит пересказ решений, провенанс и изложение исследования вместо ссылки, остаётся всё, что из одной функции не выводится, сколько бы строк ни заняло (норма переписана — `12-go-style-notes` §1; PD-255 платформы этим закрывается). ⚠ Метод-урок: её хендофф объявил «вопросов на владельце нет», а строка регистра просила именно решения — вопрос был закрыт ОБЪЯВЛЕНИЕМ, поймано ревьюером полноты выгрузки. Оркестраторов ДВА (решение владельца 07.08): этот — движок/платформа/фронт/доки; параллельный (РОЛЬЮ, без номера — счётчик один, D39.112 п.6) — приёмка полигона. Одновременно не запускаются; CURRENT-STATE ведут оба, чужие строки не трогают. Норма изоляции панелей — D39.113, гардрейлы в CLAUDE.md.) +> **⟶ ТЕКУЩЕЕ СОСТОЯНИЕ** (на 2026-08-22, голова D39.154 — КУРС: движок и платформа до «работает и отдаёт результат», фронт ЗАМОРОЖЕН и P7 его НЕ размораживает (D39.147). **ОЧЕРЕДЬ №18** (единственный носитель — здесь): (а) **P7 платформы ПРИНЯТ С ФИКС-ЛИСТОМ и ЗАЛЕНДЕН, сессия закрыта владельцем 20.08** (D39.153; зонный фикс-лист из тринадцати пунктов плюс врезанный первым блокер свипа — пинг №18 в `platform/docs/platform-PROGRESS.md`, первым `ContractVersion` 0.3.0 при формах 0.4.0) · (а1) **контракт API v0 0.4.0 РАТИФИЦИРОВАН** (D39.152; PD-327 закрыт; зеркало фронта отстаёт ратифицированно, при разморозке `cmp`) · (б) **лендинг петель полигона (фаза Д) — ОТКРЫТ**: приёмка ФАЗЫ у параллельного оркестратора, лендинг за этим; ⚠ в дереве живая незакоммиченная и частично ЗАСТЕЙДЖЕННАЯ работа полигона — не трогать и не «прибирать», состав выяснять у зоны · (в) **дофикс-пак P8-FIX ПРИНЯТ И ЗАЛЕНДЕН 22.08** (D39.154, лендинг `31f1f82`): блокер свипа закрыт четырьмя механизмами и пере-проверен живой пробой оркестратора, деньги сошлись двумя путями из сырого леджера; мои четыре строки регистра — `PD-371`…`PD-374`. ⚠ **Порядок вышел ОБРАТНЫМ этой очереди:** промт дофикса требовал запуска ПОСЛЕ читающего пака, запущен был раньше. Цена перестановки, названная мной вслух 21.08 («блокер живёт всё время читающего пака»), тем самым НЕ заплачена — это лучший исход, чем планировалось; в минус — §4.7 (аддендум релеем) пуст и читающий пак пойдёт по только что переписанному коду. **ОСТАЛОСЬ:** ревью-пак четырёх осей, которых не смотрел НИКТО (`platform/docs/PLATFORM_P8_REVIEW_SESSION_PROMPT.md`: деньги и леджер целиком · вход/сессии/CSRF · очередь и джобы · метрики) — его ось 3 зона пере-нацелила при лендинге, остальные три не затронуты → затем живой прогон книги насквозь (строка 202, гейт — холодный прогон движка) · (г) **контракт:** сквозная полоса прогресса следующим минором (строка 200, слово владельца 20.08) вместе с хвостами релеев (203) · (д) свободные бэкенд: 160 Этап 0, фикс-лист ФЧ строкой 197 (носителя-сессии нет по слову владельца); ⚠ строки 176/181/187 СНЯТЫ с таблицы при лендинге 20.08 — они закрыты ещё D39.149, а очередь всё это время звала 181 свободной работой (поймано ревью доков; остатки живут строками 194/196/197) · (е) фронтовый фрагмент pre-commit хука получает норму «жалуйся владельцу» — **решение владельца 21.08: ДА**, исполняется первым касанием зоны (пинг в её журнале). **Открытые обязательства, которых нет больше нигде:** веса `pro` — строка 172-г НЕ закрыта, прогон мерил классификатор на flash; дешёвый вход — спросить полигон, говорят ли что-то данные фазы Д (там pro гоняется редактором), отдельный замер не покупать без этого · `docs/experiments/00-provider-quirks.md` несёт протухшие цены DeepSeek («не изменились, flash $0.14/$0.28») — зона полигона, чинить пингом · санкция на платный прогон в архивном промте пака честности была РАЗОВОЙ · **норма плотности комментариев — ОТВЕЧЕНА владельцем 21.08:** режем ВОДУ, а не длину — счёт строк «пиши одну-две» негодный гейт и снят; уходит пересказ решений, провенанс и изложение исследования вместо ссылки, остаётся всё, что из одной функции не выводится, сколько бы строк ни заняло (норма переписана — `12-go-style-notes` §1; PD-255 платформы этим закрывается). ⚠ Метод-урок: её хендофф объявил «вопросов на владельце нет», а строка регистра просила именно решения — вопрос был закрыт ОБЪЯВЛЕНИЕМ, поймано ревьюером полноты выгрузки. Оркестраторов ДВА (решение владельца 07.08): этот — движок/платформа/фронт/доки; параллельный (РОЛЬЮ, без номера — счётчик один, D39.112 п.6) — приёмка полигона. Одновременно не запускаются; CURRENT-STATE ведут оба, чужие строки не трогают. Норма изоляции панелей — D39.113, гардрейлы в CLAUDE.md.) > - **Эра №15 закрыта — семь приёмок, все ПРИНЯТЫ и залендены**; лента, коммиты и разборы — D39.109–123 (D-лог) и реестр нот `architecture/05-decisions-index.md`; снимок прежних бюллетеней этой шапки — архив-слайс `-08-02-04`. > - **ЖИВОЕ:** полигон — **фаза Д ИДЁТ** (заказ 10.08; деньги санкционированы 15.08 напрямую полигону — ⚠ числа потолка в носителях расходятся, фактическую цепь сверить при лендинге петель; ja-книга `enkan_no_hate_ja`; при ратификации фазы Д в D-ноту: декой-правило + обязательный кросс-семейный опровергатель приёмки — одобрены 10.08; свежие фриз-коммиты полигона в дереве — НЕ трогать) · платформа и контракт — статус в строке выше, здесь НЕ дублируется (один носитель на факт) · **фронт ЗАМОРОЖЕН** (D39.136 п.2 + **D39.147: морозится ДАЛЬШЕ лендинга P7 — слово владельца 17.08; P7 зону НЕ размораживает, S5-промт не выдаётся, разморозка отдельным словом по достижении сквозного пути**; перечень первого касания зоны — синк зеркала на ТЕКУЩИЙ канон (не на «0.3.0»: канон с тех пор ушёл на 0.4.0 и уйдёт дальше строкой 200; оба минора уедут в ОДНУ перегенерацию — D39.152 п.7) + перегенерация типов + моки + гейт утечки конвейера + ФС-1..12 + Ф-63/Ф-28 + фразы В-11 по словарю кодов — не отменён, ждёт разморозки) · закрытые стройки эры — лентой нот: эмиттер D39.131 · P5/P6 D39.130/132 · migrate D39.134 · S4+0.2.3 D39.135 · DeepSeek-репин D39.137 (тела — D-лог и слайсы). > - **Открыто на владельце:** **развязка git с origin** (локальная линия ИСТИННА, force-push его рукой; не пуллить) · Приложение А контракта (148: фразы — по словарю кодов 0.3.0, структура готова) · продуктовое слово «остановлена: лимиты» (В-3) · В-4/Ф-30 (глава без заголовка — движковая половина строка 160) · мини-проба флора 44 (одобрена, промт не выдан; число — после ре-пробы 188) · подпись денежного шага 46 · лист В-3+К-6 · авто-резюм paused (вопрос платформы) · **схема time-based DeepSeek** (доклад — архив-слайс `PROGRESS-2026-08-14-15`; рекомендация: пик оставить + операционное правило «прогоны в долины», scheduler не начинать без ответа вендора об отметке тарификации) · **вход ратификации фазы Д:** посылка «dspro дешевле glm» в пике ПЕРЕВЁРНУТА (×1.26 дороже, D39.137 п.4) · **возражение Sol по проходу `tier` эксп-23** (⚠ носители РАСХОДЯТСЯ: здесь пункт висит на владельце, а секция «Полигон» ниже пишет «возражение снято, и владелец назвал причину» — Sol судил своё семейство, что запрещено D13.3; сверить с полигоном при лендинге петель фазы Д и снять один из двух — поймано ревью доков 20.08) · фронт-вопросы зонного журнала: В-7 (плотность; держит Ф-54) · В-8 (слово состояния в дереве) · В-9 (языки интерфейса — механизм готов, ПТ-36) · Ф-38 (вкладка «Замечания»). Закрытые пункты листа (PD-104 · В-10 · В-11-форма · Ф-56/57/61/62/63 · Ф-28 · ПТ-33-граница · 116 · 126 · 172-пин · PD-203 · санкции фазы Д · дизайн 160/161 · title) — в нотах D39.136–145, здесь не держатся. @@ -8,7 +8,7 @@ > - **Курс:** ОБЩНОСТЬ ✅ → КАЧЕСТВО БАНКА ✅ → ПАКЕТ-ЧЕКЕРОВ ✅ (D39.59–78) → **ФРОНТ-ЭРА** (D39.81–100: зоны живые, контракт API ратифицирован) → **шов/платформа/движковые блокеры построены** (D39.106–123). Хвосты курса живут строками: 16 (edit-волна не гонялась НИ РАЗУ — держит и оси голоса 13б/24) · 46 (дизайн заморожен D39.92/93, промт ждёт выдачи) · coldrun-b фаза C заморожена чекпойнтом легитимно (D39.86; эталон денег/поведения — coldrun-a, read-only); развилка 0731 решена и исполнена (D39.87/91, код `553f1a3`). > - **Горизонт (D39.62/67, освежён D39.95):** **ДОБОР ИДЕАЛА** (первым прогоном: оси голоса 24 · авто-режим · цена 16; жильцы ролей решаются ДО прогона эксп-22 — строка 149 · веса K1–K12 13а · вне-претрейн чекпоинт 55; остаток арбитража банка = рецензент спорных кластеров при ре-пробе 74 — D39.102) → ВТОРАЯ ПАРА живьём (ja→ru; преп 81) → МАСШТАБ → пилот Ф2.5 (гейт резюме-строки 80; строки 62–68, 85) → Ф3 ридер-IDE (69–71). **Стоячие:** ToS-триггер 25.10 · Ш-2 до go1.27 (⚠ + x/text Unicode 17 тем же тулчейном — строка 119, реестр §Б-108 справочника якорей) · платные прогоны разблокированы (проба провода — D39.97, конфиги 112 залендены). > - **Стек (полная карта роль→модель→конфиг→квирки — [STACK.md](STACK.md), D39.126):** draft deepseek-v4-flash thinking-ON `low` **⚠0731** → терминолог (та же модель) → editor deepseek-v4-pro БИЛИНГВ ИНТЕРИМ (топология ПОДТВЕРЖДЕНА при неразличимости жильцов — D39.117; закон-блок ОБЯЗАТЕЛЕН — строка 134; glm-5 резерв; вахта маппинга эффорта pro — §Б-108) → судья gemini (Ф2, в движке НЕ построен — строка 33); канал B Mistral+grok; ~$0.85/ранобэ (D30.4, пере-калибровка при следующем платном прогоне). ⚠ **Вендор-факты 13–15.08 (пере-пин ИСПОЛНЕН и ПРИНЯТ, D39.137):** таблица цен запинена ПИКОМ (flash 0.44/1.32 · pro 1.32/3.96/кэш-хит 0.044 за 1M; счёт шиппинг-c1 = 100% DeepSeek ⇒ ×4.2–4.4 в пике / ×2.1–2.2 в долине — замер по трём прогонам); у pro эффорт стал настраиваемым low/high/max (квирк 3а устарел — вахта §Б-108 сработала); ⚠ ВЕСА pro сменились под тем же слагом (V4-Pro-0813, класс D39.61) — вахта-риг готов (остаток 172); ⚠ посылка интерим-редактора «dspro дешевле glm» в пике ПЕРЕВЁРНУТА (×1.26 дороже — вход ратификации фазы Д, D39.137 п.4); покупки фазы Д на deepseek до 16.08 16:00 UTC — по старым ценам. ⚠ **ВЕСЬ банковый контур (банкнота+терминолог+классификатор) в shipping-c1 НЕ включён** — жив ран-локальным конфигом книги (строка 140; сверка STACK.md 09.08 — факт шире прежней декларации «одна банкнота»); эскалация в shipping за `budget_usd: 0` (STACK.md §примечания). -> - **ЕДИНЫЙ БЭКЛОГ — секция «Бэклог» ниже** (одна таблица, единственный трекер; каждая петля обязана иметь диспозицию: решено / отложено-с-записью / отклонено; ведёт оркестратор). **СЧЁТ ОЧЕРЕДИ на 20.08 (скриптом по таблице — `python3 docs/scripts/counts.py`; обновлять при каждом лендинге):** всего **158** строк · зона бэкенд **75** строго / **110** широко (175 пере-скоуплена D39.134; 176/177 заведены 15.08; 178 — D39.136; 179 ЗАКРЫТА D39.138; 180/181 — D39.137; 182 — wire-батч, аудит 15.08; 183–187 — контракт-ревью 28, D39.138; 188–190 — аудит бэклога, D39.140; 191/192 — модель подписи банка и пост-ридинговый цикл, D39.144; 193 — молчащие дыры выдачи, D39.147; 194–196 — приёмка пака честности, D39.149; 197 — фикс-лист ФЧ, D39.150; **198–204 — приёмка P7 и слова владельца 20.08, D39.153; 205 — слепота гейта якорей, аудит 21.08**) (⚠ колонки счётчик читает С КОНЦА — испр. D39.116) · **блокеров очереди 0**, платные прогоны разблокированы · «скоро» **41** (перечень — грепом по таблице, рукописный список снят D39.126) · гейт-строки эксп-22: 55·153 (плюс 150 — руки владельца); строка 5 — остаток гейчен ре-пробой 74, носитель события теперь строка 188 (аудит D39.140); остальное «когда-нибудь». ⚠ Счёт — НИЖНЯЯ граница долга, не потолок (разбор — легенда таблицы ниже). +> - **ЕДИНЫЙ БЭКЛОГ — секция «Бэклог» ниже** (одна таблица, единственный трекер; каждая петля обязана иметь диспозицию: решено / отложено-с-записью / отклонено; ведёт оркестратор). **СЧЁТ ОЧЕРЕДИ на 22.08 (скриптом по таблице — `python3 docs/scripts/counts.py`; обновлять при каждом лендинге):** всего **160** строк · зона бэкенд **75** строго / **110** широко (175 пере-скоуплена D39.134; 176/177 заведены 15.08; 178 — D39.136; 179 ЗАКРЫТА D39.138; 180/181 — D39.137; 182 — wire-батч, аудит 15.08; 183–187 — контракт-ревью 28, D39.138; 188–190 — аудит бэклога, D39.140; 191/192 — модель подписи банка и пост-ридинговый цикл, D39.144; 193 — молчащие дыры выдачи, D39.147; 194–196 — приёмка пака честности, D39.149; 197 — фикс-лист ФЧ, D39.150; **198–204 — приёмка P7 и слова владельца 20.08, D39.153; 205 — слепота гейта якорей, аудит 21.08; 206–207 — приёмка P8-FIX, D39.154**) (⚠ колонки счётчик читает С КОНЦА — испр. D39.116) · **блокеров очереди 0**, платные прогоны разблокированы · «скоро» **43** (перечень — грепом по таблице, рукописный список снят D39.126) · гейт-строки эксп-22: 55·153 (плюс 150 — руки владельца); строка 5 — остаток гейчен ре-пробой 74, носитель события теперь строка 188 (аудит D39.140); остальное «когда-нибудь». ⚠ Счёт — НИЖНЯЯ граница долга, не потолок (разбор — легенда таблицы ниже). > - Архивы хроники: `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)** · **`-08-01-02` (сессии №9/№10: общность · качество банка · coldrun-b · открытие фронта/платформы; D39.59–90, срез D39.105)** · **`-08-02-04` (сессии №11–№13: ручки эффорта · стандарты · контракт API · платформа P0 · банк-арбитраж; D39.91–105 + снимок шапки эры №15)** · `-08-04-09` (пинги закрытых паков эры №15) · **`-08-14-15` (закрытые бэкенд-записи №16–17: эмиттер шва · migrate · пере-пин DeepSeek; вынесено D39.139)**. Записи ниже — живой хвост (№16+, эра D39.124+; подрезка D39.139). ## Бэклог (ЕДИНЫЙ, собран 26.07, актуализация 04.08 D39.99/D39.101; правки — только через оркестратора) @@ -136,13 +136,15 @@ | 196 | **Остаточный класс строки 176: неперехватываемые `fatal error` Go** (конкурентная запись в map, OOM, стек-оверфлоу) по-прежнему дают exit 2, то есть читаются платформой как «завершено с флагами» — `recover` их не ловит по устройству языка (подтверждено линзой шва исполнением). Строка 176 закрыта для ПАНИК, не для fatal. Лечение — вне exit-контракта: сторож процесса у платформы либо маркер живости в артефакте прогона | бэкенд/платформа | когда-нибудь | отдельное решение | приёмка №18, линза шва | | 197 | **Фикс-лист приёмки пака честности ФЧ-1…ФЧ-8** (D39.149; тело — запись приёмки №18 в секции «Бэкенд»): три НЕПРИБИТЫЕ гарантии (снятие фильтра по книге в `CheckpointUsageForBook` не валит ни один тест — воспроизведено оркестратором · ключ ячейки без `chunk_idx` съедает деньги соседнего чанка · ветка «строка не пере-оценена» не ловится на продовом пути) · два докстринга `reprice.go` описывают НЕ то, что делает код · 187 исполнен наполовину (тот же снятый закон в докстринге теста и `backend/docs/D15.2-*.md:317`) · `HistoricalRows` не доезжает до `status`/`--json`, второй операторский текст (`--accept-rebill`) без basis · **ФЧ-5 РЕШЁН владельцем 17.08 (D39.150): прайсить по модели, которую стадия резолвит СЕЙЧАС, + округление вверх и оговорка в тексте согласия** · `Status()` жёстко падает при ошибке репрайсера против соседней политики деградации · паника поверх ceiling-стопа даёт `failed` вместо `paused` (PD-113) · три стейл-докстринга. Носителя-сессии НЕТ — по слову владельца 17.08 пока только записано | бэкенд | скоро (следующее касание денежного пути; ФЧ-5 обязателен до первого пере-прогона со сменой модели) | дофикс-промт ЛИБО попутно ближайшим паком | **D39.149**, **D39.150** | | 198 | **Апгрейд движка стирает замечания и счётчики книги БЕЗВОЗВРАТНО — композиция двух половин, каждая известна по отдельности** (приёмка P7, линза «вне карты», обе половины пере-прочитаны оркестратором). Платформа при смене `manifest_key` сносит ВСЕ `unit_resolutions` книги (`platform/internal/pgstore/readmodel.go:164-165`), рассчитывая, что поток их пере-наполнит; движок анонсирует юнит РОВНО ОДИН РАЗ за жизнь книги — ключ `unit::::` БЕЗ метки нарезки (`backend/internal/pipeline/events.go:399-400`), а леджер анонсов переживает прогоны (`backend/internal/store/outbox.go:96` «already announced… by one that ran before it») ⇒ совпавшие координаты не переанонсируются НИКОГДА. Обостряется порядком: долг на материализацию ставится только на ГРАНИЦАХ работы, поэтому первая зачистка после апгрейда случается в КОНЦЕ первого пост-апгрейдного прогона и сносит замечания ТОГО ЖЕ прогона, за который заплачено. Следствия на проводе: «0 из N» на переведённой книге навсегда · шкала снова предлагает купить переведённое · замечания читателя исчезают. **Лечится с обеих сторон:** движковая половина — метка нарезки в ключе анонса (решение зоны движка), платформенная — не сносить вслепую либо восстанавливать из экспорта. ⚠ Гейт холодного прогона: смысл упражнения — гонять книгу против МЕНЯЮЩЕГОСЯ движка, то есть первый же апгрейд обнулит библиотеку | бэкенд + платформа | **скоро (до первого реального пользователя И до холодного прогона с апгрейдами)** | связка: решение по ключу анонса в движке → правка платформы | приёмка P7 (D39.153) | -| 199 | **Канал доставки правок банка в движок НЕ построен — цепь «поправить/добавить термин → перегенерация» рвётся на шве платформа→движок** (расследование 20.08 по слову владельца; грепы пере-проверены оркестратором). По краям обе половины ЕСТЬ: сверху пользователь может впечатать исправленный перевод (`submitBankDecisions`, поле `dst`), снизу движок умеет точечную ре-редактуру по вхождениям за $0 на незатронутых юнитах со сметой и порогом согласия (`stagerun.go:88-107`, `repin.go`/`rebill.go`). Носителя между ними нет: колонки `action`/`dst` не читает НИ ОДИН SELECT (единственная выборка `readmodel.go:336` проверяет лишь факт наличия строки) · `mined_delta|mined_rejects` по Go платформы = **0** вхождений · воркер, который должен переносить решения в эти файлы перед resume, описан в комментарии её же миграции (`00002_readmodel.sql:172-174`) и НЕ построен. **Делится надвое:** (а) **труба** — платформа пишет решения в два файла, которые движок читает. ⚠ **«Контракт файлов существует, проектировать нечего» — ОПРОВЕРГНУТО КОДОМ 21.08** (опровергатель промта, пере-проверено оркестратором построчно): движок читает `mined_delta`/`mined_rejects`, ТОЛЬКО если их путь объявлен в `book.yaml` (`backend/internal/pipeline/mining.go:855-858`=`if r.Book.MinedDelta == ""`), а объявленный ключ с НЕсуществующим файлом валит загрузку конфига целиком (`backend/internal/config/book.go:199-207`=`is not readable`). Ключей нет ни в шаблоне оператора, ни в дев-стенде (`backend/example/book.yaml` — ноль вхождений), и добавить их платформа не может молча: она пишет `book.yaml` ОДИН раз под `O_EXCL` и «никогда не перезаписывает» (`platform/internal/books/render.go:106-109`=`writes the file once and never again`), а схему движка знать не должна — это ратифицированная форма Б (D39.110 §2б). **Значит развилка есть и она упирается в ратифицированную границу владения `book.yaml`:** объявляет ли ключи платформа при рождении книги (и создаёт ли два пустых файла сразу, иначе движок не стартует) · несёт ли их шаблон оператора · двигается ли граница владения. Решать её — ратификацией, не паком. Закрывает и честность `decline` (PD-277 — его текст сегодня относит работу к отложенной 192, пере-диспозиция нужна тем же решением); (б) **отложенное владельцем** — правки ПОСЛЕ прочтения уже переведённой книги: там правка банка двигает снапшот, движок падает громко без явного согласия на пере-оплату, а `resnapshot|accept-rebill` по Go платформы = 0 ⇒ прогон не перегенерирует, а УПАДЁТ (сегодня не кусает только потому, что до движка не доезжает ничего). Половина (б) — территория строки **192** | платформа + бэкенд | (а) скоро · (б) гейчена 192 | (а) дофикс-пак платформы · (б) с циклом чтения | расследование 20.08, D39.153 | +| 199 | **Канал доставки правок банка в движок НЕ построен — цепь «поправить/добавить термин → перегенерация» рвётся на шве платформа→движок** (расследование 20.08 по слову владельца; грепы пере-проверены оркестратором). По краям обе половины ЕСТЬ: сверху ЖИЛА ручка, куда пользователь мог впечатать исправленный перевод (`submitBankDecisions`, поле `dst`) — ⚠ **она СНЯТА 22.08** вместе с пер-термной подписью (D39.154, `PD-370`), поэтому верхнего края у цепи сегодня НЕТ вовсе: снизу движок умеет ре-редактуру, сверху ручки нет ни в зоне, ни в каноне, снизу движок умеет точечную ре-редактуру по вхождениям за $0 на незатронутых юнитах со сметой и порогом согласия (`stagerun.go:88-107`, `repin.go`/`rebill.go`). Носителя между ними нет: колонки `action`/`dst` не читает НИ ОДИН SELECT (единственная выборка `readmodel.go:336` проверяет лишь факт наличия строки) · `mined_delta|mined_rejects` по Go платформы = **0** вхождений · воркер, который должен переносить решения в эти файлы перед resume, описан в комментарии её же миграции (`00002_readmodel.sql:172-174`) и НЕ построен. **Делится надвое:** (а) **труба** — платформа пишет решения в два файла, которые движок читает. ⚠ **«Контракт файлов существует, проектировать нечего» — ОПРОВЕРГНУТО КОДОМ 21.08** (опровергатель промта, пере-проверено оркестратором построчно): движок читает `mined_delta`/`mined_rejects`, ТОЛЬКО если их путь объявлен в `book.yaml` (`backend/internal/pipeline/mining.go:855-858`=`if r.Book.MinedDelta == ""`), а объявленный ключ с НЕсуществующим файлом валит загрузку конфига целиком (`backend/internal/config/book.go:199-207`=`is not readable`). Ключей нет ни в шаблоне оператора, ни в дев-стенде (`backend/example/book.yaml` — ноль вхождений), и добавить их платформа не может молча: она пишет `book.yaml` ОДИН раз под `O_EXCL` и «никогда не перезаписывает» (`platform/internal/books/render.go:106-109`=`writes the file once and never again`), а схему движка знать не должна — это ратифицированная форма Б (D39.110 §2б). **Значит развилка есть и она упирается в ратифицированную границу владения `book.yaml`:** объявляет ли ключи платформа при рождении книги (и создаёт ли два пустых файла сразу, иначе движок не стартует) · несёт ли их шаблон оператора · двигается ли граница владения. Решать её — ратификацией, не паком. Закрывает и честность `decline` (PD-277 — его текст сегодня относит работу к отложенной 192, пере-диспозиция нужна тем же решением); (б) **отложенное владельцем** — правки ПОСЛЕ прочтения уже переведённой книги: там правка банка двигает снапшот, движок падает громко без явного согласия на пере-оплату, а `resnapshot|accept-rebill` по Go платформы = 0 ⇒ прогон не перегенерирует, а УПАДЁТ (сегодня не кусает только потому, что до движка не доезжает ничего). Половина (б) — территория строки **192** | платформа + бэкенд | (а) скоро · (б) гейчена 192 | (а) дофикс-пак платформы · (б) с циклом чтения | расследование 20.08, D39.153 | | 200 | **Сквозная полоса прогресса вместо пофазной — требование владельца 20.08, сформулировано и ждёт исполнения.** Сегодня прогресс считается ПО ОТРЕЗКАМ и при снятии стопа начинается с нуля (канон §Progress: «When a stop is cleared the counter starts again from zero») ⇒ пользователь видит 100% после черновика и обнуление — владелец назвал это дефектом подписанного, не вкусовщиной. Форма решения: ОДНА доля на всю работу прогона, считает СЕРВЕР (иначе клиент снова начнёт знать про фазы), плюс подпись «что делается сейчас» и неопределённый индикатор там, где доли в главах нет. ⚠ Веса «условно 10/40/40» НЕ нужны для переводческой части: движок объявляет знаменатель каждого прохода и ноль для прохода, которого на деплое нет (`backend/internal/pipeline/events.go:297-323`) ⇒ доля = сделано по всем проходам ÷ запланировано, без подобранных констант, и на деплое без редактора честно доходит до 100%. Догадка остаётся только у банка: поток прогресса несёт лишь два переводческих прохода, майнинг знаменателя не объявляет — **вопрос движку: может ли майнинг объявлять знаменатель** (он идёт по главам). Цена: правит канон §Progress + `Book.chapters_done`, то есть новый минор; пока фронт заморожен, минор бесплатен | контракт → платформа + бэкенд | скоро (следующий минор контракта) | контрактная сессия + платформенная половина; вопрос движку о знаменателе майнинга | слово владельца 20.08, D39.153 | | 201 | **Движковое «Глава N» доезжает читателю ВНУТРИ текста, обходя дисциплину `heading: null`** (линза шва P7, пере-прочитано оркестратором): `backend/internal/pipeline/export.go:230` приклеивает детерминированный порядковый к экспортному тексту первой юнит-главы (`ce.FinalText = chunk.ApplyHeading(...)`), колонка `Source` при этом остаётся heading-stripped. Платформа переносит обе как есть и честно отдаёт `heading: null` — то есть клиент нарисует СВОЙ порядковый на языке своего интерфейса над абзацем, который уже начинается с русского «Глава N», а исходная колонка соответствующего маркера не несёт: пара визуально рассинхронизирована на каждой первой главе. Конкретное следствие открытого К-2 контракта; родня движковой строки **160** (глава без заголовка) | бэкенд | когда-нибудь (с 160) | отдельное решение | приёмка P7 (D39.153) | | 202 | **Живой перевод книги НАСКВОЗЬ через API платформы не гонялся НИ РАЗУ** (obstacle сессии P7, подтверждён приёмкой): всё после «прогон стартовал и остановился» — подпись банка, halt на потолке, резюм после пополнения — покрыто батареей против живого Postgres, но с движком-заглушкой; настоящий манифест, сайдкар банка и причины флагов будут ПЕРВЫМИ данными, форму которых платформа не сочинила сама. Форма проверки (решена): только через API, как ходил бы клиент — интейк → старт → живой движок с ключами провайдера → поток событий → подпись и продолжение → чтение глав/юнитов/замечаний/банка и сверка с тем, что движок реально произвёл; качество перевода НЕ предмет (полигон). Цена ≈ $0.05 на десятиглавую книгу. **Решение владельца 20.08: ПОСЛЕ холодного прогона движка** — гонять одну неготовую систему против другой смысла нет | платформа | скоро (гейт: холодный прогон движка) | короткая сессия по промту оркестратора | слово владельца 20.08, D39.153 | | 203 | **Хвосты контракта после синка 0.4.0 — ОТКРЫТА ЧЕТВЕРТЬ, остальное исполнено** (тела релеев — `platform/docs/archive/P7_ACCEPTANCE_HANDOFF_2026-08-17.md` §7; сюда переписаны НЕ тела, а статус — один носитель на факт). ⚠ Сверено грепом при лендинге, потому что первая редакция этой строки уже разошлась с деревом: **(б) ИСПОЛНЕН** — срезанная фраза компаньона §2.14 стоит на месте (`14-api-contract/README.md:510`=`различать причины отказа клиент не может по замыслу`) · **(д) ИСПОЛНЕН** — клетка приложения А заполнена `unspecified` (`README.md:1376` — ⚠ первая редакция писала `:1391`, это строка ДРУГОГО приложения; испр. 20.08) · **(г) наполовину** — `unspecified` ратифицирован в каноне (`openapi.yaml:1784-1787`), открыта только ГРАНИЦА ступеней замечаний (две ступени при девяти рангах движка) → это строка **148** · **(и)** закрыт полем `stop_requested` (D39.152) · (л)(м)(н)(о) закрыты контрактной сессией. **ОТКРЫТО РЕАЛЬНО:** (а) канон-половина про `/auth` — компаньон поверхность описывает (§2.14), а канон говорит только «Signing in is not part of this surface» (`openapi.yaml:35-36`) и НЕ предупреждает, что конверт вне `/v0` может прийти БЕЗ обязательного `code`; сгенерированный по канону клиент об это спотыкается · (з) расхождение семантики `--verify-bank`: D39.144 ратифицировал «подпись = ОДИН акт», движок держит пер-термный гейт полноты (`backend/internal/pipeline/mining.go:80-82,243`=`EVERY proposed term is EITHER promoted`) — сегодня ОБОЙДЁН платформой, а не устранён (родня 191б); одно из двух должно уступить, это ратификация, не правка · (к) ключ `project_db` в `book.yaml`: договорить, кто им владеет — шаблон оператора его не содержит, движок делает необязательным. ⚠ **Следствие «на штатном деплое банк не читается» ОПРОВЕРГНУТО живым кодом** (проверено при лендинге): акт 5 внёс фолбэк `.db` и назвал прежний отказ багом (`platform/internal/runner/artifacts.go:82-90`=`The key is OPTIONAL to the engine`); первая редакция этой строки повторила клейм хендоффа зоны, не сверив с деревом — остаток чисто договорной · **(л) остаток закрытой строки 148 — Приложение А компаньона.** ⚠ Сама 148 СНЯТА 21.08 по слову владельца: она держала мир, которого больше нет — «карта потеряна инцидентом 08.08, реконструкция у оркестратора №15, решить, брать ли черновиком». Реконструкция брать нечего: прежняя карта вела «причина движка → ФРАЗА», то есть предполагала, что фразу рисует СЕРВЕР, а батч 0.3.0 эту политику ОТМЕНИЛ — `Note` несёт машинный `code`, фразу рисует клиент, `Note.message` с провода снят (`14-api-contract/README.md:1330`=`Карта «причина → КОД контракта`). Реально пуста другая клетка: соответствие причин движка кодам замечаний, и правила её заполнения в компаньоне уже написаны (фраза по ДОККОММЕНТУ `disposition.go`, а не по имени константы — инверсия уже стоила двух фраз; класс 2 схлопывается в ОДИН код). Исполнитель — контрактная сессия, не оркестратор | контракт/доки | скоро (следующее касание контракта, вместе с 200) | контрактная сессия | приёмка P7 (D39.153) | | 204 | **Движок не публикует причины флагов ДАННЫМИ — карта причин у платформы рукописная и расходится молча** (релей §7(в) хендоффа P7; зона платформы в чужой бэклог не пишет и просила строку сюда — `platform/docs/archive/platform-PROGRESS-P7.md:206`). Сегодня `platform/internal/ingest/notes.go` держит рукописную копию закрытого словаря ЧУЖОЙ зоны: 15 причин движка → коды замечаний контракта, сверено побайтно на 20.08 и верно СЕЙЧАС. Импортировать движок платформе нельзя (D39.85 — разные модули), поэтому расхождение появится молча в тот день, когда движок добавит причину: платформа отдаст `unspecified` и напишет ERROR в лог, то есть деградация честная, но карта протухнет незаметно. Лечение: движок публикует свой словарь причин артефактом-данными (тем же классом, что манифест и сайдкары банка), платформа читает его вместо копии. ⚠ Носителем был ТОЛЬКО регистр платформы (PD-246) — то есть обязательство к зоне движка жило внутри зоны автора; поймано ревьюером полноты выгрузки при лендинге | бэкенд | когда-нибудь (со следующим касанием эмиссии флагов) | отдельное решение | приёмка P7 (D39.153), релей §7(в) | | 205 | **Гейт якорей: ИСПОЛНЕН 21.08 — сверка по содержимому, двусторонняя дельта, объявленная слепота.** Был: проверял только существование файла и переполнение номера, поэтому дал ЗЕЛЁНЫЙ на четыре якоря, сломанных архивацией — а оркестратор на эту зелень опёрся вместо ручной сверки. Стало (`docs/scripts/counts.py`): якорь может нести ОПТ-ИН токен ожидания `` `путь:12-14`=`подстрока` ``, и такой якорь сверяется по содержимому; область расширена с `docs/` на `platform/docs` и `frontend/docs` (98 доков); из хука убран быстрый выход по «коммит не трогает docs/» — он ампутировал ЦЕЛЕВУЮ сторону, а цели у нас в основном КОД, то есть главный двигатель протухания приезжал ровно тем коммитом, на котором хук молчал (проверено ТЕСТ-КОММИТОМ, не ручным прогоном — норма D39.148). ⚠ **Разбор с внешним ревьюером снял три моих ошибки дизайна:** (1) у дельты ДВЕ роли, и путать их нельзя — ТРЕБОВАТЬ токен можно только на затронутых строках (иначе долг блокирует всех), а ПРОВЕРЯТЬ уже написанные токены дельта ограничивать не должна вовсе: токен был истинным при записи, значит упавший — гниль по построению; corpus-wide проверка схлопывает «пропущенное окно» (коммит без хука, `--no-verify`, свежий клон, проигнорированный warn) из «навсегда» в «до следующего прогона»; (2) окно диапазона `80-82,243` считалось как `min..max` — 164 строки, и токен, случайно живущий внутри, красил зелёным; теперь ОБЪЕДИНЕНИЕ отрезков; (3) литеральная сверка токена была машиной ложных тревог — фраза, разорванная переносом строки в цели, непроверяема в принципе, а будущая пере-вёрстка абзаца кричала бы «цель уехала» на невиновного; теперь ПРОБЕЛЬНАЯ нормализация (детерминированная и симметричная), разметка остаётся литеральной. ⚠ Мой довод «неудобство и есть механизм» был неверен: мой собственный случай был FALSE POSITIVE самого гейта — токен был истинным, цель не двигалась. **ОБЪЯВЛЕННАЯ СЛЕПОТА (печатается гейтом каждый прогон):** якорь БЕЗ токена — только существование и длина · подмена цели файлом с тем же путём ловится только токеном · цели читаются из ДЕРЕВА, поэтому чужой незакоммиченный WIP может транзиентно и уронить токен, и спасти · токен доказывает ссылочную свежесть, НЕ истинность фразы дока о цели · в ручном прогоне «дельта» = всё незакоммиченное кем угодно, поэтому ТРЕБОВАНИЕ токена живёт только под `--from-index`. **ОСТАТОК:** миграция корпуса на токен-форму органическая (требуется на затронутых строках), сегодня токенов 4 из ~580 якорей | оркестратор/доки | сделано 21.08, миграция органическая | исполнено; остаток гасится касаниями | аудит работы №18 + разбор с внешним ревьюером, 21.08 | +| 206 | **Канон 0.4.0 объявляет ручку, которой зона больше не отдаёт — ломающий минор 0.4.0 → 0.5.0** (контрактная половина `PD-370`, лендинг P8-FIX D39.154). `D39.144` отменил пер-термную подпись 16.08, зона сняла write-путь 22.08, а словарь канона его держит: путь `POST /books/{bookId}/bank/decisions`, глагол и три схемы — **~17 мест в `openapi.yaml` + ~8 в компаньоне**, поимённый разбор (6 мест прямой лжи, 3 самопротиворечия) в отчёте зоны. До правки деплой обслуживает на одну ручку меньше, чем объявляет — цена, названная заранее, а не найденная приёмкой. ⚠ Едет ОДНИМ минором со строкой 200 (сквозная полоса прогресса) и хвостами 203: три правки канона в одну перегенерацию фронта, а не три (D39.152 п.7) | оркестратор/контракт | скоро (следующим минором) | ратифицировано D39.154 п.8 | D39.154, `PD-370` | +| 207 | **Пол самосогласованности манифеста стоит только у материализатора, интейк тот же документ ПРИНИМАЕТ — и по такой книге можно ОПЛАТИТЬ прогон** (`PD-367`, вторая волна ревью P8-FIX). Манифест `{ChaptersTotal: 120, UnitsTotal: 400}` с пустым списком глав `Whole()` отвергает, а `books.Parse` заводит книгу `not_started` с `chapter_count=120` и пустым деревом; потолок считается ОТ `chapter_count`. **Очевидное лекарство опровергнуто исполнением самой зоной:** применить `Whole()` на интейке нельзя — вся батарея интейка ездит на манифестах без списка глав, контракт интейка это только счётчики. Значит решение не зонное: либо контракт интейка меняется, либо пол ставится в другом месте цепи | оркестратор → платформа | скоро | нужно решение (лекарство ломает запиненный контракт интейка) | D39.154 п.10, `PD-367` | | 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) | diff --git a/docs/architecture/05-decisions-index.md b/docs/architecture/05-decisions-index.md index 05ed4503..1ce8f64c 100644 --- a/docs/architecture/05-decisions-index.md +++ b/docs/architecture/05-decisions-index.md @@ -1,4 +1,4 @@ -# Реестр D-нот — карта актуальности v2 (D1–D39.153; строка 167; титул — носитель головы, бампать при каждом аппенде — испр. оркестратором №17 15.08 по аудиту: отставал на четыре ноты) +# Реестр D-нот — карта актуальности v2 (D1–D39.154; строка 167; титул — носитель головы, бампать при каждом аппенде — испр. оркестратором №17 15.08 по аудиту: отставал на четыре ноты) > Одна строка на КАЖДУЮ ноту журнала решений: № · дата · суть · статус · где тело · темы. Ведёт оркестратор при лендингах: новая нота = новая строка ТЕМ ЖЕ коммитом (полноту сторожит `docs/scripts/counts.py --check`). Суть и статус здесь — НАВИГАЦИЯ, не контракт: при конфликте побеждает ТЕЛО ноты (живой [`05-decisions-log.md`](05-decisions-log.md) → слайсы `../archive/architecture/05-decisions-*.md`). Несущие эрраты к фактам старых нот живут в шапке живого D-лога — их читать ОБЯЗАТЕЛЬНО, реестр их не дублирует. Темы (для грепа оси «какой закон по X»): деньги · шов · банк · промпт · судья · гейты · контракт · платформа · фронт · полигон · ToS · общность · процесс · нарезка · голос · инфра · модели. > Родословная: прозаическая карта D1–D39.28 (ревизии D31–D38.2) пересобрана в реестр докс-паком 167 (09.08.2026, №16): извлечение 6+6 агентов по worksheet `../archive/reports/DOC_AUDIT_INVENTORY_2026-08-09.md`, полнота сверена скриптом против заголовков всех шести файлов. «тело: жив» = живой D-лог; «слайс N» = `../archive/architecture/05-decisions-N.md`. @@ -206,3 +206,4 @@ | D39.151 | 17.08 | Владелец выбрал вариант А: маркер поколения отдельной колонкой на `checkpoints` НЕ строится, строка 195 закрыта как самостоятельная стройка и переселена осью (г) «идентичность оплаченной работы» в дизайн-пак 124 (гейт — его триггеры: 185/МАСШТАБ/внешний потребитель числа); внешний разбор опроверг две посылки оркестратора — колонка НЕ даёт тождества ($0-пере-пин законно несёт старую цену на новом снапшоте, бэкфилла нет ⇒ вывод остаётся навсегда) и «семья 49+124+195» слишком широка (49 = легальность переиспользования, 195 = честность учёта); настоящий корень — отсутствие связи «строка ↔ оплатившие её вызовы»; срочности нет под контрактом D39.150, остаток чинится без схемы строками 197/194 (194 миграции НЕ требует — RoleSpentUSD ключуется по роли) | ЖИВОЕ: ось (г) пака 124; строки 197/194 | жив | деньги владелец бэкенд | | D39.152 | 20.08 | Контракт API v0 **0.4.0 РАТИФИЦИРОВАН** (синк с платформой по её записке, 14 пунктов A–N; author≠ratifier соблюдён контрактной сессией; условие закрытия PD-327 наступило, САМА строка регистра ждёт правки зоной — пункт 10 фикс-листа); рубеж исполнен ревьюером другой модели (чтение обеих версий целиком, «ратифицировать с правками», корневой enum 16 значений не тронут); четыре текстовые правки внесены оркестратором при ратификации (сеттер `stop_requested` в `stopRun` · стухшая фраза компаньона §6в A против его же аддендума · «cleared by УСПЕШНЫЙ resume» · приписка третьего случая к таблице резюма); пункт G («сделано» = последний проход этого деплоя) ратифицирован как шаг-независимый — рамка снята владельцем 20.08 требованием, чтобы форма пайплайна не была видна клиенту; ⚠ клейм зоны «ломающая правка одна» верен для диффа ТИПОВ и неточен поведенчески — против 0.3.0 расходятся ЧЕТЫРЕ места; оговорка про пер-термные решения расширена с `decline` на всю ручку (временная, снимается строкой 199а); следующий минор (сквозная полоса, 200) не втиснут — пока фронт заморожен, миноры бесплатны | ЖИВОЕ: канон 0.4.0 | жив | контракт платформа фронт владелец | | D39.153 | 20.08 | Приёмка и лендинг P7 платформы (пять актов, читающая поверхность): **ПРИНЯТ С ФИКС-ЛИСТОМ**; шесть линз в изоляции + пере-раны и 8 собственных посадок оркестратора (поймано 7); батарея 18 пакетов EXIT=0 скипов 0, реестр 327/65 открытых без major, тестов 532 (не 533), семь удалённых имён имеют преемников; замер разворота 00016→00022 пере-выведен независимо (джойн 14.6 · счётчик 5.3 · без счётчика 2.9 мс) — разворот законен, но процент назван тремя носителями по-разному; НЕ поймана дыра: снятие `structure_version`/`revision` из `emitFrame` проходит всю батарею; ратифицированы долг-с-арендой на материализацию (§33/§34), `edit_wave` как монотонное свойство КНИГИ от объявления движка (§35), владелец клейма идемпотентности + тождество дайджестом, halt с аккаунта, счётчик замечаний на главе, демонтаж гейта полноты банка; новые строки 198–203; решения владельца — sqlc берём (+ разбор собранных запросов Postgres'ом, которого в предложении зоны не было), живой прогон ПОСЛЕ холодного, сквозная полоса прогресса; ⚠ эррата к D39.144 п.2 (пер-термная формула рождена в ДВИЖКЕ 19.07 как лечение ливлока, контрактная линия изобрела из неё ГЕЙТ 04.08); `ContractVersion` оркестратором НЕ правился — первый пункт зонного фикс-листа | ЖИВОЕ: фикс-лист в пинге №18 зонного журнала; строки 198–203 | жив | платформа приёмка контракт шов деньги | +| D39.154 | 22.08 | Приёмка и лендинг P8-FIX платформы (фикс-лист приёмки P7 + врезанный первым блокер свипа): **ПРИНЯТ**; `PD-169` — единственная строка регистра, солгавшая ДВУМ приёмкам, — закрыт четырьмя механизмами (разделение прохода на фазы · отсрочка с бэкоффом на выбравший бюджет прогон · порог `StalledAfter` с гейджем и `runs --stalled` · терминальный вердикт оператора `run abandon`), оба числа стали ручками и `RunBudget` присвоен впервые; вся цепь пере-проверена ЖИВОЙ пробой оркестратора (`FAILS 6` → гейдж 1 → `--stalled` с настоящей ошибкой движка), деньги двумя путями из сырого леджера сошлись до цента и холд вернулся целиком; батарея 18 пакетов EXIT=0, линтер 0 issues, тестов 561 против 532; ⚠ «скипов 0» НЕ воспроизведён — третий, неназванный гейт батареи (менеджер systemd), `PD-374`; одиннадцать собственных посадок мутаций, убито восемь, выжили три и различены руками: `StalledAfter` законно (носитель один), `maxAttempts` — `PD-373` (второй носитель прозой в рантбуке), `truncateReason` в `DeferRun` — `PD-372` (пин на функции, ни один из четырёх вызовов не проверен); находка вне карты `PD-371` (исключение «стоп перевешивает отсрочку» без границы, измерено живьём); ⚠ объявлена ОШИБКА харнесса приёмки — две посадки дали ложное «выжила» из-за не того пакета; спил пер-термной подписи банка принят, пол поверхности 15→14 сдвинут явно и гейт СРАБОТАЛ; `PD-370` уезжает открытым мажором (контрактная половина — ломающий минор 0.4.0→0.5.0); порядок паков вышел ОБРАТНЫМ очереди — названная цена перестановки НЕ заплачена, зато §4.7 релея пуст | ЖИВОЕ: `PD-370`/`PD-371`/`PD-372`/`PD-373`/`PD-374`; строка 199(а) ждёт ратификации; читающий пак не запускался | жив | платформа приёмка свип деньги мутации | diff --git a/docs/architecture/05-decisions-log.md b/docs/architecture/05-decisions-log.md index 8ee3d886..367cb7b4 100644 --- a/docs/architecture/05-decisions-log.md +++ b/docs/architecture/05-decisions-log.md @@ -1,4 +1,4 @@ -# Журнал решений оркестратора — контракт D1–D39.153 (живой файл: карта · эрраты · живые тела · голова D39.124+ (подрезка D39.139); тела закрытых эр — в слайсах `docs/archive/architecture/`, указатель ниже; реестр всех нот — `05-decisions-index.md`) +# Журнал решений оркестратора — контракт D1–D39.154 (живой файл: карта · эрраты · живые тела · голова D39.124+ (подрезка D39.139); тела закрытых эр — в слайсах `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+). @@ -580,3 +580,27 @@ **(з) Диагноз, который важнее списка.** Самодиагноз оркестратора («триаж глазами вместо машинной сверки») объясняет три находки из двадцати трёх и уводит от причины: остальные двадцать — это места, где рекомендация БЫЛА исполнена ровно один раз, и машинная сверка их бы не поймала. Настоящая форма: **стандарт держится в КОДЕ и обрушивается в ПРОЗЕ О ФАКТАХ** — единственной среде, где утверждение не опровергнет ни компилятор, ни тест, ни гейт. Все код-якоря оркестратора резолвятся, отказ править `ContractVersion` был верным, дыра `emitFrame` найдена им же — а рядом в прозе рождается «ручка появилась 13.08» со ссылкой на молчащую ноту. ⚠ И форма ЗАРАЗНА: линза-аудитор с чек-листом пометила два самых ложных клейма репозитория как ЗАКРЫТЫЕ, потому что проверила, что ПРАВКА СУЩЕСТВУЕТ, а не что КЛЕЙМ ИСТИНЕН. Отсюда норма, которую эта нота вносит: **«ревью исполнением» значит исполнить САМ КЛЕЙМ** — открыть цитируемую строку, пере-мерить число, дойти до первоисточника ссылки, — а не подтвердить, что редактирование приземлилось; и применять это к прозе о фактах ровно так же строго, как к коду. **10. Что НЕ проверено (obstacle приёмки).** Живого перевода через платформу не было НИ РАЗУ — всё после «прогон стартовал и остановился» покрыто батареей против живого Postgres, но с движком-заглушкой (строка 202). Четыре оси не смотрел никто и никогда: деньги и леджер целиком · вход/сессии/CSRF · очередь и джобы · метрики — пак их не менял, а все приёмки смотрели дифф; это отдельная работа, не довесок. PD-297 зона не взяла осознанно (мерить на корпусной книге). Сессия P7 ЗАКРЫТА владельцем 20.08; промт отработан → `platform/docs/archive/` с баннером-исходом. (20.08.2026, оркестратор №18) ✅ + +## D39.154 — ПРИЁМКА И ЛЕНДИНГ P8-FIX ПЛАТФОРМЫ (фикс-лист приёмки P7 + врезанный первым блокер свипа; лендинг `31f1f82`, токен якоря `ab3e22b`): **ПРИНЯТ**; блокер PD-169 закрыт четырьмя механизмами и вся его цепь пере-проверена живой пробой оркестратора; одиннадцать собственных посадок мутаций, четыре новые строки регистра; порядок паков вышел обратным очереди (22.08). ✅ + +**1. Что принято.** Пункты 1–7 и 9–13 фикс-листа (п. 8 — заказ читающего пака), врезанный первым блокер свипа, вторая волна ревью и спил пер-термной подписи банка. Батарея на моём стенде: 18 пакетов, exit 0, линтер «0 issues». Тестов **561** против 532 на HEAD — сверено исполнением, `git show HEAD:<файл>` по всем `_test.go` против дерева. Оба док-гейта зелёные. + +**2. Блокер PD-169 закрыт, и это единственная строка регистра, которая солгала ДВУМ приёмкам.** Она стояла `fixed(P5)`, а её пин гонял `Sweep` вообще без дедлайна прохода — по построению не мог увидеть проход. Живое свойство: проход 2 минуты против прогона 60 секунд, двух зависших прогонов хватало съесть проход, после чего `UnsettledRuns` — единственный ретрай отложенного расчёта — не звался ВООБЩЕ: для всей инсталляции, каждый проход, потому что `order by started_at` ставит заклиненный прогон в голову детерминированно. Лечение — не подъём константы: (1) проход разделён на фазы, реконсиляция берёт половину; (2) прогон, ВЫБРАВШИЙ бюджет или упавший, получает отсрочку с растущим бэкоффом и перестаёт держать голову; (3) после `StalledAfter` неудач — гейдж и `tmplatformctl runs --stalled`; (4) терминальный вердикт остаётся у ОПЕРАТОРА (`run abandon`). Оба числа стали ручками, `RunBudget` присвоен впервые за свою жизнь. + +**3. Цепь пере-проверена не по отчёту, а моей живой пробой.** Свой дев-демон на дереве пака, своя БД, настоящий `tmctl`. Отсрочка копит неудачи между проходами (`FAILS 6`), переходит порог → `tm_platform_runs_stalled 1` на проводе → `--stalled` называет прогон, счёт, что держит и НАСТОЯЩУЮ ошибку движка. **Деньги — двумя путями из сырого леджера:** до `run abandon --release-hold` кэш `account_balances` = 24910000 и `sum(credit_ledger)` = 24910000 при одном открытом холде 90000; после — 25000000 и 25000000, холдов 0, строки `grant · hold · hold_release`. Книга разморозилась: следующий прогон принят 202. Обе новые ручки печатаются на буте с источником — норма PD-114 держится. + +**4. Одиннадцать собственных посадок вне списка автора; выжили три, и различать их пришлось руками.** Убиты восемь: разделение фазы · «бюджет выбран = отказ» · очистка счёта тишиной · бэкофф · пропуск фазы расчёта · версия контракта · пол идентичностей манифеста · «стоп перевешивает отсрочку». **`StalledAfter` выжила ЗАКОННО** — носитель один, пин ездит на константе, второй экземпляр числа был бы лишним местом забыть. **`maxAttempts` выжила и это находка (`PD-373`)** — у неё есть второй носитель прозой в рантбуке («После пяти неудач»), и подъём константы делает рантбук лгущим молча. **`truncateReason` в `DeferRun` выжила и это находка (`PD-372`)** — пин ездит на самой функции, ни один из четырёх вызовов не проверен, а комментарий этой же функции называет цену: невалидный UTF-8 из stderr движка Postgres отвергает, отказ не считается, попытка держит голову вечно — то есть механизм отключается тем самым текстом, ради которого заведён. + +**5. Находка вне карты пака — `PD-371`.** Исключение «стоп перевешивает отсрочку» не имеет границы: прогон с запрошенным стопом выбирается КАЖДЫМ проходом независимо от `reconcile_after`. Видно живьём: `NEXT TRY` стоял на ~30 минут вперёд, а счётчик рос каждые 15 секунд — отсрочка не действовала ни разу. На дешёвой ошибке безвредно, на дорогой класс PD-169 внутри фазы возвращается, и запускает его ЛЮБОЙ пользователь кнопкой «остановить». Комментарий у `RunsToReconcile` называет цену НЕ-исключения и молчит о цене исключения. Не блокер: расчёт денег живёт во второй фазе, счётчик растёт, гейдж и `run abandon` работают. + +**6. Ошибка МОЕГО харнесса приёмки, объявленная вслух.** Две посадки дали ложное «выжила»: я гонял не тот пакет — мутация лежала в `internal/pgstore`, а пин в `internal/runs`. Пере-прогнано, обе убиты. Норма отсюда: **посадка мутации обязана называть пакет, где ищется пин, а не пакет, где лежит правка**; необъявленная ошибка харнесса приёмки — это находка, которой нет, и она опаснее пропущенной, потому что выглядит как результат. + +**7. «Скипов 0» не воспроизведён, и виноват не пак.** У меня три скипа: `systemdOrSkip` гейтит три теста `internal/runner` достижимостью пользовательского менеджера systemd, а на этом хосте `/run/user/1000` не существует. Отчёт зоны мерил на хосте с живым менеджером и честен. Незакрытым остаётся `PD-374`: рецепт объявляет у батареи ДВА гейта, а их три, и сама цель `check` над списком скипов печатает «set TM_PLATFORM_TEST_DSN» — отправляя читателя к ручке, которая тут ни при чём. + +**8. Спил пер-термной подписи банка принят, контрактная половина открыта.** D39.144 отменил модель 16.08, зона сняла write-путь 22.08 по слову владельца: маршрут, хендлер, wire-типы, метод интерфейса, `BankDecision`/`BankReceipt`, `UnknownTermError` и их пины. Пол размера поверхности 15 → 14 сдвинут ЯВНО и с причиной в комментарии — гейт СРАБОТАЛ и поймал спил, а не был подогнан; проверено, что 14 равно реальной длине таблицы, то есть запаса не оставлено. Три исчезнувших имени теста — тесты снятого кода, одно переписано на сохранившееся свойство. Пометка на месте write-пути честна: её клейм про `action NOT NULL` с чек-констрейнтом на отменённый глагол сверен по миграциям 00002 и 00016. **`PD-370` уезжает открытым мажором и это правильно:** канон 0.4.0 несёт путь, три схемы и глагол — правка канона это ломающий минор 0.4.0 → 0.5.0, работа контрактной сессии, и закрывать её в зоне было бы подгонкой под критерий приёмки. До неё деплой обслуживает на одну ручку меньше, чем объявляет — цена, названная заранее. + +**9. Порядок паков вышел ОБРАТНЫМ моей очереди, и последствия несимметричны.** Промт P8-FIX строкой 3 требует запуска «ПОСЛЕ пака P8-REVIEW»; запущен он был раньше. **В плюс:** цена, названная мной вслух при перестановке 21.08 — «блокер свипа живёт всё время читающего пака» — НЕ заплачена, блокер закрыт первым, и это лучший исход, чем планировала очередь. **В минус:** §4.7 (аддендум релеем) пуст и честно назван таковым в отчёте, а читающий пак пойдёт теперь по коду, который этот пак только что переписал. Ось 3 его промта зона пере-нацелила сама (константы переехали, якоря починены, правка ЧУЖОГО документа раскрыта прямо) — правку утверждаю: якоря умерли по вине пака, пак их починил и сказал об этом, вместо того чтобы обойти красный гейт. Остальные три оси не затронуты. + +**10. Что зона сдала вопросами, а не решениями, и это засчитано.** Строка 199(а): развилка владения `book.yaml` не решалась, сдана четырьмя вариантами с ценой — ждёт ратификации. `PD-367` (пол интейка односторонний: манифест с пустым списком глав материализатор отвергает, а интейк заводит книгу, по которой можно СТАРТОВАТЬ и ОПЛАТИТЬ прогон) — лекарство ломает запиненный контракт интейка, нужно решение. `PD-368` (когерентность пары бюджетов) · `PD-369` (`ClaimIdempotency` отдаёт 500 под конкуренцией, файл вне диффа пака). П-19 (sqlc) — отдельной сессией по слову владельца 22.08; вместо него построен гейт, который планирует КАЖДЫЙ собранный запрос против мигрированной схемы, и это лучше sqlc ровно там, где зону дважды укусило: sqlc видит только целиком-литеральный SQL, а оба рантайм-падения были в запросах, собранных из фрагментов. + +**11. Что НЕ проверено (obstacle приёмки).** Сквозного живого перевода по-прежнему не было — строка 202 гейчена холодным прогоном движка. `PD-297` зона не мерила осознанно (нужен корпусный текст). Четыре оси читающего пака по-прежнему не смотрел никто. Мою живую пробу я вёл на хосте без systemd-шины, поэтому путь «юнит поднялся и живёт» в ней не участвовал — он покрыт батареей там, где менеджер есть. (22.08.2026, оркестратор №18) ✅ diff --git a/platform/docs/PLATFORM_P8_REVIEW_SESSION_PROMPT.md b/platform/docs/PLATFORM_P8_REVIEW_SESSION_PROMPT.md index 9deda8e4..9e746dcf 100644 --- a/platform/docs/PLATFORM_P8_REVIEW_SESSION_PROMPT.md +++ b/platform/docs/PLATFORM_P8_REVIEW_SESSION_PROMPT.md @@ -2,6 +2,20 @@ > Выдан №18 21.08.2026 после лендинга P7 (D39.153). Запуск — по слову владельца. > ⚠ Это пак ЧТЕНИЯ. Кода он не меняет. Чинит найденное следующий пак — `PLATFORM_P8_FIX_SESSION_PROMPT.md`. +> +> ⚠ **ОБНОВЛЕНО 22.08 при лендинге P8-FIX (D39.154): порядок вышел ОБРАТНЫМ.** Этот промт писался в +> расчёте, что читающий пак идёт ПЕРВЫМ и отдаёт находки дофиксу релеем; на деле дофикс отработал и +> заленджен раньше (`31f1f82`). Что это меняет для тебя — три вещи, и ни одна не отменяет пак. +> **(1) Ось 3 читает уже ПЕРЕПИСАННЫЙ код:** блокер закрыт четырьмя механизмами (фазы прохода · +> отсрочка с бэкоффом · порог `StalledAfter` · `run abandon`), константы переехали в +> `internal/config`, появились `RunsToReconcile`/`DeferRun`/`ClearRunDeferral` и миграция 00025. +> Абзац про найденный блокер ниже оставлен как описание НАЙДЕННОГО — зона пере-нацелила его якоря и +> сказала об этом прямо. Ищи сиблингов класса, но теперь И в самом лечении: оно свежее, его смотрели +> ревьюеры зоны и приёмка, и у него уже есть четыре открытых строки — `PD-371`…`PD-374`. +> **(2) Оси 1, 2 и 4 (деньги и леджер · вход/сессии/CSRF · метрики) не тронуты вообще** — там пак +> по-прежнему первый взгляд, и он и есть главная ценность этого захода. +> **(3) §4.7 работает В ОБРАТНУЮ СТОРОНУ:** релея тебе ждать не от кого, твои находки поедут в +> СЛЕДУЮЩИЙ кодовый пак — тем же протоколом, через оркестратора, с эхо-подтверждением. ## 0. Зачем