27 KiB
⚠⚠ ОТРАБОТАН 05.09. ИСХОД: ПАК ПРИНЯТ С ДОФИКСОМ — акт
D39.206. Приёмочный коммит81a89e9, дофикс616a8e4. 18 находок приёмки, 6 снято, 12 устояло, 4 major — и все четыре оказались УТВЕРЖДЕНИЯМИ, а не поведением. Строки заказа 271 · 277 · 278 (+поглощённая 171) ЗАКРЫТЫ; 291 решена владельцем (D39.204). ⚠ Пункт (3) этого промта противоречил пункту (4): один запрещал цене вызова выходить наружу, другой требовал публиковатьstep_max_usd— тоже оценку одного вызова. Тензию нашла зона, разрешил владелец (D39.203). ⚠ И пункт (6) описывал симптом неверно — дефект промта, не зоны. ⛔ Инструкции этого файла НЕ ИСПОЛНЯЮТСЯ — он архив. Живое состояние:docs/PROGRESS.mdи журнал решений.
Промт сессии: БЭКЕНД — «денежный стоп перестаёт быть аварией»
Роль: бэкенд. Зона записи:
backend/+ СВОЯ секция вdocs/PROGRESS.md. Чужие зоны (platform/,frontend/,eval/) читаешь, не правишь. Не коммитишь и вообще не трогаешь индекс и историю — почему именно и полный список запретов:CLAUDE.md, §«Git-координация мультисессий». Дерево готовишь и передаёшь оркестратору на лендинг.
1. Какая проблема и что решит твой результат
Пользователь покупает перевод книги. Сегодня книгу нельзя дочитать никакими деньгами, а книга короче десяти глав не переводится вообще никогда. Замерено живьём на платном прогоне и воспроизведено дважды. Половина причины — платформенная (форма потолка), и её чинит другой пак. Твоя половина — движковая, и она гейт: пока она не сделана, любая новая форма заказа упирается в ту же стену.
Механизм: движок резервирует оценку перед каждым вызовом и отказ ОДНОГО резерва гасит всю книгу — уже допущенные параллельные вызовы отменяются, ничего не списывается, ничего не производится. Прогон умирает за 10–15 секунд с нулём сделанного.
Результат, которого ждут: отказ в резервации означает «не начинаем новое», а не «убиваем начатое». Прогон доводит допущенное, завершается штатно и НАЗЫВАЕТ, сколько не хватило.
2. Зона записи и git
См. шапку. Дополнительно: docs/architecture/** — зона оркестратора, туда не пишешь; расхождение
дока с кодом — пингом в свою секцию docs/PROGRESS.md, не своей правкой.
3. Карта чтения — ПЯТЬ позиций, дальше только по ссылкам отсюда
docs/architecture/05-decisions-log.md, нотаD39.196— РАТИФИЦИРОВАННАЯ форма заказа, ради которой этот пак и есть гейт; затемdocs/architecture/15-money-path.md§«ОТКРЫТАЯ РАЗВИЛКА 04.09» — разбор, из которого решение выросло (все числа с носителями). ⚠ Читать в этом порядке: разбор без ноты читается как открытый вопрос.docs/PROGRESS.md, строки бэклога 277 · 278 — твой состав, формулировки зоны. ⛔ Строки 261 и 262 в ЭТОТ пак НЕ входят — они назначены дофиксу, который прямо сейчас доделывает ДРУГАЯ сессия зоны (эррата 04.09-д: «зона чинит и держит сдачу; строки 256–264 закрываются её лендингом»). Две сессии в одномstagerun.go— это конфликт, а не параллельность. ⚠ Если к твоему старту дофикс уже заленджен — спроси оркестратора пингом, брать ли их; сам не бери.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) ДЕЛАЙ РОВНО ТАК — ПЕРВЫМ, строка 271: правки банка пользователя едут в SYSTEM-сообщение ДОСЛОВНО.
Тело собирается конкатенацией src + " → " + dst, dst приходит с пользовательской двери и получает
ровно один TrimSpace; предела длины нет, управляющие символы не запрещены. ⇒ dst с переводами
строки дописывает свои строки внутрь системного блока КАЖДОГО платного вызова. ⚠ Ратифицированный инвариант проекта (D25, фактура — docs/research/17-external-critique.md §A10.2) требует, чтобы текст
книги и любая внешняя выдача были ДАННЫМИ, а не инструкциями, и до сих пор это держалось САМОЙ КОНСТРУКЦИЕЙ — писать в
промпт было некому. Теперь есть: появилась пользовательская запись, открывающаяся в system-роль. ⚠ Формулировку в кавычках
не ищи — её нет, это пересказ; ссылайся на ноту и ресёрч. Лечение: предел длины, запрет управляющих, обрамление как ДАННЫХ.
⛔ АРТЕФАКТ ПРИЁМКИ НАЗВАН: тест батареи, в котором dst несёт переводы строк и текст, похожий на системную инструкцию,
и он предъявлен КРАСНЫМ до починки и зелёным после. Плюс посадка в каталог tmmutate: снятие предела длины ИЛИ снятие
запрета управляющих обязано краснеть. Без этих двух пункт не сдан.
⚠ Это обязано быть закрыто ДО того, как внутрь пустят первого внешнего человека, — а платформенный
пак, который его пускает, идёт ПАРАЛЛЕЛЬНО твоему.
⚠ ПОЧЕМУ ПЕРВЫМ, а не райдером: это ЕДИНСТВЕННЫЙ пункт пака, который реально гейтит «можно ли пускать человека», и он
дешевле остальных. В первой редакции он стоял четвёртым, райдером после трёх денежных пунктов — след того, что состав
вырос из денежного разбора, а не из чтения бэклога. Порядок исправлен 05.09; сессия читает первым то, что первым и надо.
(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 (пустой файл ⇒ интейк УНИЧТОЖАЕТ загрузку — потеря пользовательских данных на первом же шаге) требуют согласования движка и платформы, и потому не взяты ни здесь, ни в платформенном паке. Пропуск подписан сознательно; считаешь иначе — пинг ДО работы. ⚠ Что ещё в райдеры НЕ вошло и почему: строка 283 (структура глав для выдачи) — гейт беты, но это СВОЙ пак и своё окно пере-снапшота; строки 253/273 — швы, требующие согласования с платформой; 256–267 — то, что зона чинит прямо сейчас в незакрытой приёмке прошлого пака.
4-тер. Пять рисков реализации — названы зоной, проверить ОБЯЗАН
(а) защёлка на уровне волны, не у воркера · (б) учёт объёма (volume.go, bound()/reconcile): частичная
волна под потолком — НОВАЯ форма для этих счётчиков, и они уже дважды ловили ложные числа · (в) событие
ceiling и exit 4/paused обязаны сработать так же и не задержаться · (г) дневной потолок делит ветку с
книжным — проверить явно · (д) эскалационный хоп: убедиться, что его деградация не опирается на саму отмену.
⚠ Каждый из пяти предъявляется ЯВНО: в отчёте — команда и её вывод либо посадка и её цвет. «Проверил» без артефакта не считается: это ровно та вырожденная форма, которую канон велит ловить в промтах.
5. Мандат самопроверки ИСПОЛНЕНИЕМ
Батарея + собственные адверсариальные посадки ВНЕ списка автора через cmd/tmmutate (каталог 152
записи — пополняешь). Субагенты РАЗРЕШЕНЫ явно, модель называй имени. Обязательное условие приёмки:
посадка «под потолком волна погасила допущенный вызов» предъявлена КРАСНОЙ.
⚠ SURVIVED не является находкой, пока не показано, что посадка ВООБЩЕ меняет поведение — норма
куплена эквивалентной посадкой оркестратора (обход окна с обратной стороны воспроизводил оригинал).
⚠ Мутации — только на ЗАКОММИЧЕННОМ дереве; на копии — GOFLAGS=-buildvcs=false.
⚠ Каталог гонять ЦЕЛИКОМ: протухшая запись даёт ROTTED и не кладёт прогон.
5-тер. ТРИ ТРЕБОВАНИЯ ВЛАДЕЛЬЦА К ЭТОМУ ПАКУ (05.09) — обязательны, не опция
(а) ПЕРЕД СДАЧЕЙ убедись, что ПРОМТ НАПИСАН ВЕРНО по заказанным доработкам — и НАЗОВИ расхождения. Не «исполнил, что написано», а: сверь свой результат с составом промта пункт за пунктом и скажи, где промт заказал не то, не полностью или противоречиво. ⚠ Это не вежливость и не формальность: за последние сутки промты этого оркестратора трижды уходили на внешнее ревью и трижды возвращались с находками — в последнем проходе среди них были райдер, заказывавший УЖЕ СДЕЛАННОЕ, и пункт, который одновременно требовал добавить поле и запрещал двигать версию, без которой поле не добавляется. Ты читаешь промт последней и видишь то, чего не увидел его автор. Расхождение — в отчёт отдельной секцией, а не в тихую девиацию.
(б) ВОРКФЛОУ-РЕВЬЮ своей работы — обязательная часть сдачи, не «если останется время».
⚠ Замер, ради которого это требование и стоит: платформенная зона 04.09 пустила восемь агентов по
СВОЕЙ готовой работе и нашла больше, чем одиннадцать агентов по чужой. Плотность находок на
собственной работе не ниже, чем на чужой (D39.197). И там же: утверждение о проверке живёт ровно
до следующей правки — гейты гонять ЦИКЛОМ до чистоты, а не одним проходом.
(в) FABLE 5 АГЕНТ-ПОМОЩНИК РАЗРЕШЁН ЯВНО и назван моделью. Поднимай его на трудные развилки, спорные места и на разбор СВОЕЙ готовой работы; веди с ним долгий разговор ОДНИМ агентом, досылая вопросы, а не поднимая нового на каждый — он держит контекст. ⚠ И спрашивай у него не только «что не так», но и «в чём ты сам не уверен и чего не проверял»: этот вопрос за сутки дал больше, чем любой список находок.
6. Предметные оси ревью — ТРИ, и у каждой свой артефакт
⚠ Оси, а не список проверок: у каждой названо, ЧЕМ ты предъявишь результат. Сессия вправе заменить ось с аргументом.
⛔ ВСЕ ТРИ ПРЕДЪЯВЛЯЮТСЯ ЗА $0 — на фейк-клиенте батареи и голдене. Платный прогон в этот пак НЕ входит: он идёт
только по санкции владельца с названным потолком, и промт её не даёт.
· Деньги под параллельностью. Артефакт: прогон с waves.workers > 1 и потолком, которого хватает
на часть волны — леджер до и после, показывающий, что допущенное доработано, а новое не начато.
· Детерминизм резюме после частичной волны. Артефакт: прогон, остановленный деньгами, и его
резюм — совпадение чекпойнтов и отсутствие пере-оплаты доработанного.
· Шов наружу. Артефакт: событие ceiling с недостающей суммой, прочитанное СО СТОРОНЫ ПОТРЕБИТЕЛЯ
(не из своего кода), и версия потока, сдвинутая по правилу шва.
6-бис. ОБЯЗАТЕЛЬНОЕ ДЛЯ КОДОВОГО ПРОМТА — пять строк канона
· Перед отчётом сверь КАЖДЫЙ клейм с результатом инструмента ЭТОЙ сессии. Не с памятью и не с тем,
что было верно вчера.
· Последний абзац отчёта — план или обещание? Сделай это СЕЙЧАС, а не пиши как намерение.
· Править или удалять тест/голден/гейт ради зелени — НЕДОПУСТИМО. Несогласие с тестом — пинг, не
правка. ⚠ Запрет про МОТИВ (D39.183): правка, вызванная сменой поведения, которая ЗАКАЗАНА этим
промтом, — обслуживание, и держать протухший тест не нужно; такая правка ОБЪЯВЛЯЕТСЯ в отчёте — что
изменилось в поведении, какой тест это описывал, куда уехала гарантия.
· Дифф ^func Test — ИСПОЛНЕНИЕМ, не по памяти: приложи вывод, а не утверждение «тестов стало больше».
· Интервальная самоверификация субагентом в длинной сессии, против ЯВНЫХ критериев, а не «посмотри,
всё ли хорошо».
7. Записка-план ДО работы
Комплектность против заказа — механически, таблицей: пункт → файл → тест → посадка. До первой правки.
8. Заявление = команда
Каждое число и каждая категорика отчёта — с командой получения. Приёмка пере-ранит. ⚠ Отрицательное утверждение («такого пути нет») выводится ТОЛЬКО из названного грепа, и команда приводится в тексте: за сутки трижды ловили отрицания, выведенные из команд, которые не сработали.
9. Эхо-протокол старта
≤10 строк «скоуп / инварианты / не-делать» ДО работы — в прямой канал, первым действием.
10. Obstacle reporting
Обязательная секция отчёта: что НЕ удалось, что не проверено, что осталось гипотезой. ⚠ Отчитаться о баге не значит его сдать — норма куплена вчера: найденное и не починенное не превращается в долг решением о темпе.
11. Канал вопросов
Конфликт промта с кодом или доками — пинг, не интерпретация. Право сказать «этого делать не надо» с аргументом — есть, и им пользуются: за сутки зона трижды опровергла оркестратора по существу.
12. Прямой канал
Механизм — CLAUDE.md §«Связь между сессиями». Впиши свой блок первым делом; адрес оркестратора бери
оттуда же и сверяй ListAgents перед отправкой. Канала нет ⇒ НЕ искать, вопрос секцией в отчёт.