diff --git a/platform/docs/PLATFORM_P7_SESSION_PROMPT.md b/platform/docs/PLATFORM_P7_SESSION_PROMPT.md index 2a9006cb..582f9a8a 100644 --- a/platform/docs/PLATFORM_P7_SESSION_PROMPT.md +++ b/platform/docs/PLATFORM_P7_SESSION_PROMPT.md @@ -1,167 +1,163 @@ # Промт: платформа, пак P7 — читающая поверхность по контракту 0.3.0 + модель ошибок + форварды (П-17, строка 169 единого) -> Выдан оркестратором №17 16.08.2026 (очередь D39.133; входы — D39.134 п.4 · D39.135 п.2в · D39.138 · -> пинги №17 в зонном журнале). Запуск — по слову владельца, ПОСЛЕ лендинга батча 0.3.0 (§1). +> Выдан №17 16.08.2026, пересобран после лендинга батча 0.3.0 (D39.142–144) и опровергателя промта. +> Запуск — по слову владельца. -## 0. Какую проблему ты решаешь и что решит твой результат +## 0. Зачем -Платформа — control plane между веб-фронтом и движком перевода. К сегодняшнему дню построено всё -СТАТУСНОЕ и денежное: вход, кредиты с холдами, очередь и раннер, интейк книг, потребительская -половина шва с движком (события `events.jsonl` уже пишутся движком и материализуются в Postgres, -включая пер-юнитные разрешения). Чего нет — **читающей поверхности**: фронт не может прочитать ни -главы, ни юниты, ни замечания, ни банк, ни живой поток; из 16 операций контракта платформа отвечает -на 8. Из-за этого фронт живёт на моках и ЗАМОРОЖЕН, а центральный экран продукта (подпись банка) не -строится вовсе. Второе: причины отказов не существуют в машинном виде — сервер шлёт английскую фразу, -которую русский интерфейс печатает как есть. +Платформа (control plane фронт↔движок) построена до потребительской половины шва: вход, кредиты, +раннер, интейк, ингест событий движка в Postgres. Из 20 операций контракта 0.3.0 отвечает на 8: +фронт не может читать главы/юниты/замечания/банк/поток — он на моках и ЗАМОРОЖЕН, экран подписи +строить не на чем; отказы — английской фразой без машинного кода. Твой пак делает платформу читаемой +и отказы машинными → разблокирует фронт. Контракт только что пере-согласован и сломан минором 0.3.0, +чтобы ты строил СРАЗУ по правильной форме — не по памяти о старой. -Твой пак делает платформу ЧИТАЕМОЙ и её отказы — машинными. Результат разблокирует разморозку фронта -и экран подписи. Контракт только что пере-согласован целостным ревью (research/28, принят D39.138) и -сломан минором 0.3.0 ровно для того, чтобы ты строил новые ручки СРАЗУ по правильной форме — не строй -по памяти о старой. +## 1. Нормативный источник -## 1. ПРЕДУСЛОВИЕ — проверить до первой строки кода +**Канон `docs/architecture/14-api-contract/openapi.yaml`, `info.version: 0.3.0`** (не та версия → +стоп, пинг). Зеркало `frontend/docs/api-contract/` ОТСТАЁТ намеренно (фриз фронта) — читать только +канон. Форма каждой ручки решена там; расхождение промта с каноном → верь канону и пингуй. -Нормативная спека — **канон `docs/architecture/14-api-contract/openapi.yaml`**, `info.version` -обязана быть **0.3.0**. Если там 0.2.3 — батч ещё не заленден: исполни только пункты 0–2 состава -(§4 — они от батча не зависят), затем СТОП и пинг владельцу. ⚠ Зонное зеркало -`frontend/docs/api-contract/openapi.yaml` во фризе фронта может ОТСТАВАТЬ от канона — это известное -состояние; читать только канон. +## 2. Зона и git -## 2. Зона и git (канон — CLAUDE.md; здесь напоминание) +Ты не коммитишь — лендит оркестратор. Пишешь только в `platform/`; отчёт/вопросы — только +`platform/docs/platform-PROGRESS.md`. Чужие зоны read-only; живой полигон (`eval/`, +`docs/experiments/`) не трогать; `.env` не читать; git не трогать вовсе (ни `add`, ни `commit`, ни +`reset`/`checkout`), файлы застейдженными не оставлять. Путь Go-модуля не вкладывать под путь движка +(D39.85). -**Ты не коммитишь — лендит оркестратор.** Зона записи — только `platform/`. Прогресс, отчёт и -вопросы — ТОЛЬКО зонный журнал `platform/docs/platform-PROGRESS.md`. Чужие зоны read-only; чужие -незакоммиченные файлы (живой полигон: `eval/`, `docs/experiments/`) не трогать; `.env` не читать; -никаких `git add`/`git commit`/`reset`/`checkout`/переписывания истории — git не трогаешь вовсе, -файлы застейдженными не оставлять. Ревью-гард D39.85: путь Go-модуля платформы никогда не вкладывать -под путь движка. +## 3. Читать (≤5) -## 3. Что читать (карта, ≤5 позиций) +1. Канон + компаньон (`docs/architecture/14-api-contract/`) целиком. В компаньоне: §3 таблица + «чтение → источник» · **приложение А-2 — готовая карта «твоя ветка `v0.go` → код ошибки» с + `file:line`** · §6б — почему формы такие. +2. `docs/research/28-contract-review.md` §8а (классы отказов) · §5б (сеть) · §9 (находки твоей зоны) + + D39.138 п.2 и D39.142–144 (хвост `docs/architecture/05-decisions-log.md`). +3. Свой журнал `platform-PROGRESS.md`: три пинга №17 + аддендумы (входы пака, `file:line` находок). +4. Read-out движка — пинг №15 там же: `.manifest.json` (`tm-manifest-v2`; `unit.id = + ::`; ⚠ `heading` — ВРЕМЕННЫЙ рендер «Глава N», НЕ метка книги) + · `.bank.json` · `.bank-stop.json` (`conf: null` ≠ 0); пишутся атомарно, читать можно при + живом прогоне. Плюс своя `unit_resolutions` (миграция 00015). +5. `CLAUDE.md`; жаргон — `docs/glossary.md`. -1. **Канон 0.3.0 + компаньон** (`docs/architecture/14-api-contract/`) — целиком: форма каждой новой - ручки уже решена там, не изобретай параллельную. -2. **`docs/research/28-contract-review.md`** §5 (состав правок и зачем) · §8/§8а (решения владельца: - классы конкретности отказов) · §5б (сеть: что строить, чего НЕ строить) · §9 (находки по твоей - зоне) + **D39.138 п.2** (ратификация; при конфликте побеждает нота). -3. **Свой журнал `platform-PROGRESS.md`** — три пинга №17 (15–16.08) и аддендум: там входы этого пака - (PD-104, форварды, протухшие тексты твоих доков) и попутные находки §9, которые ты судишь сам. -4. **Read-out поверхности движка** — пинг №15 в том же журнале (D39.122): манифест - `.manifest.json` (`tm-manifest-v2`), банк `.bank.json` + стоп-таблица `.bank-stop.json` - (пишутся атомарно, читать можно во время прогона); плюс твоя же таблица `unit_resolutions` - (миграция 00015) — источник юнитов/замечаний. -5. `CLAUDE.md` — гардрейлы; `docs/glossary.md` — жаргон. +## 4. Состав. Пункты 0–5 — «РОВНО так» (состав ратифицирован; формы внутри — твои, где канон/промт +их не фиксируют). Пункт 6 — судишь сам. Отложенное — только явно, списком в отчёте. -## 4. Состав пака — в этом порядке. **СОСТАВ пунктов 0–5 — «делай РОВНО так» (ратифицирован); -свобода — в ФОРМАХ исполнения внутри пунктов, где канон/промт форму не фиксируют. Пункт 6 — судишь -сам. ⚠ Пункты 0–2 от батча 0.3.0 не зависят — при запуске до батча исполняй их и стоп перед п.3.** +**0. Рантбук деплоя живым `migrate`, end-to-end, $0, первым шагом** (предусловие первого выката; +твой журнал: «живьём не гонялся»): прогнать свой `deploy/README.md` новым бинарём движка по книгам +стенда (`tmplatformctl books --migratable` → `tmctl migrate`). Попутно: `deploy/README.md:131` — +мёртвый текст ошибки (движок печатает `schema_mismatch found=N expected=M`, exit 13); +`cmd/tmplatformctl/runs.go:45` — комментарий зовёт голый `tmctl` из PATH (тихий no-op старым +бинарём); якорь П-1 в BACKLOG обновить. -**0. Рантбук деплоя живым `migrate` — end-to-end на дев-стенде ($0, первым шагом).** Прогнать -собственный `deploy/README.md` настоящим новым бинарём движка по каждой книге стенда -(`tmplatformctl books --migratable` → `tmctl migrate`) — предусловие ПЕРВОГО выката (мнение -оркестратора из пинга 15.08; движковая половина финальна — D39.134; твой журнал честно фиксирует -«живьём не гонялся»). Попутно починить мёртвый текст ошибки схемы в -`deploy/README.md:131` (движок теперь печатает токен `schema_mismatch found=N expected=M`, exit 13) -и комментарий-образец `cmd/tmplatformctl/runs.go:45` (зовёт голый `tmctl` из PATH — воспроизводит -тихий no-op старым бинарём); якорь П-1 в своём BACKLOG обновить. +**1. Форварды:** (а) читать `BookIntake.title` — сегодня игнорируется (`internal/httpapi/v0.go:369-376`); +по 0.3.0 обязателен, пустая строка = «назови по файлу»; (б) проецировать `reject_reason` — писатель +`pgstore/books.go:310`, проекция `projectBook` (`v0.go:470`; обоснование-комментарий `:497`) — +значениями словаря канона `RejectReason` (`processing_failed`, не имя внутренней ветки). -**1. Форварды 0.2.3 (РОВНО так, малые):** читать `BookIntake.title` (сегодня падает в «unknown field -is IGNORED» — `internal/httpapi/v0.go:369-376`, якорь-отправная точка, код первичен) · проецировать -`books.reject_reason` на провод (`v0.go:497` — «kept for an operator and never projected»). +**2. PD-104:** `SignupGrantMicroUSD` дефолт → **0** + тест (слово владельца 16.08; возврат $5 — с +суточным потолком при платежах). Ветка «0 при неверифицированном email» (`login.go:306-308`) уже +есть — не баг. Протухшие «$5»: `PLATFORM_DIRECTION.md` §2, BACKLOG П-7, регистр. -**2. PD-104 (РОВНО так, слово владельца 16.08):** `SignupGrantMicroUSD` дефолт → **0** (бета: -начисление руками через админ-CLI; возврат $5 — вместе с суточным потолком при появлении платежей) + -тест; регистр и протухшие «$5» в `PLATFORM_DIRECTION.md` §2 / BACKLOG П-7 — поправить. ⚠ Ветка -«грант 0 при неверифицированном email» (`login.go:306-308`) УЖЕ существует — это не баг и не твоя -правка, не перепутай с ней. +**3. Модель ошибок — ПЕРВОЙ из контрактной половины** (от словаря зависят формы остальных ручек): +`Problem` по канону (`code` 16 корневых + `cause` + `request_id` из `internal/reqid` + `errors[]`). +Словарь НЕ выводить — реализуй карту А-2 компаньона; реальная ветка без кода → пинг, не изобретение. +Класс 2 = один код `content_refused`, без вариации, лимит попыток — по канону (`:2394`). +`WWW-Authenticate` на 401. Две причины 403 (нет `X-TM-Client` ≠ кросс-origin) — раздельно только в +открытом `cause.code`, корневой `forbidden` один (канон), новых корневых не заводить. -**3. Модель ошибок (Б-1/§8а) — ПЕРВОЙ из контрактной половины,** от неё зависят формы остальных ручек: -структура `Problem` по 0.3.0 (машинный `code` двухуровневый + `request_id` — значение уже штампуется, -`internal/reqid`). ⚠ **Словарь кодов УЖЕ определён каноном** (батч вывел его из твоих же веток -`fail()`) — РЕАЛИЗУЙ словарь канона, не выводи свой заново: не хватает причины для реальной ветки — -пинг, не изобретение (два независимых вывода из одного источника гарантированно разойдутся именами). -Класс 2 (прескрин/провайдер/фильтр) — ОДИН грубый код, без вариации между попытками. -`WWW-Authenticate` на 401; две причины 403 развести (нет `X-TM-Client` ≠ кросс-origin). +**4. Читающая поверхность (ядро):** `listChapters` · `listUnits` (только пер-главно; ручку «вся +книга юнитами» НЕ заводить — инвариант твоего же `PLATFORM_DIRECTION.md:208-210` и §5б; `410 Gone` +на исчезнувшую главу; `Unit.notes` массивом) · `listNotes` (`id`+`created_at`+обязательный +`chapter_id`; порядок `created_at`, тай-брейк серверный) · `listBankTerms` (проекция сайдкаров; +агрегаты `total`/`signed`/`pending_decisions`/`complete` — первая страница, ИНФОРМАЦИОННЫЕ) · +`submitBankDecisions` (`approve`/`decline`, накопительный, `maxItems` 1000; неизвестный `term_id` → +400 всей пачки, item-код `unknown`) · дельта-чтения `?after_version=` на notes/bank (ВКЛЮЧИТЕЛЬНЫЕ; +водяной знак = наименьшая ревизия обхода; устаревший → 400 `version_too_old`) · **SSE +`streamBookEvents`** — все правила в каноне: `id` = позиция истории книги (служебные кадры несут id +последнего кадра, `0` на пустой книге), кадр `end` + `204` по `Last-Event-ID` (кадра «конец +разбора» НЕТ — конец интейка = смена статуса), склейка только state-кадрам, `note` не терять в +пределах соединения, `resync_required` когда не можешь продолжить с предъявленного id · +**`structure_version`** — в `Book`, во всех четырёх конвертах страниц и в КАЖДОМ кадре +(`EventBase`); источник — манифест движка · **gzip** на JSON (НЕ на SSE) + **ETag/If-None-Match → +304** на всех коллекциях, КАРТОЧКЕ книги и `/capabilities`; валидатор — ко всему запросу, query +включая (`:850` канона; «ETag = ревизия страницы» НЕДОСТАТОЧЕН — стр.2 и дельта той же ревизии +обязаны отличаться). +⚠ Ловушки, каждая — канон против сегодняшнего кода: +- **`heading`:** канон запрещает класть рендеренный порядковый (`:1556-1566`) — а `heading` + манифеста ровно он; проецируй `null` до движковой строки 160. Прямая проекция сайдкара = + нарушение. +- **Гейт полноты банка УЖЕ ПОСТРОЕН — ДЕМОНТИРУЙ:** `internal/runs/reconcile.go:934-938` + (`awaiting_bank` → `ErrNotResumable "glossary is not signed"`) ссылается на снятые D39.144 разделы. + Подпись = ОДИН resume при любом состоянии решений; полноту не отливать ни в новый код, ни + оставлять в старом. Границу паузы движка сверь чтением его кода (строка 191); расхождение — пинг. +- **Пофазность у главы НЕ строить** (К-10 «НЕТ», D39.138 п.5): колонки `units_draft_done/edit_done` + лежат готовыми и напрашиваются — глава отдаёт ОДИН счётчик прохода по канону. +- **`Note.code`:** словарь НЕ ратифицирован (приложение А — заготовка ◆). Бери коды из ◆-карты как + есть, новых не изобретай; причина движка мимо карты → пинг. -**4. Читающая поверхность по 0.3.0 (ядро пака):** главы / юниты / замечания (с `id` и `created_at` — -форма 0.3.0) / банк (проекция сайдкаров движка + снимок стопа подписи `pending/complete`) / -`POST /bank/decisions` / **SSE-поток** в форме 0.3.0 (канал КНИГИ, кадры конца разбора и конца -прогона, `204` переподключению к завершённому, склейка ТОЛЬКО снимкам — `note`-класс не склеивать). -⚠ **Пофазность у главы НЕ строить** (К-10 отвечен «НЕТ», D39.138 п.5): колонки `units_draft_done`/ -`units_edit_done` лежат в read-модели готовыми и «бесплатная проекция» напрашивается — фазы на провод -не выходят НИ у книги, ни у главы; глава отдаёт один счётчик по канону. -⚠ **Модель подписи банка (слово владельца 16.08, D39.144): подписывается ВЕСЬ банк одним действием.** -Гейта полноты пер-термных решений НЕТ нигде: 409 `bank_decisions_incomplete` снят с канона, resume -снимает стоп с решениями «как есть» (движок так и работает — авто-провод D39.42 п.3, нерешённое едет -с пометкой); `pending_decisions`/`complete` — информационные, канал решений — накопительный БЕЗ -гейта. Не отливай полноту в код ни валидацией, ни констрейнтом. Границу паузы движка при resume -сверь чтением его кода (строка 191); расхождение — пинг, не своя интерпретация. -Сюда же сеть, шаги 1–2 §5б (строка 186): **gzip на текстовых ответах (НЕ на SSE)** и -`ETag`/`If-None-Match` → 304 на списочных GET. Совет-приор: ревизия у тебя уже читается одной -транзакцией со страницей (PD-163) — ETag из неё. +**5. Конформность ПОСТРОЕННОГО. Правило: пофайловый дифф каждой построенной wire-структуры против +required-списка канона; расхождение — чинить или в отчёт с причиной.** Именованный минимум: +`Progress` переезжает с книги на `Run` (одна полоса в ГЛАВАХ до остановки, знаменатель — купленный +объём) · `Book`: +`revision`, +`chapters_done` (SQL уже считает — `pgstore/books.go:677-681`), +−`progress`, **−`genre`** (`v0.go:108` — нарушение allowlist-инварианта канона, строка 184) · +`Run`: +`book_id`, +`failure_reason` (словарь канона из трёх значений — мапь полосу 10–19 и ветки +`outcome()`), `verify_bank`→`stop_for_signing` (провод: `v0.go:127,154`) · `Usage`: +`paused_reason`→`halt_reason` со СВОИМ словарём `AccountHaltReason` (`v0.go:159-163` сейчас несёт +прогонный) · `GET /capabilities` — НОВАЯ ручка и зависимость всех чтений (дефолты страниц читаются +из неё; все шесть полей канона, `intake_enabled` включая) · `limit`: подрезать до 1000, НЕ отвергать +(`pgstore/books.go:510-511` сейчас сбрасывает к дефолту; схемную валидацию параметра вывести из-под +отказа — `:886` канона) · трейлинг-части интейка → 400 (⚠ меняет узаконенное 0.2.3 «молча теряется» +— по канону 0.3.0) · `Location` на 201 · `Idempotency-Key` на `createBook` И `startRun` — семантика +целиком в `§IdempotencyKey` канона · `blocked {code, book_id}` на run-options и 409 (таблица +`reservations` знает держателя) · отказ по неподдерживаемой паре кодом на интейке · `finalizing` — +вон из словарей валидации (`internal/runs/runs.go:229`, `pgstore/sink.go:435`; CHECK-констрейнты — +по канону, значение никем не пишется). -**5. Правки построенного под 0.3.0:** `wireProgress` → один счётчик до остановки (Б-0; ⚠ колонки БД -и словарь шва с движком НЕ трогать — фазы остаются внутренним делом); `GET /capabilities` (Б-2: пары -из конфигурации · порог интейка · форматы · размеры страниц · версия контракта); подрезка `limit` до -максимума вместо сброса к дефолту (Б-10); трейлинг-части интейка → 400 вместо тихой потери + `Location` -на 201 + `Idempotency-Key` (Б-3); `blocked: {code, book_id}` на run-options/409 (В-6); отказ по -неподдерживаемой паре кодом на интейке (сегодня ja/en-книга умирает `failed`-ом на валидации движка -в конце пути); `Run.failure_reason` (Б-8 — словарь исхода у движка уже есть); переименование -`verify_bank` → `stop_for_signing` на проводе (живёт в построенном: `v0.go:127,154`) и сворачивание -`finalizing` из словарей валидации (`runs.go:229`, `sink.go:435`; судьбу CHECK-констрейнтов -read-модели реши по канону — значение никем не пишется). +**6. Свой регистр — судишь сам, кроме помеченного РОВНО:** РОВНО — статусы PD-172/173/174/180 +(исполнены 0.2.3) и PD-199 (закрыт D39.132 п.2а) привести; строку PD-201 обновить (движковая +половина финальна — самолечение «exit 13 → migrate → повтор» можно строить); **PD-241 исполнить — +ратифицирован D39.132 п.2д «следующим касанием зоны», это касание — ты** (намерение стопа выигрывает +на статусе). Судишь: кандидаты PD-219/PD-217/PD-162; находки §9 research/28 — каждой диспозицию +(берёшь / P8 / отклоняешь, с причиной): висящие расчёты без бюджета холда · флаг аккаунта сканом +всех книг · `ReadRunForSpawn` O(живых) · `/metrics` без аутентификации · лимитер входа на процесс · +сырой Go-текст в карантине. Протухшие тексты зоны: `PLATFORM_DIRECTION.md` §3-баннер (снят D39.132 +п.2б), §4 п.5 (склейка сузилась), **`:199` «подписывает банк частями» — ложь после D39.144**, §2 +«$5». Инструменты: **sqlc — привязан к паку** (D39.132 п.2б; `overrides` на денежные типы; +отступление = пинг); oapi-codegen — кандидат, реши и аргументируй. -**6. Свой регистр — судишь сам (кроме помеченного):** PD-201 (самолечение «поймал exit 13 → migrate → -повтор» — движковая половина ФИНАЛЬНА, можно строить); кандидаты PD-219 / PD-217 / PD-162; -**обновить протухшие статусы (РОВНО так):** PD-172/PD-173/PD-174/PD-180 — диспозиция «спек-правка» -ИСПОЛНЕНА ещё 0.2.3 · PD-199 — ратифицирован закрытым D39.132 п.2а, в регистре до сих пор open; -находки §9 research/28 — каждой явную диспозицию (берёшь / P8 с причиной / отклоняешь с причиной): -незакрываемые расчёты (бюджет висения холда) · флаг аккаунта сканом всех книг (после PD-203) · -`ReadRunForSpawn` O(живых) · **`/metrics` без аутентификации (защита — только 127.0.0.1)** · лимитер -входа на процесс · сырой Go-текст в карантине. Протухшие тексты зоны: баннер §3 -`PLATFORM_DIRECTION.md` привести к D39.132 п.2б и §4 п.5 (склейка сузилась — только снимкам). -Инструменты: **sqlc — ПРИВЯЗАН к этому паку (D39.132 п.2б, ратифицировано):** внедряй на читающей -поверхности с `overrides` на денежные типы, отступление = пинг; oapi-codegen — кандидат, реши сам -и аргументируй. +**Отложено в P8 (не тихо):** `updateBook`/`deleteBook`/`getRun` · **`createExport`/`getExport`** +(содержимое — S7; формы в каноне финальны) · эскроу П-18. Всё прочее невлезшее — списком с +причинами. -**Явно отложено в P8 (не тихо):** `PATCH /books/{id}` (title-only) + `DELETE` + `GET /runs/{id}` · -эскроу П-18 (денежный промт) · всё, что не влезло, — списком с причинами в отчёте. +## 5. Нормы -## 5. Нормы исполнения +- Самопроверка исполнением: `make check` + ОБА гейта (`TM_PLATFORM_TEST_DSN`, + `TM_PLATFORM_TEST_ENGINE_BIN`/`_BOOK_TEMPLATE`), **скипов 0 — гейт** (неустранимый скип = + obstacle с объяснением); дифф `^func Test` исполнением; живые пробы новых ручек на дев-стенде + (сид P6). +- Заявление = команда: каждое число/категорика отчёта — с командой; приёмка пере-ранит. +- Записка-план по §4 (пп. 0–6 + отложенные): «исполнено, где / отказ, почему» на каждый; сдача = + все с диспозицией. +- Шов: касаешься канала движка → сначала инвентарь ВСЕХ его каналов и кодов чтением чужого кода + (урок D39.132). +- Посадки мутаций — `ENGINEERING_STANDARDS.md` §3, списочный пункт «посадки» (~:67-69; заголовка + «§3.3» в файле нет). +- Предметная ось: индустриальный первоисточник прежде велосипеда — RFC 9457 · WHATWG SSE · + RFC 9110/9111 (условные запросы, `Vary` при gzip). Право заменить ось — с аргументом. +- Деньги: пак их не двигает (PD-104 — константа); коснулся — два независимых пути счёта из сырого + леджера. +- **Адверсариальное селф-ревью финалом — механизмом (субагенты РАЗРЕШЕНЫ, спавнь):** ≥2 независимых + ревьюера по финальному диффу, author≠reviewer: (а) контракт-конформность — канон против твоих + ручек, пере-раном живых проб; (б) деньги/шов — свой инвентарь каналов, не твой список. Плюс СВОИ + посадки в новые гейты/ручки (не из ожидаемого тобой списка). Артефакт: таблица находок/посадок с + диспозициями; ноль находок = не верить прогону. +- Obstacle reporting — обязательная секция: что НЕ удалось / не проверено. +- Канал вопросов: непонятно / промт против кода-спеки-доков → пинг через владельца, НЕ + интерпретация. Право «этого делать не надо» — с аргументом. -- **Самопроверка исполнением:** батарея `make check` + ОБА гейта (`TM_PLATFORM_TEST_DSN` + - `TM_PLATFORM_TEST_ENGINE_BIN`/`_BOOK_TEMPLATE`) — **скипов 0 это гейт**; физически неустранимый - скип = obstacle, объяви и объясни; дифф `^func Test` — исполнением, не памятью; живые пробы новых - ручек против дев-стенда (сид P6). -- **Заявление = команда:** каждое число/категорическое утверждение отчёта — с командой; приёмка - пере-ранит. -- **Записка-план по §4** (D39.121): каждый пункт (0–6 и отложенные) — строка «исполнено, где / - отказ, почему»; сдача = все с диспозицией, комплектность против заказа механически. -- **Шов:** если касаешься ЛЮБОГО канала движка — сначала инвентарь ВСЕХ его каналов и кодов чтением - чужого кода, не по памяти (урок D39.132: `status --json` упустили все, кроме панели приёмки). -- Посадки мутаций — дисциплина `ENGINEERING_STANDARDS.md` §3, пункт «посадки» (списочный пункт 3, - ~:67-69; ⚠ нумерации «§3.3» в файле нет — не ищи заголовок). -- **Предметная ось зоны:** индустриальный первоисточник прежде велосипеда — RFC 9457 (problem+json), - WHATWG SSE (204/переподключение), RFC 9110/9111 (условные запросы, `Vary` при gzip); stdlib/устоявшаяся - библиотека прежде своего. Право добавить свою ось или снять эту — с аргументом. -- **Деньги:** пак денег не двигает (PD-104 — константа гранта); если что-то денежное всё же затронул — - два независимых пути счёта из сырого леджера. -- **Адверсариальное селф-ревью финалом вехи — МЕХАНИЗМОМ, не стилем чтения (субагенты РАЗРЕШЕНЫ - явно, спавнь их; норма CLAUDE.md 12.07 + урок 14.08 «author≠reviewer ≠ перечитал сам»):** ≥2 - независимых ревьюера-субагента по финальному диффу, author≠reviewer, разные линзы — (а) - контракт-конформность: ревьюер получает канон 0.3.0 и твои ручки, мандат «найди расхождение формы - провода со спекой» (пере-раном живых проб, не чтением); (б) деньги/шов: мандат «найди путь, где - холд/расчёт/канал движка ведёт себя не так, как записано» — с инвентарём каналов, не по списку - автора. Плюс **СВОИ посадки мутаций** в новые гейты/ручки (дисциплина посадок `ENGINEERING_STANDARDS.md` §3: - свойство считается запиненным, когда посадка роняет тест — посадки НЕ из списка, который ты сам - ожидаешь). Проверяемый артефакт: таблица находок и посадок в отчёте, каждая с диспозицией - (исправлено / отклонено-с-причиной); ноль находок = повод не верить прогону. -- **Obstacle reporting** — обязательная секция отчёта: что НЕ удалось, что не проверено. -- **Канал вопросов:** непонятно / промт конфликтует с кодом, спекой или доками → пинг оркестратору - через владельца, НЕ интерпретация. Право сказать «этого делать не надо» — с аргументом. +## 6. Старт и сдача -## 6. Эхо-протокол и сдача - -Первый деливерабл — ≤10 строк «что я понял: скоуп / инварианты / не-делать». Сдача: отчёт в -`platform-PROGRESS.md` (записка-план · команды батареи · живые пробы · таблица находок и посадок -адверсариального селф-ревью с диспозициями · obstacle reporting · диспозиции §4.6), дерево -незакоммиченное, регистру дефектов — новые строки по находкам. Без саги. +Эхо-протокол: первым деливераблом ≤10 строк «скоуп / инварианты / не-делать». Сдача: отчёт в +`platform-PROGRESS.md` (записка-план · команды · живые пробы · таблица селф-ревью · obstacle · +диспозиции §4.6), дерево незакоммиченное, регистру — строки по находкам. Без саги.