From 24cccc34ab5837600ae9c4c4154df818b95a859a Mon Sep 17 00:00:00 2001 From: heaven Date: Thu, 17 Sep 2026 12:50:13 +0300 Subject: [PATCH] Add the platform pack prompt for a run that does not misreport itself, and register it in the prompt table and the queue issue log --- ...FORM_RUN_TELLS_THE_TRUTH_SESSION_PROMPT.md | 274 ++++++++++++++++++ docs/README.md | 1 + docs/orchestrator-norms-scratchpad.md | 2 + 3 files changed, 277 insertions(+) create mode 100644 docs/PLATFORM_RUN_TELLS_THE_TRUTH_SESSION_PROMPT.md diff --git a/docs/PLATFORM_RUN_TELLS_THE_TRUTH_SESSION_PROMPT.md b/docs/PLATFORM_RUN_TELLS_THE_TRUTH_SESSION_PROMPT.md new file mode 100644 index 00000000..e39a9e84 --- /dev/null +++ b/docs/PLATFORM_RUN_TELLS_THE_TRUTH_SESSION_PROMPT.md @@ -0,0 +1,274 @@ +# Платформенный пак: ПРОГОН НЕ ВРЁТ О СЕБЕ — ни оператору, ни покупателю, ни счёту + +> Выдача №15 очереди №23. Зона — `platform/`. Платных вызовов моделей пак НЕ делает: $0. +> ⚠ **Числа и адреса этого промта сняты мной по дереву 17.09. Те, на которых ты строишь решение, пере-снимай сама** — +> заимствованное число улики не заменяет. За сутки в моих же источниках адреса уезжали семь раз, а два вели в файлы, +> которых нет. + +## 1. Какая проблема и что решит твой результат + +Платформа сегодня рассказывает о прогоне три разные неправды, и каждая стоит денег или доверия. + +**Оператору:** прогон, который мы сами убили по своему же грейсу, не имеет терминального кадра — он падает в причину +отказа и читается как `service_error`. Человек видит поломку там, где сработала наша политика. + +**Покупателю:** когда проекция паркуется, оператор узнаёт об этом ЧЕТЫРЬМЯ способами — столбцом в базе, писателем, +выпиской и гейджем, — а платящий видит замерший экран без единого слова. Живая половина этого дефекта именно +пользовательская. + +**Счёту:** прогон, вышедший без маркера, перезапускается БЕЗ ВСЯКОГО ограничения — капа попыток у платформы нет. На +дочитанной книге движок выходит сразу и снова без маркера, и цикл повторяется каждым проходом свипа. Естественного +ограничителя в деньгах нет: перезапуск сперва рассчитывает старую попытку, потом берёт новый холд, а попытка ничего +не потратила ⇒ холд возвращается целиком и берётся заново. Тревога при этом молчит, потому что счётчик отсрочек +очищается «уликой» каждого рестарта и порог зависания недостижим. + +Твой результат: о прогоне нельзя узнать неправду — ни из экрана, ни из кадра, ни из суммы согласия. + +## 2. Зона записи и git + +Пишешь `platform/` и свой зонный журнал `platform/docs/platform-PROGRESS.md` (⚠ в `docs/PROGRESS.md` платформа НЕ +пишет — решение владельца). Трогаешь `platform/BACKLOG.md` и `platform/docs/DEFECT_REGISTER.md` как свои. +**Не коммитишь** — дерево передаёшь мне, лендинг мой. Движок (`backend/`) не правишь ни строкой. `.env` не читаешь. + +⛔ **КАНОН КОНТРАКТА — ОТДЕЛЬНАЯ ПРОЦЕДУРА, и без неё три пункта заказа повисают между зонами.** Пометка §4.2, слово +покупателю §4.4 и, возможно, видимость предела §4.1 приземляются в `docs/architecture/14-api-contract/` — каталог вне +твоей зоны. Порядок такой: **форма (что за поле, какие значения, кто читает) → пинг мне → ратификация → стройка**; +прецедент зоны — форма ратифицируется ДО кода. Пока ратификации нет, контракт-видимая половина останавливается на +предложении, и это законный исход пункта, а не недоделка. +⚠ `git stash` не используй: стек общий с другими рабочими копиями. Нужно отложить — временный коммит. + +## 3. Карта чтения — ЗАКОН, пять позиций + +1. `CLAUDE.md` в корне — канон проекта целиком. +2. `platform/internal/runs/reconcile.go` — **свип, исходы попытки, перезапуск, парковка.** 1932 строки, читать + целиком: весь пак живёт здесь и в соседях по пакету. +3. `platform/internal/jobs/jobs.go` — **очередь и её предел попыток.** Короткий файл; докблоки несущие. +4. `platform/docs/STACK_DECISIONS.md` — ловушки стенда и ЕДИНСТВЕННЫЙ носитель числа гейтов батареи (787 строк). + ⛔ Читать ДО первой команды: половина ловушек ниже взята оттуда, и там их больше. +5. `platform/docs/DEFECT_REGISTER.md` — твой реестр: форма строки, статусы, вес. Ряды пака в нём уже есть. + +⚠ Ряды единого трекера (`docs/BACKLOG.md`) — **394 · 396 · 398 · 399 · 400 · 416 · 486**. Их тексты несут замеры и +разбор; читай по номеру, а не целиком. + +## 4. Что построить + +### 4.1. Кап попыток прогона — ДЕЛАЙ; предмет уже стоит в твоём регистре, и пак его ПЕРЕ-ВЗВЕШИВАЕТ (ряд 398) + +Сегодня предела попыток У ПРОГОНА нет. Замер, который ряд предъявляет и который я пере-снял: `MaxAttempts` в +не-тестовом коде платформы — **7 хитов, все в очереди** (`platform/internal/jobs/jobs.go:57`=`MaxAttempts is 1 on purpose`, +значение на `:63`), и ни одного про попытки прогона. + +⇒ Построй предел, после которого платформа перестаёт перезапускать и говорит об этом. **Форма твоя**, но два условия +жёсткие: предел обязан быть виден оператору ДО того, как упрётся, и исчерпание не должно выглядеть как авария — +это наша политика, а не поломка (см. §4.2). + +⚠ **Предмет уже заведён у тебя: `PD-215`, вес `info`, с прописанным лечением** («счётчиком перезапусков на прогон или +бэк-оффом по времени последней попытки») и с оценкой «денег не теряется». ⇒ пак его ПЕРЕ-ВЗВЕШИВАЕТ, а не заводит +дубль: цена не в потраченном, а в том, что цикл бесконечен и тревога о нём молчит. Закрой или пере-взвесь ИМЕННО +`PD-215`, назвав, почему вес меняется. + +⛔ **И механизм я в первой редакции назвал неверно — поймал опровергатель.** Счётчик отсрочек не «очищается уликой»: +он живёт на ПОПЫТКЕ (`platform/internal/pgstore/runs.go:404`=`set reconcile_failures = reconcile_failures + 1`, очистка +`:443`), а рестарт открывает НОВУЮ строку попытки (`platform/internal/pgstore/runs.go:1568`=`next := attemptNo + 1`) — счётчик +стартует с нуля ПО ПОСТРОЕНИЮ, и гейдж зависания читает то же поле. ⇒ **кап, положенный на попытку, повторит дефект.** +Выражай его через номер попытки прогона, а не через счётчик внутри попытки. + +### 4.2. Убитый нашим грейсом — что от ряда 394 ОСТАЛОСЬ (⛔ половина уже вылечена) + +⛔ **ИСПР. перед выдачей: первая редакция этого блока заказывала ПОСТРОЕННОЕ, и поймал опровергатель, не я.** Я писал, +что наш грейс читается как `service_error`. Неверно с 11.09: в аварийную причину уходят РОВНО шесть значений +(`platform/internal/runs/reconcile.go:1180`=`"oom-kill", "core-dump", "watchdog"`), нашего таймаута среди них нет, и всё +прочее возвращается прерыванием (`platform/internal/runs/reconcile.go:1183`=`return "interrupted"`). Лечение +стерегут два пина — `platform/internal/runs/gracekill_test.go:21`=`func TestAKillByOurOwnGraceIsNotReportedAsABrokenDeployment` +и `:62`, — залендено коммитом `00d590e` и перечислено принятым в `D39.242`. **Ряд 394 протух: он от 10.09, лечение от 11.09.** + +**Что осталось:** у класса нет СВОЕЙ пометки — он отвечает `interrupted` вместе с «кончилось, и никто не описал чем». +Вреда «поломка вместо политики» больше нет, но и различить политику от чужого обрыва нельзя. + +⛔ **И цена этой пометки — не правка Go, а ратификация.** `RunFailureReason` — ЗАКРЫТЫЙ словарь в ТРЁХ носителях: +канон `docs/architecture/14-api-contract/openapi.yaml:1708`=`RunFailureReason:`, валидатор +`platform/internal/pgstore/sink.go:607`=`validFailureReason is the contract's RunFailureReason` и **констрейнт базы** +`platform/internal/pgstore/migrations/00016_read_surface.sql:58`=`check (failure_reason is null or failure_reason in` с тремя значениями. +⇒ четвёртое значение требует бампа канона И миграции. +⚠ **Ловушка, которой не было в первой редакции: этот словарь не стережёт НИ ОДИН гейт** — хитов в `platform/internal/gates/` +ноль при контроле 12 у соседнего словаря. Значит расхождение с каноном пройдёт `make check` ЗЕЛЁНЫМ (на этом хосте +тесты с базой скрыты) и упадёт в проде на констрейнте. ⇒ порядок обязателен: форма → пинг мне → ратификация → стройка. + +⚠ И вторая неточность прежней редакции: «при записанном намерении отдаёт `stopped`» верно только когда намерение +СТАРШЕ маркера; обратный случай запинен тем же файлом. + +### 4.3. Перезапуск без намерения — ПЕРЕ-РЕШИ ЯВНО, не наследуй (ряд 396) + +Платформа перезапускает прогон, вышедший с кодом остановки БЕЗ записанного намерения +(`platform/internal/runs/reconcile.go`, греп `interruptedBySomeoneElse`, 5 вхождений). Решение осознанное, с +записанным доводом — перезагрузка хоста против ручного `systemctl stop`, асимметрия цен, — поэтому **строка не о +дефекте**. + +⚠ Но инвариант `D39.240` обязан эту развилку пересмотреть ЯВНО: сегодня она означает, что прогон, остановленный мимо +продуктовой двери, будет поднят заново и продолжит тратить. ⇒ назови выбор своими словами, с ценой каждой стороны, +и запини выбранное. Отказ пере-решать — законный исход, если довод сильнее; молчаливое наследование — нет. + +### 4.4. Покупателю сказать, что происходит (ряд 399) + +⛔ **Половину этого ряда НЕ трогай — она построена, и первая редакция строки этого не знала.** Оператор видит парковку +ЧЕТЫРЬМЯ способами, и список берётся у ряда 399, а не у меня: столбец миграции `00034_spawn_proof_and_park.sql` · +писатель `platform/internal/pgstore/runs.go:1888`=`MarkParked records that this attempt` · **чтение на выписке** · +гейдж `platform/internal/metrics/metrics.go:109`=`parked_attempts`. Плюс операторский листинг и строка лога с +ограничителем частоты `platform/internal/runs/reconcile.go:944`=`func (s *Service) sayParked`. +⚠ Сайт вызова `platform/internal/runs/reconcile.go:532`=`s.Store.MarkParked(ctx, l.AttemptID` в этот счёт НЕ входит: +оператор его не видит, это адрес для чтения кода. + +**Живая половина — ПОЛЬЗОВАТЕЛЬСКАЯ, и только она:** платящий видит замерший экран без объяснения. Механизм — +курсор встречает чужой хендшейк и проекция останавливается до конца попытки +(`platform/internal/ingest/tail.go:36`=`another stream begins here`, обработка +`platform/internal/runs/reconcile.go:780`=`errors.Is(err, ingest.ErrForeignStreamAhead)`). + +⚠ И возьми у кода его собственную оговорку, она несущая: `platform/internal/runs/reconcile.go:791`=`may be this very run, alive and writing` +— «чужак» может оказаться этим же прогоном. ⇒ формулировка для покупателя не должна утверждать чужое вмешательство. + +### 4.5. Смерть между правкой банка и записью о ней (ряд 400) + +`platform/internal/runs/bank.go`, греп `RecordBankMove`: ветка ошибки стора обработана — клиент пере-шлёт, всё +сходится, — а смерть ПРОЦЕССА между применением правки и записью факта канала не имеет. Цену называет собственный +комментарий кода: отметка о движении банка остаётся пустой ⇒ следующий прогон допускается без пере-снапшота ⇒ +умирает на снапшот-гарде уже ПОСЛЕ взятого холда. + +Это тоже `D39.240`: «не оставить мусор» и «правильно возобновить» — ровно оно. + +### 4.6. Согласие соразмерно пере-покупаемому (ряд 416) + +Замер: на резюме после банк-стопа согласие выставляется на **весь бюджет прогона**, тогда как фактически +пере-куплено на **78× меньше**. От пере-покупки спасли чекпойнты, а не потолок согласия: промахнись хеши промптов — +и черновая волна была бы куплена заново под уже подписанным согласием. + +⛔ **Но заказ СУЖЕН, и вот почему — находка опровергателя, проверенная мной.** Величины, которой можно ограничить +согласие, у платформы в точке решения НЕТ по построению, и код это уже записал: +`platform/internal/runs/reconcile.go:1600`=`a projection to cap against does not exist here` со ссылкой на эрратy 28.08-к. +Посчитать проекцию умеет только движок, а его ты не правишь. Вдобавок стор расширяет согласие ТОЛЬКО вверх +(`platform/internal/pgstore/runs.go:1605`=`accept_rebill_micro = greatest(r.accept_rebill_micro`, довод на `:1483`=`Widening only`) ⇒ +меньшее число на втором резюме молча не применится. И ряд **416** размечен `платформа+бэкенд`. + +⇒ **Твоя половина — ПРОВЕНАНС и видимость, а не величина:** человек должен видеть, ЧТО именно он подписывает и откуда +взялась сумма, а молчаливое расширение не должно съедать пере-решение. Движковую половину (проекция пере-покупки) +назови отдельной строкой в отчёте как заказ следующему паку — строить её здесь нельзя. +⚠ И знай контекст, иначе решишь не тот вопрос: у движка УЖЕ есть ратифицированный порог согласия; вопрос не «есть ли +потолок», а почему бланкетное согласие платформы его отменяет. + +### 4.7. Довесок, который чинит доверие ко всем твоим числам (ряд 486) + +Мутационный харнесс зоны засчитывает поимкой ЛЮБОЕ красное и не требует зелёного базового прогона пакета до первой +посадки. ⇒ пакет, красный по своей причине, отчитается каждой посадкой как о поимке, и «посадок N, поймано M» +становится утверждением о другом предмете. + +Два пункта: зелёный базовый прогон как условие, и падение ИМЕННО названного пина как условие засчёта. Десяток строк, +но без них числа твоей же приёмки недоказательны. + +### 4.8. Стандарт работы — слово владельца, ратифицировано `D39.258` п.3 + +Чистый код, рефакторинг там, где он нужен, никаких заплаток, техдолга не копить. Мерило проекта — **качество +художественного перевода длинной книги**; механизм строится там, где несёт качество или деньги. + +## 5. Самопроверка ИСПОЛНЕНИЕМ + +Гейт зоны — **`make check` из `platform/`** (`build vet fmt lint sqlc-check` + `go test ./... -race -count=1`), 20 пакетов. +Самопроверкой он **не является**. Сверх него — адверсариальный проход по своей готовой работе; субагентов поднимать +разрешаю явно. Направление даю я — четыре места, где этот пак мягок: + +1. **Кап попыток** (§4.1) — посадка, снимающая предел, обязана краснеть ИМЕННО пином предела, а не соседним тестом. +2. **Пометка нашего грейса** (§4.2) — проверь, что она доезжает до человека, а не только до базы: «поле заполнено» и + «оператор это видит» — разные утверждения. +3. **Слово покупателю** (§4.4) — фикстура, где «чужак» есть ЭТОТ ЖЕ прогон. Если формулировка врёт на ней, она врёт. +4. **Согласие** (§4.6) — пин на величину, а не на факт наличия согласия. + +⛔ **ЧЕТЫРЕ ЛОВУШКИ ГЕЙТА, каждая даёт ложную зелень; все из носителя зоны, и там их больше:** +- **Вердикт читается строкой `MAKE_EXIT` из лога, а не уведомлением харнесса.** Замер зоны 17.09: первый прогон дал + `MAKE_EXIT=2`, потому что `sqlc` лежал вне `PATH`, — а уведомление сказало «exit code 0». +- **Пины инструментов:** `golangci-lint` ровно **2.12.2**, `sqlc` ровно **v1.31.1**, Go **≥1.26.6**. `tools-check` стоит + первым и убивает прогон до единого теста. ⚠ **Лечение, а не только ловушка:** на этом хосте линтер и Go пину + удовлетворяют, а `sqlc` нужной версии установлен, но НЕ на `PATH` — `export PATH=$PATH:$(go env GOPATH)/bin` перед + `make check`, иначе получишь тот самый `MAKE_EXIT=2` при «успешном» уведомлении. +- ⛔ **«Ноль FAIL» из прежних отчётов СНЯТО самим носителем зоны:** с поднятыми гейтами замер 11.09 его опроверг, и + `STACK_DECISIONS.md` предупреждает — следующая сессия, прочитав «0 FAIL», получит красное и решит, что сломала сама. + Красное на входе не обязательно твоё: сперва развернись на чистом `HEAD` и сравни. ⚠ И условий, дающих скипы, ШЕСТЬ, + а не четыре: сверх четырёх гейтов — отсутствующий артефакт контраста движка и занятый локальный порт, причём один + тест умеет скипнуться двумя условиями сразу, поэтому считать их по одному прогону нельзя. +- ⛔ **Без строки подключения к базе батарея МОЛЧА прячет около трёхсот тестов и остаётся зелёной.** Гейтов батареи + **четыре**, и единственный их носитель — `platform/docs/STACK_DECISIONS.md`, не этот промт. `make conditions` + печатает условия хоста; на этой машине все шесть переменных сейчас не заданы. +- **Движковый бинарь второго гейта пересобирается из текущего `backend/`**, не берётся со стенда: стендовый `tmctl` + давал три красных теста платформы с текстом про движковый реестр моделей — падала платформа, лгал бинарь движка. + +⚠ **Полнота сверяется СПИСКОМ:** `comm -23` списка `go list ./...` против вердиктов лога обязан быть пуст, и контроль +перевёрнутого сравнения тоже печатается. «Нет слова FAIL» полнотой не является. + +⛔ **И про стенд, чтобы ты не потеряла час:** отчёт прошлой сессии зоны обещает копии `tm-mut-94-1709` и +`tm-head-94-1709` «оставленными для приёмки» — **этих каталогов на машине НЕТ** (проверено). Уцелел только Postgres +стенда: сокет на месте, порт 55433, поднят с пустым `listen_addresses`. ⚠ **TCP-проба даёт `Connection refused` на +ЖИВОМ сервере** — живость спрашивай тем же DSN, которым читают тесты. ⚠ Демон гаси только по PID: шаблон по пути +совпадает с собственной командной строкой оболочки и убивает вызвавшего. + +## 6. Оси ревью + +Две-три, можешь заменить с аргументом: **денежная** (ни один путь не берёт холд, который некому вернуть) · +**правда о состоянии** (то, что видит человек, совпадает с тем, что случилось) · **возобновление без мусора** +(`D39.240`: остановка отличима от аварии, возобновление корректно). + +## 7. Записка-план + +До первой правки кода — короткая записка в свой зонный журнал: какие из **семи** предметов берёшь, от каких +отказываешься и почему, где проводишь границу класса «наша политика» против «авария», и что решила по развилке §4.3. +⚠ Сбрасываемыми без вреда для пака я считаю два: **416** (сужен до провенанса) и **486** (довесок-инструмент); +остальные пять несут предмет. Решишь иначе — назови довод. + +## 8. Заявление = команда + +Любое число и любая категорика отчёта идут **с командой, которой они получены**. «Батарея зелёная», «мутации +пойманы», «скипов столько-то» без команды — утверждение О проверке, а не проверка. ⚠ Рядом с любым НУЛЁМ печатай +контрольную величину: «ноль строк» и «нет такой таблицы» в выводе неразличимы. + +## 9. Эхо-протокол старта + +**Первым действием** — десять строк **своими словами**: скоуп, инварианты, чего не делаешь. Дословный пересказ +промта подтверждает канал, но не понимание. + +## 10. Что не удалось — и где прибор слеп + +Секция «не удалось / не проверено» обязательна. ⚠ И вторая половина: **«где мой прибор слеп и я это знаю»** — что +невидимо, почему не чинила, чем закрывается. Норма зоны: **в коде названо, в отчёте нет — значит для следующей смены +не названо.** + +## 11. Канал вопросов, право отказа, советчик + +Конфликт промта с кодом — **пинг**, не интерпретация: промт мог устареть между написанием и чтением. Право сказать +«этого делать не надо» с аргументом у тебя есть, и §4.3 я жду скорее пере-решённым с доводом, чем построенным. + +Тебе разрешён **один** старший советчик (`model: "fable"` явно) на развилку, которую не закрывает своё суждение; +досылай вопросы ему, а не поднимай новых. Он советчик, не источник истины: его посылки проверяются деревом — мой +собственный советчик по соседнему паку дал девять замечаний, и часть не подтвердилась. + +## 12. Прямой канал + +Механизм — `CLAUDE.md` §«Связь между сессиями»; здесь не повторяется, но **исполняется первым делом**: впиши свой +блок в `/tmp/textmachine-channel` (роль · имя из `ListAgents` · ссылка на ЭТОТ файл · дата · что делаешь и чего не +трогаешь), дописывая в конец и не трогая чужие блоки. Адрес оркестратора бери оттуда же, туда же шли эхо из блока 9. + +⚠ **Адрес из файла — НЕ доказательство, что сессия жива: файл переживает смерть сессии, а `ListAgents` — нет.** +⚠ **Нужной роли в файле нет, файла нет или имя не отвечает ⇒ КАНАЛА НЕТ, и это НОРМАЛЬНЫЙ случай: НЕ опрашивай +сессии подряд.** Вопрос — секцией в свой отчёт, работа продолжается. + +## 13. Критерий завершённости — проверяемый + +- у **каждого** пункта заказа исход: сделано · не делаю с доводом · пинг; +- круги **сошлись**: последний не дал новых находок, прежние закрыты таблицей «находка → что сделано → **чем + предъявлено**»; +- таблица мутаций полная, выжившие названы поимённо, и харнесс §4.7 уже чинит её смысл; +- числа сняты **после последней правки**, у каждого команда повторения; всё живое — **в дереве**; +- гейт зоны зелёный **целиком** (сверка списком целей, а не отсутствием слова FAIL), `MAKE_EXIT` предъявлен строкой; +- сказано явно: **«работа завершена, править не планирую»**. + +## Приложение. Ряды и контракт + +Строит: **398** · **394** · **396** · **399** · **400** · **416** · **486**. Условия работы: контракт зоны сейчас +**0.16.0**, и его стережёт независимый гейт, читающий САМ канон, а не копию числа — если твоя работа контракта не +касается, версию не трогай вовсе. ⚠ Ряд **397** (пять рядов реестра про холды — один предмет) в пак НЕ входит, но +соседствует: если твоя правка его задевает, назови это, а не чини молча. diff --git a/docs/README.md b/docs/README.md index 35ca5f75..242bf20b 100644 --- a/docs/README.md +++ b/docs/README.md @@ -24,6 +24,7 @@ - **Активные хендофф-промты — какой файл ТВОЙ** (состав обновляется при каждом лендинге, D39.80; хроника, причины и статусы РАБОТ — CURRENT-STATE и D-лог): | Роль | Активный промт | Статус | |---|---|---| + | **Платформа · ПРОГОН НЕ ВРЁТ О СЕБЕ** | [PLATFORM_RUN_TELLS_THE_TRUTH_SESSION_PROMPT.md](PLATFORM_RUN_TELLS_THE_TRUTH_SESSION_PROMPT.md) | **ВЫДАН 17.09** сессии `textmachine-main-78` (свежая: паков не брала, контекст сберегался нарочно). Ряды **398** · **394** · **396** · **399** · **400** · **416** · **486**: у перезапуска нет предела и нет ограничителя в деньгах — холд возвращается и берётся заново, тревога молчит, потому что рестарт открывает новую строку попытки; платящий видит замерший экран, тогда как оператор знает о парковке четырьмя способами; смерть между правкой банка и записью о ней даёт следующему прогону взятый холд и смерть на гарде; согласие подписывается на сумму в 78 раз больше реальной. Два рубежа пройдены: механическая сверка 13 блоков (18 якорей, все живы) и субагент-опровергатель — **10 находок, 4 денежные, все внесены**, включая мою: §4.2 заказывал ПОСТРОЕННОЕ (наш грейс перестал читаться аварией 11.09, два пина, коммит `00d590e`). $0 | | **Бэкенд · РЕШЁННОЕ НЕ ПЕРЕ-СПРАШИВАЕТСЯ** | [BACKEND_SETTLED_STAYS_SETTLED_SESSION_PROMPT.md](BACKEND_SETTLED_STAYS_SETTLED_SESSION_PROMPT.md) | **ВЫДАН 17.09** сессии `textmachine-main-57` (свежая: паков не брала, контекст пуст — проверено опросом, а не списком). ⚠ Свежих нашлось ДВЕ; вторая (`textmachine-main-78`) оставлена нетронутой, ей сказано не читать промт и не занимать зону — один промт на зону. Предмет: движок на каждой покупке заново платит банк-ролям за решённые термины — 12 из 69 и 14 из 66 смен передачи при неизменной улике у 25 из 26 строк; потолки ролей ПОЖИЗНЕННЫЕ. Строит базис решённого (ряд **130**) и стража разрыва окон (ряд **490**). Два рубежа пройдены: механическая сверка 13 блоков (27 якорей, все живы) и субагент-опровергатель — **12 находок, 9 денежных, все внесены**, включая мою ложь «текста в коде нет» о живой строке и материал замера, из которого предмет не строился. $0 | | **Бэкенд · БАНК ЗА $0** | активного НЕТ | пак ОТРАБОТАН и **ПРИНЯТ 16.09 С НАЗВАННЫМ ОСТАТКОМ** — акт **`D39.257`**; промт в [archive/prompts/](archive/prompts/BACKEND_BANK_ZERO_LAYER_SESSION_PROMPT.md) с баннером-исходом. 29 путей, $0. ⭐ Посылка `D39.256` перестала быть посылкой: 25 из 26 смен при идентичном входе. ⛔ Мажоры — сдвинутые якоря (ряд 467) и арм по чужому знаменателю (ряд 462). ⚠ Остаток: полный прогон каталога мутаций (267) на момент акта не закончен. **Слот бэкенда СВОБОДЕН** | | **Бэкенд · КУПЛЕНО — ЗНАЧИТ ДОСТАВЛЕНО** | активного НЕТ | пак ОТРАБОТАН и **ПРИНЯТ 16.09 С НАЗВАННЫМ ОСТАТКОМ** — акт **`D39.255`**; промт в [archive/prompts/](archive/prompts/BACKEND_BOUGHT_MEANS_DELIVERED_SESSION_PROMPT.md) с баннером-исходом. Лендинг `af88680`, 29 путей, $0. Закрыты строки **291** и **379** (вторая — ЗАМЕРОМ: мутант 8/8 против 7/8 в ряду). ⛔ Пак пережил ПОТЕРЮ сессии: `textmachine-b1` построила почти всё и исчезла при переезде окружения, доводила `textmachine-main-b1` разделом ПЕРЕДАЧИ ред. 5. ⚠ Остаток — строки **375** · **232** · **453**–**456**; три опубликованных ключа качества сменили смысл (п.5 акта). **Слот бэкенда СВОБОДЕН** | diff --git a/docs/orchestrator-norms-scratchpad.md b/docs/orchestrator-norms-scratchpad.md index bf8aefa0..9e77f373 100644 --- a/docs/orchestrator-norms-scratchpad.md +++ b/docs/orchestrator-norms-scratchpad.md @@ -111,6 +111,8 @@ UNKNOWN 1 — её, дошёл один раз до правок; десять | 14 | бэкенд | РЕШЁННОЕ НЕ ПЕРЕ-СПРАШИВАЕТСЯ: базис решённого как ИСТОЧНИК ОТВЕТОВ (ряд 130) + страж разрыва окон (ряд 490) | textmachine-main-57 | ✅ **своими словами, десять пунктов, механика а не текст** — и ДО начала работы названы два кандидата на отказ с замером (ряд 447 как смена продуктового поведения · сторож растущей книги, чья посылка вынесена владельцу и ответа не имеет). Ошибок понимания в эхо нет: воспроизведены порядок блоков, инвариант «базис — ИСТОЧНИК ответа, не фильтр», один писатель на двух границах, инвариантность отпечатка к способу отбора при пар-данной ширине, обязательность статуса `draft` и развилка юнитов. ⛔ **РЕЛЕЙ 17.09, через считанные минуты после выдачи: база прогона A в промте была названа НЕ ТА, и сессия уже строила прибор.** Я вписал `evidence/v16-readonly/project.db` — замер: `book_id` `guzhenren-coldrun-v16`, глоссарий 53, Σ`cost_usd` 0.43611; платный A — `stand/books/bk_ROEHZBD46ALFI43E/project.db`, глоссарий **69** (число всех банковых замеров), Σ **0.419423**, сходится с ратифицированной суммой. Нашёл советчик, пере-снял я. Той же правкой доехали три ловушки материала: все `book.yaml` прогонов ссылаются на несуществующий `/home/ubuntu-26/…` (загрузка либо падает, либо ТИХО берёт конфиги головы) · вход контура `mining-contrast.zh.txt` в git отсутствует вовсе и живёт только в зеркалах прогонов · базы в WAL-режиме, копировать с `-wal`/`-shm`. ⚠ Урок мой: **материал замера я назвал по имени каталога, а не по замеру содержимого** — «evidence» и «readonly» звучали как платная улика, и этого хватило, чтобы не открыть базу. Заказ, отправляющий мерить не тот предмет, дороже битого якоря: якорь виден линтеру, неверная база — никому. ⏳ **ДОЛГ НА ЛЕНДИНГ ЭТОГО ПАКА, записан чтобы не растворился:** правка зоны в `backend/internal/lang/langpack.go` сдвинула файл на 12 строк, и ДВА моих якоря транзиентно красны — `docs/BACKEND_SETTLED_STAYS_SETTLED_SESSION_PROMPT.md` → `langpack.go:744`=`kwic_per_term` (живёт на `:756`) и `docs/BACKLOG.md:277`=`manifest declares no channel` (ряд 347) → та же цель `langpack.go:632`, живущая теперь на `:644`. Замер, различающий транзиент от долга: оба токена ЦЕЛЫ в срезе `HEAD` на прежних строках и мертвы только в дереве ⇒ это чужой незакоммиченный WIP в цели, о котором прибор предупреждает сам, а не моя гниль. ⛔ Чинить ДО лендинга нельзя — цель движется, и пере-нацеливание сломается при следующей её правке или при откате. ⚠ Но у второго якоря есть и НЕ транзиентная половина: путь написан не от корня (`lang/langpack.go`), и это дефект формы, переживший сегодняшнюю чистку, потому что мой шаблон искал только полные пути. ⇒ после лендинга ОДНОЙ правкой: развернуть путь и пере-нацелить оба якоря по найденным, а не вычисленным адресам | ⏳ **ВЫДАН 17.09** после опроса кандидатов (свежих нашлось ДВЕ — `57` и `78`; взята `57`, второй сказано не занимать зону). Оба рубежа пройдены: механическая сверка 13 блоков (27 якорей, все живы, токен по адресу, коротких нет) и субагент-опровергатель — **12 находок, 9 денежных, все внесены**. ⭐ Чем окупился опровергатель: (1) я вписал «текста в коде УЖЕ НЕТ, 0 совпадений» о строке, которая ЖИВА ДОСЛОВНО, — грепал по одному файлу, увидел начало длинной строки, обрезанной по ширине, и прочёл обрезок как ФАКТ; у неё вдобавок третий носитель, голден операторских сообщений, которого я не видел вовсе; (2) замер M1 был заказан на копиях купленных баз, а таблицы чанков в них НЕТ (17 и 16 таблиц) — предмет из них не строится, нужен исходник отдельным файлом; (3) порядок записи на границе стопа задаёт САМ КОД («последним пишется то, чья потеря дешевле»), и по нему базис идёт ПЕРЕД памятью флажка, а не пятым, как велел консилиум; (4) ширину отпечатка я заказал константой Go — это утечка пары в общий слой, закрытая `D39.50`, причём на денежном предикате. ⛔ **И урок абзацем ниже — про эту самую выдачу: приоритет пака у владельца я НЕ подтверждал.** Слот бэкенда свободен, но «слот свободен ≠ работу зоны надо заказывать»; поэтому промт лежит файлом, исполнитель не назначен, и решение о выдаче — за владельцем. ⚠ В самой выдаче, когда она состоится, повторить норму строки 13: ВЕРНУТЬ заказ, если сессия не свежая | +| 15 | платформа | ПРОГОН НЕ ВРЁТ О СЕБЕ — ни оператору, ни покупателю, ни счёту: ряды 398 · 394 · 396 · 399 · 400 · 416 · 486 | textmachine-main-78 | ⏳ ждём эхо | ⏳ **ВЫДАН 17.09.** Собран ВЕЕРОМ из четырёх срезов за один заход — против девяти последовательных кругов, которыми я собирал предыдущий пак; это и есть разница в способе работы, а не во времени. Оба рубежа пройдены: механическая сверка 13 блоков (18 якорей с токеном, промахов 0, голых адресов 0) и опровергатель — **10 находок, 4 денежные, все внесены**. ⛔ **Самая дорогая — против меня: §4.2 заказывал ПОСТРОЕННОЕ.** Я написал, что наш собственный грейс читается как авария; вылечено 11.09 (`platform/internal/runs/reconcile.go:1183`=`return "interrupted"`, два пина в `gracekill_test.go`, коммит `00d590e`, принято `D39.242`), а ряд 394 протух и я поверил ряду вместо дерева. ⚠ Ещё три денежные: предмет капа уже стоит в регистре зоны весом `info` с прописанным лечением, а я назвал его «самым денежным» · механизм счётчика описал неверно (он живёт на ПОПЫТКЕ, а рестарт открывает новую строку, поэтому кап на попытку повторил бы дефект) · согласие нельзя сделать соразмерным силами платформы: проекции в точке решения нет по построению, и код это записал со ссылкой на эрратy, а ряд размечен двухзонным. ⚠ И ловушка, которой не было в первой редакции: словарь причин отказа закрыт в ТРЁХ носителях, включая констрейнт базы, и не стережётся НИ ОДНИМ гейтом (0 хитов при контроле 12 у соседа) — четвёртое значение прошло бы `make check` зелёным и упало в проде | + ⛔ **ПОЛИГОН СНЯТ ВЛАДЕЛЬЦЕМ 11.09.** Я предлагал пак трижды — `ed`, `5c` (обе отработавшие, отказались ПО НОРМЕ и были правы) и свежей `37`, — после чего владелец сказал «полигон не надо выдавать». Выдача `37` ОТОЗВАНА тем же часом. ⚠ Урок не про полигон: **я трижды искал адресата для заказа, приоритет которого не подтверждал у владельца.** Слот зоны свободен ≠ работу зоны надо заказывать. ## Что я должен помнить, пока паки идут