diff --git a/platform/docs/PLATFORM_P8_REVIEW_SESSION_PROMPT.md b/platform/docs/PLATFORM_P8_REVIEW_SESSION_PROMPT.md index 5cd8b60b..06f9d54c 100644 --- a/platform/docs/PLATFORM_P8_REVIEW_SESSION_PROMPT.md +++ b/platform/docs/PLATFORM_P8_REVIEW_SESSION_PROMPT.md @@ -1,7 +1,7 @@ # Промт: платформа, пак P8-REVIEW — четыре оси, которых не смотрел НИКТО (read-only) > Выдан №18 21.08.2026 после лендинга P7 (D39.153). Запуск — по слову владельца. -> ⚠ Это пак ЧТЕНИЯ. Кода он не меняет. Чинит найденное следующий пак — `PLATFORM_P8_FIX_SESSION_PROMPT.md`. +> ⚠ Это пак ЧТЕНИЯ. Кода он не меняет. Найденное чинит СЛЕДУЮЩИЙ кодовый пак по промту оркестратора (пак P8-FIX уже отработан и заленден — `archive/PLATFORM_P8_FIX_SESSION_PROMPT_2026-08-21.md`). > > ⚠ **ОБНОВЛЕНО 22.08 при лендинге P8-FIX (D39.154): порядок вышел ОБРАТНЫМ.** Этот промт писался в > расчёте, что читающий пак идёт ПЕРВЫМ и отдаёт находки дофиксу релеем; на деле дофикс отработал и @@ -25,7 +25,7 @@ Платформа — control plane между веб-фронтом и движком перевода книг: пользователи, кредиты и холды, очередь, HTTP API, запуск движка процессами. Она построена и заленджена, батарея зелёная. -Но **четыре её оси не смотрел никто и никогда**: деньги и леджер целиком · вход, сессии и CSRF · очередь и джобы · метрики. Не потому, что они хороши, а по построению: каждая приёмка смотрела ДИФФ очередного пака, а эти оси ни в один дифф не входили. +Но **ни одна из четырёх её осей не получила СИСТЕМНОГО разбора**: деньги и леджер целиком · вход, сессии и CSRF · очередь и джобы · метрики. Не потому, что они хороши, а по построению: каждая приёмка смотрела ДИФФ очередного пака. ⚠ Формулировка «ни в один дифф не входили» — прежняя редакция, и она была слишком сильной (испр. 22.08): кусками они в диффы входили при постройке, и точечные находки по ним в регистре ЕСТЬ. Ищи не «первое касание», а то, чего пер-пакетный взгляд по построению не видит: свойства, живущие МЕЖДУ паками. 21.08 первый серьёзный взгляд на ОДНУ из них — очередь — дал жёсткий блокер выката: двух медленных прогонов достаточно, чтобы расчёт денег и допуск новых прогонов встали для всей инсталляции, и ручки, чтобы выйти, нет. Он прожил два пака, и **в регистре был помечен закрытым**. @@ -61,7 +61,7 @@ ### Ось 1 — ДЕНЬГИ И ЛЕДЖЕР ЦЕЛИКОМ (приоритетная) -Приор: здесь дефект стоит денег. ⚠ **Уточнение базовой линии:** «не смотрел никто» — про СИСТЕМНЫЙ разбор оси; точечно её трогали, и в регистре есть строки со ссылками на `credits.go` и на прежние денежные линзы. Смотри их как известное, не переоткрывай. ⚠ **И два денежных дефекта уже найдены, но в регистр ещё НЕ заведены** — пункты 12 и 13 фикс-листа в пинге №18: изоляция `inReadTx` без пина и оговорка `book_id <> $2` в `CreditHeldBy`, чей пин её ни разу не исполняет. Их не переоткрывай; ищи их класс. Предмет: резерв → расчёт → возврат холда · потолки (книжный и дневной) · арифметика микро-долларов и округления · `spend_baseline`/`SpendBound` · кэп расхода холдом · путь «расход провайдера случился, а строка в леджер не легла» · `adjust` и доля в `/usage`. +Приор: здесь дефект стоит денег. ⚠ **Уточнение базовой линии:** «не смотрел никто» — про СИСТЕМНЫЙ разбор оси; точечно её трогали, и в регистре есть строки со ссылками на `credits.go` и на прежние денежные линзы. Смотри их как известное, не переоткрывай. ⚠ **Два денежных дефекта, которые прежняя редакция этого промта звала «найденными, но не заведёнными», ЗАВЕДЕНЫ И ЗАКРЫТЫ паком P8-FIX 22.08** (испр. при лендинге): изоляция `inReadTx` — `PD-333`, оговорка `book_id <> $2` в `CreditHeldBy` — `PD-334`; у обоих пины, и оба пина проверены посадкой мутации. **Не переоткрывай их — ищи их КЛАСС**, и вот он сформулирован: «оговорка в комментарии или в SQL, которую ни один тест не исполняет». Тот же пак закрыл этот класс ещё в двух местах и оставил его открытым в третьем (`PD-372`: пин стоит на функции `truncateReason`, а ни один из четырёх её вызовов не проверен) — это живой образец того, что ты ищешь. Предмет: резерв → расчёт → возврат холда · потолки (книжный и дневной) · арифметика микро-долларов и округления · `spend_baseline`/`SpendBound` · кэп расхода холдом · путь «расход провайдера случился, а строка в леджер не легла» · `adjust` и доля в `/usage`. Отправные точки: `internal/pgstore/credits.go`, `internal/money/`, `internal/runs/reconcile.go` (`settle`, `restart`), миграции `00007_credits.sql`, `00019`. @@ -85,7 +85,7 @@ ### Ось 4 — МЕТРИКИ -Приор: самая дешёвая из четырёх, но у неё есть острый вопрос — **наблюдаемость без ручки**. Блокер оси 3 виден метрикой `tm_platform_sweep_unfinished_total`, и оператор увидит, что проход не дошёл, и не сможет сделать НИЧЕГО. Предмет: что вообще можно понять по метрикам в момент отказа · есть ли метрика, растущая молча · кардинальность лейблов · соответствие практикам именования, объявленным зоной (`STACK_DECISIONS` §24). +Приор: самая дешёвая из четырёх, и её острый вопрос **ПЕРЕВЕРНУЛСЯ после P8-FIX** (испр. при лендинге 22.08). Прежняя редакция звала его «наблюдаемость без ручки»: `tm_platform_sweep_unfinished_total` рос, а сделать оператор не мог ничего. Ручка построена — гейдж `tm_platform_runs_stalled`, `tmplatformctl runs --stalled`, терминальный `run abandon`. **Новый вопрос: ДОСТАТОЧНА ли она.** Видно ли по одной только `/metrics` до и после отказа, что прогон перешёл в `stalled`; различает ли оператор по гейджу и списку те случаи, где `run abandon` ОТКАЖЕТ (попытка ещё называет юнит или несёт базовую линию траты); и не появилась ли метрика, которая теперь растёт молча. Предмет: что вообще можно понять по метрикам в момент отказа · есть ли метрика, растущая молча · кардинальность лейблов · соответствие практикам именования, объявленным зоной (`STACK_DECISIONS` §24). Отправные точки: `internal/metrics/`, `cmd/tmplatformd/main.go`. @@ -99,7 +99,7 @@ - **Самопроверка ИСПОЛНЕНИЕМ — механизмом, а не перечтением.** Названный механизм: (а) **посадки мутаций** по норме зоны — портишь инвариант ровно так, как его называет комментарий или строка регистра, и смотришь, краснеет ли пин; непойманная мутация в несущем инварианте — находка, а не примечание; (б) прямые `SELECT` по стенду для денежных чисел; (в) **субагенты РАЗРЕШЕНЫ и рекомендуются** — четыре оси независимы и делятся между ними без потерь (иначе дефолт-запрет харнесса тихо победит). Артефакт самопроверки — таблица «**ось** → что посадил → какой пин обязан был упасть → упал ли». ⚠ **Пол — не меньше одной посадки НА КАЖДУЮ ось**: без него буква промта удовлетворяется одной посадкой на весь пак и четырьмя непрочитанными осями. - **Мутации — в КОПИИ дерева**, не в репозитории, и КАЖДОМУ агенту своя: `cp -a platform ~/tm-p8-review/<имя-агента>/platform`, путь выдаётся агенту ЯВНО в его задании — «работай в копии» без выданного пути есть приглашение к инциденту (D39.113). Каждому агенту — тот же запрет state-changing git ПЕРЕЧИСЛЕНИЕМ, что и тебе. В дереве живут незакоммиченные работы параллельных сессий; правка = их потеря (норма изоляции D39.113). -- **Батарея.** `make check` с ОБОИМИ гейтами (`TM_PLATFORM_TEST_DSN` + `TM_PLATFORM_TEST_ENGINE_BIN`/`_BOOK_TEMPLATE`), **скипов 0 — гейт**; без переменных батарея МОЛЧА скипует ~200 тестов, и её зелень тогда не значит ничего. Рецепт стенда — `STACK_DECISIONS`, раздел «Стенд разработчика». +- **Батарея.** `make check` с ТРЕМЯ условиями, а не двумя (испр. 22.08, `PD-374`): `TM_PLATFORM_TEST_DSN` · `TM_PLATFORM_TEST_ENGINE_BIN`+`_BOOK_TEMPLATE` · ДОСТИЖИМЫЙ пользовательский менеджер systemd (без него три теста `internal/runner` скипаются молча, и «скипов 0» на таком хосте недостижимо в принципе). **Скипов 0 — гейт**, а если условие на твоём хосте не выполнено — НАЗОВИ его вместе с числом скипов, не объявляй батарею зелёной; без переменных батарея МОЛЧА скипует ~200 тестов, и её зелень тогда не значит ничего. Рецепт стенда — `STACK_DECISIONS`, раздел «Стенд разработчика». - **Тесты и гейты не подгонять под зелень.** Правка или удаление теста ради прохода недопустимы; несогласие с тестом — вопрос через владельца, не правка. - **Заявление = команда.** Каждое число и каждая категорика отчёта — с командой, которой они получены; приёмка пере-ранит и сверит. **Перед отчётом сверь КАЖДЫЙ клейм с результатом инструмента ЭТОЙ сессии**, а не с памятью о том, что видел час назад — у пака, чей единственный продукт это утверждения, цена неверного клейма выше, чем у кода. - **Последний абзац отчёта — план или обещание? Сделай это сейчас**, а не пиши как намерение. diff --git a/platform/docs/PLATFORM_P8_FIX_SESSION_PROMPT.md b/platform/docs/archive/PLATFORM_P8_FIX_SESSION_PROMPT_2026-08-21.md similarity index 94% rename from platform/docs/PLATFORM_P8_FIX_SESSION_PROMPT.md rename to platform/docs/archive/PLATFORM_P8_FIX_SESSION_PROMPT_2026-08-21.md index 5a9f261c..582918c3 100644 --- a/platform/docs/PLATFORM_P8_FIX_SESSION_PROMPT.md +++ b/platform/docs/archive/PLATFORM_P8_FIX_SESSION_PROMPT_2026-08-21.md @@ -1,5 +1,21 @@ # Промт: платформа, пак P8-FIX — фикс-лист приёмки P7 + труба доставки правок банка +> ⚠⚠ **ОТРАБОТАН И ЗАКРЫТ. Инструкции отсюда НЕ исполнять** — файл сохранён как провенанс заказа. +> +> **Исход:** пак исполнен 21–22.08, ПРИНЯТ и ЗАЛЕНДЕН оркестратором №18 — ратификация **D39.154**, +> лендинг `31f1f82`. Отчёт пака — `platform-PROGRESS-P8.md` в этом же каталоге. +> +> ⚠ **Один пункт заказа исполнен не так, как он написан, и это правильно.** §4.2 подробно +> инструктирует по трубе доставки решений банка (строка 199а). За время пака владелец поправил +> посылку: пер-термной ПОДПИСИ нет и не было с 16.08 (D39.144), пер-термной осталась только ПРАВКА +> термина. Пак развилку не решал — сдал её вопросом, как §4.2 и требует, — а построенный ранее +> write-путь по слову владельца СНЯЛ (`PD-370`). Открытая половина живёт строкой **199(а)** единого +> бэклога (владение `book.yaml`, ждёт ратификации) и строкой **206** (контрактный минор 0.5.0). +> +> Живые вопросы зоны после пака — `../DEFECT_REGISTER.md`: `PD-367` · `PD-368` · `PD-369` · +> `PD-370`…`PD-374`. Следующий пак зоны — `../PLATFORM_P8_REVIEW_SESSION_PROMPT.md`. + + > Выдан №18 21.08.2026. **Запуск — по слову владельца и ПОСЛЕ пака P8-REVIEW**: его находки вливаются > в состав этого пака отдельным релеем (см. §4.7). Читающий пак — `PLATFORM_P8_REVIEW_SESSION_PROMPT.md`.