diff --git a/docs/BACKEND_MIGRATE_SESSION_PROMPT.md b/docs/BACKEND_MIGRATE_SESSION_PROMPT.md index 17bdc42a..0bc66c57 100644 --- a/docs/BACKEND_MIGRATE_SESSION_PROMPT.md +++ b/docs/BACKEND_MIGRATE_SESSION_PROMPT.md @@ -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-шаги миграций v8–v14 не идемпотентны на полу-применённой БД) — знать, НЕ чинить этим касанием (отдельная строка); твоя команда не должна усугубить (никаких новых - ALTER, только вызов существующего механизма). + ALTER, только вызов существующего механизма). Опция «реши сам»: проверь, транзакционно ли + ПРИМЕНЕНИЕ шагов миграции (DDL в SQLite транзакционен) — если нет, обёртка применения (тела + миграций не трогать!) закрыла бы класс «крэш посреди migrate = полу-применённая БД с деньгами» + вперёд; бери только если ложится чисто, иначе — строкой. +- **Бэкап:** write-open уже делает бэкап файла (`backupStamp`) — проверь, что путь `migrate` + его наследует; помни коллизию секундной метки (строка 173) — не наступи, чинить не обязан. +- **Settle-инвариант:** платформа считает деньги из `committed`/леджера; `reserved` легитимно + равен нулю в любой момент (advisory, восстановим). Назови в отчёте явно, что `migrate`, + случившийся между выходом процесса и расчётом платформы, денег расчёта не искажает. - Снапшоты/голдены/RequestHash не двигаются — команда не трогает промпты и провод; голден-батарея обязана остаться бит-в-бит. - Общность §0: ничего пар-/книго-специфичного. diff --git a/docs/PROGRESS.md b/docs/PROGRESS.md index 31db8d5a..48c1f693 100644 --- a/docs/PROGRESS.md +++ b/docs/PROGRESS.md @@ -8,7 +8,7 @@ > - **Курс:** ОБЩНОСТЬ ✅ → КАЧЕСТВО БАНКА ✅ → ПАКЕТ-ЧЕКЕРОВ ✅ (D39.59–78) → **ФРОНТ-ЭРА** (D39.81–100: зоны живые, контракт API ратифицирован) → **шов/платформа/движковые блокеры построены** (D39.106–123). Хвосты курса живут строками: 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 · веса K1–K12 13а · вне-претрейн чекпоинт 55; остаток арбитража банка = рецензент спорных кластеров при ре-пробе 74 — D39.102) → ВТОРАЯ ПАРА живьём (ja→ru; преп 81) → МАСШТАБ → пилот Ф2.5 (гейт резюме-строки 80; строки 62–68, 85) → Ф3 ридер-IDE (69–71). **Стоячие:** 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.3–4.7 (пик/офф-пик; пик 01–04·06–10 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` (стройка паков 11–16, rerun2) · **`-25-31` (паки 17–20 · мини-прогон · полигон-пакеты 5–8 · ToS · холодный прогон; D39.26–58)** · **`-08-01-02` (сессии №9/№10: общность · качество банка · coldrun-b · открытие фронта/платформы; D39.59–90, срез D39.105)** · **`-08-02-04` (сессии №11–№13: ручки эффорта · стандарты · контракт API · платформа P0 · банк-арбитраж; D39.91–105 + снимок шапки эры №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 бинарей: удалять не пиненные ни одной незакрытой попыткой, последние 2–3 релиза держать для отката; (в) окно совместимости читателей / пин уровня книги — строить ТОЛЬКО по триггерам: много тенантов · бампы схемы еженедельно+ · потребители `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-шаги миграций v8–v14 не идемпотентны вопреки шапке `migrate.go:9-11`** (полу-применённая БД не сходится; счётчик версий скрывает) — находка критика полноты пака-19 | бэкенд | когда-нибудь | отдельное решение | D39.56, PACK19_BUILD §6.9 | | 50 | F3-остаток идемпотентности | бэкенд | когда-нибудь | отдельное решение | D39.34(4) |