diff --git a/platform/docs/platform-PROGRESS.md b/platform/docs/platform-PROGRESS.md index f5bd949d..d7a82129 100644 --- a/platform/docs/platform-PROGRESS.md +++ b/platform/docs/platform-PROGRESS.md @@ -3,6 +3,52 @@ > **Что это.** Состояние зоны и её живые остатки. Обратно-хронологический: свежее выше. > Отработавшие эры вынесены срезами в [`archive/`](archive/) — читать только по конкретной ссылке. +## ⚠ ПИНГ ОРКЕСТРАТОРА №23 (10.09) — ЧЕТЫРЕ АДРЕСА В ВАШЕЙ ЗОНЕ ПОСЛЕ ДВИЖКОВОГО ПАКА И РАТИФИКАЦИИ ДВУХ ОСТАНОВОК + +Зона ваша, рукой не трогаю. Всё ниже пере-снято моим прибором сегодня; каждый адрес — от корня репозитория. + +**(1) Два комментария утверждают о движке неверное — ПРОЗА протухла, КОД у вас верен.** +`platform/internal/runs/reconcile.go:1534` и `platform/internal/pgstore/runs.go:320` пишут «the engine +catches SIGTERM and exits 1». Движок на пойманном сигнале отдаёт **5** (`backend/cmd/tmctl/main.go:100` += «5 graceful stop»), и ваш собственный код это знает: `platform/internal/ingest/exit.go:34` = `ExitStopped = 5`, +`reconcile.go:1134` сверяется именно с ним. То есть врут только комментарии — но их цитируют доки, и ложь +уезжает дальше. Тот же текст, вероятно, в `platform/internal/runner/control_test.go` (у меня адрес из +чужого замера, сам не открывал). + +**(2) `platform/internal/runner/runner.go:56-58` и `:163-164` — НЕ ошибка, а ЦЕЛЬ; удалять НЕЛЬЗЯ.** +Там сказано, что движок «finishes the in-flight chunk before exiting» и что SIGTERM даётся ему, «so it can +finish the chunk it is paying for». Сегодня это ЛОЖНО: у движка одна кнопка и она жёсткая +(`backend/cmd/tmctl/main.go:207` отменяет контекст прогона, летящие вызовы рвутся). Но **владелец 10.09 +ратифицировал ровно то, что ваш комментарий описывает** — акт `D39.234` п.1: первое нажатие мягкая +остановка (новых единиц не раздаём, начатое доигрываем), второе — сегодняшняя жёсткая. ⇒ это случай «док +впереди кода»: комментарий станет истинным, когда сядет пак. Пометьте его как цель, а не правьте под +сегодняшнее дерево. + +**(3) ⛔ ЧИСЛОВОЙ КОНФЛИКТ, который включится в ту же секунду, как SIGTERM станет мягким.** +`platform/internal/runner/runner.go:59` = `stopGrace = 10 * time.Minute` (600 с), и он же уезжает в +`TimeoutStopSec`. Законное ожидание ОДНОГО вызова у движка — до `attempt_max_s` **1240 с** +(`backend/configs/models.yaml`, deepseek), и владелец это ожидание ратифицировал (`D39.230` п.3, потолок +подтверждён `D39.234` п.1б). ⇒ мягкий SIGTERM при нынешнем грейсе означает SIGKILL по ЗАКОННОМУ ожиданию, +а SIGKILL не оставляет ни пометки `cancelled`, ни сеттла оценки — деньги списаны, следа нет. Грейс обязан +вырасти выше потолка ожидания ПЛЮС время жёсткой фазы, либо второй сигнал шлёте вы сами по своему +продуктовому дедлайну. + +**(4) То, что вы просили, движок публикует — но не туда, где вы это возьмёте.** +`platform/internal/pgstore/credits.go:235` просит «publish the count and sum of estimated-price rows beside +committed_usd, which is what would let this side say "at most Y"». Движок их считает и печатает — +`backend/internal/pipeline/status.go:321` (`estimated_rows` / `estimated_usd` в `status --json`) — но по ШВУ +они не едут: в кадрах `backend/internal/runevents/runevents.go` слова `estimated` **0 хитов** (контроль: +`committed` в том же файле — **6**; денежный кадр несёт один `committed_micro_usd`, `runevents.go:244`). +С вашей стороны читателя тоже нет: в `platform/internal` вне тестов `estimated` — **2 хита, оба +комментарии** (контроль: `committed_micro` — 1 хит; go-файлов вне тестов прибор прочёл **81**). Носитель — +строка бэклога **382**; чинится ПАРНО с движком. + +**Что из этого следует для очереди.** Пак движка «мягкая остановка» и платформенная половина лендятся +ПАРОЙ и порознь не лендятся (`D39.234` п.2). Платформенная половина, как я её вижу: `mode` у `/stop`, +грейс выше потолка ожидания, путь второго сигнала (`systemctl kill --signal=SIGTERM`, юнит не трогая), +чтение оценочных строк из потока. Промт ещё не написан — если у вас есть довод против любой из четырёх +позиций, скажите ДО того, как я его напишу. + ## Состояние зоны на 08.09.2026 | Вопрос | Ответ |