Correct the ceiling mechanism for a paid run through the API: the platform derives the figure, so the pack's ceiling is a grant to the test account and the walk to a finished book is the product path

This commit is contained in:
heaven 2026-09-04 10:32:07 +03:00
parent f0cb0100d3
commit 0917cff003
3 changed files with 43 additions and 8 deletions

View file

@ -28,9 +28,14 @@
## 1. БЭКЕНД — пак «ВАЙР-БАТЧ: род, экран цели, заголовки инъекций»
**Почему именно вайр-батч, а не «самое важное по одной».** Четыре из пяти кандидатов бэкенда двигают
провод. Взять их по одному — заплатить пере-снапшот четыре раза на книге, которая уже куплена.
Строка 182 заведена ровно под это и ждёт промта.
**Почему одним паком.** Провод двигают четыре пункта из шести, и каждый — свою ось: **210** — байты
батчей терминолога и `memory_version` (⇒ edit-снапшот), **46**`ClassifierVersion` (⇒ снапшот,
`RequestHash` НЕ трогает), **134**`RequestHash` редактора и транслятора (а при правке данных ещё и
`EmbeddedVersion` с `cutTag` — см. мину ниже), **140**`RequestHash` черновика книг на c1,
**184(а)** — `BriefHash`, то есть КАЖДЫЙ `RequestHash`. Провод НЕ двигают два: **113** (фикстура) и
**дофикс** (пины). ⚠ Собрать их вместе стоит не потому, что иначе «платим четыре раза» — это
утверждение снято в §0.1, — а потому что голден пере-захватывается ОДИН раз вместо пяти, и потому что
все они обязаны лечь до одного и того же срока. Строка 182 заведена ровно под это и ждёт промта.
**Состав (в этом порядке):**
@ -82,7 +87,13 @@
⚠ При внесении суб-бюджеты банк-ролей калибровать ×4.47 — `15-money-path.md` §2 прямо говорит, что
сегодня они «режут ОПЛАЧЕННУЮ работу по протухшей калибровке». Цена в паке НАЗЫВАЕТСЯ, но не
спрашивается.
5. **ДОФИКС предыдущего пака — одним пунктом** (остаток приёмки 03.09, D39.187 п.4).
5. **ДОФИКС предыдущего пака + ФЧ-7 — одним пунктом** (остаток приёмки 03.09, D39.187 п.4).
⚠ Сюда же **ФЧ-7 фикс-листа (строка 197): паника поверх ПОЙМАННОГО потолка** — денежный шов, и он
не проверялся ни приёмкой, ни контролёром. Форма — **проверка исполнением, а не стройка**:
воспроизвести, и чинить ТОЛЬКО если воспроизводится. Тем же касанием пере-скоупить строку 197:
ФЧ-1/4/5 закрыты консент-паком, ФЧ-6 по коду выглядит закрытым (`backend/internal/pipeline/status.go`,
греп `RebillBasisFailed` — отказ проекции репортится базисом, отчёт не валится), ФЧ-2/3/8 —
НЕ ПРОВЕРЕНЫ и обязаны остаться названными как непроверенные.
⚠ По канону дофикс адресуется ТОЙ ЖЕ сессии («отработавшей пишут только по её же паку»), и
контролёр справедливо это напомнил. Проверено: сессий больше нет — `ListAgents` 04.09 не показывает
ни `textmachine-77`, ни платформенную. Значит остаток законно едет пунктом нового пака, и промт
@ -117,6 +128,10 @@
- **Строка 232 остаток / 233.** Семантика переноса отложена СЛОВОМ ВЛАДЕЛЬЦА 03.09 («подумаем»);
трогать до его решения нельзя.
- **119 + 124 + 115.** Строка 182 требует брать их ОДНИМ дизайн-паком, а не хвостом батча.
- **131 (кап инъекции) · 105(а) (вердикт-половина классификатора) · 14 (ё-фолд)** — жильцы той же
строки 182, в этот пак НЕ входят и это сказано вслух, а не умолчано: у 131 своя цена и своё
СТОП-решение, и сама строка велит «пере-замерить после 134» — то есть её очередь ПОСЛЕ этого пака,
а не внутри него; 105(а) и 14 остаются в 182 до следующего окна.
**⚠ ДВЕ СТРОКИ, КОТОРЫЕ БАТЧ ЗАДЕВАЕТ САМ, И ПЕРВАЯ РЕДАКЦИЯ ПЛАНА ИХ НЕ УВИДЕЛА:**
- **198 — апгрейд движка стирает замечания книги БЕЗВОЗВРАТНО.** Если батч тронет данные
@ -146,8 +161,23 @@
⚠ **Санкция ДАНА (`D39.189`), но сумма в первой редакции плана была занижена — исправлено по улике
контролёра.** $0.436110 — цена НЕПОЛНОГО захода (три юнита из четырнадцати); дверь выдачи и строка
16 («цена ДОВЕДЁННОЙ книги») требуют ЗАВЕРШЁННОЙ книги, а собственная проекция движка на неё —
`projected_book_usd = 1.1377…` при оттоке кассы ≈$1.44. **Потолок пака: ≈$1.5**, и он объявляется
до первого вызова, едет `--ceiling-usd`, перелёт = стоп и пинг.
`projected_book_usd = 1.1377…` при оттоке кассы ≈$1.44. **Потолок пака: ≈$1.5.**
⛔ **МЕХАНИЗМ потолка на API-пути — НЕ флаг, и первая редакция этого плана велела невозможное**
(улика контролёра, пере-проверена мной по коду). Руками `--ceiling-usd` на этом пути не ставит
никто: платформа выводит его сама — `bookCap = committed + increment` (`internal/runs/spawn.go`,
греп `func (m meter) bookCap`), а `increment` считается по ставке `DefaultPerChapter = 30_000`
($0.03, `internal/pricing/pricing.go`), которая занижена ×4.47 (`D39.179` п.1). Следствие: покупка
«10 глав» отдаёт движку ≈$0.30, прогон встаёт по потолку задолго до конца книги, а `resume`
остановленного потолком отбивается (`internal/runs/runs.go`, греп `ErrCeilingReached`; `PD-217`:
«лечение пользователя — НОВЫЙ прогон»). Сессия, исполняющая букву «едет `--ceiling-usd`», полезла бы
крутить `TM_PLATFORM_USD_PER_CHAPTER` — это хак под тест, и он запрещён.
**Правильная форма:** потолок пака = ГРАНТ тест-аккаунту ровно на $1.5
(`tmplatformctl grant --user <id> --usd 1.5`), потому что холд делает перерасход невозможным ПО
ПОСТРОЕНИЮ; а путь до завершённой книги идёт цепочкой **покупка → пауза по потолку → пополнение →
новый прогон**. Это не обход, а ровно третий сценарий строки **216** и `D39.176` п.3 (возобновление
явным действием пользователя) — то есть продуктовый путь, который прогон и обязан предъявить.
`--ceiling-usd` при этом на движковый вызов уходит всегда, но число — производное платформы, и
промт обязан это сказать, иначе сессия будет искать флаг, которого у неё нет.
**Стартовать в ДОЛИНУ:** у DeepSeek пиковые окна 0104 и 0610 UTC дают ×2 (строка 172а) —
операционное правило дешевле любой правки Go.
⚠ Тремя явными сценариями закрыть строку **216**: подпись банка · halt на потолке · резюм после
@ -176,7 +206,10 @@
(кто вправе звать, чем доказывается отсутствие процесса, что если процесс вернётся) назвать в паке
явно. ⚠ Дописать `PD-418`: та же ветвь по `finished_at`, и долговечное лечение — «ветвить по
НАЛИЧИЮ осиротевшей попытки» — либо входит в тот же дизайн, либо явно объявляется вне его.
4. **ДОФИКС предыдущего пака — одним пунктом** (D39.188 п.5а): записка зоны о предусловии хоста
4. **ДОФИКС предыдущего пака — одним пунктом** (D39.188 п.5а). ⚠ Та же оговорка, что у бэкенда: по
канону дофикс шёл бы ТОЙ ЖЕ сессии, но её больше нет (`ListAgents` 04.09), поэтому остаток едет
пунктом нового пака — и промт обязан сказать, что это чужая недоделка, а не новый заказ.
Записка зоны о предусловии хоста
различает хосты ИМЕНЕМ МАШИНЫ, а имя у этого хоста то же самое при противоположных условиях
(`~/go/bin` существует и держит `sqlc`, `make tools-check` на дефолтном PATH падает, сокет 55433).
Различает пользователь, а не хост.

View file

@ -16,7 +16,7 @@
**Залендены и ратифицированы, приёмочные дампы — телами нот:** платформенный **P11** — D39.169 · движковый пак **«деньги»** — D39.170 · платформенный **P12** — D39.180 (вместе с контрактным минором **0.9.0**; `PD-425` закрыт им же) · бэкенд-пак **«деньги и честность выдачи»** — D39.182 (тестов 1045→1083, удалённых ноль) · **закон раскрытия** движка — D39.181, ратифицирован владельцем и применён к одиннадцати экземплярам.
**ВЫДАНЫ 02.09, сессий ещё не было — работают ПАРАЛЛЕЛЬНО, зоны независимы по коду:** платформенный **P13** «шов возврата оплаченного прогона» (`docs/PLATFORM_P13_SESSION_PROMPT.md`: `PD-168` бюджет из холда · `PD-89` ключ на пути ошибки · `PD-426`/`PD-214` чужая строка не карантинит проекцию · `PD-374` гейт батареи · гейт против класса серьёзности · строка рантбука деплоя) и бэкендовый **«число согласия на пути второй покупки»** (`docs/BACKEND_CONSENT_SESSION_PROMPT.md`: ФЧ-5 ось модели · строка 232 остаток слота · ФЧ-4 обе половины · ФЧ-1 три гарантии). ⚠ **Сцепление по деплою названо в обоих: у формы манифеста БЕЗОПАСНОГО ПОРЯДКА НЕТ** — гейт интейка `platform/internal/ingest/manifest.go:112`=`if m.Version != KnownManifestVersion` сравнивает со строгим равенством одной константе, окна двух версий нет; рантбук `platform/deploy/README.md:217`=`сначала платформа, потом движок` советует обратное и отдан на починку паку P13 пунктом 6.
**ОТРАБОТАНЫ 03.09, ПРИНЯТЫ С ДОФИКСОМ и заленджены** (`D39.187` движок, `D39.188` платформа; промты в `archive/prompts/` с баннерами исхода; следующие паки ПЛАНИРУЮТСЯ — `NEXT_PACKS_PLAN.md`, промты не выданы до обоюдного «ок» оркестратора и контролёра, слово владельца 03.09): платформенный **P13** «шов возврата оплаченного прогона» (`docs/PLATFORM_P13_SESSION_PROMPT.md`: `PD-168` бюджет из холда · `PD-89` ключ на пути ошибки · `PD-426`/`PD-214` чужая строка не карантинит проекцию · `PD-374` гейт батареи · гейт против класса серьёзности · строка рантбука деплоя) и бэкендовый **«число согласия на пути второй покупки»** (`docs/BACKEND_CONSENT_SESSION_PROMPT.md`: ФЧ-5 ось модели · строка 232 остаток слота · ФЧ-4 обе половины · ФЧ-1 три гарантии). ⚠ **Сцепление по деплою названо в обоих: у формы манифеста БЕЗОПАСНОГО ПОРЯДКА НЕТ** — гейт интейка `platform/internal/ingest/manifest.go:112`=`if m.Version != KnownManifestVersion` сравнивает со строгим равенством одной константе, окна двух версий нет; рантбук `platform/deploy/README.md:217`=`сначала платформа, потом движок` советует обратное и отдан на починку паку P13 пунктом 6.
**Проводка `--max-units` в платформу остаётся ГЕЙЧЕНОЙ. Живое основание одно и оно механическое:** единственный писатель `bank_moved_at` — дверь правок банка (`platform/internal/runs/bank.go:182`), а рост АВТО-банка от майнинга этого флага не ставит, поэтому майнящая книга на второй покупке идёт без `--resnapshot` и умирает на снапшот-гарде движка — холд взят, попытка сожжена (`PD-422`). Это чинится проводкой признака движения банка от майнинга, а не решением владельца.

View file

@ -39,6 +39,8 @@
> далёк в обоих случаях, вывод приёмки не меняется, но в каноне стоит число из гейта, а не из грепа.
> ⚠ **Эррата 02.09-а (D39.182, «три блокера приёмки закрыты») — у ТРЕТЬЕГО блокера не осталось носителя.** Заголовок и §1 ноты держат счёт «3 блокера», но отчёт пака называет сегодня только два: ревизия доков 02.09 сняла из `backend/docs/MONEY_HONESTY_REPORT.md` разделы «Сверка с заказом по пунктам» и «ПРИЁМКА: три блокера и пять дофиксов» (проверка: греп `^## 9.11` и `^## 1\.` по файлу — пусто, при живом `^## 6.2`). **Третий блокер — вердикт «предъявлено» поверх неработающего пути:** в снятом §1 отчёта вердикты **A0** и **A6** стояли «предъявлено» на НЕПОЛНОЙ проверке и были сняты вместе с блокером 2, а пере-предъявлены посадками `TestAHealthyGlossaryPassIsNotReportedAsALoss` и `TestTheCONSENTGateSeesAnInPlaceSourceEdit` (грепаются по `backend/`). Дословный текст снятых разделов — `git show bd2077b:backend/docs/MONEY_HONESTY_REPORT.md`. Тело ноты не переписывается (D23.3).
> ⚠ **Эррата 04.09-а (D39.189 п.2б) — «обязательный `--ceiling-usd` на движковом вызове» верно для ПРЯМОГО прогона движка и НЕИСПОЛНИМО на пути через API платформы.** Там флаг никто не ставит руками: платформа выводит число сама — `bookCap = committed + increment` (`platform/internal/runs/spawn.go`, греп `func (m meter) bookCap`), где `increment` считается по ставке `DefaultPerChapter = 30_000` ($0.03, `platform/internal/pricing/pricing.go`), заниженной ×4.47 (D39.179 п.1). Сессия, исполняющая букву ноты, полезла бы крутить `TM_PLATFORM_USD_PER_CHAPTER` — хак под тест, запрещённый каноном. **Читать так:** потолок платного пака на API-пути задаётся ГРАНТОМ тест-аккаунту на объявленную сумму (`tmplatformctl grant --user <id> --usd <N>`) — холд делает перерасход невозможным по построению, — а путь до завершённой книги идёт цепочкой «покупка → пауза по потолку → пополнение → новый прогон», что и есть третий сценарий строки 216 и D39.176 п.3. Тело ноты не переписано (D23.3). Найдено контролёром при сверке плана, пере-проверено оркестратором по коду.
> ⚠ **Эррата 03.09-а (D39.170) — формула «покупатель платит за N юнитов и получает ровно N» БОЛЬШЕ НЕ ВЕРНА.** Пак «число согласия на пути второй покупки» (лендинг 03.09) закрыл вторую половину строки 232: юнит, который прежний прогон НАЧАЛ и не отгрузил по оси `finalStageWave`, дописывается ВНЕ гранта. Отсюда грант `--max-units N` оплачивает ДО **2N** выходных юнитов — замерено приёмкой на живом раннере (грант 2 → `Paid()=4`, шесть вызовов провайдера), и тем же замером подтверждено, что в перенос попадает даже юнит, ФЛАГНУВШИЙСЯ без текста, то есть каждая следующая покупка платит за его пере-атаку заново. ⛔ **Семантика НЕ ратифицирована: слово владельца 03.09 — «подумаем на этот счёт», решение отложено.** До него `--max-units` держит не деньги, а слоты; деньги держит только `--ceiling-usd`. Тело D39.170 не переписано (D23.3); живой носитель формулировки — `15-money-path.md`, пункт про `--max-units`.
> ⚠ **Эррата 02.09-в — ЧТО РЕАЛЬНО СДЕЛАНО С ТЕЛАМИ 02.09, слово владельца.** Ревизия доков сняла из тел нот **девять** кусков (D39.124 · D39.128 · D39.153 · D39.155) — пересказы и дубли, не решения. Проверено перед решением: у КАЖДОЙ снятой строки отличительный токен живёт ещё в 461 файле дерева (`SweepSessions` — 6, `UnsettledRuns` — 15, `RepeatableRead` — 4), уникально не потеряно НИЧЕГО. **Владелец 02.09 велел не откатывать:** заказ был вырезать мусор, а откат вернул бы в журнал ровно то, что вырезали сознательно. ⇒ D23.3 действует по-прежнему для РЕШЕНИЙ и клеймов; сжатие пересказа внутри тела с сохранением решения — не нарушение, а разрешённый случай. Прежняя редакция этой эрраты утверждала, что тела не правились вовсе, и противоречила девяти правкам рядом — снято.