From 25b4db6ca80f50fb2b8d171f2522f827b7d2db3e Mon Sep 17 00:00:00 2001 From: heaven Date: Wed, 2 Sep 2026 23:31:08 +0300 Subject: [PATCH] Reconcile the two prompts on manifest deploy order and hand the platform the runbook line whose advice its own intake gate makes destructive --- docs/BACKEND_CONSENT_SESSION_PROMPT.md | 43 ++++++------ docs/PLATFORM_P13_SESSION_PROMPT.md | 97 ++++++++++++++------------ 2 files changed, 74 insertions(+), 66 deletions(-) diff --git a/docs/BACKEND_CONSENT_SESSION_PROMPT.md b/docs/BACKEND_CONSENT_SESSION_PROMPT.md index c0714792..bf1a8e93 100644 --- a/docs/BACKEND_CONSENT_SESSION_PROMPT.md +++ b/docs/BACKEND_CONSENT_SESSION_PROMPT.md @@ -1,11 +1,10 @@ # Промт сессии: БЭКЕНД — «число согласия на пути второй покупки» -> **Роль:** бэкенд. **Зона записи:** `backend/`. **Не коммитишь** — дерево готовишь и передаёшь на -> лендинг оркестратору. Чужие зоны (`platform/`, `frontend/`, `eval/`) читаешь, не правишь; в `docs/` -> пишешь ТОЛЬКО в секцию «Бэкенд» журнала `docs/PROGRESS.md` — это единственное разрешённое каноном -> исключение. Git: никаких `git add -A`/`git add .`/`git commit -a`, никаких `reset --hard`, `rebase`, -> `checkout` поверх грязного дерева — рядом идут параллельные сессии, и rewrite стирает их работу -> безвозвратно. Норматив стиля — `docs/architecture/12-go-style-notes.md`. +> **Роль:** бэкенд. **Зона записи:** `backend/`. Чужие зоны (`platform/`, `frontend/`, `eval/`) +> читаешь, не правишь; в `docs/` пишешь ТОЛЬКО в секцию «Бэкенд» журнала `docs/PROGRESS.md` — это +> единственное разрешённое каноном исключение. **Не коммитишь** и не трогаешь индекс и историю — +> полный список запретов и причина: `CLAUDE.md`, «Git-координация мультисессий». +> Норматив стиля — `docs/architecture/12-go-style-notes.md`. ## Какая проблема и что изменит твой результат @@ -61,9 +60,9 @@ Замер вреда из приёмки: **`$0.003640` против честных `$0.036400`** при `HistoricalRows=0` (`grep -on '\$0.003640 против честных \$0.036400' docs/archive/PROGRESS-2026-08-17.md` → `68:...`). -⚠ **Проверь исходное состояние САМ и не бери с моих слов.** Оркестратор однажды утверждал, что «шапка -`rebill.go` заявляет обратное ратифицированному», и **это не подтвердилось** — там речь про `$0`-строку. -Противоречащая шапка есть, но в `reprice.go` (см. выше). Формулируй по коду, который увидишь. +⚠ **Проверь исходное состояние САМ и не бери с моих слов.** Противоречащая ратификации шапка — в +`reprice.go` (см. выше); шапка `rebill.go` про это НЕ говорит, там речь про `$0`-строку. Формулируй +по коду, который увидишь. **«Решаешь сам и аргументируешь»:** форма хранения и проводки «модели, которую стадия резолвит сейчас» в числе согласия; конкретная формула округления вверх при незнании; точные слова оговорки и обеих @@ -224,8 +223,10 @@ go run ./cmd/tmmutate -root . -logs /tmp/mutlogs # сохранить пол `88`, `"tm-manifest-v2"`). Окна из двух версий НЕТ. Поэтому «платформа первой» так же смертельно, как «движок первым»: выкатив любую сторону в одиночку, ты отправляешь КАЖДУЮ новую книгу в отказ (`ReasonParserUnavailable`, который жжёт бюджет попыток). Бамп формы = **стоп-мир** либо специально - построенное временное окно двух версий. ⚠ Это исправление: прежняя редакция промта писала «форма - манифеста требует платформа первой» — носителя у этой фразы в корпусе НЕТ. + построенное временное окно двух версий. ⛔ **Рантбук зоны платформы советует обратное:** + `platform/deploy/README.md:213`=`сначала платформа, потом движок`. По коду этот совет опасен — + дефект чужой зоны, он передан платформенному паку; тебе он важен тем, что «платформа первой» НЕ + является безопасным обходом, если ты вдруг упрёшься в форму манифеста. - **Схема хранилища — «движок первым»**, и это документировано: движок первым → `tmctl migrate` по каждой книге до прогонов → и только потом платформа (D39.158 п.6, `grep -n 'движок первым' docs/architecture/05-decisions-log.md` → `715`). @@ -286,10 +287,10 @@ EXIT=0, `golangci-lint` `0 issues`). Зелёная батарея НИЧЕГО предпосылки, каждая из которых ломается (`sed -n '86,112p' backend/internal/pipeline/reprice.go`). Твоя правка ложится прямо на него. -⚠ **Править или удалять тест ради зелени — НЕДОПУСТИМО.** Правка, вызванная сменой поведения, которая -**заказана этим промтом или ратифицирована**, — обслуживание, и держать протухший тест не нужно; но она -**ОБЪЯВЛЯЕТСЯ в отчёте**: что изменилось в поведении, какой тест это описывал, куда уехала гарантия. -Заказанность решает ЗАКАЗ, а не ты: нет в этом промте и нет ратификации — **пинг** (D39.183). +⚠ Запрет подгонки тестов — `CLAUDE.md` (D39.183). Край, который тебе понадобится: **этот промт +заказывает смену поведения в пунктах 1 и 3** (обещание точности снимается, текст отказа меняется), и +протухший под неё тест правится как обслуживание — но правка ОБЪЯВЛЯЕТСЯ в отчёте: что изменилось, +какой тест это описывал, куда уехала гарантия. Нет в промте и нет ратификации — **пинг**. ⚠ Перед отчётом **сверь каждый клейм с результатом инструмента ЭТОЙ сессии**. Последний абзац — план или обещание? Сделай сейчас. @@ -319,11 +320,7 @@ EXIT=0, `golangci-lint` `0 issues`). Зелёная батарея НИЧЕГО ## Прямой канал -Механизм — `CLAUDE.md`, секция «Связь между сессиями». **Указатель: файл `/tmp/textmachine-channel`** — -впиши туда СВОЙ блок (`role=` `session=` `ref=` `written=` `note=`; имя — из `ListAgents`) первым делом, -дописывая в конец и не трогая чужие блоки. Эхо-записку (блок выше) отправь первым действием по адресу из -файла — это заодно и проверка канала. -⚠ Адрес из файла **не доказательство, что сессия жива**: файл переживает смерть сессии, а `ListAgents` — -нет. **Сверяйся с `ListAgents` перед тем, как писать.** -⚠ Нужной роли в файле нет, файла нет или имя не отвечает ⇒ **КАНАЛА НЕТ, и это НОРМАЛЬНЫЙ случай: НЕ -ищи, НЕ опрашивай сессии подряд.** Вопрос — секцией в отчёт; владелец прочитает и пере-передаст. +Механизм целиком — `CLAUDE.md`, «Связь между сессиями»: свой блок в `/tmp/textmachine-channel`, сверка +с `ListAgents` перед отправкой, канала нет — нормальный случай, сессии подряд не опрашивать. Что +добавляет этот пак: **эхо-записку отправь ПЕРВЫМ действием по адресу оркестратора** — это и есть +проверка канала. diff --git a/docs/PLATFORM_P13_SESSION_PROMPT.md b/docs/PLATFORM_P13_SESSION_PROMPT.md index e0f23c32..a6716c4c 100644 --- a/docs/PLATFORM_P13_SESSION_PROMPT.md +++ b/docs/PLATFORM_P13_SESSION_PROMPT.md @@ -1,10 +1,9 @@ # Промт сессии: ПЛАТФОРМА, пак P13 — «шов возврата оплаченного прогона» -> **Роль:** платформа. **Зона записи:** `platform/`. **Не коммитишь** — дерево готовишь и передаёшь -> на лендинг оркестратору (канон — `CLAUDE.md`, таблица ролей). Чужие зоны читаешь, не правишь. -> ⛔ Ни `git commit`, ни `add`, ни `reset`/`checkout`/`stash`/`clean` — ничего, что двигает индекс или -> историю: рядом работают параллельные сессии, и их незакоммиченные файлы твой индекс унесёт. -> **Обязателен к ссылке:** `platform/docs/ENGINEERING_STANDARDS.md`; отступление от него — пинг, не +> **Роль:** платформа. **Зона записи:** `platform/`. Чужие зоны читаешь, не правишь. **Не коммитишь** +> и вообще не трогаешь индекс и историю — почему именно, и полный список запретов: `CLAUDE.md`, +> «Git-координация мультисессий». +> **Обязателен к ссылке:** `platform/docs/ENGINEERING_STANDARDS.md`; отступление — пинг, не > самовольство. Направление зоны — `platform/docs/PLATFORM_DIRECTION.md`. ## Какая проблема и что изменит твой результат @@ -92,7 +91,7 @@ cd platform && awk -F'|' '/^\| PD-/{l=tolower($0); ⇒ **Каждая посадка мутации в твоём отчёте обязана нести строку «гонялось при DSN = да».** Иначе пак проверит себя ровно тем способом, каким заводились ряды, которые он чинит. -## Состав пака — четыре правки и один гейт +## Состав пака — четыре правки, гейт и одна строка рантбука ### 1. ГЛАВНОЕ — денежный бюджет прогона ЧИТАТЬ, а не пере-выводить из ставки @@ -282,6 +281,20 @@ cd platform && for M in any distinct; do printf "%s: " "$M"; awk -F'|' -v mode=" и не «чинить» подгонкой — это тот же запрет, что подгонка тестов; непонятно или кажется неправым → пинг. +### 6. МЕЛКОЕ, найденное при сборке промта: рантбук ТВОЕЙ зоны советует деструктивный порядок деплоя + +`platform/deploy/README.md:213`=`сначала платформа, потом движок` — «Правило то же, что у схемы +хранилища: сначала платформа, потом движок». По коду безопасного порядка у формы манифеста НЕТ: +гейт интейка — строгое равенство ОДНОЙ константе, окна двух версий нет (обе ссылки — в разделе +ПОРЯДОК ДЕПЛОЯ ниже). Платформа, выкаченная первой со знанием новой формы, отправит в +`parser_unavailable` КАЖДУЮ книгу ещё не обновлённого движка — ровно тот симптом, который абзац +рантбука строкой выше описывает как беду ОБРАТНОГО порядка. + +**Делай РОВНО так:** ряд в `docs/DEFECT_REGISTER.md` (класс `doc`) + правка строки рантбука. +**Решаешь сам и аргументируешь:** формулировка — назвать бамп формы стоп-миром или описать временное +окно двух версий как условие, при котором безопасный порядок вообще появляется. +⚠ Увидишь в коде окно версий, которого я не нашёл, — это находка, а не твоя ошибка: скажи и не чини. + ## Границы — что НАМЕРЕННО не берём - **`PD-412`/`PD-413` (LATERAL в полосном агрегате).** Находки настоящие и замеренные (1.359 мс → @@ -304,34 +317,40 @@ cd platform && for M in any distinct; do printf "%s: " "$M"; awk -F'|' -v mode=" ## ⚠ ПОРЯДОК ДЕПЛОЯ — почему пак безопасен параллельно бэкенду Зоны независимы по коду (разные модули, перекрёстных импортов нет в обе стороны, `go.work` в корне -отсутствует), но **НЕ по деплою**, и сцеплений ДВА с противоположным порядком: форма манифеста ⇒ -«сначала платформа, потом движок» (незнакомая форма → `parser_unavailable`); **схема хранилища -ДВИЖКА (v16)** и обход ⇒ «движок первым → `tmctl migrate` по каждой книге → и только потом платформа -снимает свой обход» (D39.158 п.6). +отсутствует), но **НЕ по деплою**, и сцеплений ДВА. + +- **Форма манифеста БЕЗОПАСНОГО ПОРЯДКА НЕ ИМЕЕТ.** Гейт интейка — строгое равенство ОДНОЙ константе + (`internal/ingest/manifest.go:112`=`if m.Version != KnownManifestVersion`; сама константа — `:88`=`KnownManifestVersion = "tm-manifest-v2"`). + Окна из двух версий нет, поэтому «платформа первой» ровно так же смертельно, как «движок первым»: + односторонняя выкатка отправляет КАЖДУЮ книгу в `parser_unavailable`, который жжёт бюджет попыток. + Бамп формы = стоп-мир либо специально построенное временное окно двух версий. +- **Схема хранилища ДВИЖКА** ⇒ «движок первым → `tmctl migrate` по каждой книге → и только потом + платформа снимает свой обход» (D39.158 п.6). Голова схемы сегодня 16 + (`backend/internal/store/migrate.go:485`=`func SchemaHead() int`, `len(migrations)`) — это персистентная + память ДВИЖКА, а не Postgres платформы. **Поэтому пак НЕ меняет: форму манифеста · схему хранилища ДВИЖКА · версию контракта.** Понадобилось -— **стоп и пинг**, не «сделаю аккуратно». - -⚠ Уточняю, потому что прежняя редакция этого места читалась двояко: «схема хранилища v16» — это -персистентная память ДВИЖКА (D39.158 п.1), а не Postgres платформы. Платформенная миграция этим -абзацем не запрещена — она не нужна по пункту 1 (сумма уже персистится) и по этой причине не -заказана. Понадобилась — тоже пинг, но по другому основанию. +— **стоп и пинг**, не «сделаю аккуратно». Платформенная миграция этим абзацем НЕ запрещена: по пункту 1 +она не нужна (сумма уже персистится) и потому не заказана; понадобилась — тоже пинг, но по другому +основанию. ## Свобода и её разметка **«Делай РОВНО так» (отступление = пинг):** - предусловие хоста (четыре условия) · строка «DSN = да» у каждой посадки; -- **ФАКТ каждой из пяти правок** — что именно закрывается: (1) `reopen` читает хранимую сумму в ОБОИХ +- **ФАКТ каждой из шести правок** — что именно закрывается: (1) `reopen` читает хранимую сумму в ОБОИХ местах, `:1363` и `:1397`, схему платформы не трогая; (2) ключ печатается на пути ошибки; (3) свойство «чужая строка не карантинит нашу проекцию» с тремя оговорками пункта 3 (декод остаётся выше · понижение только при известном `want` · при `want == ""` валидация полная); (4) цель `check` - печатает ВСЕ условия; (5) гейт против класса живёт в зоне платформы; + печатает ВСЕ условия; (5) гейт против класса живёт в зоне платформы; (6) ряд регистра и правка + строки рантбука; - **обязательные посадки у пунктов 2 и 3**; - границы выше · три запрета из порядка деплоя · запрет трогать `docs/scripts/counts.py`. **«Решаешь сам и аргументируешь» — ФОРМА и только она:** какую колонку холда читать и как быть без холда · форма печати ключа · форма ручки снятия карантина · форма печати условий в `Makefile` · -место, предикат и порог гейта пункта 5 · остальной состав посадок · порядок работ внутри пака. +место, предикат и порог гейта пункта 5 · формулировка правки рантбука в пункте 6 · остальной состав +посадок · порядок работ внутри пака. ⚠ Катч-олла «всё остальное — сам» больше нет: если чего-то нет ни в одном списке — это пинг, а не твоё усмотрение. @@ -340,14 +359,15 @@ cd platform && for M in any distinct; do printf "%s: " "$M"; awk -F'|' -v mode=" Батарея зелёная — это НЕ отчёт. Обязательны все три: -1. **Живая проба каждого из пяти пунктов состава.** Поимённо, с пометкой про DSN: +1. **Живая проба каждого пункта состава.** Поимённо, с пометкой про DSN: - п.1 `reopen` — **DSN нужен** (денежный путь `internal/runs`, 110 тестов тёмных без него); - п.2 `write()` — юнит-посадки идут **без DSN**, но сквозной `TestCommandsAgainstALiveDatabase` в `cmd/tmplatformctl/main_test.go` **DSN-гейчен** (без DSN в `./cmd/...` скипается 6 тестов); - п.3 `ingest/tail.go` — **DSN не нужен**, пакет гоняется целиком (0 скипов); - п.4 `Makefile` — DSN не нужен, но проба обязана гоняться при РАЗНЫХ окружениях, иначе она не видит того самого дефекта; - - п.5 гейт — DSN не нужен. + - п.5 гейт — DSN не нужен; + - п.6 рантбук — кода не касается, «проба» это ряд регистра и `counts.py --check` зелёным. 2. **Собственные адверсариальные посадки ВНЕ списка выше.** 3. **Отдельный проход по СВОЕЙ ГОТОВОЙ работе** свежим контекстом. ⚠ Класс, купленный прошлой сменой: веер по исходным уликам находит втрое меньше, чем веер, читающий готовый результат. @@ -385,10 +405,10 @@ a second hello to the same file and numbers from 1 again») и `backend/internal принимается ТОЛЬКО со списком того, что проверялось; голое «находок нет» означает, что веер не отработал — задание переформулируй и гоняй заново. -⚠ **Править или удалять тест/гейт ради зелени — НЕДОПУСТИМО.** Запрет про МОТИВ (D39.183): правка, -вызванная сменой поведения, которая ЗАКАЗАНА этим промтом, — обслуживание, и **держать протухший тест -не надо**; но она ОБЪЯВЛЯЕТСЯ в отчёте (что изменилось в поведении, какой тест это описывал, куда -уехала гарантия). Несогласие с тестом — **пинг**, не правка. +⚠ Запрет подгонки тестов и гейтов — `CLAUDE.md` (D39.183). Здесь важен один его край: заказанность +решает ЗАКАЗ, а не ты, и **этот промт заказывает смену поведения в пунктах 1–4** — протухший под неё +тест правится как обслуживание, но правка ОБЪЯВЛЯЕТСЯ в отчёте (что изменилось, какой тест это +описывал, куда уехала гарантия). ## Отчёт @@ -397,12 +417,11 @@ a second hello to the same file and numbers from 1 again») и `backend/internal Итог — туда же. ⛔ В `docs/PROGRESS.md` платформа НЕ пишет (канон, таблица ролей). **Каждое число и каждая категорика — с КОМАНДОЙ ПОЛУЧЕНИЯ, которая это число реально печатает.** -Приёмка пере-ранит. ⚠ Команда, печатающая «ok» вместо числа, командой получения не является — это -ровно та ошибка, на которой споткнулась прежняя редакция этого промта. +Приёмка пере-ранит. ⚠ Команда, печатающая «ok» вместо числа, командой +получения не является. -Обязательная секция **«Что НЕ удалось и что НЕ проверено»**: исходов ТРИ, и «не проверено» ≠ -«опровергнуто» ≠ «сделано». Третий исход законен и ожидаем — молчание об упёршемся пункте дороже -самого упора. +Обязательная секция **«Что НЕ удалось и что НЕ проверено»**: исходов ТРИ, третий законен, и молчание +об упёршемся пункте дороже самого упора. ## Канал вопросов и право отказаться @@ -415,16 +434,8 @@ a second hello to the same file and numbers from 1 again») и `backend/internal ## Прямой канал -Механизм — `CLAUDE.md`, секция «Связь между сессиями». **Впиши свой блок в `/tmp/textmachine-channel` -первым делом** (`role=` `session=` `ref=` `written=` `note=`; имя — из `ListAgents`), дописывая в -конец и не трогая чужие блоки. - -**Эхо-записку (скоуп · инварианты · не-делать, ≤10 строк) отправь ПЕРВЫМ действием по адресу -оркестратора из файла — это и есть проверка канала**; в зонный журнал она идёт тем же текстом. - -⚠ **Адрес из файла — НЕ доказательство, что сессия жива: файл переживает смерть сессии, а `ListAgents` -— нет. Перед отправкой сверься с `ListAgents`.** В файле прямо сейчас лежат блоки закрытых смен, один -с пометкой «⚠ СМЕНА СДАНА 31.08 … по адресу не писать». - -Нужной роли в файле нет, файла нет или имя не отвечает ⇒ **канала нет, и это НОРМАЛЬНЫЙ случай — НЕ -опрашивай сессии подряд**. Вопрос — секцией в отчёт; владелец прочитает и пере-передаст. +Механизм целиком — `CLAUDE.md`, «Связь между сессиями»: впиши свой блок в `/tmp/textmachine-channel`, +сверься с `ListAgents` перед отправкой, канала нет — это нормально и опрашивать сессии подряд не надо. +Что добавляет этот пак: **эхо-записку отправь ПЕРВЫМ действием по адресу оркестратора — это и есть +проверка канала**; и знай, что в файле прямо сейчас лежат блоки закрытых смен, один с пометкой +«⚠ СМЕНА СДАНА 31.08 … по адресу не писать».