diff --git a/docs/README.md b/docs/README.md index 52599ddb..4a305e5e 100644 --- a/docs/README.md +++ b/docs/README.md @@ -17,7 +17,7 @@ - `research/` — фактура ресёрчей 01–27; у принятых — ревью-шапки, часть тел под ⚠ superseded: **читай баннер прежде содержимого**. Ключевые для навигации: 15 голос · 16 ридер-IDE · 17 внешняя критика · 18 рычаги качества · 19 нарезка · 20 банк-майнинг · 21 обзор транспорта · 22 доменные харнессы · 23 шов движок↔платформа (транспорт superseded D39.106) · 25 холодное ревью шва — форма D39.106, отвергнутые альтернативы, требования к эмиттеру (читать перед любым кодом стыка) · 24 арбитраж банка (ПРИНЯТ D39.102: консилиум закрыт классом, вход фикс-пака банка — §G) · 26 официальные практики Anthropic (D39.121: записка-план, сниппеты хендоффов, карта «уже делаем/перенять»). - [PROGRESS.md](PROGRESS.md) — журнал: CURRENT-STATE + **ЕДИНЫЙ БЭКЛОГ** (единственный трекер) + живой хвост хроники. НЕ источник решений. - `scripts/counts.py` — **производные числа доков считаются им, а не руками** (голова по трём носителям · счёт очереди и зон · вес открытых строк регистра платформы · полнота реестра нот); `--check` даёт ненулевой код на расхождении; `--lint` — линтер file:line-якорей живых доков (D39.126). Его же зовёт зонный хук `scripts/githooks/pre-commit` при коммите, задевающем D-лог или PROGRESS — предупреждает, не блокирует. Заведено по D39.112 п.5б: голова отставала трижды у трёх разных оркестраторов. -- Активные хендофф-промты сессий (состав обновляется при каждом лендинге — норма D39.80): [ORCHESTRATOR_SESSION_PROMPT.md](ORCHESTRATOR_SESSION_PROMPT.md) (роль/нормы; состояния не дублирует) · **Полигон: [POLYGON_EXP2223_REDO_SESSION_PROMPT.md](POLYGON_EXP2223_REDO_SESSION_PROMPT.md)** — фаза Д доводки эксп-22/23 ИДЁТ (заказ владельца 10.08, потолок фазы $4.50; выводы 22/23 заморожены до неё) · [POLYGON_PACKAGE4_SESSION_PROMPT.md](POLYGON_PACKAGE4_SESSION_PROMPT.md) (отложен) . **Фронт: [../frontend/docs/S4_SESSION_PROMPT.md](../frontend/docs/S4_SESSION_PROMPT.md)** — S4 выдан 14.08 (гейт пал D39.130, запуск одобрен владельцем: библиотека/загрузка/прогресс + спек-правка 0.2.3) · **Платформа: [../platform/docs/PLATFORM_P6_SESSION_PROMPT.md](../platform/docs/PLATFORM_P6_SESSION_PROMPT.md)** — P6 выдан 14.08 (П-15 половина шва эмиттера + П-14 форма Б + П-16 дев-сид + деплой-порядок v15; курс владельца: платформа достраивается целиком до фронта) · **Бэкенд: [BACKEND_MIGRATE_SESSION_PROMPT.md](BACKEND_MIGRATE_SESSION_PROMPT.md)** — малое касание `tmctl migrate` (строка 174, вариант А; запуск = ратификация). Эмиттер шва ИСПОЛНЕН и ПРИНЯТ (D39.131, промт в архиве). Все ОТРАБОТАННЫЕ промты — в `archive/prompts/`, отчёты с ревью-шапками — в `archive/reports/`; статусы паков — CURRENT-STATE и D-лог, здесь не дублируются. Зонные журналы фронта/платформы — `frontend-PROGRESS.md` / `platform-PROGRESS.md` в их зонах (прогресс зон только там, D39.100). +- Активные хендофф-промты сессий (состав обновляется при каждом лендинге — норма D39.80): [ORCHESTRATOR_SESSION_PROMPT.md](ORCHESTRATOR_SESSION_PROMPT.md) (роль/нормы; состояния не дублирует) · **Полигон: [POLYGON_EXP2223_REDO_SESSION_PROMPT.md](POLYGON_EXP2223_REDO_SESSION_PROMPT.md)** — фаза Д доводки эксп-22/23 ИДЁТ (заказ владельца 10.08, потолок фазы $4.50; выводы 22/23 заморожены до неё) · [POLYGON_PACKAGE4_SESSION_PROMPT.md](POLYGON_PACKAGE4_SESSION_PROMPT.md) (отложен) . **Фронт: [../frontend/docs/S4_SESSION_PROMPT.md](../frontend/docs/S4_SESSION_PROMPT.md)** — S4 выдан 14.08 (гейт пал D39.130, запуск одобрен владельцем: библиотека/загрузка/прогресс + спек-правка 0.2.3) · **Платформа: [../platform/docs/PLATFORM_P6_DOFIX_SESSION_PROMPT.md](../platform/docs/PLATFORM_P6_DOFIX_SESSION_PROMPT.md)** — дофикс P6 выдан 15.08 по фикс-листу приёмки (ФП-1 exit-2 status-канала — HIGH · деплой-порядок · пины гейта миграции; P6 исполнен и принят УСЛОВНО, лендится одним пакетом с дофиксом; курс владельца: платформа достраивается целиком до фронта) · **Бэкенд: [BACKEND_MIGRATE_SESSION_PROMPT.md](BACKEND_MIGRATE_SESSION_PROMPT.md)** — малое касание `tmctl migrate` (строка 174, вариант А; запуск = ратификация). Эмиттер шва ИСПОЛНЕН и ПРИНЯТ (D39.131, промт в архиве). Все ОТРАБОТАННЫЕ промты — в `archive/prompts/`, отчёты с ревью-шапками — в `archive/reports/`; статусы паков — CURRENT-STATE и D-лог, здесь не дублируются. Зонные журналы фронта/платформы — `frontend-PROGRESS.md` / `platform-PROGRESS.md` в их зонах (прогресс зон только там, D39.100). - Зоны фронта (чужие, читать при касании стыка; каждая ведёт СВОЙ зонный бэклог — единый бэклог их строк не принимает, D39.84): [../frontend/](../frontend/) — веб-интерфейс: промт фронт-сессий S0–S7 + [STACK_DECISIONS.md](../frontend/docs/STACK_DECISIONS.md) (пины версий точными числами и ловушки, сверены с вебом 02.08) + [BACKLOG.md](../frontend/docs/BACKLOG.md) · [../platform/](../platform/) — SaaS control plane: README + [BACKLOG.md](../platform/BACKLOG.md) (П-1..П-14) + `docs/` (зонный журнал `platform-PROGRESS.md` · регистр дефектов · архив промтов P0–P5). - `archive/` — история ([правила архива](archive/README.md)): закрытые промты (`prompts/`) · отчёты с ревью-шапками (`reports/` — на них ссылаются приёмки) · исполненные арх-доки (`architecture/`) · слайсы хроники `PROGRESS-*.md`. Инструкции оттуда не исполнять. - Диаграммы: [../backend/docs/components.puml](../backend/docs/components.puml) · [../backend/docs/pipeline.puml](../backend/docs/pipeline.puml) — дом рядом с кодом (D39.80), правятся бэкендом одним коммитом с кодом; вручную НЕ рендерить (владелец смотрит PlantUML-расширением VS Code). diff --git a/platform/docs/PLATFORM_P6_DOFIX_SESSION_PROMPT.md b/platform/docs/PLATFORM_P6_DOFIX_SESSION_PROMPT.md new file mode 100644 index 00000000..78793c51 --- /dev/null +++ b/platform/docs/PLATFORM_P6_DOFIX_SESSION_PROMPT.md @@ -0,0 +1,160 @@ +# Промт: дофикс P6 — фикс-лист приёмки (шов status-канала · деплой-порядок · пины гейта миграции) + +> Выдан оркестратором №16 15.08.2026 по приёмке пака P6 (панель 5 верификаторов + посадки +> оркестратора). Запуск — по слову владельца. Средний вес: полный DoD `ENGINEERING_STANDARDS` §3, +> но скоуп — ровно фикс-лист ниже, не новый пак. + +## 0. Какую проблему решаем + +Пак P6 (потребительская половина шва эмиттера · интейк формы Б · дев-сид) принят УСЛОВНО. Ядро +устояло под адверсариальной панелью — денежные гонки, дев-вход, фолд юнитов, аддендум деплоя +проверены исполнением и держат. Но приёмка нашла находки, из-за которых лендить без дофикса нельзя: +самая тяжёлая — платформа не переживёт первый прогон с помеченными юнитами (см. ФП-1). Твой +результат = закрытый фикс-лист, после которого оркестратор лендит P6+дофикс одним пакетом. + +**Мандат владельца (15.08, дословно по смыслу): каждая находка ниже — ПРИОР приёмки, а не истина. +ПЕРЕПРОВЕРЬ каждую, пройдясь по коду, прежде чем чинить; где находка не подтверждается — не чини, +а опровергни в отчёте с уликой. Рефакторинг разрешён и приветствуется там, где чинить точечно +получается грязно, — на месте разберись сам и аргументируй.** + +Промт — твой единственный контекст. Улики приёмки даны как file:line — код первичен. + +⚠ Если ты — та же сессия, что строила P6, после компакта контекста: своей памяти о деталях кода НЕ +доверяй — компакт теряет именно детали. Каждую правку начинай с чтения актуального кода, а не с +воспоминания о нём; свои прежние решения перепроверяй так же адверсариально, как чужие. +«Аддендум», упоминаемый ниже, — аддендум оркестратора 14.08 о деплое; его текст — раздел +«Аддендум оркестратора» в записи P6 журнала `platform-PROGRESS.md`. + +## 1. Онбординг (коротко — ты зона `platform/`, правила прежние) + +`CLAUDE.md` (гардрейлы: зона записи ТОЛЬКО `platform/`, НЕ коммитишь, `.env` не читать, чужие +незакоммиченные файлы в `backend/`/`frontend/`/`docs/`/`eval/` не трогать — там живые параллельные +сессии; свой tmctl для проб — из КОПИИ `backend/` вне репозитория) → `platform/docs/ENGINEERING_STANDARDS.md` +§3 (DoD) → раздел «P6» в `platform/docs/platform-PROGRESS.md` (что построено) → этот фикс-лист. +Движок read-only; ⚠ в `backend/` лежит незакоммиченная работа параллельной migrate-сессии — HEAD и +дерево различай `git diff -- backend/`. + +**Эхо-протокол:** ≤10 строк «что я понял: скоуп / инварианты / не-делать» ДО работы. + +## 2. Фикс-лист (по каждой: перепроверить → чинить или опровергнуть → пин + посадка) + +### ФП-1 [HIGH, деньги, несущий путь] `status --json` с exit 2 читается как отказ + +Движок с D39.131 выходит кодом 2 из `status --json`, когда в книге есть flagged-юниты (симметрия с +человеческим режимом, «minor 1d»; `backend/cmd/tmctl/render.go:548-554`, запинено его же +`TestRenderStatusJSONSchemaAndSentinel`). Платформенный `runner.Status` +(`internal/runner/engine.go:157`) любой ненулевой код читает как ошибку и выбрасывает валидный JSON +со stdout. Следствия: settle каждого flagged-прогона откладывается вечно (холд висит, PD-162-класс +на ОБЫЧНОМ пути), `bookMeter` перед спавном отказывает каждому новому прогону такой книги, резюнк +мёртв. Дев-путь `ingest/supervisor.go` (`cmd.Output()`) — тот же класс. + +Чинить: exit 2 при валидном JSON = валидный отчёт. **Перепроверь по коду движка, какие ещё +$0-команды, которые зовёт платформа, могут выйти 2** (`render.go:639`, `:691` — там тоже +`CompletedWithFlags`; `manifest`?) — и накрой каждую осознанно, а не только status. Exit 2 с +НЕвалидным stdout остаётся отказом. Пины: фейк движка, выходящий 2 с валидным JSON → settle +проходит и деньги считаются, спавн допускается; посадка «вернуть err-на-любой-ненулевой» падает. + +### ФП-2 [доки, несущий документ] Деплой-порядок апгрейда движка гоняет `migrate` СТАРЫМ бинарём + +`deploy/README.md:136-148`: шаг 2 зовёт голый `tmctl migrate` ДО установки нового бинаря (шаг 3) — +это no-op старым бинарём, деадлок v15 остаётся. Движковый `backend/cmd/tmctl/migrate.go` (заголовок; +⚠ незакоммичен, параллельная сессия) требует обратного: «стоп прогонов → НОВЫЙ бинарь на место → +migrate ИМ по книгам → прогоны обратно». Поправь порядок: новый бинарь на ВЕРСИОНИРОВАННЫЙ путь +(это безопасно — попытки запинены к своим путям) → `migrate` явным путём нового бинаря → только +затем перевести `TM_PLATFORM_ENGINE_BIN`. Там же: комментарий шага 1 говорит «ДВА факта», а код и +аддендум — ТРИ (незакрытый холд — `README:153` называет его только прозой ниже) — приведи к трём. +Там же реши (запиши выбор): окно между списком `--migratable` и прогоном migrate ничем не +заморожено — либо шаг «остановить демон/приём прогонов» в порядок, либо названный остаток строкой. + +### ФП-3 [DoD] Гейт миграции книг не запинен + +Посадка приёмки «убрать блокер незакрытого холда из `BooksForMigration`» +(`internal/pgstore/books.go:399-413`) пережила ВСЮ батарею. Это денежный гейт аддендума. Пин: тест, +где каждый из ТРЁХ блокеров (живой прогон · резюмируемый · незакрытый холд) по отдельности +переводит вердикт книги в «нельзя», и книга без всех трёх — в «можно»; посадка на каждый блокер +падает. (Сам запрос приёмка проверила живым PG — он верен; не хватает именно пина.) + +### ФП-4 [minor] Ветка нечитаемого маркера хоронит потолочную паузу как `failed` + +`internal/runs/reconcile.go:139-146` — единственная из трёх веток конца попытки, которая НЕ +перечитывает `freshPausedReason` после дрейна: потолок, приехавший событием в этот же свип при +испорченном маркере, закрывается `failed` с пустой причиной (воспроизведено приёмкой на живом PG: +журнал `ceiling{scope:day}` + маркер `{not json` → `failed`/`""`, хотел `paused`/`daily_ceiling`). +Чини (кандидат — поднять перечит выше switch, реши сам) + пин на этот сценарий. + +### ФП-5 [hardening] `TM_PLATFORM_INSECURE_COOKIES` не отвергается рядом с боевым OIDC + +`config.Load` (`internal/config/config.go:252`) отказывает связке DEV_LOGIN+OIDC, но НЕ связке +INSECURE_COOKIES+OIDC — а дев-рецепт `deploy/README.md` экспортирует обе переменные соседними +строками, так что «оператор скопировал стендовое окружение в прод» ловится только наполовину: +демон стартует с боевым Google-логином и куками без Secure/__Host (проверено приёмкой живым +демоном). Приор — тот же отказ на буте; перепроверь, нет ли легитимного сценария (OIDC по http на +стенде?) — если есть, реши форму сам (явный override?) и аргументируй. Пин + посадка; рецепт +поправить, если изменится. + +### ФП-6 [однострочники — перепроверить и взять либо опровергнуть] + +- **Незнакомый scope потолка** → `PausedCreditExhausted` (`internal/pgstore/books.go` `CeilingPause`): + зажигает аккаунтный halted-флаг на аккаунте с деньгами — тогда как `ceiling_unknown` этот же пак + завёл ровно для «потолок был, чей — не установлено». Приор: unknown scope → `ceiling_unknown`. +- **Сид не тримит `--subject`** (`cmd/tmplatformctl/seed.go:42` читает сырую переменную, `Load` + тримит): падённое значение создаёт аккаунт, сжигает одноразовый грант и обрывает сид + (воспроизведено). Выровнять. +- **Комментарий `sink.go` при `at >=`-гарде** утверждает «переанонс несёт СТАРОЕ время события» — + по коду движка неверно (`pipeline/events.go:357` штампует время анонсирующего процесса, + `ForgetEvents` стирает старую строку); гард всё равно корректен, но довод ложен — привести к + факту. +- **Комментарий Resume про book-ceiling** («remaining ноль и резюм ничего не меняет») — по + арифметике остаток до одного зарезервированного вызова положителен, резюм даёт короткий + холд-спавн-паузу цикл за клик. Комментарий привести к факту; сам чурн — чини или строкой, реши. +- **exit 5 + стоп, записанный ПОЗЖЕ маркера** → сегодня `failed` (воспроизведено): намерение + снимает «прерывание», а `stoppedOnRequest` отвергает по времени. Приор: намерение стопа при + exit 5 = `stopped` независимо от того, кто был первым (пользователь ХОЧЕТ стоп — не + перезапускать и не хоронить); перепроверь, не ломает ли это гард «чистый финиш перебивает стоп» + (0/2/3 — он должен остаться), реши и запини. + +### ФП-7 [строки регистра — не чинить, завести честно] + +Новые находки приёмки, которые НЕ чинятся этим касанием, — строками, **нумерация с PD-217** +(⚠ PD-198/PD-199 НЕ трогать вовсе — их коллизию правит оркестратор при лендинге; открытый +daily_ceiling-вопрос остаётся под номером PD-199): книга на `daily_ceiling`/вечно-незакрытом холде +навсегда блокирует апгрейд движка без выхода для оператора · down-путь миграции 00015 падает на +данных с новыми причинами паузы · рестарт при упавшем дрейне навсегда теряет непримененный хвост +журнала (`unit_resolutions` для P7) · резерв имени `dev` сравнивается байт-в-байт («Dev» проходит; +сегодня инертно — Postgres сравнивает байт-в-байт) · TM_TRACE_ID переиспользуется на ре-спавне +попытки, движок отвергает и чеканит свой (деградация в резюнк, свежесть) · сид-променад не имеет +теста (или добавь тест — реши по цене). Что из этого возьмёшь чинить сверх строк — твоё право, но +класс PD-83 помни: не расширяться молча. + +### ФП-8 [журнал] Базис «396 → 403» в шапке P6 не воспроизводится + +В HEAD 359 `^func Test`, в дереве 401 (+2 fuzz) — прирост +42, не +7; откуда 396 — неизвестно. +Поправь запись P6 в журнале на воспроизводимые числа С КОМАНДОЙ счёта. + +## 3. Чего НЕ делать + +Контракт (`openapi.yaml` и зеркало) не трогать (PD-199-вопрос ждёт слова владельца; правит S4). +Читающую поверхность (P7), эскроу, брокер — нет. Чужие зоны и чужие незакоммиченные файлы — нет. +`PD-198`/`PD-199` в регистре — нет (см. ФП-7). Тесты/гейты под зелень не подгонять — несогласие с +пином = пинг. + +## 4. Самопроверка и сдача (DoD = `ENGINEERING_STANDARDS` §3) + +Батарея `make check` с живым PG (`~/.local/pgsql`, порт 55433) под `-race`, скипов 0 — включая +второй гейт (`TM_PLATFORM_TEST_ENGINE_BIN` + `_BOOK_TEMPLATE`, tmctl из копии backend/ вне репо). +ФП-1 — «тяжёлый» класс: живая проба на фейке, умеющем выйти 2 с валидным JSON И с мусором. Каждый +фикс — пин + посадка, списки посадок В ЖУРНАЛ; дифф `^func Test` исполнением, не памятью. +Адверсариальное ревью диффа ДО сдачи механизмом (author≠reviewer, субагенты разрешены явно; ≥1 +опровергатель другой модели на оценочной линзе); **артефакт — таблица «находка → диспозиция» в +журнале**. Предметные оси этого дофикса (вправе добавить/аргументированно снять): (1) шов против +РЕАЛЬНОГО движка — перечень команд, способных выйти 2, снимается чтением/пробой настоящего tmctl +из копии, не догадкой; (2) деньги: settle flagged-прогона пересчитать из сырого леджера двумя +путями; (3) конфиг-отказы (ФП-5) — атаковать обходы связки, как security-ось P6 атаковала дев-вход. +Записка-план ID (ФП-N) → статус (закрыт/опровергнут/строкой) → улика; «заявление = команда». +Сдача: раздел «Дофикс P6» в `platform-PROGRESS.md`, регистр строками тем же деревом, +`python3 docs/scripts/counts.py --check` зелёный от корня, дерево НЕ коммитить. + +## 5. Канал вопросов + +Непонятно / находка не подтверждается кодом / фикс тянет за границы зоны → пинг оркестратору через +владельца, НЕ интерпретация.