Correct the review form by the owner's word: a separate session runs the contract review, the orchestrator workflow attempt is stopped and discarded, prompt issued

This commit is contained in:
heaven 2026-08-15 20:46:39 +03:00
parent 64def62885
commit 1c0dd68a9c
4 changed files with 140 additions and 2 deletions

View file

@ -0,0 +1,137 @@
# Промт: сессия КОНТРАКТ-РЕВЬЮ — API v0 фронт↔платформа на адекватность и индустриальные нормы (строка 179)
> Выдан оркестратором №17 15.08.2026 по заказу владельца (D39.136 п.5; форма «отдельная сессия»
> — слово владельца 15.08, эррата 15.08-в). Запуск — по слову владельца. Тяжёлый класс: полный
> аппарат — эхо-протокол, судейство буллетов, кросс-модельные опровергатели.
## 0. Какую проблему решаем и что даст твой результат
TextMachine — сервис издательского перевода книг: Go-движок `tmctl` (процесс-на-прогон, SQLite
на книгу) · SaaS-платформа `platform/` (пользователи/деньги/очередь, зовёт движок процессами,
проецирует его артефакты в HTTP) · веб-фронт `frontend/` (React, дом — мир моков MSW). Между
фронтом и платформой — ратифицированный контракт **OpenAPI 0.2.3**: канон
`docs/architecture/14-api-contract/openapi.yaml` + компаньон-README рядом (провенанс, К-вопросы).
Контракт рос ТОЧЕЧНЫМИ правками (0.2.0→0.2.3), каждую сверяли «спека ↔ код», но целиком «а
хороший ли это API» не смотрел никто. Владелец заказал жёсткое ревью: без костылей и хаков, по
индустриальным нормам, и — ключевое — **БЕЗ ИНЕРЦИИ от уже принятого**: «ратифицировано ≠
правильно». Живой пример, почему это не паранойя: правило PD-172 ратифицировано в форме «сервер
читает multipart-форму до части `file`, необязательное поле после файла МОЛЧА теряется при
успешном 201» — потому что так делает код платформы. Тихая потеря данных на успешном ответе —
кандидат в протёкшую реализацию, и таких мест может быть больше.
Твой результат: **доклад с СУЖДЁННЫМИ буллетами** — каждый с вердиктом, миграционной ценой и
рекомендацией — из которого владелец и оркестратор ратифицируют батч правок **0.3.0**. Сам ты
НИЧЕГО не правишь и не заводишь: ни спеку, ни код, ни бэклог, ни канон — только отчёт. Момент
идеальный: до беты, по одному построенному потребителю с каждой стороны — дешевле не будет.
## 1. Онбординг (порядок чтения; ⚠ вся документация и код написаны нейросетями — могут ошибаться)
1. `CLAUDE.md` (корень) — гардрейлы; жёсткие для тебя: `.env` НЕ читать · PUML не рендерить ·
чужие незакоммиченные файлы (сейчас в дереве живёт полигон: `eval/`, `docs/POLYGON_*`,
`docs/experiments/23-*`) не трогать · git-коммитов НЕ делать вовсе.
2. Канон: `docs/architecture/14-api-contract/openapi.yaml` ЦЕЛИКОМ + компаньон-README рядом
(К-вопросы, провенанс ✓/◆/○, §2.15 потолок).
3. Код — read-only, все три зоны: `platform/internal/` (httpapi, books, runs, ingest — что сервер
ДЕЛАЕТ на самом деле) · `frontend/src/api/` + `src/mock/` + использование в `src/showcase/`
(что клиент реально зовёт, чем лечится сам) · движок: `backend/cmd/tmctl/` +
`backend/internal/pipeline/{manifest,bankexport,status,export}.go` + эмиттер `events.jsonl`
(правда данных, которые контракт проецирует).
4. Планы (контракт обязан их пережить): `docs/product-requirements.md` (ПТ-реестр) ·
`frontend/docs/FRONTEND_SESSION_PROMPT.md` §3 (сценарии S5S7: подпись банка, читалка,
экспорт/настройки/лимиты) · `docs/research/16` (ридер-IDE Ф3) · `docs/research/27` (структура
глав — двинет контракт: правка названий, типы глава/фрагмент) ·
`docs/architecture/15-money-path.md` · `platform/BACKLOG.md` (П-строки читающей поверхности) ·
строки единого бэклога 49 (annot-v1) · 94 · 160162 · 169 · 178 (`docs/PROGRESS.md`).
5. Голова D-лога по контракту — только для контекста ратификаций: D39.99 (v0) · D39.115/123/127/
129/130/135 (минорные бампы). Помни мандат: эти решения МОЖНО опрокидывать — аргументом.
**Эхо-протокол:** первый деливерабл — ≤10 строк «что я понял: скоуп / инварианты / не-делать»
ДО работы. Расхождение чинится на минуте пять, не на приёмке.
## 2. Метод (ратифицировано направлением — отступление с аргументом в отчёте приветствуется)
Субагенты, панели и воркфлоу-оркестрация для тебя **РАЗРЕШЕНЫ ЯВНО** — дефолт-запреты харнесса
на это ревью не распространяются; изоляция агентов обязательна (читающие мандаты, state-changing
git запрещён перечислением: reset/checkout/restore/clean/stash/add/commit/rebase/push).
1. **Инвентарь фактов** чтением кода трёх зон и планов — каждый факт с `file:line`. Особо:
расхождения «сервер умеет — контракт молчит» и «контракт обещает — сервер не делает»
(известные: `BookIntake.title` платформа не читает, `Book.reject_reason` не проецирует —
это ратифицированный форвард с носителем в P7, НЕ находка; ищи НЕизвестные).
2. **Greenfield-контраст (главный механизм анти-инерции):** агент(ы), которые НАШУ СПЕКУ НЕ
ВИДЕЛИ, проектируют форму API с нуля от продуктовых требований (собери им бриф из §1 п.4 БЕЗ
ссылок на спеку). Потом дифф с нашей: совпадение — подтверждение, расхождение — вопрос на суд,
не приговор.
3. **Линза стандартов:** постатейная сверка с первоисточниками — RFC 9110 (семантика HTTP),
RFC 9457 (problem details), практики SSE, OpenAPI-конвенции, публичные стайлгайды уровня
Stripe/GitHub/Google/Microsoft. Интернет-доступ легитимен для чтения стандартов; выводы — с
цитатой источника.
4. **Аудит квирков:** каждое место спеки, рождённое «уточнением по коду», судится вопросом:
«это осмысленный контракт или протёкшая деталь реализации — и что дешевле чинить: спеку или
код?» (обе зоны построены — цена реальна с обеих сторон).
5. **Судейство буллетов ДО отчёта:** каждый кандидат-буллет проходит адверсариальную верификацию
— опровергатель с установкой опровергать, **кросс-модельно** (опровергатели текстовых/
оценочных линз — ДРУГИМ семейством модели, чем автор буллета); вердикт CONFIRMED / PLAUSIBLE /
REJECTED. Выживший буллет несёт: severity · чью боль лечит (фронт/платформа/движок/продукт/
индустрия) · **миграционную цену** (что и у кого переделывается) · рекомендацию «менять спеку /
менять код / оставить как есть с записанным обоснованием». REJECTED-буллеты — отдельной
секцией с причинами (отвержение лишнего — тоже результат).
## 3. Обязательные входы (вопросы, уже стоящие в очереди — каждому дать диспозицию в отчёте)
- **Ф-56**: конец разбора книги никто не объявляет — клиент лечится опросом раз в 3 с; кадр/канал?
- **Ф-57**: какие пары языков продукт принимает — контракт не выражает ни список, ни отказ по паре.
- **Ф-61 + машинные коды + i18n**: платформа и движок шлют человеческие строки хардкод-английским;
машинных кодов ошибок нет; слово владельца 15.08 — хардкод недопустим во ВСЕХ зонах; как
контракт должен нести причины (код + словарь клиента? Accept-Language? где живут фразы)?
- **Ф-62**: переименование книги — направление «в контракт» ратифицировано (D39.136 п.4в); дать
форму — и шире: какие записи на книге вообще легитимны (сейчас на всей поверхности НИ ОДНОЙ).
- **Форма PD-172**: потоковое правило multipart (см. §0) — контракт или протёкшая реализация?
- **Пагинация и масштабы**: банк пагинирован (1000/курсор), а главы (реальная книга — 2284
раздела), юниты, замечания, события — нет; сверь масштабы с движковыми артефактами.
- **Зашитые числа**: 16 частей · 1 КиБ на поле · page 1000 — принадлежат ли контракту (коммент
кода платформы зовёт их «делом деплоя»).
- **Паттерн-консистентность**: `paused_reason` required+nullable против `reject_reason` optional
— одна семантика, два паттерна (спека мотивирует; суди мотивацию); найди ВСЕ такие пары.
- **Идемпотентность** `POST /books` (ретрай загрузки = дубль книги?), семантика 408/413, 404 как
«на этом деплое нет интейка».
- **Версионная политика**: клиент сверяет только мажор, миноры аддитивны — достаточно ли для
планов S5S7/Ф3.
- **К-вопросы компаньона** — статусы и что ревью может закрыть.
- **Спойлер (В-10)**: ТОЛЬКО если владелец к моменту запуска сказал «защита» — тогда форма
«sense по явному раскрытию»; если «вежливость» или слова нет — НЕ трогать.
## 4. Интересы, которые обязаны быть учтены (владелец 15.08: «учесть интересы все»)
Фронт (что реально нужно UI: лаг, спам запросов, honest states) · платформа (реализуемость,
деньги/холды, деплой) · движок (контракт не должен ВРАТЬ о данных движка и их именах; ложные
друзья класса source/origin уже ловились) · продукт и планы S5S7/Ф3 (подпись банка, читалка,
экспорт — без слома контракта) · индустрия (стандарты §2.3). Конфликт интересов — называть
явно, не решать молча в чью-то пользу.
## 5. Границы
- Ты НЕ правишь: спеку · код · бэклог · D-лог · README. Единственный твой файл —
`docs/research/28-contract-review.md` (отчёт). Дерево НЕ коммитить — лендит оркестратор.
- $0 по внешним провайдерам перевода: платных LLM-вызовов НЕТ (агент-токены твоего харнесса —
не в счёт). Интернет — только чтение стандартов/доков.
- Живой стенд платформы поднимать НЕ требуется (можно read-only читать код тестов, чтобы понять
поведение; вердикт о рантайме без прогона помечай PLAUSIBLE — D39.129).
## 6. Самопроверка и сдача (мандат, не пожелание)
- «Заявление = команда»: каждый факт — `file:line` или цитата стандарта с URL; числа — командой.
- Записка-план по буллетам (ID → статус → улика; D39.121) — движение по ней, сдача = все ID
имеют диспозицию.
- Критик полноты на финале: что НЕ покрыто (зона/ось/вход из §3) — явным списком, не молчанием.
- Obstacle reporting: что не удалось прочитать/проверить — явно.
- Отчёт `docs/research/28-contract-review.md`: (1) карта фактов по зонам · (2) буллеты
CONFIRMED/PLAUSIBLE с ценой и рекомендацией, упорядоченные по severity · (3) REJECTED с
причинами · (4) предложение состава батча 0.3.0 (или честное «контракт здоров, N точечных
правок») · (5) не покрытое. Владельцу — краткое резюме поверх файла.
## 7. Канал вопросов
Непонятно / промт конфликтует с кодом или доками / нужна правка вне твоего файла → пинг
оркестратору через владельца, НЕ интерпретация. Настоящие развилки эскалируй быстро — это норма.

View file

@ -121,7 +121,7 @@
| 176 | **Паника движка неотличима от «completed with flags»**: непойманная паника Go-рантайма = exit 2, а 2 — «успешный» код контракта; платформа записывает `ready` для прогона, упавшего посреди работы (деньги целы — расчёт из `status --json`; врёт статус). Лечение движковое: `recover` в main tmctl либо другой номер для флагов; найдено адверсариальным ревью P6 (PD-212 регистра платформы) · тем же касанием exit-контракта — usage-строка `invocation.go` не знает migrate/backup/seed-lint (замороженный контракт; чинить разом — D39.134 п.3) | бэкенд | когда-нибудь (следующее касание exit-контракта) | малое касание | D39.132, PD-212, D39.134 |
| 177 | **Гигиена restore point `tmctl migrate`** (находки приёмки ВНЕ карты отчёта; фикс-лист ФМ — запись приёмки 15.08, PROGRESS «Бэкенд»): ретрай в ту же секунду после сорванного шага = exit 1 «backup already exists» вне полосы — ровно на цикле самолечения платформы · kill -9 посреди шва оставляет РВАНУЮ копию под легитимным именем (ручной откат по ней = потеря данных; лечение — temp+rename) · копии restore point не подчищаются (повтор после срыва копит их) · SIGINT/SIGTERM в migrate не прерывают (ctx не доезжает) · комментарий migrate.go «no money touched» на no-op неверен (recovery зануляет leftover reserved) | бэкенд | когда-нибудь (следующее касание migrate/бэкапа) | малое касание + тесты | D39.134, приёмка №17 |
| 178 | **Калибровка `sense` банка** — слово владельца 15.08 (D39.136 п.4б): смысл должен быть «ёмкий и достаточный на всю книгу, но не слишком подробный» (образец: «спутница главного героя»); сейчас возможно КОРОТКОВАТ; замер длины/достаточности на подписанном банке → правка промптов банкноты/терминолога (двигает провод — цену назвать при внесении) | бэкенд/полигон | когда-нибудь (касание банка) | замер → правка промптов | D39.136 п.4б |
| 179 | **Контракт-ревью 0.3.0 — заказ владельца 15.08** (D39.136 п.5): жёсткий ресёрч всем репо (код трёх зон + планы), greenfield-проект API без нашей спеки + линза индустриальных стандартов + аудит квирков «контракт или протёкшая реализация», КРОСС-МОДЕЛЬНОЕ судейство каждого буллета с миграционной ценой ДО записи в бэклог; мандат анти-инерции «ратифицировано ≠ правильно»; входы: Ф-56 · Ф-57 · Ф-61 · Ф-62 · форма PD-172 · пагинация/производительность чтения банка · i18n сообщений всех зон · спойлер (если В-10 = «защита») | оркестратор | скоро (фазный воркфлоу №17) | воркфлоу-ресёрч → доклад → ратификация → 0.3.0 батч | D39.136 п.5 |
| 179 | **Контракт-ревью 0.3.0 — заказ владельца 15.08** (D39.136 п.5): жёсткий ресёрч всем репо (код трёх зон + планы), greenfield-проект API без нашей спеки + линза индустриальных стандартов + аудит квирков «контракт или протёкшая реализация», КРОСС-МОДЕЛЬНОЕ судейство каждого буллета с миграционной ценой ДО записи в бэклог; мандат анти-инерции «ратифицировано ≠ правильно»; входы: Ф-56 · Ф-57 · Ф-61 · Ф-62 · форма PD-172 · пагинация/производительность чтения банка · i18n сообщений всех зон · спойлер (если В-10 = «защита») | ресёрч-сессия | скоро (**промт `CONTRACT_REVIEW_SESSION_PROMPT.md` ВЫДАН 15.08**; форма «отдельная сессия» — слово владельца, эррата 15.08-в: воркфлоу-заход №17 остановлен, результаты выброшены) | сессия по промту → доклад → ратификация → 0.3.0 батч | D39.136 п.5, эррата 15.08-в |
| 49 | **Этапы Б+В спеки D15.2** (content-addressed resume / `guard_hash` — D39.31 сознательно не строил) ; этап В = tmctl export-контракт D29.1 (annot-v1 · цвет-мап+rollup · политика красных fail-closed) + операторский протокол-документ релиза гендер-твиста (D5.1): сам механизм УЖЕ построен — until_ch-правка → точечный re-edit со сметой и $0-пере-пином (`repin.go`/`rebill.go`, D39.42 п.5/D39.45) | бэкенд | скоро (ПОДТЯНУТА D39.81: annot-v1 = источник замечаний для фронта — критический путь подключения) | отдельное решение (annot-половина — по контракту 14, D39.99) | D39.34(4), D33 п.5, D39.81 |
| 49а | **ALTER-шаги миграций v8v14 не идемпотентны вопреки шапке `migrate.go:9-11`** (полу-применённая БД не сходится; счётчик версий скрывает) — находка критика полноты пака-19 | бэкенд | когда-нибудь | отдельное решение | D39.56, PACK19_BUILD §6.9 |
| 50 | F3-остаток идемпотентности | бэкенд | когда-нибудь | отдельное решение | D39.34(4) |

View file

@ -17,7 +17,7 @@
- `research/` — фактура ресёрчей 0127; у принятых — ревью-шапки, часть тел под ⚠ 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) (отложен) . **Фронт: ЗОНА ЗАМОРОЖЕНА (D39.136 п.2)** — S4 ИСПОЛНЕН и ПРИНЯТ (D39.135, лендинг `267aa35`; контракт 0.2.3 в каноне; промт в `frontend/docs/archive/`); разморозка = лендинг P7 + гейт-ответы S5 (В-10 · фразы В-11); живой smoke против дев-стенда легитимен и во фризе; фикс-лист ФС — запись приёмки 15.08 в зонном журнале · **Платформа: активного промта НЕТ** — P6 + дофикс ИСПОЛНЕНЫ и ПРИНЯТЫ (D39.132, промты в `platform/docs/archive/`); следующий пак — P7 (читающая поверхность + форвард-половина 0.2.3: чтение `title` и проекция `reject_reason`, D39.135 п.2в + хвосты D39.134 п.4), промт — очередь №17 · **Бэкенд: [BACKEND_DEEPSEEK_REPIN_SESSION_PROMPT.md](BACKEND_DEEPSEEK_REPIN_SESSION_PROMPT.md)** — вендор-сессия пере-пина цен DeepSeek (выдан 15.08, D39.136 п.6г; запуск владельцем ДО 16:00 UTC 16.08). `tmctl migrate` ИСПОЛНЕН и ПРИНЯТ (D39.134, лендинг `d55edd4`; промт в `archive/prompts/`), деплой эмиттер-бинаря разблокирован. Эмиттер шва ИСПОЛНЕН и ПРИНЯТ (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) (роль/нормы; состояния не дублирует) · **Контракт-ревью: [CONTRACT_REVIEW_SESSION_PROMPT.md](CONTRACT_REVIEW_SESSION_PROMPT.md)** — ревью API v0 на адекватность/индустриальные нормы отдельной сессией (строка 179, D39.136 п.5 + эррата 15.08-в; запуск по слову владельца; отчёт → `docs/research/28-contract-review.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) (отложен) . **Фронт: ЗОНА ЗАМОРОЖЕНА (D39.136 п.2)** — S4 ИСПОЛНЕН и ПРИНЯТ (D39.135, лендинг `267aa35`; контракт 0.2.3 в каноне; промт в `frontend/docs/archive/`); разморозка = лендинг P7 + гейт-ответы S5 (В-10 · фразы В-11); живой smoke против дев-стенда легитимен и во фризе; фикс-лист ФС — запись приёмки 15.08 в зонном журнале · **Платформа: активного промта НЕТ** — P6 + дофикс ИСПОЛНЕНЫ и ПРИНЯТЫ (D39.132, промты в `platform/docs/archive/`); следующий пак — P7 (читающая поверхность + форвард-половина 0.2.3: чтение `title` и проекция `reject_reason`, D39.135 п.2в + хвосты D39.134 п.4), промт — очередь №17 · **Бэкенд: [BACKEND_DEEPSEEK_REPIN_SESSION_PROMPT.md](BACKEND_DEEPSEEK_REPIN_SESSION_PROMPT.md)** — вендор-сессия пере-пина цен DeepSeek (выдан 15.08, D39.136 п.6г; запуск владельцем ДО 16:00 UTC 16.08). `tmctl migrate` ИСПОЛНЕН и ПРИНЯТ (D39.134, лендинг `d55edd4`; промт в `archive/prompts/`), деплой эмиттер-бинаря разблокирован. Эмиттер шва ИСПОЛНЕН и ПРИНЯТ (D39.131, промт в архиве). Все ОТРАБОТАННЫЕ промты — в `archive/prompts/`, отчёты с ревью-шапками — в `archive/reports/`; статусы паков — CURRENT-STATE и D-лог, здесь не дублируются. Зонные журналы фронта/платформы — `frontend-PROGRESS.md` / `platform-PROGRESS.md` в их зонах (прогресс зон только там, D39.100).
- Зоны фронта (чужие, читать при касании стыка; каждая ведёт СВОЙ зонный бэклог — единый бэклог их строк не принимает, D39.84): [../frontend/](../frontend/) — веб-интерфейс: промт фронт-сессий S0S7 + [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` · регистр дефектов · архив промтов P0P5).
- `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).

View file

@ -4,6 +4,7 @@
> ⚠ **Эррата 09.08 (D39.125):** D39.111 п.1 предписывал промту S3 «максимум = баланс МИНУС открытые холды» — формула ОШИБОЧНА (вычитание дважды), исправлена D39.115 п.2(а): максимум = Balance КАК ЕСТЬ; тело D39.111 живёт ниже в этом файле (голова D39.106+).
> ⚠ **Эррата 15.08 (D39.132):** D39.131 п.2(а) перечисляет полосу отказов «10 конфиг · 11 источник · 12 лок · 19 безымянный» — читать через D39.132 п.2(г): полоса ДОПОЛНЕНА **exit 13 = `schema_mismatch`** (~~обе зоны сошлись на числе независимо~~; ратифицирован направлением, ФИНАЛИЗИРОВАН приёмкой D39.134).
> ⚠ **Эррата 15.08-б (D39.134 п.2а, вписана по аудиту корпуса):** клейм «зоны сошлись на 13 НЕЗАВИСИМО» (строкой выше и в D39.132 п.2г) СНЯТ — платформа прочитала число из незакоммиченного дерева движка и сама это записала (`platform/internal/ingest/exit.go:63-64`); на силу ратификации не влияет.
> ⚠ **Эррата 15.08-в (D39.136 п.5):** форма контракт-ревью «фазный воркфлоу оркестратора» ОТМЕНЕНА словом владельца тем же днём — исполняет ОТДЕЛЬНАЯ СЕССИЯ со своим онбордингом (норма D39.120 п.2; оркестратор — автор части ратификаций 0.2.3, author≠reviewer); запущенная воркфлоу-фаза 1 остановлена, её результаты выброшены; промт — `docs/CONTRACT_REVIEW_SESSION_PROMPT.md`.
> ⚠ **Навигация (актуализация 07.08, эра D39.1xx):** append-only-дисциплина (D23.3) означает, что
> НЕВЕРНЫЙ ФАКТ внутри старой ноты не переписывается, а получает эрратау — и тогда он опасен ровно
> тем, что грепающий его найдёт ПЕРВЫМ, а эрратау ниже может не дочитать. Поэтому поправки к фактам