diff --git a/docs/CONTRACT_MINOR_SESSION_PROMPT.md b/docs/CONTRACT_MINOR_SESSION_PROMPT.md index e65ca112..f35fc82e 100644 --- a/docs/CONTRACT_MINOR_SESSION_PROMPT.md +++ b/docs/CONTRACT_MINOR_SESSION_PROMPT.md @@ -34,7 +34,7 @@ $0-глагол со своим словарём, кодами отказа и ## §1. Зона записи и git **Твоя зона — РОВНО два файла:** `docs/architecture/14-api-contract/openapi.yaml` (канон) и -`docs/architecture/14-api-contract/README.md` (компаньон). Плюс отчёт — см. §9. +`docs/architecture/14-api-contract/README.md` (компаньон). Плюс отчёт — `docs/CONTRACT_MINOR_REPORT.md`, его состав в §11. - **Ты НЕ коммитишь.** Дерево готовишь и сдаёшь; лендит оркестратор. Канон — `CLAUDE.md`. - **`platform/` и `frontend/` не трогать ничем**, даже одной строкой. Почему это названо отдельно — @@ -57,7 +57,16 @@ $0-глагол со своим словарём, кодами отказа и короткий лозунг «входной словарь = выходной» про него НЕВЕРЕН. Это твой источник тела двери. 4. **`backend/internal/pipeline/bankdecisions.go`** — форма отчёта (`BankDecisionsReport`) и шесть исходов; `backend/cmd/tmctl/main.go:69-75` — полоса отказов 10–19. -5. **Ратифицированное, что бьёт всё остальное, вложено сюда** (§3.0) — грепать D-лог не требуется. +5. **Две ратифицированные НОРМЫ — читать обе, они короткие и обе про твой предмет:** + `docs/architecture/18-bank-ontology.md` (69 строк, ратифицирована **D39.158**) — три роли носителей, + единственные писатели и **дисциплина проекции**; `docs/README.md` называет её обязательным + пре-чтением перед всем, что трогает банк или его артефакты, и твоя дверь — ровно это. Из неё же + растут §3.2 (машиночитаемый признак «не построено») и §6 ось 3. + `docs/architecture/17-seam-inbound-law.md` (ратифицирован **D39.156**) — закон входной двери шва, + семь пунктов дисциплины; на его **п.4** ссылается §3.2, когда говорит про громкий отказ на + неизвестное поле, и на **п.6** — §3.0. + +⚠ Прочее ратифицированное вложено в §3.0 — грепать журнал решений не требуется. ## §3. Состав пака @@ -116,8 +125,8 @@ $0-глагол со своим словарём, кодами отказа и - **Конверт документа — тоже словарь, и его нельзя изобретать заново:** `decisions_version` со значением `tm-bank-decisions-v1` (`decisions.go:47`) · `book_id` **обязателен и сверяется с книгой** (`:142`), потому что решения — единственный вход, несущий слова пользователя в чужую книгу незаметно - для даунстрима · **неизвестное поле — громкий отказ** (`DisallowUnknownFields`, `:133`), зеркало - п.4 закона шва. + для даунстрима · **неизвестное поле — громкий отказ** (`DisallowUnknownFields`, `:133`) — зеркало + **п.4 закона входной двери шва** (`docs/architecture/17-seam-inbound-law.md`, позиция 5 карты). - **Два потолка, оба объявляются:** **1 МиБ** на чтение документа и **5000 решений на один акт** (`bankdecisions.go:647`, `maxDecisions`; за ним — отказ КЛАССОМ 14 с текстом «split it», потому что дальше вызов перестаёт влезать в таймаут вызывающего и умирает на каждом ретрае). Опубликованная @@ -137,6 +146,12 @@ $0-глагол со своим словарём, кодами отказа и пер-термная модель, вернувшаяся через чёрный ход тем же минором, который её сносит. **Публикуешь поле — публикуешь и запрет; не готов опубликовать запрет — не публикуй поле.** +**Отправные точки модели ошибки — держи их под рукой прежде, чем раскладывать коды:** конверт отказа +— схема `Problem` (`openapi.yaml:2395`, RFC 9457 плюс расширения); **машинный идентификатор — `code`** +(`:2432`), его словарь — `ErrorCode` (`:2462`); `errors[]` (`:2444`) несёт, ЧТО именно в запросе не так, +и его несёт `invalid_request`. Согласовывать дверь надо с ЭТИМ конвертом — §6 ось 1 будет судить +именно по нему. + **Твоя свобода и твой аргумент:** форма HTTP-поверхности (один `POST` с документом целиком против чего-либо иного), имена схем, как ложатся коды 10–19 на статусы HTTP, как выражается `--dry-run`. **Решай сам и обоснуй в отчёте.** Совет, опровергаемый аргументом: код **14** — это НЕ ошибка сервера, @@ -144,8 +159,9 @@ $0-глагол со своим словарём, кодами отказа и документ», и оба заслуживают различимости на проводе, а не общего `400`. ⚠ **Дверь объявляется, но платформой ещё НЕ обслуживается** — её смонтирует пак (2в). Прецедент того, -как контракт честно объявляет непостроенное, в каноне уже есть: `Capabilities.ExportFormats`, пустой -список = «здесь не построено», и это названо честным ответом. **Машиночитаемый признак «здесь не построено» ОБЯЗАТЕЛЕН — свободна только его ФОРМА.** Без него +как контракт честно объявляет непостроенное, в каноне уже есть: **`export_formats`** в `Capabilities` +(`openapi.yaml:1222` и `:1250` — ⚠ в каноне поле именно в snake_case; греп по Go-имени `ExportFormats` +даёт там ноль), пустой список = «здесь не построено», и это названо честным ответом. **Машиночитаемый признак «здесь не построено» ОБЯЗАТЕЛЕН — свободна только его ФОРМА.** Без него пак объявит голую необслуживаемую дверь и воспроизведёт `PD-370` тем же коммитом, которым его закрывает: «канон объявляет — деплой не обслуживает» и есть содержание той строки. Разберись, годится ли `Capabilities` для двери; если нет — назови почему и предложи замену, но не отсутствие. @@ -199,7 +215,7 @@ surface». Допиши предупреждение: отказ от повер до пака (2в). Написать новую семантику в канон и поднять константу значит объявить `0.5.0` у деплоя, который обслуживает прогресс по-старому, — ровно та ложь, против которой гейт и стоит. -**Мой разбор, который владелец может отменить:** прежнее «одним куском» покупалось тем, что иначе +**Разбор, ратифицированный владельцем 27.08 (D39.160):** прежнее «одним куском» покупалось тем, что иначе фронт перегенерируется дважды. **Фронт ЗАМОРОЖЕН**, и его зеркало отстаёт ратифицированно — при разморозке он перегенерируется ОДИН раз независимо от того, сколько миноров прошло. Значит цена разделения сегодня равна нулю, а цена объединения — деплой, врущий о своей версии. Поэтому прогресс @@ -230,10 +246,12 @@ surface». Допиши предупреждение: отказ от повер platform` даёт постоянный красный того же теста по другой причине, и вердикт будет ложным — норма зоны платформы, `ENGINEERING_STANDARDS` §3 п.3. -**Субагенты РАЗРЕШЕНЫ явно** (харнесс по умолчанию их не берёт, и без этого разрешения запрет тихо -побеждает): бери отдельного агента-опровергателя на §3.2 — он получает твоё предложение двери и -словарь из кода, мандат «найди, где предложенное тело расходится со словарём глагола». Его находки — -в отчёт, включая те, что ты отверг, и с причиной. +**Опровергатель на §3.2 — ЗАКАЗ, а не право** (разметка исправлена 27.08: прежняя редакция писала +«разрешены», а §11 требует его находок в отчёте — без него отчёт некомплектен, и это был заказ, +размеченный как разрешение). **Субагенты тебе РАЗРЕШЕНЫ явно** — харнесс по умолчанию их не берёт, +и без явного разрешения запрет тихо побеждает. Опровергатель получает твоё предложение двери и +словарь из кода, мандат — «найди, где предложенное тело расходится со словарём глагола». Его +находки — в отчёт, включая те, что ты отверг, и с причиной. ⚠ **Соразмеряй веер заранее:** 2–4 агента, не больше. Панель на полтора десятка агентов на этой машине убивает сама себя, и это уже стоило проекту находок. @@ -251,7 +269,9 @@ surface». Допиши предупреждение: отказ от повер ## §7. Записка-план и комплектность -**До правок** выложи записку-план: что меняешь, где, чем проверишь. **В конце** — механическая сверка +**До правок** СОЗДАЙ файл отчёта `docs/CONTRACT_MINOR_REPORT.md` и первой же секцией положи в него +записку-план: что меняешь, где, чем проверишь. Файл ведёшь по ходу работы, а не собираешь в конце — +так оркестратор видит план ДО правок, и так секции §9/§10 не пишутся задним числом по памяти. **В конце** — механическая сверка комплектности против §3 таблицей: пункт заказа → что сделано → каким исполнением подтверждено. Пункт, по которому в колонке «исполнение» стоит слово, а не команда, считается НЕ сделанным. @@ -274,9 +294,21 @@ surface». Допиши предупреждение: отказ от повер ## §11. Канал вопросов Конфликт промта с кодом или доками — **пинг оркестратору через владельца, НЕ интерпретация в свою -пользу и НЕ обход**. Отчёт и вопросы пиши в `docs/PROGRESS.md`? — **нет**: у контрактной сессии зонного -журнала нет, поэтому отчёт кладёшь **отдельным файлом `docs/CONTRACT_MINOR_REPORT.md`**, а оркестратор -переносит существенное в журнал и в ноту при лендинге. +пользу и НЕ обход**. **Где твой отчёт.** У контрактной сессии зонного журнала НЕТ, и в `docs/PROGRESS.md` ты не пишешь — +это зона оркестратора. Отчёт кладёшь ОТДЕЛЬНЫМ новым файлом **`docs/CONTRACT_MINOR_REPORT.md`**; +существенное из него в журнал и в ноту переносит оркестратор при лендинге. + +**Что ты сдаёшь — состав дерева на лендинг:** +1. `docs/architecture/14-api-contract/openapi.yaml` — правленый канон, версия `0.5.0`. +2. `docs/architecture/14-api-contract/README.md` — правленый компаньон. +3. `docs/CONTRACT_MINOR_REPORT.md` — новый: эхо-протокол (§9) · записка-план и таблица комплектности + (§7) · обоснование формы двери и её схем (§3.2) · решение по счётчикам (§3.2-бис) · выводы всех + трёх исполнений самопроверки С КОМАНДАМИ (§5) · находки опровергателя, включая отвергнутые с + причиной · секция obstacle (§10). +4. **Ничего больше.** Ни одного файла в `platform/`, `frontend/`, `backend/` или `eval/`. + +Сдача = сказать оркестратору «готово» и назвать этот состав. Коммитит он; `git status` перед сдачей +прогони и убедись, что в дереве нет твоих файлов вне списка. ⚠ **Тесты и гейты не подгонять под зелень.** Гейт платформы обязан покраснеть — это ожидаемое поведение, описанное в §4, а не повод его править. Несогласие с гейтом — вопрос, не правка.