Add backlog row 175 for in-flight engine deploys shaped by the deploy research and harden the migrate prompt with a typed version-mismatch outcome and a money-conservation test

This commit is contained in:
heaven 2026-08-14 22:36:36 +03:00
parent 9847693556
commit 943a2576a7
2 changed files with 23 additions and 5 deletions

View file

@ -37,9 +37,18 @@ write-команда. Платформа (`platform/`) зовёт `tmctl status
сети, трат: $0-команда, как `manifest`/`status`.
- **Идемпотентна**: повторный вызов на свежей схеме — успех и no-op.
- Exit-коды — по свежей конвенции полосы отказов (D39.131: 10 конфиг · 12 лок · 19 безымянный);
успех 0. Не изобретай новых кодов.
- Тест: фикстура/БД старой версии → `migrate``OpenReadOnly`/`status` работает; лок занят →
exit 12; повторный вызов — no-op. Плюс дифф `^func Test` исполнением, не памятью.
успех 0.
- **Типизированный отказ read-only путей при несовпадении схемы** (вторая половина задачи,
ресёрч 14.08): `status`/`report` на файле чужой версии сегодня падают текстом — сделай исход
МАШИНОРАЗЛИЧИМЫМ: свой exit-код (выбери место в конвенции, занятые классы не переиспользуй)
+ `found`/`expected` машиночитаемо (JSON/стандартная строка — реши форму). Цель: платформа
сможет самолечиться «поймала → migrate → повтор» вместо стоп-мира. Поведение на совпадающей
схеме не меняется ни на байт.
- Тесты: фикстура/БД старой версии → `migrate``OpenReadOnly`/`status` работает; лок занят →
exit 12; повторный вызов — no-op; version-mismatch у `status` даёт новый различимый исход.
**Обязательный money-тест:** фикстура старой схемы с ЖИВЫМИ резервациями → `migrate`
`committed` не сдвинулся ни на цент, `reserved` обнулён ровно по правилам recovery, схема =
head; повторный вызов денег не трогает. Плюс дифф `^func Test` исполнением, не памятью.
## 3. Границы и известные мины (приоры — опровергаются замером)
@ -55,7 +64,15 @@ write-команда. Платформа (`platform/`) зовёт `tmctl status
валидации свежести цен (или обоснуй, почему она тут уместна) — и назови выбор в отчёте.
- **Строка 49а** (ALTER-шаги миграций v8v14 не идемпотентны на полу-применённой БД) — знать,
НЕ чинить этим касанием (отдельная строка); твоя команда не должна усугубить (никаких новых
ALTER, только вызов существующего механизма).
ALTER, только вызов существующего механизма). Опция «реши сам»: проверь, транзакционно ли
ПРИМЕНЕНИЕ шагов миграции (DDL в SQLite транзакционен) — если нет, обёртка применения (тела
миграций не трогать!) закрыла бы класс «крэш посреди migrate = полу-применённая БД с деньгами»
вперёд; бери только если ложится чисто, иначе — строкой.
- **Бэкап:** write-open уже делает бэкап файла (`backupStamp`) — проверь, что путь `migrate`
его наследует; помни коллизию секундной метки (строка 173) — не наступи, чинить не обязан.
- **Settle-инвариант:** платформа считает деньги из `committed`/леджера; `reserved` легитимно
равен нулю в любой момент (advisory, восстановим). Назови в отчёте явно, что `migrate`,
случившийся между выходом процесса и расчётом платформы, денег расчёта не искажает.
- Снапшоты/голдены/RequestHash не двигаются — команда не трогает промпты и провод; голден-батарея
обязана остаться бит-в-бит.
- Общность §0: ничего пар-/книго-специфичного.

View file

@ -8,7 +8,7 @@
> - **Курс:** ОБЩНОСТЬ ✅ → КАЧЕСТВО БАНКА ✅ → ПАКЕТ-ЧЕКЕРОВ ✅ (D39.5978) → **ФРОНТ-ЭРА** (D39.81100: зоны живые, контракт API ратифицирован) → **шов/платформа/движковые блокеры построены** (D39.106123). Хвосты курса живут строками: 16 (edit-волна не гонялась НИ РАЗУ — держит и оси голоса 13б/24) · 46 (дизайн заморожен D39.92/93, промт ждёт выдачи) · coldrun-b фаза C заморожена чекпойнтом легитимно (D39.86; эталон денег/поведения — coldrun-a, read-only); развилка 0731 решена и исполнена (D39.87/91, код `553f1a3`).
> - **Горизонт (D39.62/67, освежён D39.95):** **ДОБОР ИДЕАЛА** (первым прогоном: оси голоса 24 · авто-режим · цена 16; жильцы ролей решаются ДО прогона эксп-22 — строка 149 · веса K1K12 13а · вне-претрейн чекпоинт 55; остаток арбитража банка = рецензент спорных кластеров при ре-пробе 74 — D39.102) → ВТОРАЯ ПАРА живьём (ja→ru; преп 81) → МАСШТАБ → пилот Ф2.5 (гейт резюме-строки 80; строки 6268, 85) → Ф3 ридер-IDE (6971). **Стоячие:** ToS-триггер 25.10 · Ш-2 до go1.27 (⚠ + x/text Unicode 17 тем же тулчейном — строка 119, реестр §Б-108 справочника якорей) · платные прогоны разблокированы (проба провода — D39.97, конфиги 112 залендены).
> - **Стек (полная карта роль→модель→конфиг→квирки — [STACK.md](STACK.md), D39.126):** draft deepseek-v4-flash thinking-ON `low` **⚠0731** → терминолог (та же модель) → editor deepseek-v4-pro БИЛИНГВ ИНТЕРИМ (топология ПОДТВЕРЖДЕНА при неразличимости жильцов — D39.117; закон-блок ОБЯЗАТЕЛЕН — строка 134; glm-5 резерв; вахта маппинга эффорта pro — §Б-108) → судья gemini (Ф2, в движке НЕ построен — строка 33); канал B Mistral+grok; ~$0.85/ранобэ (D30.4, пере-калибровка при следующем платном прогоне). ⚠ **Вендор-факты 13.08 (сняты 14.08, строка 172):** цены deepseek с 16.08 16:00 UTC ×2.34.7 (пик/офф-пик; пик 0104·0610 UTC), у pro эффорт стал настраиваемым low/high/max (квирк 3а устарел — вахта §Б-108 сработала); покупки фазы Д на deepseek до 16.08 идут по старым ценам. ⚠ **ВЕСЬ банковый контур (банкнота+терминолог+классификатор) в shipping-c1 НЕ включён** — жив ран-локальным конфигом книги (строка 140; сверка STACK.md 09.08 — факт шире прежней декларации «одна банкнота»); эскалация в shipping за `budget_usd: 0` (STACK.md §примечания).
> - **ЕДИНЫЙ БЭКЛОГ — секция «Бэклог» ниже** (одна таблица, единственный трекер; каждая петля обязана иметь диспозицию: решено / отложено-с-записью / отклонено; ведёт оркестратор). **СЧЁТ ОЧЕРЕДИ на 14.08 (скриптом по таблице — `python3 docs/scripts/counts.py`; обновлять при каждом лендинге):** всего **135** строк · зона бэкенд **67** строго / **91** широко (169 пере-зонирована 14.08: движковая половина построена D39.122) (⚠ колонки счётчик читает С КОНЦА — испр. D39.116) · **блокеров очереди 0**, платные прогоны разблокированы · «скоро» **31** (перечень — грепом по таблице, рукописный список снят D39.126) · гейт-строки эксп-22: 55·153 (плюс 150 — руки владельца); строка 5 — остаток гейчен ре-пробой 74 (D39.102 п.2); остальное «когда-нибудь». ⚠ Счёт — НИЖНЯЯ граница долга, не потолок (разбор — легенда таблицы ниже).
> - **ЕДИНЫЙ БЭКЛОГ — секция «Бэклог» ниже** (одна таблица, единственный трекер; каждая петля обязана иметь диспозицию: решено / отложено-с-записью / отклонено; ведёт оркестратор). **СЧЁТ ОЧЕРЕДИ на 14.08 (скриптом по таблице — `python3 docs/scripts/counts.py`; обновлять при каждом лендинге):** всего **136** строк · зона бэкенд **67** строго / **92** широко (169 пере-зонирована 14.08: движковая половина построена D39.122; 175 заведена 14.08) (⚠ колонки счётчик читает С КОНЦА — испр. D39.116) · **блокеров очереди 0**, платные прогоны разблокированы · «скоро» **31** (перечень — грепом по таблице, рукописный список снят D39.126) · гейт-строки эксп-22: 55·153 (плюс 150 — руки владельца); строка 5 — остаток гейчен ре-пробой 74 (D39.102 п.2); остальное «когда-нибудь». ⚠ Счёт — НИЖНЯЯ граница долга, не потолок (разбор — легенда таблицы ниже).
> - Архивы хроники: `archive/PROGRESS-2026-07-04-10.md` (D31) · `-10-13` (D39.6-гигиена) · `-13-25` (стройка паков 1116, rerun2) · **`-25-31` (паки 1720 · мини-прогон · полигон-пакеты 58 · ToS · холодный прогон; D39.2658)** · **`-08-01-02` (сессии №9/№10: общность · качество банка · coldrun-b · открытие фронта/платформы; D39.5990, срез D39.105)** · **`-08-02-04` (сессии №11№13: ручки эффорта · стандарты · контракт API · платформа P0 · банк-арбитраж; D39.91105 + снимок шапки эры №15)**. Записи ниже — живой хвост (№14+, эра D39.106+).
## Бэклог (ЕДИНЫЙ, собран 26.07, актуализация 04.08 D39.99/D39.101; правки — только через оркестратора)
@ -118,6 +118,7 @@
| 171 | **Число символов книги — от движка** (PD-177 платформы: `character_count` интейка точен только для UTF-8; GB18030/UTF-16 движок декодирует сам — цифра платформы на них неверна, для UTF-16 занижена ~вдвое): счёт символов в манифест (рядом `source_bytes`/`encoding`) либо перерасчёт платформой после разбора | бэкенд | когда-нибудь | малое касание (манифест) | П-13 платформы, PD-177, приёмка P5 |
| 173 | **`backupStamp` секундной точности**: два `translate` в одну секунду дают коллизию имени бэкапа и exit 1, маскируя класс «проект занят» (12) — метка до наносекунд/uniquify либо распознавать коллизию явно; преexisting, вскрыт ревью эмиттер-пака | бэкенд | когда-нибудь | малое касание | приёмка D39.131 |
| 174 | **Деадлок деплоя v15**: read-only `status` отказывает схеме старее бинаря, а платформа зовёт его ПЕРЕД каждым спавном и для settle ⇒ апгрейд движка запирает ВСЕ существующие книги (write-команда, которая мигрировала бы, не наступает никогда); решить ДО деплоя эмиттер-бинаря на платформу: движковая $0-команда `tmctl migrate` либо деплой-шаг «write-команда по каждой книге» | владелец → бэкенд/платформа | **скоро (гейт деплоя эмиттер-бинаря)** | отдельное решение | приёмка D39.131 (шов-ревьюер) |
| 175 | **Деплой движка «в полёте» — ОСТАТОК после ресёрча 14.08** (внешний агент, две итерации: сначала абстрактная индустрия-съёмка, затем вердикт по нам; вывод — exact-match читателей на деньгах = осознанный fail-closed, корень не выдёргивать, приделать дверь). Ближняя половина УШЛА в работу: типизированная ошибка version-mismatch у `status` + money-тест — промт migrate; правило свипа «мигрировать только книги БЕЗ открытых попыток» + settle ЗАПИНЕННЫМ бинарём попытки (`run_attempts.engine_binary`, строка 139) — аддендум P6. Дальний остаток: (а) при СЛЕДУЮЩЕМ бампе схемы проставить в файл книги `application_id` + `min_reader_version` — данные-задел под окно совместимости, ~0 логики; (б) GC бинарей: удалять не пиненные ни одной незакрытой попыткой, последние 23 релиза держать для отката; (в) окно совместимости читателей / пин уровня книги — строить ТОЛЬКО по триггерам: много тенантов · бампы схемы еженедельно+ · потребители `status` кроме платформы | платформа/бэкенд | когда-нибудь (по названным триггерам; (а) — попутно первым бампом схемы) | данные-задел + малые касания | владелец 14.08, ресёрч 14.08, строки 139/174 |
| 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) |