22 KiB
⚠⚠ ПРОМТ ОТРАБОТАН — исторический, НЕ задание. Исполнен сессией P6 (14–15.08), ПРИНЯТ оркестратором №16 с фикс-листом ФП-1…ФП-8 (панель 5 верификаторов + посадки), дофикс закрыт той же сессией, залендено одним пакетом D39.132: потребительская половина шва эмиттера (PD-113/PD-196 закрыты), интейк формы Б, дев-стенд, деплой-порядок v15. Механика — зонный журнал, разделы «P6» и «Дофикс P6».
Промт: платформа P6 — половина шва эмиттера (П-15) · интейк формы Б (П-14) · дев-сид (П-16) · деплой-порядок v15
Выдан оркестратором №16 14.08.2026. Запуск — по слову владельца. Курс владельца 14.08: платформа достраивается ЦЕЛИКОМ до фронта — фронт потом идёт по готовому и отлаженному, а не пушит решения в платформу (его пожелания заходят контрактом и PD-строками, как и раньше).
0. Какую проблему решаем и что даст твой результат
Платформа — SaaS-слой между веб-интерфейсом и движком перевода: пользователи, кредиты, очередь,
запуск движка транзиентными systemd-юнитами, read-model в Postgres. Построено много (P0–P5:
вход · леджер · раннер · интейк книг · стоп/резюм · метрики), и 14.08 заленден ДВИЖКОВЫЙ эмиттер
событий (D39.131, 9cfe080): движок теперь пишет events.jsonl (StreamVersion 1.1) и
выходит РАЗЛИЧИМЫМИ кодами — 4 потолок · 5 graceful stop · 10–19 полоса отказов. Твоя зона
этих сигналов ещё не читает: потолочный стоп у нас материализуется failed (единственный
major регистра PD-113 — контрактно видимая ложь: контракт запрещает называть резюмируемый стоп
failed), а refusedTheSource() не смотрит на код выхода вовсе — опечатка оператора в
book.yaml до сих пор стоит пользователю удалённого файла (PD-196). Плюс два хвоста
ратификаций: интейк должен сам рендерить стартовый book.yaml (форма Б, D39.130 — без этого ни
одна загрузка через UI не доезжает до разбора без ручной работы оператора), и стенду нужен
дев-сид с тестовым пользователем (слово владельца 14.08 — чтобы фронт разрабатывался на живой
платформе). Твой результат = платформа честно проживает все исходы движка, загрузка доезжает до
перевода без оператора, и на стенде можно жить тестовым аккаунтом.
Промт — твой ЕДИНСТВЕННЫЙ контекст; всё несущее — здесь или в названных доках.
1. Онбординг (порядок чтения, до кода)
CLAUDE.md(корень) — гардрейлы; жёсткое для тебя: зона записи ТОЛЬКОplatform/, ты НЕ коммитишь,.envне читать, чужие незакоммиченные файлы (вdocs/,eval/,frontend/— там живут параллельные сессии) не трогать.backend/— read-only; свойtmctlдля проб собирай в копии ВНЕ репозитория (прецедент приёмки D39.131).platform/README.md+platform/docs/ENGINEERING_STANDARDS.md(критерии приёмки — каждый промт зоны обязан на них ссылаться; отступление = пинг) +platform/docs/STACK_DECISIONS.md(пины · стенд PG без root · §15–27 решения раннера/интейка).platform/docs/platform-PROGRESS.md— шапка «Текущее состояние» + пинг оркестратора 14.08 про эмиттер (словарь событий финальный) + пинг про гигиену доков + записи P4/P5.platform/BACKLOG.md(П-14 · П-15 · П-16 — твои задачи) +platform/docs/DEFECT_REGISTER.md(секции открытых; целевые PD названы ниже).- Движковая правда шва:
docs/architecture/16-events-emitter.md(норматив) + сам код движка read-only —backend/internal/runevents/(journal.go,runevents.go),backend/internal/pipeline/events.go,pipeline/refusal.go,store/outbox.go,cmd/tmctlexit-коды. Код первичен.
Эхо-протокол: первый деливерабл — ≤10 строк «что я понял: скоуп / инварианты / не-делать» ДО работы.
2. Задача 1 — П-15: потребительская половина шва эмиттера (несущий путь: деньги и статусы)
Движковая половина принята D39.131; словарь = ваш же events.go, принятый движком с диффом
(пинг 14.08 в журнале зоны: StreamVersion 1.1 · Ceiling.Scope: book|day ·
Finished.outcome += ceiling|stopped · eta_seconds = темп ТЕКУЩЕГО прогона · unit_done.unit
= лидерный first_chunk_idx). Делай РОВНО (ратифицировано):
- (а) Маппинг exit-кодов движка. Сегодня
outcome()знает 0/2/3, всё прочее =failed. Новая семантика: 4 = потолок →pausedс причиной потолка, НИКОГДА неfailed(закрывает PD-113, единственный major); 5 = graceful stop по сигналу; 10–19 = полоса отказов с классами (10 конфиг · 11 «источник прочли и вердикт: книги в байтах нет» — ЕДИНСТВЕННЫЙ класс, по которому интейк вправе удалить загрузку · 12 лок · 19 безымянный) —refusedTheSource()судит по КОДУ, не по «exit 1» (закрывает потребительскую половину PD-196: опечаткаbook.yamlбольше не стоит файла).paused_reasonчитать ПОСЛЕ drain журнала, не из stale-снапшота до него (находка приёмки D39.131 п.3). ⚠ Семантику «exit 5 БЕЗ записанного намерения стопа» (штатная перезагрузка хоста, чужой SIGTERM) реши сам и запиши: приор — это прерывание, не авария и не пользовательский стоп ⇒ кандидат на перезапуск реконсилятором (путь строки 138), закрывает остаток PD-152; опровергается аргументом. - (б) Фолд
unit_done— ПРИСВАИВАНИЕМ по тройке (chapter, unit, wave), не инкрементом (ратифицировано D39.131 п.2г: поток at-least-once, идемпотентность — обязанность потребителя; заодно самолечит потерю недодрейненного хвоста при рестарте). - (в) Словарь и версию читателя привести к потоку 1.1:
ingest.StreamVersionсегодня"1.0"и словарьevents.goне знаетCeiling.Scope/новых outcome — по мажору совместимо, но читатель врёт о том, что понимает. ПринятьCeiling.Scope(book|day) и outcomeceiling|stopped. Scope = диагностика PD-157 (дневной потолок изbook.yamlтеперь различим); resume прогона, вставшего на ДНЕВНОМ потолке, не гонять в цикл — реши форму (отказ с диагностикой / отложенный повтор), аргументируй. - (г) Dev-супервизор
outcomeOfстейл (знает 0/2/3) — привести к той же семантике. - Watch (провериться, не обязательно строить): foreign-hello adoption при пре-существующем журнале в workdir — приёмка отметила как наблюдение; воспроизведёшь дефект — фикс с пином, нет — запиши что проверено.
Деньги на этом пути живые: любое изменение веток закрытия прогона — «тяжёлый» класс по
ENGINEERING_STANDARDS §1 (полный цикл: пины + посадки + живая проба).
3. Задача 2 — П-14: интейк рендерит стартовый book.yaml (форма Б, ратификация D39.130)
Шов готов и назван — books.ErrNotProvisioned заменяется рендером в ОДНОМ месте
(books.Service.manifest-путь, твоя же оценка в развилке P5). Делай РОВНО:
- Рендер ОДИН раз при создании книги из деплой-шаблона (
TM_PLATFORM_BOOK_TEMPLATE— файл оператора): языки и жанр изBookIntake,source_file— имя, которое интейк сам записал, потолки/пути пайплайна — из шаблона. Дальше файл принадлежит оператору: платформа его не читает и не правит (D39.110 §2b в силе). - Требования к полям —
backend/internal/config/book.goкак СПРАВОЧНИК (read-only): рендер обязан давать конфиг, который движок грузит; проверь живымtmctl manifestсвоей сборки. - Отсутствие/битость ШАБЛОНА — беда деплоя, не книги: не терминалить, не жечь бюджет попыток
(тот же предикат
waitsForTheDeployment, что у пропавшего корня). - Форма В (
tmctl init, строка 170 единого) придёт позже — рендер должен сниматься заменой одного места, это ревью-вопрос к твоей структуре.
4. Задача 3 — П-16: дев-сид стенда (слово владельца 14.08)
Цель: фронт разрабатывается на живой платформе тестовым пользователем. Состав:
- Одна команда/цель (
make seedилиtmplatformctl-подкоманда — реши форму): тестовый аккаунт- грант (админ-CLI уже умеет) + демо-книга через ЖИВОЙ интейк (не прямой INSERT — сид должен ходить теми же путями, что пользователь).
- Дев-вход без внешнего OIDC-провайдера. Сверь, существует ли dev-профиль (П-6/PD-8 бэклога зоны); в пробах сессию вставляли в Postgres руками — это не рецепт. Если нет — построй узкую дев-форму с ЖЁСТКИМ гейтом: недостижима в проде ПО ПОСТРОЕНИЮ (например, монтируется только при явной переменной + отказ, если одновременно задан боевой OIDC — форму реши сам, security-ось ревью обязана её атаковать: дев-вход, доступный в бою, = захват аккаунта).
- Рецепт — в
deploy/илиSTACK_DECISIONS(где живёт стенд), одной страницей: поднять PG → мигрировать → сид → фронт через дев-прокси (TM_PLATFORMна стороне фронта уже есть). - Границы (уже ратифицированы, не переоткрывать): фикстуры фронта остаются его батарее; снос
frontend/src/mock/— не твоя работа и не сейчас (триггер Ф-29 у фронта).
5. Задача 4 — деплой-порядок против деадлока v15 (строка 174 единого)
Факт: read-only status отказывает схеме старее бинаря, а ты зовёшь его ПЕРЕД каждым спавном и
для settle ⇒ деплой эмиттер-бинаря НА СТЕНД запирает все существующие книги. Решение владельца:
движку параллельно выдан микро-промт tmctl migrate ($0-команда, write-open без прогона).
Твоя часть:
- Жёсткое правило: эмиттер-бинарь НЕ деплоится на стенд, пока
tmctl migrateне заленден (или явное слово владельца). До того П-15 строится и проверяется против журналов, писанных СВОИМ tmctl из копииbackend/вне репозитория — ровно так делала приёмка D39.131. - Деплой-док зоны фиксирует порядок апгрейда движка: стоп/дренаж прогонов →
migrateпо каждой книге → новый бинарь в работу; шаг проверяется исполнением на стенде, когда migrate приедет (если в твою сессию не успеет — порядок записан, проверка исполнением помечается ждущей, НЕ клеймится сделанной).
6. Задача 5 — гигиена зонных доков (пинг оркестратора 14.08, список в журнале зоны)
Чинить по факту кода: README.md:85 (тулчейн 1.26.6) · README.md:87 и STACK_DECISIONS.md:23
(River «не подключён» против построенной P4-очереди) · README.md:47-48 (вопрос book.yaml решён
D39.130 — а после твоей задачи 2 и построен) · PLATFORM_DIRECTION.md — противоречие
(oapi-codegen «взять — доказано» и sqlc «до первого хендлера» НЕ исполнены — ручки рукописные)
тихо не оставлять: либо исполняй на новых ручках, либо ПРЕДЛОЖИ пере-подпись направления с
причиной — ратифицирует оркестратор при лендинге, направление ратифицировано не зоной ·
ре-диспозиция PD-60 и PD-61: обе стоят open, а их движковая половина решена и залендена
D39.131 (PD-60 — деградация стала громкой; PD-61(а) — буфера в эмиттере нет вовсе) — закрыть
либо пере-формулировать остаток по факту кода · DEFECT_REGISTER.md: диспозиции D39.130 в PD-172/173/174/180 (спек-правка
0.2.3 = задача S4 фронта, идёт параллельно) · открытые PD-180/185/196 из секций «Закрытые…» — в
открытые · порядок PD-178 · путь counts.py · веса секций · STACK_DECISIONS.md:17
(«make tools-check» → version-check) · П-1/П-3 бэклога не знают построенного P4 · хвост (г)
третьего раунда (перечислительность мета-пина systemd) — PD-строка или явное закрытие.
7. Попутные PD того же касания — по весу, реши сам (взять либо диспозиционировать, не молчать)
Все живут в файлах, которые ты и так трогаешь: PD-141 (PauseRun молча возвращает nil на
завершённом прогоне) · PD-164 (существующий, но неразбираемый маркер вечно валит
реконсиляцию — нужен аналог карантина) · PD-165 (относительный TM_PLATFORM_CTL_BIN — отказ
на буте, как у StateDir) · PD-163 (ревизия области читается вторым запросом после страницы)
· PD-154 (окно Settle/MarkSettled). Расширять пак сверх этого списка НЕ надо (класс
PD-83): нашёл новое — строкой в регистр.
8. Чего НЕ делать
Читающая поверхность (SSE-эндпоинт, ручки глав/юнитов/замечаний, проекция bank.json) — это
СЛЕДУЮЩИЙ пак (P7), не тяни её сюда. Эскроу/uncertain/closing (строка 136) — денежный промт
позже. Контракт (openapi.yaml канон и зеркало) не трогать — его прямо сейчас правит S4-сессия
фронта в своей зоне. П-2 (брокер) — гейт «до второго параллельного пользователя» не наступил.
Платёжного провайдера не существует. Чужие незакоммиченные файлы в docs//eval//frontend/
не трогать — там живые сессии.
9. Самопроверка и сдача (мандат; DoD = ENGINEERING_STANDARDS §3 целиком)
- Исполнением, не чтением: батарея
make checkс живым PG (~/.local/pgsql, порт 55433, рецепт в STACK_DECISIONS) под-race, скипов 0 · живая проба на собранных бинарях с фейком движка, моделирующим СЕМАНТИКУ (exit-коды 4/5/10–19, кумулятивный счётчик — фейк, который не может отказать, не проверяет ничего: урок D39.123) · каждый новый инвариант запинен тестом, сессия называет «какой тест что пинит» · посадки своих мутаций с восстановлением, списки посадок — В ЖУРНАЛ (не в скрэтчпад: урок дофикса-2). - Деньги — двумя независимыми путями счёта; леджер = нижняя граница.
- Адверсариальное ревью диффа ДО сдачи — механизмом, author≠reviewer: независимые ревью-агенты по диффу с установкой опровергать; субагенты/параллельные агенты разрешены явно. В панели — ≥1 опровергатель ДРУГОЙ модели на оценочных линзах (D39.120; в этой зоне это эмпирически доказано: кросс-семейный круг дофикса-2 нашёл 5 дефектов, которых три однофамильца не увидели, два — уничтожение данных). Артефакт — таблица «находка → диспозиция» в журнале.
- Предметные оси этого пака (вправе добавить/аргументированно снять): (1) индустриальный первоисточник прежде велосипеда (норма зоны §1); (2) деньги и гонки — каждый новый путь закрытия прогона атакуется устаревшим снапшотом/двумя поколениями свипа (класс PD-181/193); (3) безопасность дев-входа — атаковать достижимость в проде.
- Заявление = команда; числа с командами; «чего НЕ сделал» — явным списком; записка-план ID → статус → улика по каждой задаче и каждому PD.
- Сдача: запись в
platform-PROGRESS.md(механика, пробы, посадки, диспозиции), регистр обновлён строками тем же деревом,python3 docs/scripts/counts.py --checkзелёный, дерево НЕ коммитить — лендит оркестратор после адверсариальной приёмки.
10. Канал вопросов
Непонятно / промт конфликтует с кодом или доками / нужна правка вне platform/ → пинг
оркестратору через владельца и запись в зонный журнал; НЕ интерпретация. Настоящие развилки
эскалируй быстро — это норма (образец: развилка book.yaml в P5, которую сессия правильно НЕ
интерпретировала тихо).