diff --git a/docs/PROGRESS.md b/docs/PROGRESS.md index 8fd2d5fc..57d17a44 100644 --- a/docs/PROGRESS.md +++ b/docs/PROGRESS.md @@ -1,6 +1,6 @@ # Журнал прогресса -> **⟶ ТЕКУЩЕЕ СОСТОЯНИЕ** (на 2026-09-05, голова D39.205 — КУРС: движок и платформа до «работает и отдаёт результат», фронт ЗАМОРОЖЕН и P7 его НЕ размораживает (D39.147). **ОЧЕРЕДЬ №22** (единственный носитель — здесь; роль передана 01.09, №21 закрыт нотой передачи D39.184). ⚠ **ЗАКАЗ ВЛАДЕЛЬЦА 01.09 — ПЕРВЫМ:** (0а) **ревизия документации на ПРОТУХШЕЕ** — по всем зонам, не только тронутым; (0б) **планы доработок в БЭКЕНД и ПЛАТФОРМУ** по остатку бэклога и регистра; (0в) **вынос неактуального в АРХИВ** (`docs/archive/`, `platform/docs/archive/`) — за сутки 31.08 закрыто много, и часть носителей стала историей. ⚠ Трезвость по масштабу (пере-считано 02.09): **90** живых дока в `docs/` (пере-счёт 04.09: `find docs -name '*.md' -not -path 'docs/archive/*' | wc -l`), 8 в `platform/docs`, 9 в `backend/docs` — ⚠ из 94 ВРЕМЕННЫЙ остался ОДИН (`DOC_CLEANUP_PLAN`, живой до закрытия батчей Б14/Б15/Б17); два прежних временных уехали в `archive/reports/` 02.09; счёт бэклога — бюллетенем ниже, открытых рядов регистра платформы — 107 (major 5), всего рядов 453 (пере-счёт `python3 docs/scripts/counts.py`; с 04.09 оба числа под гардом `--check`, прежние 95/3 разошлись молча) ⚠ (ревизией 02.09 ряды **154** и **157** переведены из «скоро» в «когда-нибудь»: их гейтом стоял первый холодный прогон, он ОТРАБОТАЛ 31.08 и оба предусловия оказались другими — разбор в самих ячейках, ни одна НЕ закрыта). ⚠ Числа доков `counts.py` НЕ сторожит — при переносе файлов пере-считывать руками командой `find docs -name '*.md' -not -path 'docs/archive/*' | wc -l`. ⚠ И предупреждение о МЕТОДЕ, купленное сменой №21: «выглядит протухшим» ≠ «протухло». Три факта оркестратора опровергнуты ЗАМЕРОМ сессий, а якоря `15-money-path.md` в девяти случаях из двенадцати РОДИЛИСЬ верными и сгнили дрейфом — то есть ревизия обязана быть исполнением, а не чтением. ⚠ **ОЧЕРЕДЬ, унаследованная от №21** (три лендинга 31.08 — секция «СОСТОЯНИЕ ПАКОВ» ниже): **(1) ~~РАЗРЫВ ЦИКЛА~~ ЗАМКНУТ ЖИВЬЁМ 04.09** — пользователь получил EPUB настоящего ПЛАТНОГО перевода ЧЕРЕЗ API, `epubcheck` 5.3.0 на СКАЧАННОМ файле 0/0/0/0 (книга `bk_SS5VES2JELESJSTR`, потрачено $0.278319 из гранта $0.60 при потолке пака $1.5, санкция D39.189). Дверь выдачи построена и проверена исполнением: `202`+`Location`, поллинг с `Retry-After`, Range 206 · второй клиент 200 · аноним 401 · чужая книга 404, TTL с GC, идемпотентность третьего создающего вызова. Все ТРИ сценария строки 216 предъявлены живьём (подпись банка · halt на потолке с exit 4 · `409 run_not_resumable/ceiling_reached` и лечение новым прогоном). +> **⟶ ТЕКУЩЕЕ СОСТОЯНИЕ** (на 2026-09-05, голова D39.206 — КУРС: движок и платформа до «работает и отдаёт результат», фронт ЗАМОРОЖЕН и P7 его НЕ размораживает (D39.147). **ОЧЕРЕДЬ №22** (единственный носитель — здесь; роль передана 01.09, №21 закрыт нотой передачи D39.184). ⚠ **ЗАКАЗ ВЛАДЕЛЬЦА 01.09 — ПЕРВЫМ:** (0а) **ревизия документации на ПРОТУХШЕЕ** — по всем зонам, не только тронутым; (0б) **планы доработок в БЭКЕНД и ПЛАТФОРМУ** по остатку бэклога и регистра; (0в) **вынос неактуального в АРХИВ** (`docs/archive/`, `platform/docs/archive/`) — за сутки 31.08 закрыто много, и часть носителей стала историей. ⚠ Трезвость по масштабу (пере-считано 02.09): **90** живых дока в `docs/` (пере-счёт 04.09: `find docs -name '*.md' -not -path 'docs/archive/*' | wc -l`), 8 в `platform/docs`, 9 в `backend/docs` — ⚠ из 94 ВРЕМЕННЫЙ остался ОДИН (`DOC_CLEANUP_PLAN`, живой до закрытия батчей Б14/Б15/Б17); два прежних временных уехали в `archive/reports/` 02.09; счёт бэклога — бюллетенем ниже, открытых рядов регистра платформы — 107 (major 5), всего рядов 453 (пере-счёт `python3 docs/scripts/counts.py`; с 04.09 оба числа под гардом `--check`, прежние 95/3 разошлись молча) ⚠ (ревизией 02.09 ряды **154** и **157** переведены из «скоро» в «когда-нибудь»: их гейтом стоял первый холодный прогон, он ОТРАБОТАЛ 31.08 и оба предусловия оказались другими — разбор в самих ячейках, ни одна НЕ закрыта). ⚠ Числа доков `counts.py` НЕ сторожит — при переносе файлов пере-считывать руками командой `find docs -name '*.md' -not -path 'docs/archive/*' | wc -l`. ⚠ И предупреждение о МЕТОДЕ, купленное сменой №21: «выглядит протухшим» ≠ «протухло». Три факта оркестратора опровергнуты ЗАМЕРОМ сессий, а якоря `15-money-path.md` в девяти случаях из двенадцати РОДИЛИСЬ верными и сгнили дрейфом — то есть ревизия обязана быть исполнением, а не чтением. ⚠ **ОЧЕРЕДЬ, унаследованная от №21** (три лендинга 31.08 — секция «СОСТОЯНИЕ ПАКОВ» ниже): **(1) ~~РАЗРЫВ ЦИКЛА~~ ЗАМКНУТ ЖИВЬЁМ 04.09** — пользователь получил EPUB настоящего ПЛАТНОГО перевода ЧЕРЕЗ API, `epubcheck` 5.3.0 на СКАЧАННОМ файле 0/0/0/0 (книга `bk_SS5VES2JELESJSTR`, потрачено $0.278319 из гранта $0.60 при потолке пака $1.5, санкция D39.189). Дверь выдачи построена и проверена исполнением: `202`+`Location`, поллинг с `Retry-After`, Range 206 · второй клиент 200 · аноним 401 · чужая книга 404, TTL с GC, идемпотентность третьего создающего вызова. Все ТРИ сценария строки 216 предъявлены живьём (подпись банка · halt на потолке с exit 4 · `409 run_not_resumable/ceiling_reached` и лечение новым прогоном). > ✅ **ПОЧИНЕНО 05.09 ЛЕНДИНГОМ `616a8e4` (пак «денежный стоп», принят D39.203) — ниже до-паковая археология, читать как историю.** Отказ резервации больше не роняет волну: он ЗАЩЁЛКИВАЕТ её (новое не стартует, допущенное дорабатывается), а обязательный вызов ЖДЁТ settle, когда settle может помочь. ⇒ **порог «книга короче десяти глав не переводится» СНЯТ**; остаточный пол — одна резервация (~$0.07 ≈ 3 главы), и он ВЫВЕДЕН, а не замерен (замер — $0.15-прогон пятиглавой книги, передан полигону). ⚠ Разбор эрратой — `architecture/15-money-path.md`, греп `ЭРРАТА 05.09`. ⚠ **Эта строка сутки стояла непоправленной ПОСЛЕ лендинга и по ней оркестратор предупредил владельца о снятой стене как о действующей** — канон, не обновлённый лендингом, врёт громче отсутствующего. **НО КНИГУ ЧЕРЕЗ API НЕЛЬЗЯ БЫЛО ДОВЕСТИ ДО КОНЦА — найдено прогоном 04.09 и воспроизведено дважды.** Прирост потолка на прогон = `chaptersLeft × $0.03` (ставка `DefaultPerChapter`, занижена ×4.47 — D39.179 п.1), и после первой готовой главы это $0.27, тогда как движок при `waves.workers: 4` резервирует под редакторский шаг ~$0.28 ⇒ **отказ резервации, прогон встаёт, книга не двигается**. Два прогона подряд дали одно и то же: `committed` не сдвинулся, холд вернулся. ⇒ **занижение ставки — не «шкала короче», а СТОП ПРОДУКТА: с какого-то момента каждая следующая покупка не покупает ничего.** Лечить придётся согласованно двумя сторонами (ставка платформы + резерв движка под шаг с параллельными воркерами), носитель — ряд регистра зоны, вес `major` **за недостижимость продукта, а не за деньги**: сам стоп НЕ ЖЖЁТ ничего — замер платформы 04.09 показал отмену ДО ухода запроса (латентность 20–31 мс, `model_actual` пуст, токенов ноль), и вся книга сходится до микро-доллара по трём источникам (`request_log` 0.278319 · `spend.committed_usd` 0.278318752 · платформенный `committed` 278319 микро). > ⛔ **ЗАТО HALT НА ПРОГОНЕ, КОТОРЫЙ ПРОДВИНУЛСЯ, ЖЖЁТ — отдельная находка того же прогона и свежая датированная точка строки 78 («леджер = НИЖНЯЯ граница»).** Четыре редакторских вызова ушли параллельно; один дошёл ($0.063404) и своим коммитом сорвал потолок, три других отменены в тот же миг, **отработав 120756, 156469 и 156470 мс** — и легли в леджер нулём. Незаписанное ≈ **$0.05–0.19 на ОДИН halt** против $0.278 за всю книгу, то есть механизм, защищающий от перерасхода, сам создаёт неучтённый расход. ⚠ Списание провайдером НЕ доказано (биллинга у нас нет) — утверждается ровно наблюдаемое: вызовы шли 2–2.6 минуты, их цены в леджере нет. > ⇒ **Дыра НЕ в принципе, а в покрытии, и это делает её заказом, а не наблюдением** (разбор оркестратора 04.09 по коду): консервативная оценка уже построена и ратифицирована — `backend/internal/pipeline/stagerun.go`, греп `settling the reservation estimate to keep the ceiling honest` (pack-13 point-9), — но её условие требует ОТВЕТА провайдера (`resp.Usage`), а отменённый в полёте вызов ответа не получает и уходит другим путём. Направление лечения: сеттлить оценку при отмене вызова, который успел уйти; различитель — факт ухода (латентность кандидат, порог обязан быть обоснован замером, а не назначен). Половина ДВИЖКОВАЯ. ⚠ Прежняя формулировка пункта — ниже, она о состоянии ДО 04.09. Движок пишет файл с 30.08 (`tmctl build` — EPUB 3 + чистый txt, D39.175), и холодный прогон 31.08 предъявил это живьём: собранный EPUB настоящего перевода прошёл `epubcheck` 0/0/0/0 и передан владельцу. ⚠ **ЭТОТ АБЗАЦ ЗАКРЫТ 04.09 и оставлен как история:** дверь выдачи ПОСТРОЕНА и заленджена (`adf5e53`, D39.194), смонтировано **18 операций из 21** (три адреса двери: `createExport`/`getExport`/`downloadExport`), долг `П-17` зона пере-сняла. Прежняя проверка «`grep -rn 'createExport\|getExport' platform/internal/` — пусто» БОЛЬШЕ НЕ ПУСТА и как гейт не работает. Не смонтированы по-прежнему `getRun`, `updateBook`, `deleteBook` — `updateBook` несёт продуктовое следствие, строка бэклога 274 (имя книги в выданном файле не чинится ничем). **Слово «отдаёт результат» ложно по букве ТОЛЬКО платформенной половиной** (п.4) · **(2) ~~холодный прогон движка~~ ОТРАБОТАЛ 31.08, закрыт РЕШЕНИЕМ ВЛАДЕЛЬЦА «не доводить»** (отчёт — `archive/reports/COLDRUN_V16_REPORT_2026-08-31.md`, числа относятся к `065d8ac`). Потрачено **$0.436110** из санкции $0.80. ПРЕДЪЯВЛЕНО живьём: объёмный потолок · D39.158 ОБЕИМИ половинами (стоп и не-стоп) · exit 16 · строки 154/198/239/240. ⚠ ~~**Причина большой доли редактора НЕ УСТАНОВЛЕНА**~~ — **УСТАНОВЛЕНА пробой полигона 02.09 по четырём осям: РЕДАКТОР ДУМАЕТ, А НЕ ПИШЕТ.** Размышление — **77.9%** цены редактора без ручки и 45.7% с `low`; у `glm-5` с выключенным thinking — 0.0%. Замер куплен и закончен ($6.17 из $9.50). ⚠ `research/30` §2.4 того же полигона повторяет «причина не установлена» — это про ДРУГОЙ вопрос (доля роли в прогоне против доли размышления в цене роли), и различение обязано попасть в ревью-шапку 30. Доля редактора идёт с ДВУМЯ знаменателями: **49.3%** от всего прогона ($0.214865 из $0.436110) и **81.3%** внутри порции П1 (⚠ ходившее «73%» — фантом, в отчёте его нет ни разу). Следующий шаг — контролируемая проба по ЧЕТЫРЁМ осям (роли осей и три требования, купленные ошибками этого прогона, — §14 отчёта; ось `stale` НЕДОСТИЖИМА — §10 там же). ⚠ **Цена: слово владельца 31.08 — ≈$0.60, потолок $0.80, ДЕСЯТЬ глав ПОЛНОЙ цепью включая редакторскую волну.** ⚠ **КЛЮЧИ: гейт снят словом владельца 30.08, разбор двух путей — D39.176 п.6.** Живое отсюда: конвенционного `.env` НЕТ НИ У ОДНОЙ книги корпуса (заполнены только `projects/textmachine/backend/.env` и `.../eval/.env`), поэтому прогон движка обязан передавать `--keys-file` абсолютным путём и только на `translate`; для п.3 нужен ДРУГОЙ файл — `TM_PLATFORM_ENGINE_KEYS_PATH`, тоже АБСОЛЮТНЫМ путём (`platform/internal/config/config.go`, греп `must be an absolute path`). Лечение операционное и $0 — направить переменную на уже заполненный файл; проверять ПРОГОНОМ, не чтением (гардрейл `.env`) · **(3) живой сквозной прогон через API платформы** — форма манифеста, сайдкара банка и карта причин флагов сочинены платформой САМОСТОЯТЕЛЬНО. ⚠ Уточнено 01.09: гейт СНЯТ холодным прогоном, и настоящие артефакты движка теперь ЕСТЬ (каталог `books/gu-zhenren/coldrun-v16/`), но сверка вышла ТОНКОЙ: на шов реально вышло **одно значение `flag_reason` из пятнадцати** (`sanitizer_stripped`), остальные четырнадцать по-прежнему только чтением кода, а манифест против `platform/internal/ingest/manifest.go` не сверялся вовсе · **(4) дверь выдачи** — строго ПОСЛЕ (3) (⚠ слово владельца 30.08: дверь ВСЕГДА строит файл — отказ юзеру не отдаётся, неполная книга уходит с пометкой, т.е. дверь зовёт `tmctl build --partial`; отказ по умолчанию остаётся операторской ручкой CLI; D29.1(б) «fail-closed» читать как «никогда молча» — честность несут пометки) · **(5) проводка `--max-units`** — снятие гейта, а не стройка: механизм в движке стоит (D39.170), живое основание гейта — `PD-422` · **(6) разморозка фронта** — ПОСЛЕ (4): зеркало отстало на **ВОСЕМЬ** миноров (`frontend/docs/api-contract/openapi.yaml` — `0.2.3` против канона `0.10.0`, и первый из них — ЛОМАЮЩИЙ 0.3.0), **16 операций против 21**; зеркало последний раз двигали 15.08 — ⚠ ходившее «30.08» было взято из текста коммита, а не из `git log` (испр. 05.09), то есть расхождение старше на две недели; отставание ратифицировано D39.142 п.5 на время фриза и две ручки разъехались, размораживать раньше значит перегенерировать типы дважды. ⚠ **ДВА ЗАГЕЙЧЕННЫХ ТРИГГЕРА НАЖАТЫ И НЕ ОТРАБОТАНЫ — строка бэклога 237** (`go.work` · вендор-сверка эффорта `deepseek-v4-pro`; реестр `13-tech-debt-anchors.md` §Б-108). ⚠ **Состояние git — снимать КОМАНДАМИ, не чтением** (ветка `polygon` ушла вперёд, коммит здесь не цитирую): работа полигона лежит на ней и в `main` НЕ влита, а `git status -- eval/` в main-дереве пуст ПО ПОСТРОЕНИЮ и уводит в ложный вывод «работы нет»; ⚠ **«развязка git с origin» — арбитр ПЕРЕ-СНЯТ 04.09 и прежний вердикт БОЛЬШЕ НЕ ВЕРЕН:** `git merge-base --is-ancestor origin/main main` → **rc 1**, `git log main..origin/main` → `afa7700 temp` (коммит владельца 04.09, которым он передавал работу зон). Локальная линия ушла вперёд на семнадцать коммитов и содержит ВСЁ содержимое `afa7700` — оно снято `reset --soft` и заленджено раздельными зонными коммитами, — но формально ветки разошлись. Лечение — force-push рукой владельца; **не пуллить** (его же правило). ⚠ Пункт «развязка git с origin» в листе владельца ниже держится ТОЛЬКО как вопрос про force-push его рукой; утверждением о расхождении дерева он не является — арбитр этой пары именно здесь. @@ -19,14 +19,14 @@ > - **Курс:** этапы ОБЩНОСТЬ · КАЧЕСТВО БАНКА · ПАКЕТ-ЧЕКЕРОВ · ФРОНТ-ЭРА · шов/платформа/движковые блокеры — ПРОЙДЕНЫ (D39.59–123). Хвосты курса живут строками: 16 (полная цена холодного старта; edit-волна на малых прогонах отработала и оплачена — 58 вызовов волновым драйвером 23–25.07 плюс 648 до драйвера, счёт по леджерам `~/books/gu-zhenren/**/*.db`) · coldrun-b фаза C заморожена чекпойнтом легитимно (D39.86; эталон денег/поведения — coldrun-a, read-only); развилка 0731 решена и исполнена (D39.87/91, код `553f1a3`). > - **Горизонт (D39.62/67, освежён D39.95):** **ДОБОР ИДЕАЛА** (первым прогоном: оси голоса 24 · авто-режим · цена 16; остаток арбитража банка = рецензент спорных кластеров при ре-пробе — D39.102). ⚠ **Испр. 05.09 (D39.198 п.5):** прежняя редакция держала здесь ТРИ предусловия, снятых владельцем, — жильцы ролей (149: разморозка ничего не разблокирует, пока идут доработки) · веса K1–K12 (13а: веса не нужны, мерить по узлам) · вне-претрейн чекпоинт (55: прогоняем на тех же текстах, оговорка — ограничение ВЫВОДА, а не требование новой книги) → ВТОРАЯ ПАРА живьём (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; закон-блок ОБЯЗАТЕЛЕН и ВНЕСЁН — D39.104 п.2, вайр-батч принят D39.199; glm-5 резерв; вахта маппинга эффорта pro — §Б-108) → судья gemini (Ф2, в движке НЕ построен — строка 33); канал B Mistral+grok; ~$0.85/ранобэ (D30.4) — ⚠ **ТРИГГЕР ПЕРЕ-КАЛИБРОВКИ СРАБОТАЛ 31.08** (испр. 02.09): платный прогон отработал и дал собственную оценку движка `projected_book_usd = 1.1377277707` на десяти главах при куплённых $0.436110; число D30.4 держать как июльское. ⚠ **Вендор-факты 13–15.08 (пере-пин ИСПОЛНЕН и ПРИНЯТ, D39.137):** таблица цен запинена ПИКОМ (flash 0.44/1.32 · pro 1.32/3.96/кэш-хит 0.044 за 1M; счёт шиппинг-c1 = 100% DeepSeek ⇒ ×4.2–4.4 в пике / ×2.1–2.2 в долине — замер по трём прогонам); ⚠ **испр. 05.09: носители про эффорт `pro` БОЛЬШЕ НЕ ПРОТИВОРЕЧАТ** — и квирки (§3г), и `STACK.md` говорят одно: ручка ДОХОДИТ до модели с вендор-апдейта 13.08. Живой остаток один — вендор-сверка маппинга и ВЕЛИЧИНА эффекта, строка **237**(б); ⚠ ВЕСА pro сменились под тем же слагом (V4-Pro-0813, класс D39.61) — вахта-риг готов (остаток 172); покупки фазы Д на deepseek до 16.08 16:00 UTC — по старым ценам. ⚠ **ВЕСЬ банковый контур (банкнота+терминолог+классификатор) ВКЛЮЧЁН в shipping-c1 с `b8154cd`** — `enabled: true` у обоих гейтов и `classify_types: true`, бюджеты по $1.00 (прежде жил только ран-локальным конфигом книги; строка 140 — ⛔ его единственный вход `mining.contrast_path` в git ОТСУТСТВУЕТ, развёртывание обязано положить артефакт, иначе контур не исполняется вовсе, носитель — строка 251; сверка STACK.md 09.08 — факт шире прежней декларации «одна банкнота»); эскалация в shipping за `budget_usd: 0` (STACK.md §примечания). -> - **ЕДИНЫЙ БЭКЛОГ — секция «Бэклог» ниже** (одна таблица, единственный трекер; каждая петля обязана иметь диспозицию: решено / отложено-с-записью / отклонено; ведёт оркестратор). **СЧЁТ ОЧЕРЕДИ на 05.09 (скриптом по таблице — `python3 docs/scripts/counts.py`; обновлять при каждом лендинге):** всего **212** строк · зона бэкенд **106** строго / **143** широко (⚠ колонки счётчик читает С КОНЦА — испр. D39.116) · **блокеров очереди 0** (236 закрыта D39.175), платные прогоны разблокированы · «скоро» **83** (перечень — грепом по таблице, рукописный список снят D39.126) · гейт-строка эксп-22: 153 (плюс 150 — руки владельца; ⚠ 55 из гейтов СНЯТА — D39.198 п.5); строка 5 — остаток гейчен ре-пробой 74, носитель события теперь строка 188 (аудит D39.140); остальное «когда-нибудь». ⚠ Счёт — НИЖНЯЯ граница долга, не потолок (разбор — легенда таблицы ниже). +> - **ЕДИНЫЙ БЭКЛОГ — секция «Бэклог» ниже** (одна таблица, единственный трекер; каждая петля обязана иметь диспозицию: решено / отложено-с-записью / отклонено; ведёт оркестратор). **СЧЁТ ОЧЕРЕДИ на 05.09 (скриптом по таблице — `python3 docs/scripts/counts.py`; обновлять при каждом лендинге):** всего **215** строк · зона бэкенд **107** строго / **146** широко (⚠ колонки счётчик читает С КОНЦА — испр. D39.116) · **блокеров очереди 0** (236 закрыта D39.175), платные прогоны разблокированы · «скоро» **85** (перечень — грепом по таблице, рукописный список снят D39.126) · гейт-строка эксп-22: 153 (плюс 150 — руки владельца; ⚠ 55 из гейтов СНЯТА — D39.198 п.5); строка 5 — остаток гейчен ре-пробой 74, носитель события теперь строка 188 (аудит D39.140); остальное «когда-нибудь». ⚠ Счёт — НИЖНЯЯ граница долга, не потолок (разбор — легенда таблицы ниже). > - Архивы хроники: `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)** · `-08-04-09` (пинги закрытых паков эры №15) · **`-08-14-15` (закрытые бэкенд-записи №16–17: эмиттер шва · migrate · пере-пин DeepSeek; вынесено D39.139)**. Записи ниже — живой хвост (№16+, эра D39.124+; подрезка D39.139). ## 📌 СОСТОЯНИЕ ПАКОВ **Залендены и ратифицированы, приёмочные дампы — телами нот:** платформенный **P11** — D39.169 · движковый пак **«деньги»** — D39.170 · платформенный **P12** — D39.180 (вместе с контрактным минором **0.9.0**; `PD-425` закрыт им же) · бэкенд-пак **«деньги и честность выдачи»** — D39.182 (тестов 1045→1083, удалённых ноль) · **закон раскрытия** движка — D39.181, ратифицирован владельцем и применён к одиннадцати экземплярам. -**ПАКИ 04.09 ОТРАБОТАНЫ И ПРИНЯТЫ ОБА (испр. 05.09).** Платформенный «закрыть цикл» — `adf5e53`, **D39.194**, контрактный минор 0.10.0 тем же актом (⚠ эррата 04.09-в: минор ратифицирован БЕЗ своей кодовой половины и сутки жил ложным на проводе; починено `7e204db`). Движковый вайр-батч — приёмочный коммит **`74ffe4f`**, **D39.199**, принят С ДОФИКСОМ; строки заказа 210·113·46·134·140·184·232 ЗАКРЫТЫ и сняты из таблицы, найденное вне карты отчёта заведено строками 287–290. ⚠ Эррата 04.09-д («пак НЕ принят») ИСЧЕРПАНА этим актом. **ПАКИ 05.09 ВЫДАНЫ И ИДУТ:** движковый **«денежный стоп перестаёт быть аварией»** (`docs/BACKEND_MONEYSTOP_SESSION_PROMPT.md` — строки 271 · 277 · 278 · защёлка отказа) и платформенный **«пустить внутрь можно»** (`docs/PLATFORM_OPERATIONS_SESSION_PROMPT.md` — строки 269 бэкапы с предъявленным восстановлением · 270 дверь для не-браузерного клиента · 274 `updateBook` · рантбук деплоя). **ПАКИ 04.09 РАБОТАЛИ ПАРАЛЛЕЛЬНО** (зоны независимы по коду; сцеплений ДВА, и второе найдено 04.09 уже после выдачи промтов — оба про то, чтобы не сорвать платный прогон платформы: +**ПАКИ 04.09 ОТРАБОТАНЫ И ПРИНЯТЫ ОБА (испр. 05.09).** Платформенный «закрыть цикл» — `adf5e53`, **D39.194**, контрактный минор 0.10.0 тем же актом (⚠ эррата 04.09-в: минор ратифицирован БЕЗ своей кодовой половины и сутки жил ложным на проводе; починено `7e204db`). Движковый вайр-батч — приёмочный коммит **`74ffe4f`**, **D39.199**, принят С ДОФИКСОМ; строки заказа 210·113·46·134·140·184·232 ЗАКРЫТЫ и сняты из таблицы, найденное вне карты отчёта заведено строками 287–290. ⚠ Эррата 04.09-д («пак НЕ принят») ИСЧЕРПАНА этим актом. **ПАКИ 05.09 ВЫДАНЫ И ИДУТ:** движковый **«денежный стоп перестаёт быть аварией»** (`archive/prompts/BACKEND_MONEYSTOP_SESSION_PROMPT_2026-09-05.md` — строки 271 · 277 · 278 · защёлка отказа) и платформенный **«пустить внутрь можно»** (`archive/prompts/PLATFORM_OPERATIONS_SESSION_PROMPT_2026-09-05.md` — строки 269 бэкапы с предъявленным восстановлением · 270 дверь для не-браузерного клиента · 274 `updateBook` · рантбук деплоя). **ПАКИ 04.09 РАБОТАЛИ ПАРАЛЛЕЛЬНО** (зоны независимы по коду; сцеплений ДВА, и второе найдено 04.09 уже после выдачи промтов — оба про то, чтобы не сорвать платный прогон платформы: > **(1) форма манифеста ЗАМОРОЖЕНА на окно** (`D39.190` п.5): гейт интейка — строгое равенство одной константе, бамп отправил бы каждую книгу в `parser_unavailable`. > **(2) ⚠ ДАННЫЕ ЯЗЫКОВОГО ПАКЕТА — ТОЖЕ.** Правка `backend/internal/lang/data/*.txt` двигает `EmbeddedVersion` → `cutTag` (докстринг `backend/internal/pipeline/manifest.go`: «the embedded data feeds the CJK numerals and sentence terminators that place boundaries») → ключ валидности манифеста → на платформе `recut := storedKey != in.ManifestKey` (`platform/internal/pgstore/readmodel.go`) → `delete from unit_resolutions where book_id`. То есть у книги, за которую заплачено, исчезают замечания читателя и счётчики глав — это строка бэклога **198**. ⇒ **Лендинг правки данных не кладётся, пока книга платного прогона живая**; порядок лендинга — обязанность оркестратора, зоны об этом предупреждены пингами 04.09. Рычаг у бэкенда есть и он объявлен предпочтительным: снять рендер в Go, данные не трогать): бэкенд — вайр-батч `docs/BACKEND_WIREBATCH_SESSION_PROMPT.md`; платформа — «закрыть цикл» `docs/PLATFORM_EXPORT_SESSION_PROMPT.md`. ⚠ Строка **160** взята, но идёт СВОИМ паком ПОСЛЕ двери: она бампает `manifestVersion`, у которого безопасного порядка деплоя нет (`D39.190` п.2). Строка **142** — после шагов 0–1 полигона (`D39.190` п.3). > **Предыдущие паки ОТРАБОТАНЫ 03.09, ПРИНЯТЫ С ДОФИКСОМ и заленджены** — `D39.187` движок, `D39.188` платформа; составы и приёмочные дампы ТЕЛАМИ НОТ, промты в `archive/prompts/` с баннерами исхода, план паков — `archive/reports/NEXT_PACKS_PLAN_2026-09-03.md`, решения — D39.190. ⚠ Живое отсюда одно и оно уже вылечено паком P13: **у формы манифеста БЕЗОПАСНОГО ПОРЯДКА ДЕПЛОЯ НЕТ** — гейт интейка сравнивает версию со строгим равенством одной константе (`platform/internal/ingest/manifest.go`, греп `KnownManifestVersion`), окна двух версий нет, поэтому порядок «сначала платформа, потом движок» из рантбука разворачивается на обратный. @@ -351,6 +351,9 @@ | 291 | ✅ **РЕШЕНО ВЛАДЕЛЬЦЕМ 05.09 (`D39.204`): деградировать во ФЛАГ, отличный по причине от исчерпания регенераций; текст попытки 0 оплачен и отгружается, волна идёт дальше. Вариант «минимальная покупка ≥ `step_max_usd`» СНЯТ — он стоил бы покупателю входного порога в пять глав. ⚠ Работа СВОИМ паком движка (правка пути ошибки в `stagerun.go` + новая причина флага + пин «купленное доставлено ⇒ не `exit 4`»), в принятый пак не дописывается.** Ниже — разбор, по которому решали. **ОТКАЗ РЕЗЕРВАЦИИ НА РЕТРАЕ НЕ ДЕГРАДИРУЕТ И НЕ ОСТАВЛЯЕТ СЛЕДА — юнит может заклинить НАВСЕГДА, а волна не может продолжиться без дыры.** `maxTokensForAttempt` удваивает бюджет на каждой регенерации (`backend/internal/pipeline/disposition.go`, греп `maxTokensForAttempt`), так что attempt 1 резервирует вдвое больше attempt 0. Отказ ретрая уходит наверх из цикла попыток (`backend/internal/pipeline/stagerun.go`, греп `return nil, err` в цикле попыток) **РАНЬШЕ `UpsertChunkStatus`** ⇒ чекпойнт attempt 0 есть (реплей за $0), **строки `chunk_status` НЕТ**, читающие модели видят юнит как `pending`, экспорт не отдаёт ничего. **Следствия два.** (1) Если потолок покупки не вмещает attempt 1 — юнит не доделается НИКОГДА: каждый резюм реплеит attempt 0 за $0 и умирает на attempt 1, прогон уходит exit 4 при ПОЛНОСТЬЮ доставленных купленных юнитах. (2) Продолжить волну после отказа ретрая нельзя без ДЫРЫ в непрерывном префиксе — то есть цена глобальной защёлки (недодача юнитов, которые влезали; разброс резервов внутри волны замерен ×2.976) различителем «свежий/ретрай» НЕ снимается. ⚠ **Оркестратор предлагал такой различитель на посылке «ретрай оставляет ФЛАГОВАННЫЙ юнит» — посылка ЛОЖНА, опровергнута зоной по строкам.** **Два пути лечения, ВЫБОР НЕ СДЕЛАН:** (а) отказ ретрая деградирует во флаг attempt 0 — смена `D2.3`, закрывает ОБА следствия; (б) минимальная покупка платформы ≥ `step_max_usd` движка (он включает ретраи именно поэтому) — закрывает только (1) и стоит продукту минимальной покупки ~5 глав | бэкенд+платформа | скоро | выбор владельца между (а) и (б) + пин | бэкенд-сессия денежного стопа 05.09, формулировка зоны | | 292 | ⛔ **ЧЕСТНОСТЬ ТРЁХ СТРОК НАБЛЮДАЕМОСТИ — ЖИВАЯ ПОЛОВИНА (б) ЗАКРЫТОЙ СТРОКИ 105, заведена 05.09 отдельным носителем.** Закрытие 105 сняло только половину (а) — предикат `isBankRole`; половину (б) чинить никто не заказывал, а на неё ссылались ДВА носителя как на «до фикса 105». Три дефекта, все воспроизведены: **(1)** строка `VOICE` берёт `rules=` из конфига ВРЕМЕНИ ОТЧЁТА (`backend/internal/pipeline/quality.go`, греп `rules=`), поэтому включение `gates.voice` ПОСЛЕ прогона печатает «измерено, чисто» для книги, которую никто не мерил; **(2)** та же строка печатается при ВЫКЛЮЧЕННОМ гейте, если `SpoilerLeaks>0` — поведение верное, неверна формулировка отчёта; **(3)** знаменатель `BANKNOTE` = `len(states)` вместе с призрачными строками `retrieval_state`, тогда как соседний агрегатор их фильтрует ⇒ после пере-чанковки покрытие ЗАНИЖАЕТСЯ. ⚠ Цена молчания прямая: отчёт говорит «измерено», когда не мерили, — это ложь читателю в том самом месте, куда смотрят, решая, готова ли книга. Печатает `cmd/tmctl/render.go` (греп `rules=`), пин — `render_observability_test.go`. | бэкенд | скоро | правка формулировки + знаменателя + тест на «включил гейт после прогона» | D39.86, D39.200; археология — `architecture/13-tech-debt-anchors.md` §Б-105 п.(б) | | 293 | ⛔ **ФАЙЛ ПОД ЛЮБЫМ КАТАЛОГОМ `books/` НЕВИДИМ ДЛЯ GIT — `git status` его не показывает, `git add` молча не берёт, и сдающая зона теряет работу, не заметив.** Предъявлено 05.09 платформенной сессией и проверено оркестратором до лендинга: `git check-ignore -v platform/internal/books/counter_test.go` → `/info/exclude:9:books`. **Причина: правило `books` в `.git/info/exclude` НЕЯКОРЕНО**, а gitignore без ведущего `/` ловит каталог с этим именем на ЛЮБОЙ глубине. ⚠ Неякорность ОСМЫСЛЕННА и снимать её нельзя не думая: `books` в связанном рабочем дереве — СИМЛИНК, а трекнутое правило `/books/` матчит только каталоги (комментарий стоит там же). ⚠ **Почему это не поймал никто:** тронутые файлы того же каталога в `git status` ВИДНЫ (игнор действует лишь на неотслеживаемое), поэтому пропажа не читается глазами; а `git commit -- <путь>` untracked роняет и без игнора. Замер: без `git add -f` уехал бы 31 файл из 32. **Лечение — не «поправить exclude»:** файл ОБЩИЙ для всех рабочих деревьев клона, включая полигонное, и менять семантику игнора под живыми сессиями нельзя. Формы, между которыми выбирать: (а) якорить правило под КОНКРЕТНЫЙ симлинк (`/books` в корне дерева) и проверить, что симлинк по-прежнему игнорируется во ВСЕХ деревьях; (б) оставить как есть и завести проверку лендинга — `git status --ignored --short <зона>` перед каждым актом. | оркестратор | скоро (гигиена лендинга, $0) | выбор формы + проверка во всех воркtree | предъявлено платформенной сессией 05.09; проверено исполнением при лендинге `7e2226a` | +| 294 | ⭐ **ФОРМА «СКОЛЬКО ДОБАВИТЬ» — решение владельца 05.09, ратифицировано `D39.203`.** Наружу вместо «сколько не хватило на ЭТОТ вызов» едет **«сколько добавить, чтобы прошёл ЛЮБОЙ следующий»** = `max(shortfall, step_max − headroom)`: сегодняшняя недостача закрывает текущий вызов, а следующий может быть крупнее, и человек доплачивает дважды. ⚠ **НЕ однострочник, и объявлять его дешёвым было бы ошибкой** (зона дешевизну не подтвердила): новая величина · **ПЕРЕИМЕНОВАНИЕ поля** — `shortfall_micro_usd` станет ложным именем, кандидат `top_up_micro_usd` · минор `StreamVersion` 1.3→1.4 · зеркало словаря у платформы · пере-снятие пина белого списка кадра `ceiling`. ⚠ Построенное поле НЕ ложно, оно у́же: закрывает вызов, а не следующий шаг | бэкенд+платформа | скоро | новая величина + переименование + минор потока | **D39.203**; тензия п.(3) против п.(4) заказа найдена зоной движка | +| 295 | ⛔ **СНАЧАЛА ПОДАТЬ ПОДПИСАННЫЙ КАНОН В ПРОГОН — только потом мерить точность чекера и решать про гейт.** Живая дыра приоритета №1 владельца («100% консистентность») — НЕ порог и НЕ флаг: канон из 53 подписанных терминов **не подключён к стенду**, весь замеренный дрейф — дрейф С ОТКЛЮЧЁННЫМ каноном, а там, где его подключали, консистентность 99.3–100%. ⇒ мерить полноту чекера на прогоне без канона значит мерить не то. **Порядок:** (1) канон в прогон · (2) пере-замер точности/полноты (строка **12**, прежний замер порочен — класс одного иероглифа не имел ни одного положительного примера) · (3) решение владельца по `gates.glossary.postcheck_gate`. ⚠ Владелец 05.09: «если он ложно положительно будет стрелять это плохо, очень плохо» | полигон+бэкенд | скоро | подача канона + замер | **D39.205**, D39.198 п.3-4, строка 12 | +| 296 | **ТОЧЕЧНАЯ ПЕРЕГЕНЕРАЦИЯ ПО ПРОМАХУ ГЛОССАРИЯ — направление владельца 05.09 («или флагать, или перегенерировать проблемный участок»), работы сегодня НЕТ.** Актуаторы ремонта — только `RepairLatinResidue` и `RepairBrokenWord` (`backend/internal/pipeline/repair.go`, греп `defaultRepairClasses`); `glossary_miss` нет ни там, ни в `knownRepairClasses`. Сегодняшние лекарства не точечные и обе дороги: удержать ВЕСЬ фрагмент (гейт) либо править глоссарий с `--resnapshot`, то есть ПЕРЕ-ОПЛАТИТЬ книгу. ⇒ заказ: `glossary_miss` как класс-актуатор — перегенерация участка с подписанной формой. ⚠ Гейтится строкой **295**: без замера точности перегенерация по ложному срабатыванию перепишет верный текст | бэкенд | когда-нибудь (после 295) | новый класс актуатора + пост-инвариант | **D39.205** | *(Указатели на архив-слайсы хроники — бюллетенем «Архивы хроники» в CURRENT-STATE; здесь копий нет.)* @@ -368,7 +371,7 @@ действующую. Токен обновлять вместе с текстом, который его объясняет. -> **Состояние зоны на 05.09:** ⚠ **активный промт ЕСТЬ** — `docs/BACKEND_MONEYSTOP_SESSION_PROMPT.md` («денежный стоп перестаёт быть аварией», выдан 05.09), дерево `backend/` НЕ чисто: в нём работа этой сессии. Прежняя редакция («на 31.08 активного промта нет, дерево чисто») читалась как текущее и приглашала следующего править чужое дерево. Ратифицированные лендинги +> **Состояние зоны на 05.09 (вечер):** активного промта НЕТ — пак «денежный стоп» ОТРАБОТАН и ПРИНЯТ С ДОФИКСОМ (акт **D39.206**, `81a89e9` + `616a8e4`), промт в `archive/prompts/` с баннером исхода; дерево `backend/` чисто. Следующая работа зоны — строки **291** · **294** · **296**. Прежняя редакция («на 31.08 активного промта нет, дерево чисто») читалась как текущее и приглашала следующего править чужое дерево. Ратифицированные лендинги > зоны: входная дверь шва — **D39.158** (`d1eb8a9`) · «тихая порча» — **D39.164** (`7d0c6f2`) · «деньги» — > **D39.170** · гейт схемы — **D39.173** · «писатель книги» — **D39.175** (`8adcb86`) · «деньги и честность > выдачи» — **D39.182** (`bb541a8`) · ЗАКОН РАСКРЫТИЯ, ратифицирован владельцем — **D39.181** · четыре diff --git a/docs/README.md b/docs/README.md index d5e0095a..1f9daa69 100644 --- a/docs/README.md +++ b/docs/README.md @@ -22,8 +22,8 @@ | Роль | Активный промт | Статус | |---|---|---| | Оркестратор | [ORCHESTRATOR_SESSION_PROMPT.md](ORCHESTRATOR_SESSION_PROMPT.md) | роль и нормы; счётчик роли — CURRENT-STATE | - | Бэкенд | [BACKEND_MONEYSTOP_SESSION_PROMPT.md](BACKEND_MONEYSTOP_SESSION_PROMPT.md) | **ВЫДАН 05.09** — «денежный стоп перестаёт быть аварией»: строки 277 · 278 + ДВА РАЙДЕРА по пере-проверке бэклога (271 дыра в system-промпт · 251 артефакт контура). ⚠ 261/262 в пак НЕ входят — они в незакрытом дофиксе другой сессии зоны. **ГЕЙТ для формы заказа (D39.196)** — пока отказ резерва гасит допущенное, в стену упирается любой путь. ⚠ Предыдущий пак (вайр-батч) **ПРИНЯТ С ДОФИКСОМ 05.09 — акт D39.199, приёмочный коммит `74ffe4f`**; эррата 04.09-д («пак НЕ принят») ИСЧЕРПАНА, промт ушёл в `archive/prompts/` с баннером исхода | - | Платформа | [PLATFORM_OPERATIONS_SESSION_PROMPT.md](PLATFORM_OPERATIONS_SESSION_PROMPT.md) | **ВЫДАН 05.09** — «пустить внутрь можно»: бэкапы (строка 269, единственная находка дня БЕЗ частичного исхода) · дверь для не-браузерного клиента (270) · блокер рантбука деплоя · имя книги (274) · ложная подпись «Знаков» (282). ⚠ Форму заказа НЕ трогает — она идёт своим паком ПОСЛЕ движкового гейта | + | Бэкенд | активного НЕТ | пак «денежный стоп» ОТРАБОТАН и ПРИНЯТ С ДОФИКСОМ 05.09 — акт **D39.206** (`81a89e9` + `616a8e4`), промт в `archive/prompts/` с баннером исхода. Следующая работа зоны — строки **291** (флаг вместо клина, `D39.204`) · **294** (форма «сколько добавить», `D39.203`) · **296** (точечная перегенерация по промаху глоссария, после 295) | + | Платформа | активного НЕТ | пак «пустить внутрь можно» ОТРАБОТАН и ПРИНЯТ С ДОФИКСОМ 05.09 — акт **D39.201** (`7e2226a` + `3e84716`), промт в `archive/prompts/` с баннером исхода. Следующая работа зоны — строки **293** (невидимый для git файл) · **294** (зеркало словаря под минор потока) | | Полигон | [POLYGON_EXP2223_REDO_SESSION_PROMPT.md](POLYGON_EXP2223_REDO_SESSION_PROMPT.md) (отложенный — [POLYGON_PACKAGE4_SESSION_PROMPT.md](POLYGON_PACKAGE4_SESSION_PROMPT.md), строка 85) | фаза Д ИДЁТ; ⚠ живой носитель курса — в `eval/dovodka/`, какой именно называет зона (⚠ [POLYGON_PHASE_D_HANDOFF.md](POLYGON_PHASE_D_HANDOFF.md) — перекрытый снимок, читать не как курс) | | Фронт | активного НЕТ | **ЗОНА ЗАМОРОЖЕНА** (D39.136 п.2 + D39.147: разморозка отдельным словом владельца, не привязана к P7); перечень первого касания — в зонном журнале | | Контракт | активного НЕТ | канон — `architecture/14-api-contract/`; ⚠ версию брать ФАЙЛОМ (`grep '^ version:' openapi.yaml`), не отсюда: миноры ратифицируются D-нотами и их содержание грепается по реестру нот. | diff --git a/docs/architecture/05-decisions-index.md b/docs/architecture/05-decisions-index.md index 89e60939..c243e02b 100644 --- a/docs/architecture/05-decisions-index.md +++ b/docs/architecture/05-decisions-index.md @@ -1,4 +1,4 @@ -# Реестр D-нот — карта актуальности v2 (D1–D39.205; титул — носитель головы, бампать при каждом аппенде) +# Реестр D-нот — карта актуальности v2 (D1–D39.206; титул — носитель головы, бампать при каждом аппенде) > ⚠ **Колонку «тело» `counts.py --check` НЕ сторожит по устройству:** он сверяет полноту НОМЕРОВ, а не > место тела, поэтому колонка держится дисциплиной лендинга. Не нашёл тело по колонке — иди в слайсы, @@ -264,3 +264,4 @@ | D39.203 | 05.09 | **Владелец: движку МОЖНО говорить «сколько добавить»** — раскрытие оценки отказанного вызова легитимно (стена и есть цена вызова, формой не обходится). ⚠ Запрет ПТ-35 на СТОИМОСТЬ цел: наружу идёт до-вызовная ОЦЕНКА, не сеттлмент. Тензия жила внутри заказа (п.3 против п.4: `step_max_usd` — тоже оценка вызова). Создаёт работу: величина `max(shortfall, step_max − headroom)` + ПЕРЕИМЕНОВАНИЕ поля + минор `StreamVersion` 1.3→1.4; пак лендится как построен | ратифицировано | живое тело | деньги · шов · контракт · продукт | | D39.204 | 05.09 | **Владелец: отказ резервации на ретрае ДЕГРАДИРУЕТ ВО ФЛАГ** («пусть флагает просто как-то»); вариант «минимальная покупка ≥ step_max» снят. ⚠ Это НЕ смена D2.3 — D2 уже кончается флагом, денежная ветка до него не доходит (возврат ошибки из цикла попыток ДО `UpsertChunkStatus`). Причина флага обязана отличаться от исчерпания регенераций. Строка 291 закрывается; работа — своим паком движка | ратифицировано | живое тело | деньги · диспозиция · движок | | D39.205 | 05.09 | **Лестница D25.1 ЗАКРЫТА владельцем: копия без пометки = книга БЕЗ ПРОПУСКОВ; пропущенный КУСОК главы — критический** (маркер остаётся на уровне юнита). Закрывает последнюю границу D39.178 п.4. ⚠ Оркестратор поднял ложную тревогу «вы отменяете решение 30.08» — принцип «в книгу только дыры, остальное на фронт» ратифицирован D39.175 п.2 / D39.178 п.3. Гейт глоссария НЕ включается до замера точности (строка 12 — предусловие); заказ: `glossary_miss` как актуатор ремонта, но СНАЧАЛА подать подписанный канон в прогон | ратифицировано | живое тело | продукт · выдача · качество | +| D39.206 | 05.09 | **АКТ: движковый пак «денежный стоп» ПРИНЯТ С ДОФИКСОМ** (`81a89e9` + `616a8e4`; каталог 201/197 RED/0 неожиданных, тесты 1172→1213). 18 находок, 6 снято, 12 устояло, 4 major — **все четыре оказались УТВЕРЖДЕНИЯМИ, а не поведением**. Строки 271 · 277 · 278 (+171) закрыты, 291 решена владельцем. Порог десяти глав снят лендингом | ратифицировано | живое тело | приёмка · движок · деньги | diff --git a/docs/architecture/05-decisions-log.md b/docs/architecture/05-decisions-log.md index dc7b5e6f..fb61de8f 100644 --- a/docs/architecture/05-decisions-log.md +++ b/docs/architecture/05-decisions-log.md @@ -1,4 +1,4 @@ -# Журнал решений оркестратора — контракт D1–D39.205 (живой файл: карта · эрраты · живые тела · голова D39.124+ (подрезка D39.139); тела закрытых эр — в слайсах `docs/archive/architecture/`, указатель ниже; реестр всех нот — `05-decisions-index.md`) +# Журнал решений оркестратора — контракт D1–D39.206 (живой файл: карта · эрраты · живые тела · голова D39.124+ (подрезка D39.139); тела закрытых эр — в слайсах `docs/archive/architecture/`, указатель ниже; реестр всех нот — `05-decisions-index.md`) > **⟶ КАРТА АКТУАЛЬНОСТИ (ревизия D31, продлена до D38.2 [12.07]; исторические записи ниже НЕ переписываются — дисциплина D23.3).** Работая с контрактом (греп номера: живой файл → слайсы, целиком НЕ читать — D39.125), держи под рукой, что чем перекрыто: > ⚠ **Эррата 09.08 (D39.125):** D39.111 п.1 предписывал промту S3 «максимум = баланс МИНУС открытые холды» — формула ОШИБОЧНА (вычитание дважды), исправлена D39.115 п.2(а): максимум = Balance КАК ЕСТЬ; тело D39.111 — в слайсе `../archive/architecture/05-decisions-D39-106-123.md` (испр. 05.09: прежнее «живёт ниже в этом файле» протухло подрезкой D39.139) (голова D39.106+). @@ -2470,3 +2470,21 @@ $2.00» не мерил никто), **а утверждение о ПРОШЛО **4. Гейт глоссария (`gates.glossary.postcheck_gate`) НЕ ВКЛЮЧАЕТСЯ. Слово владельца 05.09: «Не знаю. Тут надо мерить типо?… если он ложно положительно будет стрелять это плохо, очень плохо».** ⇒ Решение отложено НЕ по темпу, а за отсутствием замера, и это законная диспозиция: включение ручки без замера точности удерживало бы ХОРОШИЙ текст, то есть чинило бы приоритет №1 ценой отказа отдать книгу. Строка бэклога **12** (пере-замер recall; прежний замер порочен — класс одного иероглифа не имел ни одного положительного примера) остаётся ЖИВОЙ и становится предусловием, а не «когда-нибудь». ⚠ Противоречие «D39.198: стоп» против «строка 12: когда-нибудь» снято ИМЕННО ТАК: стоп остаётся целью, замер — его ценой входа. **5. ⭐ И направление, названное владельцем, — работа, которой сегодня НЕТ: «или флагать, или ПЕРЕГЕНЕРИРОВАТЬ проблемный участок».** Перегенерации по промаху глоссария в движке не существует: актуаторы ремонта — только `RepairLatinResidue` и `RepairBrokenWord` (`backend/internal/pipeline/repair.go`, греп `defaultRepairClasses`), `glossary_miss` среди них нет и в `knownRepairClasses` тоже. Сегодня лекарства другие и оба не точечные: консолидация терминолога на майнинг-стопе и правка глоссария с `--resnapshot` (то есть ПЕРЕ-ОПЛАТА). ⇒ **Заказ, который из этого следует:** `glossary_miss` как класс-актуатор ремонта — точечная перегенерация участка с подписанной формой вместо удержания целого фрагмента. ⚠ И порядок работ, потому что он меняет цену всего остального: **СНАЧАЛА подать подписанный канон в прогон.** Живая дыра приоритета №1 — не порог и не флаг: канон из 53 подписанных терминов НЕ ПОДКЛЮЧЁН к стенду (`docs/PROGRESS.md`, греп `канон подписан`), весь замеренный дрейф — дрейф С ОТКЛЮЧЁННЫМ каноном, а там, где его подключали, консистентность 99.3–100%. Мерить точность чекера на прогоне без канона — значит мерить не то (05.09.2026, оркестратор №22). ✅ + +## D39.206 — АКТ ПРИЁМКИ ДВИЖКОВОГО ПАКА «ДЕНЕЖНЫЙ СТОП ПЕРЕСТАЁТ БЫТЬ АВАРИЕЙ»: ПРИНЯТ С ДОФИКСОМ, `81a89e9` + `616a8e4` (05.09). ✅ + +**1. Пак ПРИНЯТ.** Приёмочный коммит **`81a89e9`** (29 файлов, +4393/−85) — он и назван обоим верификаторам (D39.172); дофикс **`616a8e4`** (22 файла, +983/−104); отчёт зоны в её секции — `ba4fd34`. Четыре пункта заказа закрыты: санитайз пользовательских правок банка перед system-сообщением · отказ резерва ЗАЩЁЛКИВАЕТ волну и не отменяет допущенное · недостающая сумма в событии `ceiling` (+`StreamVersion` 1.2→1.3) · проекция цены книги в `manifest --json`/`status --json`. + +**2. Цифры — СНЯТЫ ЗОНОЙ, не приёмкой** (подпись источника обязательна, форма D39.199): батарея `MAKE_EXIT=0`, 19 пакетов, 0 FAIL, линтер 0 issues, VET_CLEAN; каталог **201 запись · 197 RED · 4 аргументированных выживших · 0 неожиданных · 0 NOTHING · 0 ROTTED**; тесты **1172 → 1213 (+41)**, ни одна существующая функция не удалена и не переименована. Денег не потрачено ни цента. ⚠ **Каталог целиком приёмкой НЕ перегонялся**, батарея приёмкой не гонялась — оба верификатора назвали это в своих границах. + +**3. Приёмка: 18 находок · 6 снято скептиками с предъявленным основанием · 12 устояло · 4 major.** Мандаты асимметричны: №1 судил ЗАКАЗ и ДИФФ **не читая отчёт** (вердикт: заказанное сделано, все четыре пункта достигают цели); №2 строил карту 38 находок отчёта и искал ВНЕ неё. Каждая находка атакована скептиком с заданием СНЯТЬ её. + +**4. ⛔ ВСЕ ЧЕТЫРЕ MAJOR ОКАЗАЛИСЬ УТВЕРЖДЕНИЯМИ, А НЕ ПОВЕДЕНИЕМ — код делал то, что должен, а врали про него слова.** (а) `runevents.go` утверждал, что недостача «не раскрывает стоимость ни одного вызова», — приёмка восстановила цену отказанного вызова живым прогоном с точностью до микродоллара; **посылка была ОРКЕСТРАТОРСКОЙ**, разбор — D39.203. (б) Контрактный тип шва: `Finished.Money` документирован «present only on `outcome: ceiling`», а эмиттер вешает его на ПЯТЬ веток — нашли ОБА верификатора независимо; починено и запинено в обе стороны, включая отрицательные кейсы. (в) Сайдкар ПРЕЖНЕЙ сборки оставался действительным и молча гасил `price`/`structure` — ровно тот дефект, который фолбэк объявлен закрывающим; починка зоны сформулирована как **«живость АДДИТИВНОГО поля спрашивается о ПОЛЕ, а не о документе»**. (г) Фенс сид-лоадера отказывал ДВИЖКОМ ЖЕ написанному документу; ⚠ зона расширила находку — тем же лоадером грузится АВТО-БАНК (пять машинных вызовов, не два), то есть носитель достижимее найденного; лечение — разведение по АВТОРСТВУ (операторский документ отказывает, движковый роняет строку и продолжает), гарантия цела: дропнутая строка в банк не входит и до провода не доходит. + +**5. Мелкие — все восемь взяты зоной с явной диспозицией по каждой.** Из них отдельного слова стоит `V2-5`: `bookOnceUSD` клал в цену книги весь бюджет классификатора при выключенной фазе, **и собственный тест пака ПИНИЛ неверное число** — гейт, защищающий дефект (реестр форм ложной зелени — D39.202 п.3). + +**6. ⚠ ЧЕСТНЫЙ ОСТАТОК, названный поимённо.** Каталог не сошёлся с первого раза ДВАЖДЫ, и оба раза находил то, чего зелёная батарея не видит: первый прогон — четыре неожиданных исхода, включая посадку, красноту которой промт назвал ОБЯЗАТЕЛЬНЫМ УСЛОВИЕМ приёмки (**named-артефакт поймал ВЫРОЖДЕННЫЙ ТЕСТ, а не забытый прогон** — за это его и держат); второй — посадку, чью починку не держал НИ ОДИН тест. Сдача — склейка двух прогонов, её законность предъявлена МЕХАНИЧЕСКИ (побайтная идентичность AST без комментариев). Не проверено: гонка `MS-reserve-under-the-gate` (аргументированный выживший, инструментом не проверяема — так и записано в `why`) · цена защёлки не замерена, только выведена · числа проекции с фактом не сверены · платного прогона не было. + +**7. Диспозиции строк.** **271** (правки банка ехали в system-сообщение дословно) — ЗАКРЫТА · **277** (защёлка) — ЗАКРЫТА · **278** (проекция цены и недостача) — ЗАКРЫТА, поглотив **171** · **291** (клин юнита) — решена владельцем, D39.204, работа своим паком. ⚠ Порог «книга короче десяти глав не переводится» СНЯТ этим лендингом — эррата в `15-money-path.md`; канон сутки стоял непоправленным и стоил владельцу ложного предупреждения. + +**8. Норма, купленная этим паком и стоящая дороже находок.** Восемь major за два пака смены — **утверждения, а не поведение**. ⇒ **Батарея сторожит поведение, каталог мутаций сторожит поведение, линтер сторожит форму — и НИ ОДИН не сторожит того, что код о себе ГОВОРИТ.** Поймало все восемь одно: чтение вслух чужими глазами. Кандидат в механизм и возражение против его простой формы — D39.202 п.9 (05.09.2026, оркестратор №22). ✅ diff --git a/docs/architecture/15-money-path.md b/docs/architecture/15-money-path.md index 192db33a..452d36b7 100644 --- a/docs/architecture/15-money-path.md +++ b/docs/architecture/15-money-path.md @@ -102,7 +102,7 @@ обещание «не потратить больше, чем дано». Отраслевой стандарт тот же (см. прайор-арт ниже). 3. **Менять надо ТРАКТОВКУ ОТКАЗА**, а не наличие резервации: «не начинаем новое» вместо «гасим всё». -⛔⛔ **ЭРРАТА 05.09 — ВСЁ НИЖЕ ОПИСЫВАЕТ ДВИЖОК ДО ПАКА «ДЕНЕЖНЫЙ СТОП» (`616a8e4`, принят D39.203). Порог «книга короче десяти глав не переводится» СНЯТ ЛЕНДИНГОМ.** Стена стояла на том, что отказ ОДНОГО воркера ронял ВСЮ волну ⇒ резервы всех четырёх обязаны были уместиться в потолок разом. Пак это и чинил (его промт `docs/BACKEND_MONEYSTOP_SESSION_PROMPT.md` называл порог целью): отказ ЗАЩЁЛКИВАЕТ волну — новое не стартует, допущенное дорабатывается, — а обязательный вызов ЖДЁТ settle, когда settle может помочь. Пины: `backend/internal/pipeline/moneystop_test.go`, греп `TestUnderACeilingTheWaveFinishesWhatItAdmitted` и `TestWaitingForHeadroomDeliversTheWholeBook` («a ceiling that admits one call AT A TIME must still deliver the book»). +⛔⛔ **ЭРРАТА 05.09 — ВСЁ НИЖЕ ОПИСЫВАЕТ ДВИЖОК ДО ПАКА «ДЕНЕЖНЫЙ СТОП» (`616a8e4`, принят D39.203). Порог «книга короче десяти глав не переводится» СНЯТ ЛЕНДИНГОМ.** Стена стояла на том, что отказ ОДНОГО воркера ронял ВСЮ волну ⇒ резервы всех четырёх обязаны были уместиться в потолок разом. Пак это и чинил (его промт `docs/archive/prompts/BACKEND_MONEYSTOP_SESSION_PROMPT_2026-09-05.md` называл порог целью): отказ ЗАЩЁЛКИВАЕТ волну — новое не стартует, допущенное дорабатывается, — а обязательный вызов ЖДЁТ settle, когда settle может помочь. Пины: `backend/internal/pipeline/moneystop_test.go`, греп `TestUnderACeilingTheWaveFinishesWhatItAdmitted` и `TestWaitingForHeadroomDeliversTheWholeBook` («a ceiling that admits one call AT A TIME must still deliver the book»). ⇒ **Честное состояние на 05.09:** движок больше НЕ требует, чтобы вся волна умещалась в потолок; короткая книга идёт по одному вызову. Остаточный пол — ОДНА резервация (`step_max_usd` ≈ $0.07 ⇒ ~3 главы по ставке $0.03; до лендинга `D39.204` удвоение на ретрае поднимало это до ~5). ⚠ **Новый порог ВЫВЕДЕН, НЕ ЗАМЕРЕН** — отчёт пака называет это честно (`backend/docs/MONEYSTOP_REPORT.md` §9: цена защёлки не замерена, числа проекции с фактом не сверены). Замер стоит одного $0.15-прогона пятиглавой книги и передан полигону. ⚠ Платформенная половина (потолок ДЕНЬГАМИ, D39.196) снимает и этот пол по построению — но НЕ ПОСТРОЕНА: `git grep -lE "StepMax|step_max" -- platform/` пусто. ⚠ **Класс ошибки, ради которого эррата написана так подробно: оркестратор заленджил пак, чей промт заказывал снятие этой стены, принял его — и в тот же час предупредил владельца о стене как о действующей, читая ЭТОТ абзац.** Канон, не обновлённый лендингом, врёт громче, чем отсутствующий. diff --git a/docs/BACKEND_MONEYSTOP_SESSION_PROMPT.md b/docs/archive/prompts/BACKEND_MONEYSTOP_SESSION_PROMPT_2026-09-05.md similarity index 95% rename from docs/BACKEND_MONEYSTOP_SESSION_PROMPT.md rename to docs/archive/prompts/BACKEND_MONEYSTOP_SESSION_PROMPT_2026-09-05.md index ea1ad89f..4a2c5b4a 100644 --- a/docs/BACKEND_MONEYSTOP_SESSION_PROMPT.md +++ b/docs/archive/prompts/BACKEND_MONEYSTOP_SESSION_PROMPT_2026-09-05.md @@ -1,3 +1,7 @@ +> ⚠⚠ **ОТРАБОТАН 05.09. ИСХОД: ПАК ПРИНЯТ С ДОФИКСОМ — акт `D39.206`.** +> Приёмочный коммит `81a89e9`, дофикс `616a8e4`. 18 находок приёмки, 6 снято, 12 устояло, **4 major — и все четыре оказались УТВЕРЖДЕНИЯМИ, а не поведением**. Строки заказа 271 · 277 · 278 (+поглощённая 171) ЗАКРЫТЫ; 291 решена владельцем (`D39.204`). ⚠ Пункт (3) этого промта противоречил пункту (4): один запрещал цене вызова выходить наружу, другой требовал публиковать `step_max_usd` — тоже оценку одного вызова. Тензию нашла зона, разрешил владелец (`D39.203`). ⚠ И пункт (6) описывал симптом неверно — дефект промта, не зоны. +> ⛔ **Инструкции этого файла НЕ ИСПОЛНЯЮТСЯ** — он архив. Живое состояние: `docs/PROGRESS.md` и журнал решений. + # Промт сессии: БЭКЕНД — «денежный стоп перестаёт быть аварией» > **Роль:** бэкенд. **Зона записи:** `backend/` + СВОЯ секция в `docs/PROGRESS.md`. Чужие зоны diff --git a/docs/PLATFORM_OPERATIONS_SESSION_PROMPT.md b/docs/archive/prompts/PLATFORM_OPERATIONS_SESSION_PROMPT_2026-09-05.md similarity index 96% rename from docs/PLATFORM_OPERATIONS_SESSION_PROMPT.md rename to docs/archive/prompts/PLATFORM_OPERATIONS_SESSION_PROMPT_2026-09-05.md index 3efe66aa..4e9b88ef 100644 --- a/docs/PLATFORM_OPERATIONS_SESSION_PROMPT.md +++ b/docs/archive/prompts/PLATFORM_OPERATIONS_SESSION_PROMPT_2026-09-05.md @@ -1,3 +1,7 @@ +> ⚠⚠ **ОТРАБОТАН 05.09. ИСХОД: ПАК ПРИНЯТ С ДОФИКСОМ — акт `D39.201`.** +> Приёмочный коммит `7e2226a`, дофикс `3e84716`. 20 находок приёмки, 5 снято, 15 устояло, **5 major — ТРИ в самом механизме бэкапа**. Строки заказа 269 · 270 · 274 · 282 ЗАКРЫТЫ, заведена 293. ⚠ Пункт (6) описывал симптом отсутствия артефакта контраста НЕВЕРНО, пункт (4) заказывал доставку титула в `dc:title` вопреки ратифицированному — оба дефекта промта, названы зоной. +> ⛔ **Инструкции этого файла НЕ ИСПОЛНЯЮТСЯ** — он архив. Живое состояние: `docs/PROGRESS.md` и журнал решений. + # Промт сессии: ПЛАТФОРМА — «пустить внутрь можно» > **Роль:** платформа. **Зона записи:** `platform/`. Чужие зоны читаешь, не правишь; пинги и итоги —