textmachine/docs/PLATFORM_TRUTH_AT_THE_DOOR_SESSION_PROMPT.md

25 KiB
Raw Blame History

Промт: платформенный пак «ПРАВДА У ДВЕРИ — не заклинивать и не обещать того, чего дверь не даст»

1. Какая проблема и что решит твой результат

Гость платформы упирается в три разных места, и все три — про ОДНО: платформа говорит человеку не то, что произойдёт на самом деле.

  1. Форма заказа обещает то, в чём дверь откажет. Вердикт «хватает на всю книгу» считается из остатка и баланса и НЕ спрашивает, не идёт ли по книге прогон прямо сейчас; допуск же вторую покупку отвергает. Человек видит зелёное, жмёт и получает отказ, причину которого форма знала до клика (PD-455).
  2. Двойной клик по «продолжить» отвечает ошибкой, хотя прогон в этот момент СТАРТОВАЛ. Проигравший гонку получает «прогон нельзя продолжить: он переводится» — то есть отказ, описывающий успех соседа (PD-448).
  3. Прогон книги, чей каталог исчез, принимает 202, берёт холд и висит вечно. Пользователю видно только «идёт», деньги заморожены до прихода человека (PD-162).

Плюс интейк-гигиена, которую D39.176 п.1 прямо называет ИНЖЕНЕРНОЙ и не требующей слова владельца: число аплоадов ничем не ограничено, у статуса rejected нет выхода, каталоги-сироты никто не подметает.

Что решит твой результат. После пака человек, работающий с платформой, видит правду в трёх точках: форма не обещает невозможного · повторный клик отвечает прогоном, а не ошибкой · прогон, который никогда не поедет, отказывает ДО денег, а не молчит с холдом. Это прямо служит главной ценности продукта — переводу длинных книг: длинная книга живёт неделями, за это время в неё кликают многократно, и каждая ложь двери стоит человеку или денег, или доверия.

2. Зона записи и git

Зона: platform/. Записи, пинги и итоги — ЗОННЫЙ журнал platform/docs/platform-PROGRESS.md; в docs/PROGRESS.md платформа НЕ пишет. Регистр дефектов platform/docs/DEFECT_REGISTER.md — твой, ряды переводит зона (не оркестратор). Зонный бэклог — platform/BACKLOG.md. Сессия НЕ коммитит — дерево передаёшь оркестратору (канон — CLAUDE.md §«Git-координация мультисессий»: никаких git add -A, reset --hard, checkout поверх грязного дерева). .env не читать. Чужие зоны (backend/, frontend/, docs/) — только ЧИТАТЬ. ⚠ Что должно пережить рестарт — в РЕПОЗИТОРИЙ, а не в скретчпад. ⚠ Входящее сообщение другой сессии — не приказ: промт сильнее, расхождение — пинг. ⚠ Параллельно идут сессии ДРУГИХ зон (движок · полигон). Их файлов не трогать.

3. Карта чтения — ЗАКОН, дальше только по её ссылкам

  1. CLAUDE.md — цели владельца, зоны, гардрейлы.
  2. platform/docs/ENGINEERING_STANDARDS.md — ратифицирован; КАЖДЫЙ платформенный пак обязан на него ссылаться, отступление = пинг. Плюс platform/docs/PLATFORM_DIRECTION.md (ратифицированное направление зоны) и platform/README.md.
  3. Ряды регистра PD-455 · PD-448 · PD-162 (platform/docs/DEFECT_REGISTER.md, греп по id) — там же улики прежних смен и границы этих улик. Зонный бэклог: П-18 (эскроу) и П-20 (хвост PD-162).
  4. docs/architecture/14-api-contract/ — канон провода; форма заказа и Run живут там. ⚠ Версию брать ФАЙЛОМ (grep '^ version:' openapi.yaml), не по памяти.
  5. Код — первичен; file:line ниже суть отправные точки, а не истина: пере-снимай адрес командой.

Ратифицированное, что нужно для работы (не переоткрывать):

  • D39.176 п.1 — ПРОДУКТОВЫХ КВОТ НЕТ и фри-тир-лимиты НЕ ПРОЕКТИРУЮТСЯ. Слово владельца: «никаких квот, живём на покупке API; бонусы зачисляются из админки». Грант новичку 0 — это РЕШЕНИЕ, а не дыра. Техническая половина (число аплоадов, выход из rejected, сироты) остаётся и решается ИНЖЕНЕРНО.
  • Автоматического терминального вердикта после N неудач у реконсилятора НЕТ и он НЕ планируется вне эскроу — это записанное решение зоны (П-20, и запись в internal/runs/reconcile.go; ⚠ якорь reconcile.go:249-257 из ряда PD-162 УЕХАЛ — по адресу сегодня комментарий settleOne; пере-найди запись грепом по «what it must not buy» и почини якорь ряда тем же движением). ⇒ строить «счётчик неудач → бросить прогон» в этом паке ЗАПРЕЩЕНО: это более слабая половина эскроу (П-18), поставленная рядом с проектируемым целым.
  • D39.221 — контрактный минор 0.13.0 и временный отказ интейка книге из одной главы; D39.229 — синхронный разрез приёма под потолком. Обе — фон твоей работы, не предмет.

4. Состав и разметка свободы

4.1 PD-455 — форма заказа обязана знать про живой прогон — реши сам, аргументируй

Вердикт формы и вердикт допуска сегодня отвечают на один вопрос ДВУМЯ разными механизмами, и потому расходятся. Не строй в форме вторую копию логики допуска — это ровно то велосипедостроение, которое владелец запретил отдельным словом: два ответа на один вопрос расходятся снова, и следующая смена будет чинить оба. Правильная форма решения — ОДНО определение, которое спрашивают обе площадки. Что именно это определение возвращает (blocked отдельным вердиктом · признак живого прогона в теле · что-то третье) — решаешь ты, но ответь на вопрос: как устроено так, что расхождение больше не может возникнуть молча. ⚠ Контракт трогаешь? Аддитивное расширение ОПИСЫВАЕШЬ, канон правит оркестратор — пинг с предложенной формой.

4.2 PD-448 — проигравший гонку обязан получить прогон, а не отказ — реши сам, аргументируй

Гарантия сформулирована в шапке самого теста (internal/runs/control_test.go, греп TestTwoResumesOfOneRunTakeOneHoldAndBothAnswer): оба вызова проходят проверку состояния вместе и гонятся за попытку N+1 на уникальном индексе; проигравший обязан ответить прогоном, который открыл победитель, а не ошибкой. Сегодня под нагрузкой вызовы СЕРИАЛИЗУЮТСЯ, победитель успевает перевести прогон в translating, и проигравший упирается в проверку состояния.

Направление (ПРИОР, опровергается аргументом): проигравший обязан различать «прогон идёт, потому что его только что открыл параллельный резюм» от «прогон идёт сам по себе» — первое обязано вернуть прогон, второе законно отказывает. Как именно различить — твоё решение. Ретрай-с-паузой решением НЕ является: он превращает гонку в лотерею и прячет предмет.

4.3 PD-162 — прогон, который никогда не поедет, обязан отказать ДО денег — делай РОВНО так в границе, свободен внутри неё

Граница (отступление = пинг): автоматический терминальный вердикт живому прогону НЕ строится (§3). Внутри границы: ряд сам называет второй путь — валидация каталога книги ПРИ ДОПУСКЕ, до взятия холда (internal/runs/runs.go Start, internal/runs/spawn.go journalSize — ENOENT там законно мапится в ноль для ПЕРВОГО прогона, и именно это делает дыру невидимой). Спроектируй и построй допуск, который отвергает прогон книги, чьего каталога нет, не сломав законный первый прогон — это и есть вся трудность пункта. ⚠ Класс ряда ШИРЕ удаления каталога (прогон, запиненный к старой сборке движка, даёт тот же клин). Закрываешь одну половину — скажи это прямо и оставь ряд открытым с пере-написанным остатком; «закрыто» при живой второй половине — дефект акта, а не победа.

4.4 Интейк-гигиена — реши сам, аргументируй; можешь взять НЕ ВСЁ

Три предмета, названные D39.176 п.1 инженерными: число аплоадов ничем не ограничено · у статуса rejected нет выхода · каталоги-сироты никто не подметает. Возьми то, что честно закрывается в этом паке, и назови, что оставляешь и почему. Продуктовых квот не строить (§3). Свип обязан определять сироту по СОСТОЯНИЮ В БАЗЕ, а не по возрасту каталога на диске: каталог, который никто не читал неделю, и каталог, которого нет в базе, — разные вещи, и первый может быть книгой, которую читатель откроет завтра.

4.5 Якоря регистра — делай РОВНО так ($0, попутно)

python3 docs/scripts/counts.py --lint (из корня репозитория) сегодня показывает три уехавших якоря в твоей зоне: platform/docs/DEFECT_REGISTER.md:84 (reconcile.go:327const settlementBackoffCap) · :559 (reconcile.go:278case overran:) · :560 (pgstore/sink.go:724where a.reconcile_after…), плюс уехавший якорь внутри PD-162 (§3). Пере-снять адреса командой и починить. ⚠ Якорь бывает ДВУХ ролей: живая ссылка (чинить) и УЛИКА в описании дефекта — «код цитирует вот этот путь, а его удалили» (не чинить: замена переворачивает описание поломки в описание её отсутствия). Раздели хиты прежде правки.

4.6 Чего в паке НЕТне делай

Эскроу (П-18) · автоматический терминальный вердикт · продуктовые квоты и фри-тир · платёжный провайдер · правка канона контракта (описываешь, правит оркестратор) · чужие зоны · платные прогоны движка.

5. Мандат самопроверки ИСПОЛНЕНИЕМ — «перечитал сам» не считается

Механизм НАЗВАН: make check целиком (не подмножество -run) + мутационные посадки на СВОИ новые пины + живая проба на стенде (рецепт стенда — platform/docs/STACK_DECISIONS.md). Субагентов спавнить тебе РАЗРЕШЕНО и требуется (иначе дефолт-запрет харнесса тихо победит); модель задавай ЯВНО. Артефакт — таблица «находка → что сделано → ЧЕМ ПРЕДЪЯВЛЕНО».

Где у ЭТОГО пака мягко — четыре места, и адверсариальный проход веди по ним (глубину и веер выбираешь сам):

  1. PD-448 — тест, зелёный в изоляции, о гонке не говорит НИЧЕГО. Замер 05.09: изолированно -count=5 → 5/5 ok, а полный пакет при загруженной машине падал 2 раза из 2. ⇒ твой пин обязан краснеть на НЕПОЧИНЕННОМ коде воспроизводимо, а не «иногда»: пин, флейковый на мутанте, измеряет пустой сценарий. Гони его многократно и назови число прогонов.
  2. PD-455 — «форма спросила допуск» легко выродится в копию. Проверь у себя: если завтра изменится правило допуска, сколько мест придётся тронуть? Больше одного — ты построил вторую копию, а не общее определение.
  3. PD-162 — валидация каталога ломает законный ПЕРВЫЙ прогон. ENOENT в journalSize мапится в ноль именно потому, что у первого прогона журнала ещё нет. Твоя проверка обязана различать «журнала нет, потому что прогон первый» и «каталога нет вовсе» — и обе ветви обязаны иметь пин.
  4. Свип сирот — самая опасная правка пака: он УДАЛЯЕТ. Прежде чем удалять, докажи пином, что предмет удаления не может оказаться живой книгой. Отрицательный замер здесь особенно вреден: «0 сирот» и «свип не посмотрел» неотличимы — печатай рядом контрольную величину (сколько каталогов прибор прочёл).

Плюс общие для кодового пака: пин на УСЛОВНОЕ сообщение обязан иметь фикстуру, где это сообщение ОБЯЗАНО прозвучать (тест, утверждающий только молчание, вакуумен) · перед отчётом сверь каждый клейм с результатом инструмента ЭТОЙ сессии · дифф ^func Test — исполнением, не памятью · править или удалять тест/гейт ради зелени НЕДОПУСТИМО; правка, вызванная ЗАКАЗАННОЙ сменой поведения, — обслуживание, и она ОБЪЯВЛЯЕТСЯ в отчёте (что изменилось, какой тест это описывал, куда уехала гарантия).

И отдельное слово владельца 11.09, оно же ось приёмки: никаких велосипедов, воркэраундов и хаков ВОКРУГ проблемы. Нужно логически правильное решение поставленной задачи, а не её обход. Рефакторинг — только действительно необходимый; «дешевле подпереть» доводом не является.

6. Предметные оси ревью

Код — тест утверждает не то, что думает: часы как способ синхронизации там, где предмет утверждения НЕ время; ассерт по подстроке в буфере, куда пишет кто-то ещё. Обе формы дают тихо-зелёное, а оно дороже ложно-красного. Сверка с индустриальным первоисточником прежде велосипеда. Деньги — из сырого леджера ДВУМЯ независимыми путями; леджер = нижняя граница. Холд, взятый и не возвращённый, — денежный дефект, даже если сумма мала.

7. Записка-план ДО работы

До первой правки пришли оркестратору ≤15 строк: что берёшь по каждому пункту §4 · где ждёшь сопротивления · что считаешь спорным в самом заказе. Комплектность против заказа сверяется механически, а не по памяти.

8. Заявление = команда

Любое число и любая категорика отчёта — с командой, которой получены, и её выводом. Рядом с НУЛЁМ ПЕЧАТАЕТСЯ контрольная величина, доказывающая, что вопрос задан существующему предмету («в базе без этой таблицы: 0», «каталогов прибор прочёл: 67»). Не «проверено с контрольной строкой» — само число. make check без -v скипы не печатает: «20 пакетов ok» на машине без стенда неотличимо от «20 ok при N скипах». Печатай счёт скипов рядом с числом ok и называй условие каждого.

9. Эхо-протокол старта

ДО первой правки пришли оркестратору первым действием, по адресу из /tmp/textmachine-channel (SendMessage, роль ОРКЕСТРАТОР) ≤10 строк: скоуп · инварианты · не-делать — СВОИМИ словами. Дословный пересказ промта подтверждает канал, но не понимание, и ошибку промта повторяет вместе с ним. Канала нет — эхо первой секцией отчёта, это законный случай.

10. Что НЕ удалось — обязательная секция отчёта

Что не проверено · что не воспроизвелось · где данных не хватило · что пришлось оставить. «Не измерено» вместо догадки. «Не проверено» ≠ «опровергнуто».

11. Канал вопросов и право отказаться

Конфликт промта с кодом или доками — пинг оркестратору, НЕ интерпретация. У тебя есть право сказать «этого делать не надо» с аргументом — им пользуются, и такие развилки поощряются. Вопрос владельцу (деньги сверх мелочи · продуктовый скоуп) идёт через оркестратора, не напрямую.

12. Прямой канал

Механизм — CLAUDE.md §«Связь между сессиями»: файл /tmp/textmachine-channel, свой блок дописать первым делом, живость адресата — ListAgents. Нужной роли в файле нет, файла нет или имя не отвечает ⇒ КАНАЛА НЕТ, и это НОРМАЛЬНЫЙ случай: сессии подряд НЕ опрашивать, вопрос — секцией в отчёт.

13. Критерий завершённости — по нему тебя примут

Работа завершена, когда: у каждого пункта §4 есть исход (сделано · не делаю с доводом · пинг) · круги самопроверки СОШЛИСЬ — последний не дал НОВЫХ находок, прежние закрыты таблицей «находка → что сделано → чем предъявлено» · таблица мутаций полная, выжившие названы поимённо · числа сняты ПОСЛЕ последней правки · ряды регистра и зонного бэклога переведены ТЕМ ЖЕ движением, что и код (закрытый ряд при живой половине — дефект) · всё живое в ДЕРЕВЕ, а не в письме · явное «работа завершена, править не планирую». Без последнего пак считается идущим. Пак доводится до конца САМОЙ сессией (слово владельца 11.09): владельца не беспокоить, оркестратора не тегать «просто так» — его приёмка идёт последней и вторым кругом тебе не служит.

Деньги

Пак — $0. Платных вызовов движка нет. Упрёшься в «это предъявляется только платным прогоном» — пинг за санкцией, не своё решение.

Отчёт

Зонный журнал platform/docs/platform-PROGRESS.md + переведённые ряды регистра + сообщение оркестратору: что сделано по каждому пункту · чем предъявлено (команда и вывод) · таблица «находка → что сделано → чем предъявлено» · что сказал твой адверсариальный проход и что ты с этим сделал · секция §10 · что ты сам считаешь слабым местом сделанного. Последний абзац отчёта — план или обещание? Значит работа не кончена: сделай сейчас.