12 KiB
Промт сессии: БЭКЕНД — «денежный стоп перестаёт быть аварией»
Роль: бэкенд. Зона записи:
backend/+ СВОЯ секция вdocs/PROGRESS.md. Чужие зоны (platform/,frontend/,eval/) читаешь, не правишь. Не коммитишь и вообще не трогаешь индекс и историю — почему именно и полный список запретов:CLAUDE.md, §«Git-координация мультисессий». Дерево готовишь и передаёшь оркестратору на лендинг.
1. Какая проблема и что решит твой результат
Пользователь покупает перевод книги. Сегодня книгу нельзя дочитать никакими деньгами, а книга короче десяти глав не переводится вообще никогда. Замерено живьём на платном прогоне и воспроизведено дважды. Половина причины — платформенная (форма потолка), и её чинит другой пак. Твоя половина — движковая, и она гейт: пока она не сделана, любая новая форма заказа упирается в ту же стену.
Механизм: движок резервирует оценку перед каждым вызовом и отказ ОДНОГО резерва гасит всю книгу — уже допущенные параллельные вызовы отменяются, ничего не списывается, ничего не производится. Прогон умирает за 10–15 секунд с нулём сделанного.
Результат, которого ждут: отказ в резервации означает «не начинаем новое», а не «убиваем начатое». Прогон доводит допущенное, завершается штатно и НАЗЫВАЕТ, сколько не хватило.
2. Зона записи и git
См. шапку. Дополнительно: docs/architecture/** — зона оркестратора, туда не пишешь; расхождение
дока с кодом — пингом в свою секцию docs/PROGRESS.md, не своей правкой.
3. Карта чтения — ПЯТЬ позиций, дальше только по ссылкам отсюда
docs/architecture/15-money-path.md— §«ОТКРЫТАЯ РАЗВИЛКА 04.09» целиком: разбор трёх независимых чтений, все числа с носителями.docs/PROGRESS.md, строки бэклога 277 · 261 · 262 · 278 — твой состав, формулировки зоны.backend/internal/pipeline/volume.go, грепTHE STOP IS A COMPLETION, NOT A HALT— прецедент внутри твоего же пакета: объёмный потолок уже построен с нужной семантикой и САМ противопоставляет себя денежному.docs/architecture/05-decisions-log.md— грепом:D39.122(семантика--ceiling-usd),D39.170(структурное лечение пробоя потолка),D39.183(правка тестов — про МОТИВ).docs/experiments/00-provider-quirks.md— перед любым утверждением о биллинге провайдера.
Код первичен. Отправные точки, а не истина: stagerun.go (греп r.Store.Reserve(r.Book.BookID,
ReserveDeniedBook, No 2xx ever arrived), waverun.go (греп context.WithCancel), ledger.go
(греп func (s *Store) Reserve), httpllm.go (греп for att := 0; att < profile.MaxAttempts).
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 — признак доверия к нарезке. Всё аддитивно, версию
манифеста НЕ двигает.
(4) РЕШАЕШЬ САМ И АРГУМЕНТИРУЕШЬ: форма защёлки; где именно ждать settle; как назвать поля; сеттлить ли оценкой поздно отменённый вызов и по какому различителю (латентность — кандидат, порог обязан быть обоснован ЗАМЕРОМ, а не назначен).
(5) НЕ ДЕЛАЙ: не убирай резервацию — она единственная гарантия «не потратим больше, чем дано»;
не резервируй «ожидаемое» вместо worst-case; не ужимай max_tokens под остаток (двигает request_hash
⇒ снапшот и детерминизм, и даёт finish=length ценой целой генерации); не трогай кумулятивную
семантику --ceiling-usd; не двигай manifestVersion, StreamVersion, схему и контракт.
5. Пять рисков реализации — названы зоной, проверить ОБЯЗАН
(а) защёлка на уровне волны, не у воркера · (б) учёт объёма (volume.go, bound()/reconcile): частичная
волна под потолком — НОВАЯ форма для этих счётчиков, и они уже дважды ловили ложные числа · (в) событие
ceiling и exit 4/paused обязаны сработать так же и не задержаться · (г) дневной потолок делит ветку с
книжным — проверить явно · (д) эскалационный хоп: убедиться, что его деградация не опирается на саму отмену.
6. Мандат самопроверки ИСПОЛНЕНИЕМ
Батарея + собственные адверсариальные посадки ВНЕ списка автора через cmd/tmmutate (каталог 151
запись — пополняешь). Субагенты РАЗРЕШЕНЫ явно, модель называй имени. Обязательное условие приёмки:
посадка «под потолком волна погасила допущенный вызов» предъявлена КРАСНОЙ.
⚠ SURVIVED не является находкой, пока не показано, что посадка ВООБЩЕ меняет поведение — норма
куплена эквивалентной посадкой оркестратора (обход окна с обратной стороны воспроизводил оригинал).
⚠ Мутации — только на ЗАКОММИЧЕННОМ дереве; на копии — GOFLAGS=-buildvcs=false.
⚠ Каталог гонять ЦЕЛИКОМ: протухшая запись даёт ROTTED и не кладёт прогон.
7. Записка-план ДО работы
Комплектность против заказа — механически, таблицей: пункт → файл → тест → посадка. До первой правки.
8. Заявление = команда
Каждое число и каждая категорика отчёта — с командой получения. Приёмка пере-ранит. ⚠ Отрицательное утверждение («такого пути нет») выводится ТОЛЬКО из названного грепа, и команда приводится в тексте: за сутки трижды ловили отрицания, выведенные из команд, которые не сработали.
9. Эхо-протокол старта
≤10 строк «скоуп / инварианты / не-делать» ДО работы — в прямой канал, первым действием.
10. Obstacle reporting
Обязательная секция отчёта: что НЕ удалось, что не проверено, что осталось гипотезой. ⚠ Отчитаться о баге не значит его сдать — норма куплена вчера: найденное и не починенное не превращается в долг решением о темпе.
11. Канал вопросов
Конфликт промта с кодом или доками — пинг, не интерпретация. Право сказать «этого делать не надо» с аргументом — есть, и им пользуются: за сутки зона трижды опровергла оркестратора по существу.
12. Прямой канал
Механизм — CLAUDE.md §«Связь между сессиями». Впиши свой блок первым делом; адрес оркестратора бери
оттуда же и сверяй ListAgents перед отправкой. Канала нет ⇒ НЕ искать, вопрос секцией в отчёт.