From d443c1205919bec10e04a7ac1da2998825baba4c Mon Sep 17 00:00:00 2001 From: heaven Date: Thu, 17 Sep 2026 18:57:49 +0300 Subject: [PATCH] Record an erratum for three overstated claims in the platform acceptance act, add a tracker row for the gender directive ratified but never carried into data, and make the status board point at the contract file instead of copying its number --- docs/BACKLOG.md | 3 ++- docs/NEAR_TERM_PLAN.md | 12 ++++++++++++ docs/architecture/05-decisions-log.md | 18 ++++++++++++++++++ docs/architecture/09-target-architecture.md | 6 +++++- 4 files changed, 37 insertions(+), 2 deletions(-) diff --git a/docs/BACKLOG.md b/docs/BACKLOG.md index 5cbf5c02..44d0923e 100644 --- a/docs/BACKLOG.md +++ b/docs/BACKLOG.md @@ -3,7 +3,7 @@ > **Единственный трекер проекта.** Здесь живут строки, на которые доки, промты и D-ноты ссылаются словами «строка N» / «строка бэклога N»: **ID строки стабилен навсегда**, не перенумеровывается и не переиспользуется (D39.80). Правки — только через оркестратора; каждая петля обязана иметь диспозицию: решено / отложено-с-записью / отклонено. > ⚠ **Это НЕ бэклог зоны `docs/`, а бэклог ПРОЕКТА.** У зон свои, с другими неймспейсами ID, и единый их строк не принимает (D39.84): платформа — [../platform/BACKLOG.md](../platform/BACKLOG.md) (`П-N`) и её регистр дефектов `platform/docs/DEFECT_REGISTER.md` (`PD-N`); фронт — [../frontend/docs/BACKLOG.md](../frontend/docs/BACKLOG.md) (`Ф-N`). > ⚠ **Состояние проекта — не здесь.** Очередь, курс, CURRENT-STATE, состояние паков и живая хроника — шапка [PROGRESS.md](PROGRESS.md). Здесь только долг и его диспозиции. -> - **СЧЁТ ОЧЕРЕДИ на 17.09 (скриптом по таблице — `python3 docs/scripts/counts.py`; обновлять при каждом лендинге):** всего **367** строк · зона бэкенд **194** строго / **247** широко (⚠ колонки счётчик читает С КОНЦА — испр. D39.116) · **блокеров очереди 0** (236 закрыта D39.175; **371** — актом D39.233, **360** — актом D39.232, обе 10.09), платные прогоны разблокированы · «скоро» **194** (перечень — грепом по таблице, рукописный список снят D39.126) · гейт-строка эксп-22: 153 (плюс 150 — руки владельца; ⚠ 55 из гейтов СНЯТА — D39.198 п.5); строка 5 — остаток гейчен ре-пробой 74, носитель события теперь строка 188 (аудит D39.140); остальное «когда-нибудь». ⚠ Счёт — НИЖНЯЯ граница долга, не потолок (разбор — легенда таблицы ниже). +> - **СЧЁТ ОЧЕРЕДИ на 17.09 (скриптом по таблице — `python3 docs/scripts/counts.py`; обновлять при каждом лендинге):** всего **368** строк · зона бэкенд **195** строго / **248** широко (⚠ колонки счётчик читает С КОНЦА — испр. D39.116) · **блокеров очереди 0** (236 закрыта D39.175; **371** — актом D39.233, **360** — актом D39.232, обе 10.09), платные прогоны разблокированы · «скоро» **195** (перечень — грепом по таблице, рукописный список снят D39.126) · гейт-строка эксп-22: 153 (плюс 150 — руки владельца; ⚠ 55 из гейтов СНЯТА — D39.198 п.5); строка 5 — остаток гейчен ре-пробой 74, носитель события теперь строка 188 (аудит D39.140); остальное «когда-нибудь». ⚠ Счёт — НИЖНЯЯ граница долга, не потолок (разбор — легенда таблицы ниже). > - ⚠ **Переезд 06.09 (D39.218):** таблица вынесена из `PROGRESS.md` ДОСЛОВНО и ни один ID не сдвинут — **с единственным исключением: две ячейки (строки 220 и 306) тронуты РОВНО в номере якоря `docs/scripts/counts.py:566`→`:569` и `:592`→`:595`**, потому что цель сдвинул этот же коммит; текст ячеек не менялся, длины равны. В `PROGRESS.md` на прежнем месте оставлен заголовок-указатель, поэтому ссылки «секция „Бэклог“» доезжают в один хоп. ## Бэклог (ЕДИНЫЙ, собран 26.07, актуализация 04.08 D39.99/D39.101; правки — только через оркестратора) @@ -403,3 +403,4 @@ | 492 | **ДВИЖОК ПУБЛИКУЕТ «РЕШЕНО РАНЬШЕ», А НАРУЖУ ЭТО НЕ ВЫХОДИТ: платформенная половина `settled_earlier` не построена.** Движок отдаёт в проекции банка два аддитивных поля — счётчик `BankConsolidation.settled_earlier` и флаг строки предложения `settled_earlier` (`backend/internal/pipeline/bankexport.go:115` и `:168`), — которыми говорит, что передача решена ПРЕЖНЕЙ покупкой и роли за неё не платили. ⚠ **Замер 17.09 с напечатанным контролем, потому что это отрицательное утверждение:** `settled_earlier` в `platform/` — **0 файлов**, при том что соседнее по секции `never_asked` прибор видит в **ВОСЬМИ** файлах, из них не-тестовых шесть — `platform/internal/ingest/bank.go` (модель и json-форма) · `httpapi/reading.go` · `httpapi/project.go` · `pgstore/readmodel.go` (upsert и select) · **колонка Postgres `platform/internal/pgstore/migrations/00036_bank_read_out.sql:57`**; знаменатель — 261 прочитанный файл зоны (217 `.go`, 44 `.sql`). ⚠ Первая редакция этого ряда писала «в ЧЕТЫРЁХ местах» — число было ЗАНИЖЕНО, потому что мой греп шёл только по `.go` и не видел ни хранилища, ни миграции; пере-снято после поправки сессии `textmachine-main-57`, подтверждено моим прибором по файлам всех типов. ⇒ платформа собирает секцию ПОИМЁННЫМ перечислением полей — включая СХЕМУ БАЗЫ, — и аддитивное поле движка теряется молча, а не доезжает само; цена половины поэтому выше, чем правка проекции: нужна миграция. ⛔ **Почему поле НЕ внесено в канон авансом:** гейт версии сверяет НОМЕР, а не форму, поэтому канон, объявивший поле, которого не отдаёт ни один деплой, прошёл бы зелёным — это дословно класс `PD-399` (канон и деплой разошлись по полям при совпавшем номере). Контракт двигается, когда у поля появится читатель, а не раньше. ⛔ **Чем это стоит продукта:** на экране подписи человек видит строку без пометки, что её передача пришла из прошлой покупки, и читает её как предложение ЭТОГО прогона; у флага `invented` при этом намеренно нет значения на такой строке, так что без соседнего поля отсутствие флага читается как «черновики это предлагали». То есть половина смысла, купленного движком, до платящего не доходит | платформа | скоро | секция консолидации и строка предложения несут `settled_earlier` наружу, поле внесено в канон минором вместе с читателем | замер оркестратора 17.09, движковая половина построена сессией `textmachine-main-57` | | 493 | **ХАРНЕСС МУТАЦИЙ ЗОНЫ ЗАСЧИТЫВАЕТ ВЫЖИВШЕЙ ПОСАДКУ, ЧЕЙ ШАБЛОН `-run` НЕ ВЫБРАЛ НИ ОДНОГО ТЕСТА.** `platform/tools/mutate.py`, `verdict()`: ветка `if code == 0` возвращает «выжила» безусловно, не спрашивая, запускался ли пин вообще; `baseline()` гоняет тот же набор и требует нулевого кода, поэтому пустой шаблон проходит базу ЗЕЛЁНЫМ и после посадки засчитывается выжившей. ⚠ **Направление ошибки безопасное** — лишняя «дыра», а не лишняя «поимка», — и числа пака, который харнесс строил, не испорчены: замерено оркестратором, что все 26 якорей каталога встречаются в дереве ровно по разу и записей с несуществующим пином ноль. ⛔ Но фикстурный каталог самого харнесса несёт ШЕСТЬ форм исхода (пойман пином · красное другим тестом · выжила · якоря нет · база красная · пина нет), и седьмой — «шаблон не выбрал ни одного теста» — среди них НЕТ, то есть собственный пин прибора этого класса не стережёт. Родня ряда **486**, которым прибор и построен: там лечилось «любое красное засчитывается поимкой», здесь остаётся зеркальное «любое зелёное засчитывается выживанием» | платформа | скоро | пустой шаблон `-run` даёт исход «НЕ ИЗМЕРЕНА», и это запинено седьмой формой фикстурного каталога | линза приёмки 17.09, подтверждено чтением `verdict()` | | 494 | **ФИКСТУРА ПРЕДЕЛА ПЕРЕЗАПУСКОВ ДЕРЖИТ ТРАТУ НУЛЁМ — ПИН ОТЧИТЫВАЕТСЯ ЗА КЛАСС, А МЕРЯЕТ СРЕЗ.** Все четыре денежных пина капа в `platform/internal/runs/attemptcap_test.go` гоняют `f.engine.set(… Spend: usd(0))` при `f.runner.alive = false`, поэтому утверждение «холд вернулся целиком» осмысленно ровно на НУЛЕВОЙ трате. Класс «предел сработал на прогоне, который УЖЕ что-то потратил» идёт другой веткой расчёта и не измерен ничем: пинов капа на ненулевой трате в зоне нет. ⚠ Это не дефект пака — поведение при нуле верно и запинено, — а НЕПОЛНОТА, названная приёмкой и принятая зоной в её же блок «где прибор слеп». Норма, под которую ряд заводится: если фикстура держит что-то постоянным, пин отчитывается за КЛАСС, а меряет СРЕЗ, и молчит о том, какой именно | платформа | скоро | предел перезапусков запинен на прогоне с ненулевой тратой, либо утверждение пина сужено до среза, который он действительно меряет | линза приёмки 17.09, пере-снято оркестратором | +| 495 | ⛔ **РЕШЕНИЕ ВЛАДЕЛЬЦА О РОДОВОЙ ДИРЕКТИВЕ ЗАПИСАНО В ЖУРНАЛЕ И НЕ ИСПОЛНЕНО В ДАННЫХ — носителя у него не было вовсе.** `backend/internal/lang/data/injection.txt:12` по-прежнему предписывает роли «при неизбежности — мужские», тогда как `D39.254` п.3 постановил «меняется ТОЛЬКО текст данных `injection.txt:12`: вместо «при неизбежности — мужские» — перестроить фразу, а если литературно не выходит, писать как читается лучше», и `D39.263` п.2 уже ОБЪЯВИЛ это исполненным («больше не предписывает»). ⚠ **Замер 17.09 с контролем:** строка в дереве жива (1 совпадение), упоминаний `injection.txt` в журнале решений **4**, рядов трекера на этот предмет — **0**. ⇒ решение существовало только в прозе ратификаций, а гейт чисел такого не видит по построению: он сторожит литералы, а не согласие решений с деревом. ⛔ **И это НЕ «правка данных за $0».** Файл встроен `go:embed` (28 упоминаний в `backend/internal/lang/embedded.go`), а `lang.EmbeddedVersion()` хеширует встроенные файлы целиком (`backend/internal/lang/embedded.go:79`=`hashEmbeddedFiles`) ⇒ хеш двигает тег кроя и ключ манифеста, у купленной книги стираются `unit_resolutions` платформы и пере-покупается нарезка. ⇒ правка идёт в ОКНО ПЕРЕКРОЯ вместе со свёртками исходника (ряд **446**) и ручкой голоса (ряд **410**); окно открыто словом владельца 17.09 и закрывается первым же продолжением книги. ⚠ Класс для следующей смены: **ратифицированное без носителя исполняется ноль раз, и вторая нота, объявившая исполнение, лжи не заметила** — акт судил намерение, а не дерево | бэкенд | скоро (в окне перекроя) | `injection.txt:12` не предписывает род по умолчанию, формулировка ратифицирована, и правка уехала ОДНИМ заходом со всеми прочими правками встроенных данных | верификация актов Fable 5 17.09, пере-снято оркестратором | diff --git a/docs/NEAR_TERM_PLAN.md b/docs/NEAR_TERM_PLAN.md index 70d072a7..30d5ddff 100644 --- a/docs/NEAR_TERM_PLAN.md +++ b/docs/NEAR_TERM_PLAN.md @@ -170,6 +170,18 @@ API не было: 04.09 упёрлось в потолок (`PD-440`, с тех ## Решения владельца, уже полученные (носитель — ЗДЕСЬ; заведён 11.09, прежде его не было ни в одном доке) +- ✅ **ОКНО ПЕРЕКРОЯ ОТКРЫТО, ПЕРЕКУПКА РАЗРЕШЕНА** (слово 17.09, дословно: «Да, ничего. Можно перекупить, перезаписать + что тебе нужно и выполнить все тесты\актуализировать все»). ⇒ **санкция на правку ВСТРОЕННЫХ данных ядра и на + ре-снапшот купленной книги.** Цена названа и принята: файлы `backend/internal/lang/data/` встроены `go:embed`, + `lang.EmbeddedVersion()` хеширует их целиком (`backend/internal/lang/embedded.go:79`=`hashEmbeddedFiles`), хеш двигает + тег кроя и ключ манифеста ⇒ у купленной книги стираются `unit_resolutions` платформы и пере-покупается нарезка. + ⛔ **Окно ОДНО и закрывается первым же продолжением книги** — пока платная книга одна и тома 2 нет, все правки + встроенных данных идут ОДНИМ заходом и платят ре-снапшотом ОДНАЖДЫ. Состав окна на 17.09: родовая директива + (`injection.txt:12` всё ещё предписывает «при неизбежности — мужские», хотя решение записано ТРИЖДЫ — `D39.254` п.3, + `D39.260` п.2, `D39.263` п.2, и ни одно не исполнено) · свёртки исходника из ядра в пар-данные (японский текст + получает китайскую свёртку, долг общности) · ручка `InjectVoice` (ряд **410**: константа без ключа конфига). + ⚠ Санкция названа ЗДЕСЬ и датирована, потому что норма «согласие — ДО траты, явным словом» уже однажды стоила смены: + промты ссылались на разрешение как на факт, а в дереве его не было ни строкой. - ✅ **ЗА ВСЁ ПЛАТИТ ЧИТАТЕЛЬ, вопрос отложен** (слово 11.09: «пока платит за все юзер, потом будем решать эту проблему»). ⇒ **ни один пак не строит механизм „платит продукт“** и не меняет, кому что выставляется. Вопрос «считается ли доставленная пустота расходом читателя» снят с очереди решений и diff --git a/docs/architecture/05-decisions-log.md b/docs/architecture/05-decisions-log.md index 6c11d412..8e690753 100644 --- a/docs/architecture/05-decisions-log.md +++ b/docs/architecture/05-decisions-log.md @@ -307,6 +307,24 @@ > **⟶ ТЕЛА ЗАКРЫТЫХ НОТ — В СЛАЙСАХ `docs/archive/architecture/05-decisions-*.md` (D39.125):** `D1-D38` · `D39-arch-reset` (D39–D39.19) · `D39-20-58` · `D39-59-90` · `D39-91-105` · **`D39-106-123`** (⚠ шестой слайс, созданный подрезкой D39.139, в этом перечне ОТСУТСТВОВАЛ — испр. 22.08 аудитом доков: по инструкции самой карты тела D39.107–123 не находились нигде). ⚠ **испр. 05.09: тело `D39.106` — ЖИВОЕ и лежит в ЭТОМ файле**, хотя номер попадает в диапазон слайса `D39-106-123`; идущий по имени слайса его там не найдёт. Грепай номер СНАЧАЛА здесь (живые тела + карта + эрраты), затем в слайсах. В живом файле телом остались: D22 · D25 · D29 · D30 · D39.25 · 30 · 33 · 42 · 47 · 58 · 62 · 63 · 64 · 69 · 70 · **72 · 73** · 81 · 84 · 85 · 93 · 99 · 100 · 102 · 104 и вся голова **D39.124+** (⚠ было «D39.106+» — протухло подрезкой D39.139, которая и сдвинула пол головы; испр. 22.08). **Статус/суть КАЖДОГО номера — реестр [`05-decisions-index.md`](05-decisions-index.md).** +> ⚠⚠ **Эррата 17.09-к (`D39.265`, и она о ТРЁХ вещах сразу, потому что все три — один класс: акт сказал сильнее, чем дал замер).** +> **(а) ЧИСЛО ПУТЕЙ.** Акт пишет «32 пути, $0: 30 в `platform/` и 2 в каноне». Замер: в `bde8f5f` **41 файл** — 33 под +> `platform/` (20 правленых, 13 новых), 2 канона, 6 в `docs/`. «30» получается, только если считать каталог +> `internal/gates/testdata/mutantfixture/` за одну позицию, а ни одна команда так не считает. Число унаследовали ещё +> два носителя — карта доков и бюллетень журнала прогресса; читать везде как **41 файл: 33 · 2 · 6**. +> **(б) ЛЕНДИНГ СДВИНУЛ 38 ЯКОРЕЙ, И АКТ ОБ ЭТОМ МОЛЧИТ.** Замер на срезах, а не в грязном дереве: +> `git archive 3251603` (= `bde8f5f^`) → **17** проблемных якорей, `git archive HEAD` → **55**. ⛔ Тот же класс у +> бэкенд-зоны акт `D39.257` п.4 назвал МАЖОРОМ («сдача сдвинула строки под якорями живых доков, и отчёт об этом +> молчит»), а у `D39.264` он получил свою эрратy — то есть стандарт приёмки применён асимметрично, и мягче он оказался +> к собственному лендингу. +> **(в) ЭРРАТА 17.09-и ОПРОВЕРГНУТА ЭТИМ ЖЕ ЛЕНДИНГОМ ЧЕРЕЗ ШЕСТЬ ЧАСОВ.** Она раздаёт «живые адреса» чужим зонам, и +> два из них умерли: `platform/internal/httpapi/v0.go` вырос на два члена минора 0.17.0, компаньон контракта — на запись +> о нём. ⇒ **живые на сегодня, найдены ПОИСКОМ:** `platform/internal/httpapi/v0.go:336`=`null when no manifest` (в +> эррате `:320`) и `docs/architecture/14-api-contract/README.md:1282`=`не различает две беды` (в эррате `:1213`). +> ⭐ **И лечение класса, а не случая:** адрес, выданный ЧУЖОЙ зоне, обязан быть ТОКЕНОМ для грепа, а не номером строки — +> номер стареет в тот же день, когда кто-нибудь трогает файл, и стареет молча. Это третий промах подряд по ряду **457**. + + ## D22. Приёмка пакетов «бэкенд №3» и «полигон-erotica» + развязки 18+/эха/L3 (10.07, оркестратор). ✅ Внешнее ревью обоих пакетов (8 ревьюеров, всё исполнением: go build/vet/test -race + 11 мутационных ревертов в scratchpad-копии; пересчёт exp11 из сырья поштучно независимой репликой классификатора; Fisher-статистика на клеймах; вендор-цены по официальным страницам с датами). Вердикты: **оба ACCEPT_WITH_FIXES, залендены (e1fcee4, 3551997)**; микро-дефекты журнала исправлены оркестратором (заголовок пакета-2 восстановлен; счёт диффа бэкенда 20 файлов +860/−143). diff --git a/docs/architecture/09-target-architecture.md b/docs/architecture/09-target-architecture.md index b0eb2b2c..926c8dda 100644 --- a/docs/architecture/09-target-architecture.md +++ b/docs/architecture/09-target-architecture.md @@ -10,7 +10,11 @@ > ⚠ **КАК ЧИТАТЬ ШАПКУ (освежена 05.09 — оба пака 05.09 отражены в строках слоёв: `81a89e9` движковый «денежный стоп», акт D39.206; `7e2226a`+`3e84716` платформенный «пустить внутрь можно», акт D39.201).** Таблица «слой → статус → пак/D» ниже — единственный статус-борд этого файла: она БЬЁТ тело документа, а D-лог бьёт её. **Хроники лендингов паков здесь больше нет** — кто что построил и когда живёт в журнале решений: `05-decisions-log.md` + реестр `05-decisions-index.md` + слайсы `../archive/architecture/` (эры D39.100–D39.190 покрывают всю стройку платформы, шва, писателя книги и числа согласия). > ⚠ **ЗАКОН РАСКРЫТИЯ (D39.181) — норма зоны `backend/`, а не пункт одного пака:** число, которое движок публикует, обязано ехать со СВОИМ БАЗИСОМ, а присутствие поля не может быть булевым признаком, если оно перестало им быть. Из него же — `config_drift_basis` в `status --json` и леджер доставки в кадре `finished` (`StreamVersion` 1.2, D39.182 §4). **D39.182** («деньги и честность выдачи») добавил класс BANK в разложение денег и `noteSourceVintage`. > ⚠ **ПОСТРОЕНО, но в семь слоёв НЕ укладывается** (движковые оси рядом со слоями — читать шапку как полную нельзя без них): объёмный потолок оплаченной работы `--max-units`/`VolumeStop` (`backend/internal/pipeline/volume.go`, D39.170; ратифицированная единица продажи — D39.165 §1) · гейт схемы движка (`backend/internal/store/sqlgate_test.go`, D39.173: каждый SQL-оператор компилируется против схемы, поднятой продовой цепью миграций) · дверь правок банка `POST /books/{bookId}/bank/corrections` смонтирована синхронно (D39.162) · ключи деплоя доезжают до движка аргументом `--keys-file` (строка 211 ЗАКРЫТА, блокером живого прогона больше не является) · полоса прогресса СКВОЗНАЯ, подпись стадии — второе исключение границы (D39.162/163) · пере-проход можно КУПИТЬ (D39.166) · инъекция банка не теряется на провайдере с одним системным слотом (D39.164) · **ЧИСЛО СОГЛАСИЯ НА ПУТИ ВТОРОЙ ПОКУПКИ (03.09, D39.187):** пере-покупка прайсится по модели, которую стадия резолвит СЕЙЧАС, с округлением ВВЕРХ и оговоркой в тексте согласия (D39.150 п.1) — а **обещание точности снято с провода** во всех пяти местах, где стояло: контракт механизма теперь «не точность, а НАПРАВЛЕНИЕ ошибки — никогда не занизить молча»; фигура едет с базисом двумя новыми полями `status --json` (`rebill_historical_rows` · `rebill_model_moved_rows`) · **слот объёмного гранта (вторая половина строки 232):** юнит, начатый прежним прогоном и не отгруженный по оси `finalStageWave`, дописывается ВНЕ гранта и слота повторно не тратит ⚠ **следствие денежное и НЕ ратифицированное:** грант `--max-units N` оплачивает ДО 2N выходных юнитов (замер приёмки: грант 2 → четыре юнита, шесть вызовов провайдера), слово владельца 03.09 — «подумаем на этот счёт», до его решения `--max-units` держит СЛОТЫ, а деньги держит только `--ceiling-usd` (эррата 03.09-а к D39.170). -> ⚠ **Канон контракта — 0.16.0** (⚠ испр. 17.09: отстал на ТРИ минора — 0.14.0 `D39.244`, 0.15.0 `D39.246` п.6, 0.16.0 `D39.262`; третье исправление этой строки подряд ⇒ **число здесь стареет по построению, брать ФАЙЛОМ** — `grep '^ version:' architecture/14-api-contract/openapi.yaml`) (⚠ испр. 10.09: корректирующий минор `D39.235` п.6; прежде 0.13.0 (⚠ испр. 08.09: стояло 0.12.0; версию брать ФАЙЛОМ — `grep '^ version:' 14-api-contract/openapi.yaml`)** (`D39.211`, лендинг 06.09: заказ по размеру перестал притворяться заказом в главах), не 0.11.0, не 0.10.0, не 0.9.0 и не 0.4.0. Носители — `docs/architecture/14-api-contract/openapi.yaml` и `platform/internal/httpapi/capabilities.go`, они сходятся гейтом. +> ⚠ **Канон контракта — БЕРИ ЧИСЛО ИЗ ФАЙЛА, а не отсюда:** `docs/architecture/14-api-contract/openapi.yaml`, поле `info.version` +> (на 17.09 там **0.17.0**, минор `D39.265` — `Run.progress_lagging` и `Run.rebill_consent_micro_usd`). ⛔ **Литерал здесь +> исправляется ЧЕТВЁРТЫЙ раз подряд, и это уже не про внимательность: статус-борд не гейтится ничем, а канон двигает +> каждый платформенный пак.** ⇒ носитель числа — файл; здесь остаётся указатель и дата последней сверки. Прежняя редакция +> ниже, как история промаха. ⚠ **Канон контракта — 0.16.0** (⚠ испр. 17.09: отстал на ТРИ минора — 0.14.0 `D39.244`, 0.15.0 `D39.246` п.6, 0.16.0 `D39.262`; третье исправление этой строки подряд ⇒ **число здесь стареет по построению, брать ФАЙЛОМ** — `grep '^ version:' architecture/14-api-contract/openapi.yaml`) (⚠ испр. 10.09: корректирующий минор `D39.235` п.6; прежде 0.13.0 (⚠ испр. 08.09: стояло 0.12.0; версию брать ФАЙЛОМ — `grep '^ version:' 14-api-contract/openapi.yaml`)** (`D39.211`, лендинг 06.09: заказ по размеру перестал притворяться заказом в главах), не 0.11.0, не 0.10.0, не 0.9.0 и не 0.4.0. Носители — `docs/architecture/14-api-contract/openapi.yaml` и `platform/internal/httpapi/capabilities.go`, они сходятся гейтом. > > ⚠ **ПЛАТФОРМЕННЫЙ ШОВ — что построено 03.09 (D39.188, пак P13).** Оплаченный прогон продолжается на ТЕ деньги, за которые продан: `reopen` читает бюджет ИЗ ХОЛДА первой попытки, а прогон без холда отвечается ОШИБКОЙ, не цифрой (прежде бюджет пере-выводился по текущей ставке — `PD-168`) · **владение потоком переживает проход свипа:** чтение ОСТАНАВЛИВАЕТСЯ на чужом handshake'е (`ErrForeignStreamAhead`), потому что до этого чужие события ложились на оплаченную попытку — чужой `ceiling` ставил `paused` живому прогону, `unit_done` писал непокупленные главы (`PD-438`, major) · операторские ручки: `run unquarantine` и колонка QUARANTINE · условия хоста батареи ВЫВОДЯТСЯ из тестовых исходников (`make conditions`), а не держатся списком в прозе · два гейта в `platform/internal/gates/`: перечень условий против исходников и класс «тревожный ряд ушёл из счёта незамеченным». ⚠ **Бамп формы манифеста безопасного порядка деплоя НЕ ИМЕЕТ ни в одну сторону** (`PD-436`): гейт интейка — строгое равенство одной константе, окна двух форм нет ⇒ стоп-мир. Пока окно двух паков открыто, форма ЗАМОРОЖЕНА (D39.190 п.5). >