From 0917cff0033572a885b115dd055682bc6baa5f12 Mon Sep 17 00:00:00 2001 From: heaven Date: Fri, 4 Sep 2026 10:32:07 +0300 Subject: [PATCH] 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 --- docs/NEXT_PACKS_PLAN.md | 47 +++++++++++++++++++++++---- docs/PROGRESS.md | 2 +- docs/architecture/05-decisions-log.md | 2 ++ 3 files changed, 43 insertions(+), 8 deletions(-) diff --git a/docs/NEXT_PACKS_PLAN.md b/docs/NEXT_PACKS_PLAN.md index c221ec21..a19a24b2 100644 --- a/docs/NEXT_PACKS_PLAN.md +++ b/docs/NEXT_PACKS_PLAN.md @@ -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 --usd 1.5`), потому что холд делает перерасход невозможным ПО + ПОСТРОЕНИЮ; а путь до завершённой книги идёт цепочкой **покупка → пауза по потолку → пополнение → + новый прогон**. Это не обход, а ровно третий сценарий строки **216** и `D39.176` п.3 (возобновление + явным действием пользователя) — то есть продуктовый путь, который прогон и обязан предъявить. + `--ceiling-usd` при этом на движковый вызов уходит всегда, но число — производное платформы, и + промт обязан это сказать, иначе сессия будет искать флаг, которого у неё нет. ⚠ **Стартовать в ДОЛИНУ:** у DeepSeek пиковые окна 01–04 и 06–10 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). Различает пользователь, а не хост. diff --git a/docs/PROGRESS.md b/docs/PROGRESS.md index 6a1388b3..aef53ba1 100644 --- a/docs/PROGRESS.md +++ b/docs/PROGRESS.md @@ -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`). Это чинится проводкой признака движения банка от майнинга, а не решением владельца. diff --git a/docs/architecture/05-decisions-log.md b/docs/architecture/05-decisions-log.md index c72ade87..b9670f04 100644 --- a/docs/architecture/05-decisions-log.md +++ b/docs/architecture/05-decisions-log.md @@ -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 --usd `) — холд делает перерасход невозможным по построению, — а путь до завершённой книги идёт цепочкой «покупка → пауза по потолку → пополнение → новый прогон», что и есть третий сценарий строки 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) — пересказы и дубли, не решения. Проверено перед решением: у КАЖДОЙ снятой строки отличительный токен живёт ещё в 4–61 файле дерева (`SweepSessions` — 6, `UnsettledRuns` — 15, `RepeatableRead` — 4), уникально не потеряно НИЧЕГО. **Владелец 02.09 велел не откатывать:** заказ был вырезать мусор, а откат вернул бы в журнал ровно то, что вырезали сознательно. ⇒ D23.3 действует по-прежнему для РЕШЕНИЙ и клеймов; сжатие пересказа внутри тела с сохранением решения — не нарушение, а разрешённый случай. Прежняя редакция этой эрраты утверждала, что тела не правились вовсе, и противоречила девяти правкам рядом — снято.