diff --git a/docs/CONTRACT_MINOR_SESSION_PROMPT.md b/docs/CONTRACT_MINOR_SESSION_PROMPT.md new file mode 100644 index 00000000..c6ff0e8c --- /dev/null +++ b/docs/CONTRACT_MINOR_SESSION_PROMPT.md @@ -0,0 +1,267 @@ +# Промт: контрактная сессия, минор 0.4.0 → 0.5.0 — снос отменённой модели и дверь, выведенная из глагола + +> **Выдан оркестратором №19, 27.08.2026.** Порядок работ по шву ратифицирован **D39.156**; этот пак — +> пункт (2б) очереди, и он идёт ПОСЛЕ движкового пака, который закончен и заленджен 27.08 (**D39.158**, +> коммит `d1eb8a9`). Это существенно: тело новой двери больше не сочиняется — оно ВЫВОДИТСЯ из словаря +> уже работающего глагола. + +## §0. Какая проблема и что решит твой результат + +Контракт `docs/architecture/14-api-contract/` — единственный ратифицированный договор между фронтом и +платформой. Сегодня он **лжёт в двух местах и молчит в одном**, и цена лжи не абстрактная. + +**1. Канон описывает дверь, которой нет и не будет.** 16.08 владелец отменил пер-термную модель +подписи банка памяти: подписывается ВЕСЬ банк одним «ОК», а пер-термно существует не подпись, а +ПРАВКА термина. Зона платформы снесла свою половину 22.08 — маршрут, хендлер, wire-типы. **Канон свою +половину не снёс**: путь `POST /books/{bookId}/bank/decisions`, глагол `submitBankDecisions` и три +схемы стоят в 0.4.0 как действующие. Следствие сегодня: клиент, сгенерированный по канону, получит +404 на ручке, которую канон объявляет обязательной, а деплой обслуживает на одну ручку меньше, чем +декларирует. Носитель — `PD-370`, вес **major**, зонная половина закрыта, контрактная открыта. + +**2. Канон не предупреждает о конверте вне `/v0`.** Он говорит только «Signing in is not part of this +surface» (`openapi.yaml:35-36`), а компаньон описывает поверхность `/auth` в §2.14. Отказ оттуда может +прийти БЕЗ обязательного поля `code`, и сгенерированный по канону клиент об это спотыкается. Носитель +— строка бэклога **203**, пункт **(а)** — ⚠ проверь букву своим грепом, в первой редакции этого промта стояла «(е)», и это была моя ошибка чтения. У строки открыт ещё пункт **(к)** (владение `project_db` в `book.yaml`) — он в этот пак НЕ входит. + +**3. Двери для правок банка в контракте нет вовсе.** Движок её теперь имеет: `tmctl bank-apply` — +$0-глагол со своим словарём, кодами отказа и отчётом. Платформе нечего объявлять фронту, потому что в +каноне такой поверхности не существует. + +**Что решит твой результат.** После пака канон перестаёт обещать несуществующее, начинает +предупреждать о конверте и объявляет дверь правок банка в форме, выведенной из глагола движка, — так +что платформенный пак (пункт 2в очереди) реализует объявленное, а не изобретает своё. + +## §1. Зона записи и git + +**Твоя зона — РОВНО два файла:** `docs/architecture/14-api-contract/openapi.yaml` (канон) и +`docs/architecture/14-api-contract/README.md` (компаньон). Плюс отчёт — см. §9. + +- **Ты НЕ коммитишь.** Дерево готовишь и сдаёшь; лендит оркестратор. Канон — `CLAUDE.md`. +- **`platform/` и `frontend/` не трогать ничем**, даже одной строкой. Почему это названо отдельно — + §4: там лежит ровно одна строка, которую хочется поправить, и правит её оркестратор при лендинге. +- **`frontend/src/api/` — зеркало контракта, оно отстаёт РАТИФИЦИРОВАННО** (зона заморожена D39.147, + сверка `cmp` при разморозке). Версию оно не хардкодит — проверено грепом; трогать нечего. +- В дереве живёт незакоммиченная работа зоны полигона (20 позиций, `eval/` + `START_PROMT.MD`) и + возможны другие параллельные сессии. **Чужих файлов не касаться, `git add -A` не существует.** + +## §2. Карта чтения — ≤5 позиций, и она ЗАКОН + +Дальше — только по ссылкам отсюда. README проекта, CURRENT-STATE и голову журнала решений читать НЕ +нужно: ратифицированное вложено в тело этого промта. + +1. **`docs/architecture/14-api-contract/README.md`** — компаньон, 1414 строк. Он и есть карта канона: + читается целиком, объясняет, ЗАЧЕМ канон устроен так. Начни с него, не с YAML. +2. **`openapi.yaml`, только нужные места** — 2592 строки, целиком НЕ читать. Отправные точки в §3. +3. **Словарь глагола — в КОДЕ, и он первичен:** `backend/internal/membank/decisions.go`, комментарий + к типу `Decision` (строки 55–120). Он написан развёрнуто НАРОЧНО и прямо предупреждает, что + короткий лозунг «входной словарь = выходной» про него НЕВЕРЕН. Это твой источник тела двери. +4. **`backend/internal/pipeline/bankdecisions.go`** — форма отчёта (`BankDecisionsReport`) и шесть + исходов; `backend/cmd/tmctl/main.go:69-75` — полоса отказов 10–19. +5. **Ратифицированное, что бьёт всё остальное, вложено сюда** (§3.0) — грепать D-лог не требуется. + +## §3. Состав пака + +### §3.0. Ратифицированное, из чего исходишь (не пере-открывать, конфликт — пингом) + +- **D39.144 (16.08, слово владельца):** подписывается ВЕСЬ банк ОДНИМ «ОК». «Пер-термная подпись — + сотни кликов — НЕ модель продукта». Пер-термно существует ПРАВКА термина. +- **D39.158 (27.08):** стоп банка — ФЛАЖОК, который движок чтит сам; «ОК» = возобновление. Дверь + правок — `tmctl bank-apply`: проекция `--dry-run`, всё-или-ничего, байтовый no-op идемпотентен. +- **D39.156 п.6:** платформа НЕ пере-реализует движковый закон у себя. +- **Полоса отказов [10,19]** — ратифицированная: 10 конфиг · 11 источник · 12 лок · 13 схема · + **14 решения отклонены (законный отказ, пользователь ПЕРЕ-решает)** · **15 write_incomplete + (документ принят, запись не довершена — слать ТОТ ЖЕ документ)** · 19 без имени. +- **Версионирование канона:** semver; пока мажор `0`, различающийся МИНОР несёт ломающие изменения по + замыслу. Клиент обязан игнорировать неизвестные поля и терпеть неизвестные enum-значения. + +### §3.1. Снести отменённую модель — делай РОВНО так + +Носители пере-сняты мной грепом 27.08, числа в строке `PD-370` («~17 мест + ~8») — ОЦЕНКА, не замер; +доверяй своему грепу, не строке. **Канон, 9 позиций:** `469` (путь) · `474` (`operationId`) · `495` +(запрос) · `501` (ответ) · `1830` (проза, ссылающаяся на путь) · `1939` (`BankDecision`) · `1980` +(`BankDecisionsRequest`) · `1990` (ссылка на элемент) · `1992` (`BankDecisionsResult`). +**Компаньон, 5 позиций:** `124` · `674` · `685` · `724` · `1173`. + +⚠ **`674` — уже зачёркнутая строка таблицы** («~~`POST /bank/decisions`~~»), а не действующее +описание: прочти её целиком прежде, чем править, — там может стоять запись, которую снос обязан +СОХРАНИТЬ как историю, а не стереть. + +**Свой греп обязателен**: мой шаблон ловил четыре имени, и позиция, названная иначе, в него не попала +бы. Пере-проверь ещё и по `dst`, `UnknownTermError`, `BankPage`. + +### §3.2. Объявить дверь правок банка — реши САМ, аргументируй + +Тело выводится из словаря глагола (позиция 3 карты чтения). **Что словарь говорит буквально:** + +- Два действия: `approve` и `decline`. Больше нет. +- Идентичность термина — ЛИБО стабильный `id` из читаемого банка, ЛИБО кортеж + `src`/`sense`/`since_chapter`/`until_chapter`, из которого id выводится. **Взаимоисключающе**, и + причина названа в коде: принять оба значит позволить назвать два разных термина одним решением. +- ⛔ **Кортеж — это НЕ второй способ назвать существующее. Это форма, которой терм ДОБАВЛЯЕТСЯ** + (`decisions.go:94-96`: «the form in which a term the bank does not have yet is added»). + **Неизвестный кортеж — НЕ ошибка.** Канон 0.4.0 делал ровно наоборот — отвечал `unknown` + (`openapi.yaml:486`), — и дверь, спроектированная по той же логике, убьёт добавление терма, то есть + половину продуктовой правки. Это место, где ошибиться легче всего; ошибка стоит целой ветки. +- `dst` — ОБЯЗАТЕЛЕН при `approve` и ЗАПРЕЩЁН при `decline`. +- `kind` — отсутствие значит «не решено», а не «сбросить». +- `note` — принимается и **НЕ публикуется**; отсутствие значит «не решено». Опустошить его дверью + нельзя, только заменить другими словами — узость названа в коде, не прячь её. +- `aliases` — публикуются и **НЕ принимаются**, намеренно. +- `gender` / `speech` / `decl` — ни то, ни другое: сид-онли, производителя нет (строка **210**), и + дверь на них была бы дверью на неработающую ось. +- ⚠ **Названная узость v1, и у неё ДВЕ половины — обе в канон:** ОКНО ГЛАВ термина одним решением не + правится. `approve` нового кортежа **добавляет вторую строку и оставляет старую стоять**, а + `decline` **снимает ВСЕ окна поверхности** (`decisions.go:85-87`). Расширение или сдвиг окна — + операция в два вызова. Это ратифицированное свойство, а не дефект: предупреждением, не умолчанием. +- **Конверт документа — тоже словарь, и его нельзя изобретать заново:** `decisions_version` со + значением `tm-bank-decisions-v1` (`decisions.go:47`) · `book_id` **обязателен и сверяется с книгой** + (`:142`), потому что решения — единственный вход, несущий слова пользователя в чужую книгу незаметно + для даунстрима · **неизвестное поле — громкий отказ** (`DisallowUnknownFields`, `:133`), зеркало + п.4 закона шва. +- **Два потолка, оба объявляются:** **1 МиБ** на чтение документа и **5000 решений на один акт** + (`bankdecisions.go:647`, `maxDecisions`; за ним — отказ КЛАССОМ 14 с текстом «split it», потому что + дальше вызов перестаёт влезать в таймаут вызывающего и умирает на каждом ретрае). Опубликованная + дверь без объявленных лимитов — это сгенерированный клиент, шлющий двадцать тысяч решений вслепую. +- Правка СИД-терма этой дверью ОТКЛОНЯЕТСЯ по имени (`decisions.go:359`): это перенос базового + снапшота и пере-оплата черновой волны — другая дверь, ещё не спроектированная (строка **192**). + +**Твоя свобода и твой аргумент:** форма HTTP-поверхности (один `POST` с документом целиком против +чего-либо иного), имена схем, как ложатся коды 10–19 на статусы HTTP, как выражается `--dry-run`. +**Решай сам и обоснуй в отчёте.** Совет, опровергаемый аргументом: код **14** — это НЕ ошибка сервера, +а законный отказ, по которому ПОЛЬЗОВАТЕЛЬ пере-решает; код **15** несёт указание «слать тот же +документ», и оба заслуживают различимости на проводе, а не общего `400`. + +⚠ **Дверь объявляется, но платформой ещё НЕ обслуживается** — её смонтирует пак (2в). Прецедент того, +как контракт честно объявляет непостроенное, в каноне уже есть: `Capabilities.ExportFormats`, пустой +список = «здесь не построено», и это названо честным ответом. **Машиночитаемый признак «здесь не построено» ОБЯЗАТЕЛЕН — свободна только его ФОРМА.** Без него +пак объявит голую необслуживаемую дверь и воспроизведёт `PD-370` тем же коммитом, которым его +закрывает: «канон объявляет — деплой не обслуживает» и есть содержание той строки. Разберись, годится +ли `Capabilities` для двери; если нет — назови почему и предложи замену, но не отсутствие. + +### §3.2-бис. Счётчики упразднённой модели — реши САМ, но решить ОБЯЗАН + +Канон объявляет `pending_decisions` и `complete` — «how much of the bank a person has touched» +(`openapi.yaml:442-447`). Это счётчики платформенной таблицы `bank_decisions`, у которой **write-путь +снесён 22.08**: колонки были write-only, кормившая их дверь мертва, а новая (§3.2) пишет ДВИЖКОВЫЕ +файлы, не эту таблицу. Значит поля навсегда нули. + +⚠ Мой греп §3.1 их НЕ ловит — имена другие, — и твой по тем же четырём именам не поймает тоже. +**Греп-форма, которая их вытаскивает: `bank_decisions` (с подчёркиванием).** Ею же находится носитель +компаньона **:358** («решение живёт отдельной таблицей `bank_decisions`») и тег `openapi.yaml:127` +(«Memory bank and term signing»). + +**Заказ: реши судьбу обоих полей — снести · пере-определить на новую дверь · пометить — и обоснуй.** +⚠ Проза рядом (`:442-447`) при этом УЖЕ несёт ратифицированную модель («Signing the bank is ONE act +over the whole of it»): она правильная, и сносить её вместе со счётчиками было бы потерей. + +### §3.3. Предупредить о конверте вне `/v0` — делай РОВНО так + +Строка **203**, пункт **(а)** (не (е) — см. §0). Канон (`openapi.yaml:35-36`) говорит только «Signing in is not part of this +surface». Допиши предупреждение: отказ от поверхности вне версионного префикса может прийти БЕЗ +обязательного `code`, и клиент, сгенерированный по канону, обязан это терпеть. Поверхность описана в +компаньоне §2.14 — сошлись, не пересказывай (один носитель на факт). + +### §3.4. Чего в этом паке НЕТ + +**Сквозная полоса прогресса (строка 200) в этот минор НЕ входит — решение оркестратора 27.08, +подлежит слову владельца.** Причина механическая, и её надо знать: см. §4. Если владелец решит иначе, +получишь аддендум; сам не бери. + +## §4. Развилка версии — прочти ДО того, как поднимешь номер + +Гейт платформы `TestTheAnnouncedContractVersionIsTheOneTheCanonRatified` +(`platform/internal/gates/contract_test.go:14`) читает ТВОЙ канон и требует, чтобы константа +`platform/internal/httpapi/capabilities.go:13` (`ContractVersion = "0.4.0"`) ему равнялась. Гейт +заведён не зря: однажды деплой обслуживал `0.3.0`, когда каноном был `0.4.0`. + +**Следствия, каждое проверено мной командой:** +1. В ту секунду, когда ты напишешь `version: 0.5.0`, батарея зоны платформы КРАСНЕЕТ. Это ожидаемо и + это не твоя ошибка. **Константу правит оркестратор при лендинге, одной строкой, тем же коммитом.** + Ты в `platform/` не пишешь. +2. Поэтому канон и деплой обязаны совпадать В МОМЕНТ ЛЕНДИНГА. Снос двери этому не мешает: платформа + свою половину уже снесла 22.08, после твоего сноса они СОВПАДУТ точно. Объявление необслуживаемой + двери — тоже, если оно честное (§3.2). +3. **А смена семантики ПРОГРЕССА — мешает.** Канон сегодня говорит: «When a stop is cleared the + counter starts again from zero» (`openapi.yaml:1293`). Владелец 20.08 назвал это дефектом и + потребовал ОДНУ долю на весь прогон, считаемую СЕРВЕРОМ. Но сервер её не считает и не будет считать + до пака (2в). Написать новую семантику в канон и поднять константу значит объявить `0.5.0` у + деплоя, который обслуживает прогресс по-старому, — ровно та ложь, против которой гейт и стоит. + +**Мой разбор, который владелец может отменить:** прежнее «одним куском» покупалось тем, что иначе +фронт перегенерируется дважды. **Фронт ЗАМОРОЖЕН**, и его зеркало отстаёт ратифицированно — при +разморозке он перегенерируется ОДИН раз независимо от того, сколько миноров прошло. Значит цена +разделения сегодня равна нулю, а цена объединения — деплой, врущий о своей версии. Поэтому прогресс +едет с паком (2в) отдельным минором. + +**Если по ходу работы найдёшь, что этот разбор неверен — это пинг, а не молчаливое отступление.** + +## §5. Самопроверка ИСПОЛНЕНИЕМ — обязательна, и «перечитал сам» её не удовлетворяет + +Сессии регулярно ошибаются, и самоотчёт «проверено» без исполнения регулярно оказывается ложным. +**Названный механизм, три пункта, каждый даёт проверяемый артефакт:** + +1. **Канон обязан парситься.** Прогони валидатор OpenAPI (любой доступный: `python3 -c "import yaml, + sys; yaml.safe_load(open('...'))"` — минимум; если в окружении есть настоящий линтер схемы — + лучше). **Артефакт: команда и её вывод в отчёте.** YAML, который не грузится, — это канон, + который не читает никто. +2. **Ни одной висячей ссылки после сноса.** Схема, на которую больше никто не ссылается, и ссылка на + снесённую схему — оба дефекта. Собери проверку сам (греп `$ref` против списка `components.schemas` + годится) и **приложи её вывод**, а не утверждение. ⚠ **Туда же — ДУБЛИ КЛЮЧЕЙ:** `yaml.safe_load` + схлопывает их молча по правилу last-wins (проверено: `a: 1\na: 2` даёт `{'a': 2}` без единого + слова), а это реальный класс дефекта канона после правок — пятистрочный loader-хук их ловит. +3. **Гейт платформы обязан покраснеть ПРЕДСКАЗУЕМО.** Прогони его на копии дерева и покажи, что он + краснеет ИМЕННО на несовпадении версий и ИМЕННО с ожидаемым текстом. ⚠ **Копию снимай ВМЕСТЕ с + каноном:** `cp -a --parents platform docs/architecture/14-api-contract <куда>/`. Голая `cp -a + platform` даёт постоянный красный того же теста по другой причине, и вердикт будет ложным — норма + зоны платформы, `ENGINEERING_STANDARDS` §3 п.3. + +**Субагенты РАЗРЕШЕНЫ явно** (харнесс по умолчанию их не берёт, и без этого разрешения запрет тихо +побеждает): бери отдельного агента-опровергателя на §3.2 — он получает твоё предложение двери и +словарь из кода, мандат «найди, где предложенное тело расходится со словарём глагола». Его находки — +в отчёт, включая те, что ты отверг, и с причиной. + +⚠ **Соразмеряй веер заранее:** 2–4 агента, не больше. Панель на полтора десятка агентов на этой +машине убивает сама себя, и это уже стоило проекту находок. + +## §6. Оси ревью — 1–3, сессия вправе заменить с аргументом + +1. **Ось «клиент, сгенерированный по канону».** Пройди канон глазами генератора: обязательные поля, + которых сервер не шлёт; enum, который вырастет; ссылки в никуда. Это ось, на которой канон уже + ловили дважды (`0.3.0`/`0.4.0` и конверт `/auth`). +2. **Ось «словарь двери против словаря глагола».** Каждое поле твоей схемы — с ответом, откуда оно в + `decisions.go` и почему принимается/публикуется именно так. Поле без ответа — либо изобретение, + либо находка. +3. **Ось «что читатель канона узнает о том, чего нет».** Необслуживаемая дверь, узость окна глав, + отклонение сид-терма — все три обязаны быть В КАНОНЕ явными, а не выводимыми. + +## §7. Записка-план и комплектность + +**До правок** выложи записку-план: что меняешь, где, чем проверишь. **В конце** — механическая сверка +комплектности против §3 таблицей: пункт заказа → что сделано → каким исполнением подтверждено. Пункт, +по которому в колонке «исполнение» стоит слово, а не команда, считается НЕ сделанным. + +## §8. «Заявление = команда» + +Любое число и любая категорика в отчёте — с командой, которой они получены. «Снёс девять мест» без +`grep -c` — не факт. Приёмка пере-считает выборочно, и расхождение будет стоить дороже, чем честное +«не мерил». + +## §9. Эхо-протокол старта + +ДО работы — ≤10 строк: **скоуп** (что делаешь) · **инварианты** (что не сдвинется) · **не-делать** +(что явно вне пака). Если эхо расходится с этим промтом — расхождение и есть первый вопрос. + +## §10. Obstacle — обязательная секция отчёта + +**«Что НЕ удалось и что НЕ проверено»** — отдельной секцией, не россыпью. Названный пробел стоит +дёшево; необъявленная ошибка автора — это находка, которой нет, и она всплывёт у приёмки дороже. + +## §11. Канал вопросов + +Конфликт промта с кодом или доками — **пинг оркестратору через владельца, НЕ интерпретация в свою +пользу и НЕ обход**. Отчёт и вопросы пиши в `docs/PROGRESS.md`? — **нет**: у контрактной сессии зонного +журнала нет, поэтому отчёт кладёшь **отдельным файлом `docs/CONTRACT_MINOR_REPORT.md`**, а оркестратор +переносит существенное в журнал и в ноту при лендинге. + +⚠ **Тесты и гейты не подгонять под зелень.** Гейт платформы обязан покраснеть — это ожидаемое +поведение, описанное в §4, а не повод его править. Несогласие с гейтом — вопрос, не правка. diff --git a/docs/PROGRESS.md b/docs/PROGRESS.md index 2e5b5051..5e98547f 100644 --- a/docs/PROGRESS.md +++ b/docs/PROGRESS.md @@ -1,6 +1,7 @@ # Журнал прогресса > **⟶ ТЕКУЩЕЕ СОСТОЯНИЕ** (на 2026-08-27, голова D39.159 — КУРС: движок и платформа до «работает и отдаёт результат», фронт ЗАМОРОЖЕН и P7 его НЕ размораживает (D39.147). **ОЧЕРЕДЬ №19** (единственный носитель — здесь; роль передана 22.08, №18 закрыт D39.155): (а) **P7 платформы ПРИНЯТ С ФИКС-ЛИСТОМ и ЗАЛЕНДЕН, сессия закрыта владельцем 20.08** (D39.153; зонный фикс-лист из тринадцати пунктов плюс врезанный первым блокер свипа — пинг №18 в `platform/docs/platform-PROGRESS.md`; ⚠ прежний врезанный пример «первым `ContractVersion` 0.3.0 при формах 0.4.0» СНЯТ — константа поднята и запинена гейтом против канона лендингом `31f1f82`) · (а1) **контракт API v0 0.4.0 РАТИФИЦИРОВАН** (D39.152; PD-327 закрыт; зеркало фронта отстаёт ратифицированно, при разморозке `cmp`) · (б) **лендинг петель полигона (фаза Д) — ОТКРЫТ**: приёмка ФАЗЫ у параллельного оркестратора, лендинг за этим; ⚠ **предупреждение в силе: работа полигона в дереве по-прежнему НЕЗАКОММИЧЕНА** (20 позиций: `START_PROMT.MD` + 14 правленых и 5 новых файлов `eval/`). Владелец перевозил её на новую машину транспортным коммитом `temp`, но 24.08 **снял его словом владельца** (`reset --mixed`, дерево не тронуто — сверено побайтно, бэкап `~/tm-backup-2026-08-24/textmachine-HEAD.bundle` + reflog): транспортный коммит вдобавок уносил `START_PROMT.MD`, который канон коммитить запрещает. Состав читать командой `git status --short -- eval/`, снимок здесь протухает. Не трогать и не «прибирать»; приёмка ФАЗЫ — за параллельным оркестратором, пинг №20 — в секции «Полигон». Форма коммита строго pathspec · (в) **дофикс-пак P8-FIX ПРИНЯТ И ЗАЛЕНДЕН 22.08** (D39.154, лендинг `31f1f82`): блокер свипа закрыт четырьмя механизмами и пере-проверен живой пробой оркестратора, деньги сошлись двумя путями из сырого леджера; мои четыре строки регистра — `PD-371`…`PD-374`. ⚠ **Порядок вышел ОБРАТНЫМ этой очереди:** промт дофикса требовал запуска ПОСЛЕ читающего пака, запущен был раньше. Цена перестановки, названная мной вслух 21.08 («блокер живёт всё время читающего пака»), тем самым НЕ заплачена — это лучший исход, чем планировалось; в минус — §4.7 (аддендум релеем) пуст и читающий пак пойдёт по только что переписанному коду. **ЧТО ДАЛЬШЕ С ПЛАТФОРМОЙ — решено 22.08 при актуализации доков, порядок такой.** **(1) Читающий пак P8-REVIEW — ОТРАБОТАН, ПРИНЯТ И ЗАЛЕНДЁН 27.08** (D39.159): четыре оси, 24 новые строки регистра (`PD-375`…`PD-398`), 17 дописок, каталог воспроизведения `platform/docs/p8-review/`. Единственный vuln — `PD-379` (major): открытый поток событий переживает отзыв сессии. Числа сдачи пере-мерены приёмкой на дереве С лендингом бэкенда. Промт архивируется. **Следующая работа зоны — кодовый пак по этим строкам, запуск по слову владельца.** Промт ЖИВ и переписан 22.08 в трёх местах, которые дофикс сделал ложными: «два денежных дефекта не заведены» (заведены и закрыты — `PD-333`/`PD-334`, вместо них дан их КЛАСС и живой образец `PD-372`) · приор оси 4 «наблюдаемость без ручки» (ручка построена ⇒ вопрос стал «достаточна ли она») · абсолют «оси ни в один дифф не входили» (сужен: системного разбора не было, кусками входили). **Довод ЗА пак — базовая ставка, а не вера:** первый же серьёзный взгляд на ОДНУ из четырёх осей (очередь, 21.08) дал пред-продовый блокер, проживший два пака под статусом `fixed`. Осей осталось три, и на двух из них лежат деньги и вход. **(2) ПОРЯДОК РАБОТ ПО ШВУ — ратифицирован D39.156 (23.08), исполняется строго так.** **(2а) Движковый пак — АКТИВНЫЙ ПРОМТ ЗОНЫ** (`BACKEND_SEAM_PACK_SESSION_PROMPT.md`, выдан 23.08, запуск по слову владельца): конвенционные дефолты `mined_delta`/`mined_rejects` · $0-глагол приёма правок банка · путь к файлу ключей аргументом (снимает блокер **211**) · строгость сид-загрузчика · путь артефакта и версия документа в `status --json` (снимает движковую половину **213**). **(2б) Контрактный минор — ПОСЛЕ него и ОДНИМ куском:** снос отменённой пер-термной модели + новая дверь, тело которой выводится из словаря глагола, а не сочиняется до него; сюда же строки **200**, **203** и хвосты компаньона. ⚠ Гигиена держится сознательно: снести дверь сейчас и завести в следующем миноре — две перегенерации фронта вместо одной; фолбэк объявлен — если пак застрянет надолго, гигиену шипить отдельно. **(2в) Платформенный пак — последним:** воркер решений → глагол перед возобновлением · путь ключей из конфига · снятие дубля вывода пути · дев-супервизор на тот же механизм ключей. **(3) `sqlc` отдельной сессией** (решение владельца 22.08, `BACKLOG.md` П-19, граница 41 запрос в пяти файлах) — механическая работа, не мешать её с содержательной. **(4) Живой прогон книги насквозь** — строка 202, гейт прежний: ПОСЛЕ холодного прогона движка. ⚠ **На владельце и блокирует пункт своей темы:** развилка владения `book.yaml` (строка 199а, зона сдала четырьмя вариантами с ценой, рекомендация зоны C или D+B) — без неё труба доставки правок банка не строится, а верхнего края у неё теперь нет вовсе · (г) **контракт:** сквозная полоса прогресса (строка 200, слово владельца 20.08) и хвосты релеев (203) едут тем же минором, что и дверь приёма правок банка — состав собирается ПОСЛЕ ратификации нормы шва, см. пункт (2) · (д) свободные бэкенд: 160 Этап 0, фикс-лист ФЧ строкой 197 (носителя-сессии нет по слову владельца); ⚠ строки 176/181/187 СНЯТЫ с таблицы при лендинге 20.08 — они закрыты ещё D39.149, а очередь всё это время звала 181 свободной работой (поймано ревью доков; остатки живут строками 194/196/197) · (е) фронтовый фрагмент pre-commit хука получает норму «жалуйся владельцу» — **решение владельца 21.08: ДА**, исполняется первым касанием зоны (пинг в её журнале). · (ж) **ПЕРЕЕЗД НА НОВУЮ МАШИНУ — стенд ПЕРЕСОБРАН 24.08 (№19), как поднимать — карта `README.md`, строки «Тулчейн» и `counts.py`.** Ubuntu 26.04 WSL2, пользователь `ubuntu-26`; тулчейн стоял НУЛЕВОЙ. Поставлено: Go 1.26.7 · golangci-lint 2.12.2 · Node 22.23.2 — тарболами вендоров со сверкой sha256 в `~/.local/opt` (симлинки в `~/.local/bin`); PostgreSQL 18.4 — рецептом самой зоны (`platform/docs/STACK_DECISIONS.md` §«Postgres на стенде без root»); `build-essential` + `python3-venv` — руками владельца, они единственные требовали root. **Обе батареи зелены под `-race`:** бэкенд `make battery` EXIT=0, линтер 0 issues, скипы только корпус-гейченные и хелперы; платформа `make check` EXIT=0, 18 пакетов, линтер 0 issues, **скипов 0**. Фронт: `npm ci` + `npm run check` проходит целиком (335 тестов), `vite build` собирается. Сквозняк проверен ЖИВЬЁМ: демон платформы → сид через настоящий интейк → движок распарсил книгу (3 главы) → дев-прокси фронта достучался до платформы. ⚠ **Что НЕ проверено:** ни одного платного вызова · браузеров Playwright нет ⇒ `check:full` не гонялся · локальной модели и GPU на машине нет вовсе (слово владельца 24.08: мерить нечем, ветка не закрыта) · OIDC не поднимался, вход только дев-логином. ⚠ Правка `.gitignore` владельца несла дефект — правило `books/` без якоря глушило ЛЮБОЙ каталог `books`, включая живой пакет `platform/internal/books/` (новый файл там уходил бы в игнор молча); заякорено в `/books/`, проверено пробой в обе стороны. Новые строки бэклога — **217** (пути полигона), **218** (дефолты корпуса в движке — ЗАКРЫТА и снята 27.08, D39.159 эррата-д), **219** (line-якоря D-лога съехали) **Открытые обязательства, которых нет больше нигде:** веса `pro` — строка 172-г НЕ закрыта, прогон мерил классификатор на flash; дешёвый вход — спросить полигон, говорят ли что-то данные фазы Д (там pro гоняется редактором), отдельный замер не покупать без этого · `docs/experiments/00-provider-quirks.md` несёт протухшие цены DeepSeek («не изменились, flash $0.14/$0.28») — зона полигона, чинить пингом · санкция на платный прогон в архивном промте пака честности была РАЗОВОЙ · **норма плотности комментариев — ОТВЕЧЕНА владельцем 21.08:** режем ВОДУ, а не длину — счёт строк «пиши одну-две» негодный гейт и снят; уходит пересказ решений, провенанс и изложение исследования вместо ссылки, остаётся всё, что из одной функции не выводится, сколько бы строк ни заняло (норма переписана — `12-go-style-notes` §1; PD-255 платформы этим закрывается). ⚠ Метод-урок: её хендофф объявил «вопросов на владельце нет», а строка регистра просила именно решения — вопрос был закрыт ОБЪЯВЛЕНИЕМ, поймано ревьюером полноты выгрузки. Оркестраторов ДВА (решение владельца 07.08): этот — движок/платформа/фронт/доки; параллельный (РОЛЬЮ, без номера — счётчик один, D39.112 п.6) — приёмка полигона. Одновременно не запускаются; CURRENT-STATE ведут оба, чужие строки не трогают. Норма изоляции панелей — D39.113, гардрейлы в CLAUDE.md.) +> - ⚠ **27.08: ВЫДАН ПРОМТ КОНТРАКТНОГО МИНОРА** (`CONTRACT_MINOR_SESSION_PROMPT.md`, пункт 2б очереди D39.156). **ОТКРЫТЫЙ ВОПРОС НА ВЛАДЕЛЬЦЕ:** сквозная полоса прогресса (строка **200**) из минора ИСКЛЮЧЕНА решением оркестратора. Причина механическая: гейт платформы требует, чтобы объявленная деплоем версия равнялась канону, поэтому канон и деплой обязаны совпасть В МОМЕНТ ЛЕНДИНГА; снос двери этому не мешает (платформа свою половину снесла 22.08), а смена семантики прогресса мешает — сервер её не считает и не будет до пака (2в), и `0.5.0` у старого прогресса был бы ровно той ложью, против которой гейт стоит. Прежнее «одним куском» покупалось тем, что иначе фронт перегенерируется дважды, — но фронт ЗАМОРОЖЕН и перегенерируется один раз независимо от числа миноров. Слово владельца отменяет это решение аддендумом. > - ⚠ **27.08: ПАК P8-REVIEW ПЛАТФОРМЫ ПРИНЯТ (D39.159).** Четыре оси прочитаны исполнением, кода не тронуто; регистр 374→398 строк, открытых 72→96 (major 1→3). Ратифицированы норма копии-с-каноном, эррата §13 и токен `ОСПОРЕНО(PD-N)`; статусы трёх спорных строк НЕ пере-открыты. Приёмка пере-мерила батарею на движке из HEAD — **шов пережил лендинг бэкенда `d1eb8a9`** — и подтвердила `PD-376` своей посадкой. Правка гейта формы регистра ОТКЛОНЕНА замером: краснила бы семь законных строк. Новая строка бэклога **225**. > - ⚠ **27.08: ВХОДНАЯ ДВЕРЬ ШВА ЗАКОНЧЕНА И ЗАЛЕНДЖЕНА (D39.158).** Четыре пака зоны бэкенда приняты одним деревом: $0-глагол приёма правок банка · стоп банка стал ФЛАЖКОМ в самом движке (память предъявленного, схема хранилища v16) · единая точка фиксации отчёта (шесть исходов, v2) · полоса отказов в два яруса с классом `write_incomplete`/exit 15 · пути решений только конвенцией. **Порядок деплоя обязателен: движок первым → `tmctl migrate` по каждой книге до прогонов → и только потом платформа снимает свой обход** (пинг в её журнале). Строки **211/212/213/218** закрыты, **191(б)/203(з)** пере-диспозиционированы (устранено, не обойдено), заведены **221–224**. Онтология банка записана — `architecture/18-bank-ontology.md`. > - **Эра №15 закрыта — семь приёмок, все ПРИНЯТЫ и залендены**; лента, коммиты и разборы — D39.109–123 (D-лог) и реестр нот `architecture/05-decisions-index.md`; снимок прежних бюллетеней этой шапки — архив-слайс `-08-02-04`. diff --git a/docs/README.md b/docs/README.md index 279a6d1c..f19601a4 100644 --- a/docs/README.md +++ b/docs/README.md @@ -26,7 +26,7 @@ | Платформа | активного НЕТ | читающий пак P8-REVIEW ОТРАБОТАН, ПРИНЯТ и ЗАЛЕНДЁН 27.08 (D39.159): четыре оси, 24 строки регистра, единственный vuln `PD-379`. Промт — `platform/docs/archive/`. Следующая работа зоны — КОДОВЫЙ пак по этим строкам, промт пишется по слову владельца | | Полигон | [POLYGON_EXP2223_REDO_SESSION_PROMPT.md](POLYGON_EXP2223_REDO_SESSION_PROMPT.md) (отложенный — [POLYGON_PACKAGE4_SESSION_PROMPT.md](POLYGON_PACKAGE4_SESSION_PROMPT.md), строка 85) | фаза Д ИДЁТ; ⚠ живой носитель курса — в `eval/dovodka/`, какой именно называет зона (⚠ [POLYGON_PHASE_D_HANDOFF.md](POLYGON_PHASE_D_HANDOFF.md) — перекрытый снимок, читать не как курс) | | Фронт | активного НЕТ | **ЗОНА ЗАМОРОЖЕНА** (D39.136 п.2 + D39.147: разморозка отдельным словом владельца, не привязана к P7); перечень первого касания — в зонном журнале | - | Контракт | активного НЕТ | канон ратифицирован (версия — в самом `openapi.yaml`); следующий минор — ПОСЛЕ движкового пака и одним куском (D39.156) | + | Контракт | [CONTRACT_MINOR_SESSION_PROMPT.md](CONTRACT_MINOR_SESSION_PROMPT.md) | минор 0.4.0 → 0.5.0, выдан 27.08: снос отменённой пер-термной модели (`PD-370`, контрактная половина) · дверь правок банка, выведенная из словаря `bank-apply` · конверт вне `/v0` (строка 203-а) · судьба счётчиков упразднённой модели. ⚠ Прогресс (строка 200) в минор НЕ входит — разбор в §4 промта, на слове владельца | Отработанные промты — `archive/prompts/`, отчёты с ревью-шапками — `archive/reports/`. Зонные журналы фронта и платформы — `frontend-PROGRESS.md` / `platform-PROGRESS.md` в их зонах (прогресс зон только там, D39.100). - Чужие зоны — фронт и платформа (читать при касании стыка; каждая ведёт СВОЙ зонный бэклог — единый бэклог их строк не принимает, D39.84): [../frontend/](../frontend/) — веб-интерфейс: промт фронт-сессий + [STACK_DECISIONS.md](../frontend/docs/STACK_DECISIONS.md) (пины версий точными числами и ловушки) + [BACKLOG.md](../frontend/docs/BACKLOG.md) · [../platform/](../platform/) — SaaS control plane: README + [BACKLOG.md](../platform/BACKLOG.md) + `docs/` (зонный журнал `platform-PROGRESS.md` · регистр дефектов · `STACK_DECISIONS.md` с рецептом стенда и инвентарём каналов шва · **[ENGINEERING_STANDARDS.md](../platform/docs/ENGINEERING_STANDARDS.md) — ратифицирован; КАЖДЫЙ промт платформенной сессии обязан на него ссылаться, отступление = пинг** · **[PLATFORM_DIRECTION.md](../platform/docs/PLATFORM_DIRECTION.md) — ратифицированное направление зоны: аутентификация, деньги, стандарты, скорость** · архив промтов).