From 09a7d1213024ab572c785b85c1740e60ea6aa787 Mon Sep 17 00:00:00 2001 From: heaven Date: Wed, 2 Sep 2026 23:18:11 +0300 Subject: [PATCH] Give the nine bare anchors in both prompts their expectation tokens, so the executor sessions can verify content and not just line numbers --- docs/BACKEND_CONSENT_SESSION_PROMPT.md | 6 +++--- docs/PLATFORM_P13_SESSION_PROMPT.md | 12 ++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/docs/BACKEND_CONSENT_SESSION_PROMPT.md b/docs/BACKEND_CONSENT_SESSION_PROMPT.md index bf80adb0..c0714792 100644 --- a/docs/BACKEND_CONSENT_SESSION_PROMPT.md +++ b/docs/BACKEND_CONSENT_SESSION_PROMPT.md @@ -50,9 +50,9 @@ ⚠ **Пункт 4 — это правка ТЕКСТА в двух живых местах, и оба надо снять, иначе ФЧ-5 придётся переоткрывать** (класс «текст обещает больше числа» — ровно тот, ради которого заведён фикс-лист): -- `backend/internal/pipeline/status.go:217` — «…so status can never quote a different number than the +- `backend/internal/pipeline/status.go:217`=`can never quote a different number` — «…so status can never quote a different number than the one translate enforces» (`grep -n 'can never quote a different number' backend/internal/pipeline/status.go` → `217`); -- `backend/internal/pipeline/reprice.go:24` — шапка файла: «NOT projected (like the content axis in +- `backend/internal/pipeline/reprice.go:24`=`NOT projected (like the content axis` — шапка файла: «NOT projected (like the content axis in rebill.go): **ROUTING**. A row is priced by the model that ANSWERED, not by the one its stage resolves to now» (`grep -n 'NOT projected (like the content axis' backend/internal/pipeline/reprice.go` → `24`). Это заявление становится ЛОЖНЫМ ровно в тот момент, когда ты исполнишь пункт 1. @@ -148,7 +148,7 @@ ни денежные pipeline-тесты (`grep -n 'func (s \*Store) CheckpointUsageForBook' backend/internal/store/ledger.go` → `367`, сам фильтр — `371`). Единственная защита от того, чтобы деньги ЧУЖОЙ книги вошли в число согласия. **Воспроизведено оркестратором ЛИЧНО.** Существующий тест - (`internal/store/ledger_test.go:10` `TestCheckpointUsageForBookReturnsInsertionOrder`) пинит только + (`internal/store/ledger_test.go:10`=`func TestCheckpointUsageForBookReturnsInsertionOrder`) пинит только порядок вставки. 2. **Ключ ячейки можно лишить `chunk_idx`** — обход начнёт съедать деньги соседнего чанка (во всех фикстурах глава = один чанк, поэтому никто не краснеет). diff --git a/docs/PLATFORM_P13_SESSION_PROMPT.md b/docs/PLATFORM_P13_SESSION_PROMPT.md index e030f4da..e0f23c32 100644 --- a/docs/PLATFORM_P13_SESSION_PROMPT.md +++ b/docs/PLATFORM_P13_SESSION_PROMPT.md @@ -113,7 +113,7 @@ cd platform && grep -n 'Pricing' internal/runs/reconcile.go Вызывающих у `reopen` двое: свиповый `restart` (`:1224`, вызов `:1244`, `fromALiveRun`) и контрактный `Resume` (`:1481`, вызов `:1548`, `fromAFinishedRun`). Смена `TM_PLATFORM_USD_PER_CHAPTER` -(`internal/config/config.go:485`) между покупкой и продолжением молча пере-оценивает уже оплаченный +(`internal/config/config.go:485`=`TM_PLATFORM_USD_PER_CHAPTER`) между покупкой и продолжением молча пере-оценивает уже оплаченный прогон в обе стороны; при удвоении ставки на тонком счёте он становится невозобновляемым. Носитель — `PD-168` (стоит `minor`, вес занижен; замер ряда: холд `5.500000` вместо `2.500000`). @@ -161,11 +161,11 @@ cd platform && grep -n 'ceiling_micro_usd' internal/pgstore/migrations/*.sql `internal/ingest/tail.go`, функция `apply` (`:145`). Четыре отказа стоят выше ветки, решающей принадлежность: `:150` декод payload · `:153` `checkVersion` · `:156` пустой `EngineRunID` · `:162` `Seq != 1`. Ошибка любого из них терминальна для проекции: `quarantines()` -(`internal/runs/reconcile.go:770-781`) пропускает только `context.Canceled/DeadlineExceeded` и +(`internal/runs/reconcile.go:770-781`=`func quarantines(err error) bool`) пропускает только `context.Canceled/DeadlineExceeded` и `pgstore.IsTransient`, всё прочее едет в `Store.Quarantine`. Снятия карантина в дереве НЕТ (`grep -rniE 'unquarantine|clearquarantine|quarantine_reason *= *null|dequarantine'` по `.go`/`.sql` -— пусто при живом положительном контроле `internal/pgstore/runs.go:1470 func (s *Store) Quarantine`), -операторской ручки нет, а гейдж `tm_platform_quarantined_attempts` (`internal/metrics/metrics.go:80`) +— пусто при живом положительном контроле `internal/pgstore/runs.go:1470`=`func (s *Store) Quarantine`), +операторской ручки нет, а гейдж `tm_platform_quarantined_attempts` (`internal/metrics/metrics.go:80`=`Name: "quarantined_attempts"`) это видит и молчит о том, что делать. ⚠ **ПОСЫЛКА, КОТОРУЮ НАДО ЗНАТЬ ТОЧНО — иначе живая проба будет искать несуществующее.** @@ -180,7 +180,7 @@ cd platform && go test ./internal/ingest/ -count=1 -run TestAnotherAttemptsStrea Карантинит **чужая ИЛИ БИТАЯ** hello-строка, и условий ровно четыре — они же перечислены в `PD-214` («ручной `tmctl` оператора в каталоге книги, старый мажор, баг чужой сборки»): -другой **МАЖОР** потока (`checkVersion` сравнивает ТОЛЬКО мажор, `internal/ingest/events.go:196-208`; +другой **МАЖОР** потока (`checkVersion` сравнивает ТОЛЬКО мажор, `internal/ingest/events.go:196-208`=`func checkVersion(got string) error`; у платформы `StreamVersion = "1.1"`, у движка `"1.2"` — обе стороны на мажоре 1, поэтому сегодня проходит) · пустой `engine_run_id` · `seq != 1` · нераспарсиваемый payload. ⚠ Формулировка `PD-426` («попасть можно по чужому ЗАКОННОМУ handshake'у») — переупрощение, ряд @@ -192,7 +192,7 @@ cd platform && go test ./internal/ingest/ -count=1 -run TestAnotherAttemptsStrea Что это значит по букве, чтобы ты не внёс дефект буквальным исполнением: - ⚠ **Отказ по ДЕКОДУ (`:150`) остаётся ВЫШЕ и не двигается.** `EngineRunID` живёт ВНУТРИ payload - `Hello` (`internal/ingest/events.go:82-92`), в `Envelope` (`:71-79`) его нет — значит без успешного + `Hello` (`internal/ingest/events.go:82-92`=`EngineRunID string`), в `Envelope` (`:71-79`) его нет — значит без успешного декода принадлежность просто НЕИЗВЕСТНА. Переставляемы только три отказа, не четыре. - Понижаются **только** `checkVersion`, пустой `EngineRunID` и `Seq != 1` — **и ТОЛЬКО в ветке, где `want` уже известен** (`want != ""`): там принадлежность решается сравнением `h.EngineRunID == want`,