From 8ff6b5a40b9145d93ff0fbe1dedefa02987e768e Mon Sep 17 00:00:00 2001 From: heaven Date: Sat, 5 Sep 2026 01:49:26 +0300 Subject: [PATCH] Take the third outside pass: a rider ordering work already finished is gone, the cheapest gate now leads the pack instead of trailing it, and an instruction that would have broken the contract is withdrawn --- docs/BACKEND_MONEYSTOP_SESSION_PROMPT.md | 111 ++++++++++----------- docs/PLATFORM_OPERATIONS_SESSION_PROMPT.md | 20 ++-- 2 files changed, 68 insertions(+), 63 deletions(-) diff --git a/docs/BACKEND_MONEYSTOP_SESSION_PROMPT.md b/docs/BACKEND_MONEYSTOP_SESSION_PROMPT.md index 395ad6fa..7ddbbb1c 100644 --- a/docs/BACKEND_MONEYSTOP_SESSION_PROMPT.md +++ b/docs/BACKEND_MONEYSTOP_SESSION_PROMPT.md @@ -48,48 +48,7 @@ ## 4. Состав — что делать РОВНО так и что решаешь сам -**(1) ДЕЛАЙ РОВНО ТАК — отказ резерва перестаёт гасить допущенное.** Отступление = пинг. -· Отказ **защёлкивается на уровне ВОЛНЫ**: кормилец перестаёт раздавать индексы по первому - `ReserveDeniedBook`. Без защёлки W воркеров дадут W путей ошибки вместо одной остановки. -· Уже допущенные вызовы **дорабатываются**. `cancel()` по деньгам не зовётся. -· При непустом полёте отказ **не окончателен**: ждать settle (settle ≤ оценки, значит запас растёт) и - повторить тот же резерв. Отказ при пустом полёте — стоп. -· Завершение **штатное**, с леджером сделанного и отложенного. Exit 4 и `paused` остаются: семантика - «деньги кончились, резюмируемо» верна. - -**(2) ДЕЛАЙ РОВНО ТАК — «сколько не хватило» доезжает наружу.** Число у тебя уже есть и печатается -(`denied estimate=$…`), но умирает в stderr транзиентного юнита. Оно обязано ехать в событие `ceiling` -отдельным полем. ⚠ Наружу — только НЕДОСТАЮЩАЯ сумма; цены моделей, стадий и вызовов не выходят. - -**(3) ДЕЛАЙ РОВНО ТАК — проекция цены в `manifest --json` и `status --json`.** По ЮНИТУ: `source_chars` -(руны ингестированного текста, включая пробелы), раздельно плотные/разреженные знаки, `expected_usd`; -по КНИГЕ: `book_once_usd` (книжное слагаемое — терминология тратится на книгу, не на юнит) и -`step_max_usd` (самый крупный неделимый резерв). Считается из СВОИХ цен и фертильности, **без константы -за главу**. Плюс `structure: detected|declared|none` — признак доверия к нарезке. Всё аддитивно, версию -манифеста НЕ двигает. -⚠ **РЕШАЕШЬ САМ И АРГУМЕНТИРУЕШЬ (промт форму НЕ задаёт):** как считается `expected_usd` — по -отрендеренному промпту с инъекциями или по сырому тексту, какие стадии входят, учитывать ли ретраи и -эскалации; по какому признаку выставляется `structure: detected|declared|none`; какую форму имеет -леджер сделанного и отложенного в `finished`. Каждый выбор — с доводом в отчёте. - -**(4) РЕШАЕШЬ САМ И АРГУМЕНТИРУЕШЬ:** форма защёлки; где именно ждать settle; как назвать поля; -сеттлить ли оценкой поздно отменённый вызов и по какому различителю (латентность — кандидат, порог -обязан быть обоснован ЗАМЕРОМ, а не назначен). - -**(5) НЕ ДЕЛАЙ:** не убирай резервацию — она единственная гарантия «не потратим больше, чем дано»; -не резервируй «ожидаемое» вместо worst-case; не ужимай `max_tokens` под остаток (двигает `request_hash` -⇒ снапшот и детерминизм, и даёт `finish=length` ценой целой генерации); не трогай кумулятивную -семантику `--ceiling-usd`; не двигай `manifestVersion`, схему и контракт. ⚠ **`StreamVersion` — ИСКЛЮЧЕНИЕ и его двигать НАДО:** добавление поля в кадр — минорный бамп по правилу шва (`internal/runevents/runevents.go`, греп `IT WAS ALMOST NOT BUMPED` — там записана ровно эта ловушка). Прежняя редакция промта запрещала бамп и заказывала поле одновременно; противоречие снято 05.09. - -## 4-бис. ДВА РАЙДЕРА — и вот почему они здесь, а не в другом паке - -⚠ **Честно о происхождении состава:** пункты 1–3 выше выведены из денежного разбора, а не из свежего -прочтения бэклога. Владелец поймал это вопросом «взял по инерции или вычитал?». Пере-проверка -бэклога (42 движковые строки со статусом «скоро») дала ДВА хвоста, которые по цене ошибки идут не -позже денежного стопа, и оба дёшевы. Они входят в пак райдерами, а не отдельным паком, потому что -каждый — одно касание, а собирать под них третью сессию дороже, чем сделать здесь. - -**(Р1) ДЕЛАЙ РОВНО ТАК — строка 271: правки банка пользователя едут в SYSTEM-сообщение ДОСЛОВНО.** +**(1) ДЕЛАЙ РОВНО ТАК — ПЕРВЫМ, строка 271: правки банка пользователя едут в SYSTEM-сообщение ДОСЛОВНО.** Тело собирается конкатенацией `src + " → " + dst`, `dst` приходит с пользовательской двери и получает ровно один `TrimSpace`; предела длины нет, управляющие символы не запрещены. ⇒ `dst` с переводами строки дописывает свои строки внутрь системного блока КАЖДОГО платного вызова. ⚠ Ратифицированный инвариант проекта (**D25**, фактура — `docs/research/17-external-critique.md` §A10.2) требует, чтобы текст @@ -101,17 +60,57 @@ запрета управляющих обязано краснеть. Без этих двух пункт не сдан. ⚠ Это обязано быть закрыто ДО того, как внутрь пустят первого внешнего человека, — а платформенный пак, который его пускает, идёт ПАРАЛЛЕЛЬНО твоему. +⚠ **ПОЧЕМУ ПЕРВЫМ, а не райдером:** это ЕДИНСТВЕННЫЙ пункт пака, который реально гейтит «можно ли пускать человека», и он +дешевле остальных. В первой редакции он стоял четвёртым, райдером после трёх денежных пунктов — след того, что состав +вырос из денежного разбора, а не из чтения бэклога. Порядок исправлен 05.09; сессия читает первым то, что первым и надо. -**(Р2) ДЕЛАЙ РОВНО ТАК — строка 251: банковый контур требует артефакта, которого в git нет.** -`mining.contrast_path` — единственный вход контура; артефакт крупный, генерируется из jieba, в -репозитории его нет и быть не должно. Три гарда добавлены прошлым паком, но **развёртывание обязано -положить файл рядом с конфигом ПЕРЕД выкаткой**, и сегодня об этом не сказано там, где читает -оператор. ⚠ **ПРОВЕРЬ ПЕРВЫМ ДЕЛОМ, СДЕЛАНО ЛИ УЖЕ:** блок «⛔ РАЗВЁРТЫВАНИЕ: `mining.contrast_path`» стоит в -`backend/configs/pipeline-c1.yaml` (греп `РАЗВЁРТЫВАНИЕ`), то есть движковая половина, возможно, ЗАКРЫТА. Если да — скажи -это в отчёте и НЕ делай заново; твоя работа тогда сводится к тому, чтобы отказ загрузки НАЗЫВАЛ рецепт, а не только путь. -⚠ Операторская половина (рантбук деплоя обязан положить артефакт ПЕРЕД выкаткой) — в `platform/deploy/README.md`, и её -сегодня НЕТ (`grep -c contrast platform/deploy/README.md` → 0). Она заказана платформенному паку; если к твоему отчёту её -там всё ещё нет — назови это незакрытой дырой, а не чужой зоной. +**(2) ДЕЛАЙ РОВНО ТАК — отказ резерва перестаёт гасить допущенное.** Отступление = пинг. +· Отказ **защёлкивается на уровне ВОЛНЫ**: кормилец перестаёт раздавать индексы по первому + `ReserveDeniedBook`. Без защёлки W воркеров дадут W путей ошибки вместо одной остановки. +· Уже допущенные вызовы **дорабатываются**. `cancel()` по деньгам не зовётся. +· При непустом полёте отказ **не окончателен**: ждать settle (settle ≤ оценки, значит запас растёт) и + повторить тот же резерв. Отказ при пустом полёте — стоп. +· Завершение **штатное**, с леджером сделанного и отложенного. Exit 4 и `paused` остаются: семантика + «деньги кончились, резюмируемо» верна. + +**(3) ДЕЛАЙ РОВНО ТАК — «сколько не хватило» доезжает наружу.** Число у тебя уже есть и печатается +(`denied estimate=$…`), но умирает в stderr транзиентного юнита. Оно обязано ехать в событие `ceiling` +отдельным полем. ⚠ Наружу — только НЕДОСТАЮЩАЯ сумма; цены моделей, стадий и вызовов не выходят. + +**(4) ДЕЛАЙ РОВНО ТАК — проекция цены в `manifest --json` и `status --json`.** По ЮНИТУ: `source_chars` +(руны ингестированного текста, включая пробелы), раздельно плотные/разреженные знаки, `expected_usd`; +по КНИГЕ: `book_once_usd` (книжное слагаемое — терминология тратится на книгу, не на юнит) и +`step_max_usd` (самый крупный неделимый резерв). Считается из СВОИХ цен и фертильности, **без константы +за главу**. Плюс `structure: detected|declared|none` — признак доверия к нарезке. Всё аддитивно, версию +манифеста НЕ двигает. +⚠ **РЕШАЕШЬ САМ И АРГУМЕНТИРУЕШЬ (промт форму НЕ задаёт):** как считается `expected_usd` — по +отрендеренному промпту с инъекциями или по сырому тексту, какие стадии входят, учитывать ли ретраи и +эскалации; по какому признаку выставляется `structure: detected|declared|none`; какую форму имеет +леджер сделанного и отложенного в `finished`. Каждый выбор — с доводом в отчёте. + +**(5) РЕШАЕШЬ САМ И АРГУМЕНТИРУЕШЬ:** форма защёлки; где именно ждать settle; как назвать поля; +сеттлить ли оценкой поздно отменённый вызов и по какому различителю (латентность — кандидат, порог +обязан быть обоснован ЗАМЕРОМ, а не назначен). + +**(6) НЕ ДЕЛАЙ:** не убирай резервацию — она единственная гарантия «не потратим больше, чем дано»; +не резервируй «ожидаемое» вместо worst-case; не ужимай `max_tokens` под остаток (двигает `request_hash` +⇒ снапшот и детерминизм, и даёт `finish=length` ценой целой генерации); не трогай кумулятивную +семантику `--ceiling-usd`; не двигай `manifestVersion`, схему и контракт. ⚠ **`StreamVersion` — ИСКЛЮЧЕНИЕ и его двигать НАДО:** добавление поля в кадр — минорный бамп по правилу шва (`internal/runevents/runevents.go`, греп `IT WAS ALMOST NOT BUMPED` — там записана ровно эта ловушка). Прежняя редакция промта запрещала бамп и заказывала поле одновременно; противоречие снято 05.09. + +## 4-бис. ЧЕСТНО О ПРОИСХОЖДЕНИИ СОСТАВА И ЧТО В ПАК НЕ ВОШЛО + +⚠ **Честно о происхождении состава:** пункты 1–3 выше выведены из денежного разбора, а не из свежего +прочтения бэклога. Владелец поймал это вопросом «взял по инерции или вычитал?». Пере-проверка +бэклога (42 движковые строки со статусом «скоро») дала ДВА хвоста, которые по цене ошибки идут не +позже денежного стопа, и оба дёшевы. Они входят в пак райдерами, а не отдельным паком, потому что +каждый — одно касание, а собирать под них третью сессию дороже, чем сделать здесь. + +⛔ **РАЙДЕР Р2 (строка 251, артефакт контура) СНЯТ С ПАКА 05.09 — движковая половина УЖЕ СДЕЛАНА.** +`backend/internal/config/pipeline.go`, греп `CheckMiningContrast`: при включённом гейте терминологии и заданном +`contrast_path` недоступный файл даёт ОТКАЗ ЗАГРУЗКИ, и текст отказа называет путь, говорит «deployment-provided and NOT +in git» и последствие. Непокрыто только «откуда взять артефакт» — это ОПЕРАТОРСКИЙ текст рантбука, и он заказан +платформенному паку. ⚠ Прежняя редакция велела тебе «проверить первым делом, сделано ли уже» — это была моя работа до +выдачи, а не твоя после. ⚠ **Строки 198 и 254 — БЕСХОЗНЫ, и это надо знать обеим сторонам:** 198 (апгрейд движка стирает замечания читателя) и **254 (пустой файл ⇒ интейк УНИЧТОЖАЕТ загрузку — потеря пользовательских данных на первом же шаге)** требуют согласования @@ -120,7 +119,7 @@ СВОЙ пак и своё окно пере-снапшота; строки 253/273 — швы, требующие согласования с платформой; 256–267 — то, что зона чинит прямо сейчас в незакрытой приёмке прошлого пака. -## 5. Пять рисков реализации — названы зоной, проверить ОБЯЗАН +## 4-тер. Пять рисков реализации — названы зоной, проверить ОБЯЗАН (а) защёлка на уровне волны, не у воркера · (б) учёт объёма (`volume.go`, `bound()`/`reconcile`): частичная волна под потолком — НОВАЯ форма для этих счётчиков, и они уже дважды ловили ложные числа · (в) событие @@ -128,7 +127,7 @@ книжным — проверить явно · (д) эскалационный хоп: убедиться, что его деградация не опирается на саму отмену. ⚠ **Каждый из пяти предъявляется ЯВНО:** в отчёте — команда и её вывод либо посадка и её цвет. «Проверил» без артефакта не считается: это ровно та вырожденная форма, которую канон велит ловить в промтах. -## 6. Мандат самопроверки ИСПОЛНЕНИЕМ +## 5. Мандат самопроверки ИСПОЛНЕНИЕМ Батарея + **собственные адверсариальные посадки ВНЕ списка автора** через `cmd/tmmutate` (каталог 152 записи — пополняешь). **Субагенты РАЗРЕШЕНЫ явно**, модель называй имени. Обязательное условие приёмки: @@ -139,7 +138,7 @@ ⚠ Мутации — только на ЗАКОММИЧЕННОМ дереве; на копии — `GOFLAGS=-buildvcs=false`. ⚠ Каталог гонять ЦЕЛИКОМ: протухшая запись даёт `ROTTED` и не кладёт прогон. -## 6-бис. Предметные оси ревью — ТРИ, и у каждой свой артефакт +## 6. Предметные оси ревью — ТРИ, и у каждой свой артефакт ⚠ Оси, а не список проверок: у каждой названо, ЧЕМ ты предъявишь результат. Сессия вправе заменить ось с аргументом. ⛔ **ВСЕ ТРИ ПРЕДЪЯВЛЯЮТСЯ ЗА $0** — на фейк-клиенте батареи и голдене. **Платный прогон в этот пак НЕ входит**: он идёт @@ -151,7 +150,7 @@ · **Шов наружу.** Артефакт: событие `ceiling` с недостающей суммой, прочитанное СО СТОРОНЫ ПОТРЕБИТЕЛЯ (не из своего кода), и версия потока, сдвинутая по правилу шва. -## 6-тер. ОБЯЗАТЕЛЬНОЕ ДЛЯ КОДОВОГО ПРОМТА — пять строк канона +## 6-бис. ОБЯЗАТЕЛЬНОЕ ДЛЯ КОДОВОГО ПРОМТА — пять строк канона · **Перед отчётом сверь КАЖДЫЙ клейм с результатом инструмента ЭТОЙ сессии.** Не с памятью и не с тем, что было верно вчера. diff --git a/docs/PLATFORM_OPERATIONS_SESSION_PROMPT.md b/docs/PLATFORM_OPERATIONS_SESSION_PROMPT.md index 63b55ad9..7684bdac 100644 --- a/docs/PLATFORM_OPERATIONS_SESSION_PROMPT.md +++ b/docs/PLATFORM_OPERATIONS_SESSION_PROMPT.md @@ -80,12 +80,15 @@ system-промпт дословно) — внешнего пользовате читалке. **(5) ДЕЛАЙ РОВНО ТАК — СНЯТЬ ЛОЖНУЮ ПОДПИСЬ «ЗНАКОВ».** Счётчик считает руны ПОТОКА ЗАПИСИ файла: для -UTF-8 txt это и есть знаки, для EPUB — руны zip-архива, для GB18030/UTF-16 приближение. **ДЕЛАЙ РОВНО ТАК — законная внутризонная форма ОДНА: не отдавай число там, где оно неточно.** -`character_count` уже опционально (`*int64` у тебя, `character_count?` у фронта), значит зона вправе -ПРОСТО НЕ ЗАПОЛНЯТЬ его для входов, где счёт лжёт (EPUB — руны zip; GB18030 и UTF-16 — приближение), и -оставить для UTF-8 txt, где он и есть число знаков. Это не трогает контракт: поле остаётся, меняется -только то, когда оно есть. -⛔ **Переименовывать или снимать поле НЕ надо** — это правка контракта, которую §2 запрещает твоей рукой. +UTF-8 txt это и есть знаки, для EPUB — руны zip-архива, для GB18030/UTF-16 приближение. ⛔ **ПРЕЖНЯЯ РЕДАКЦИЯ ЭТОГО ПУНКТА БЫЛА НЕВЕРНА И ОТОЗВАНА 05.09.** Она велела «просто не заполнять +поле там, где счёт лжёт». Так нельзя: в каноне `character_count` стоит в `required`, тип +`[integer, 'null']`, и `null` уже НЕСЁТ СМЫСЛ — «книга ещё загружается». Платформа `null` не шлёт +никогда, а фронт проверяет `=== undefined` и на `null` нарисует «0». ⇒ «не заполнять» ломает и смысл +контракта, и потребителя. +**ДЕЛАЙ РОВНО ТАК: вынеси состав минора в ОТЧЁТ** — либо признак точности рядом с числом, либо смена +семантики `null`. Канон правит оркестратор; своей рукой поле не трогай (§2). ⚠ Внутри зоны законно и +нужно другое: назвать в своём журнале, ЧТО именно считает счётчик, чтобы следующий не принял руны zip +за знаки. ⛔ **Ветку «взять число из манифеста движка» в ЭТОМ паке НЕ бери:** сегодня манифест несёт только `source_bytes`, а знаки по юниту появятся ТОЛЬКО после движкового пака (его строка 278). Зависимость названа, чтобы ты не начала с невозможного. @@ -96,7 +99,10 @@ UTF-8 txt это и есть знаки, для EPUB — руны zip-архив **(6) ДЕЛАЙ РОВНО ТАК — РАЗВЁРТЫВАНИЕ БАНКОВОГО КОНТУРА В РАНТБУКЕ.** `mining.contrast_path` — единственный вход контура; артефакт крупный, генерируется из jieba, в git его нет и быть не должно, а **рантбук о нём молчит** (`grep -c contrast platform/deploy/README.md` → 0). ⇒ Первая выкатка после -лендинга поднимет инстанс, у которого банковый контур не исполняется вовсе. Рантбук обязан сказать: +лендинга даст инстанс, который **ОТКАЖЕТ КАЖДОМУ ПРОГОНУ**: движок проверяет файл при загрузке конфига +и отказывает по имени пути (`backend/internal/config/pipeline.go`, греп `CheckMiningContrast`) — это не +«контур не работает», это конфиг не загружается. ⚠ Прежняя редакция промта описывала симптом мягче и +была неверна; исправлено 05.09 — два промта одной ночи описывали одну выкатку по-разному. Рантбук обязан сказать: положить артефакт рядом с конфигом ПЕРЕД выкаткой, откуда его взять, и чем проверить. ⚠ Движковая половина (отказ загрузки называет путь) уже стоит в `backend/configs/pipeline-c1.yaml` — не дублируй, сошлись.