diff --git a/docs/PROGRESS.md b/docs/PROGRESS.md index 4a4b722c..702210b0 100644 --- a/docs/PROGRESS.md +++ b/docs/PROGRESS.md @@ -1,6 +1,6 @@ # Журнал прогресса -> **⟶ ТЕКУЩЕЕ СОСТОЯНИЕ** (на 2026-09-05, голова D39.207 — КУРС: движок и платформа до «работает и отдаёт результат», фронт ЗАМОРОЖЕН и 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.208 — КУРС: движок и платформа до «работает и отдаёт результат», фронт ЗАМОРОЖЕН и 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.206**; ⚠ испр.: раньше здесь стояла 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 его рукой; утверждением о расхождении дерева он не является — арбитр этой пары именно здесь. @@ -444,6 +444,33 @@ polygon, `mined_delta`/`mined_rejects` — в 17 конфигах из 31, по ⚠ Полный прогон 201 записи НЕ делался (124 из них гоняют `./internal/pipeline/` по ~145 с); вместо него механически проверено, что у всех 205 записей цель ЖИВА. +**ДОФИКС ПО ПРИЁМКЕ 06.09 — шесть обязательных находок, все подтверждены мной заново и все закрыты.** +Дороже прочих **M-1: молчаливая потеря текста.** Роль `toc`/`cover`, объявленная С ФРАГМЕНТОМ +(`href="c2.xhtml#pos"`), исключала ВЕСЬ документ — а фрагмент значит «оглавление НАЧИНАЕТСЯ здесь внутри», а +не «файл целиком служебный». Проза исчезала при уверенном ярлыке `declared` и молчащем логе. ⛔ **Форма уже +стоит в EPUB владельца:** у Kristoff `type="toc" href="index_split_124.html#filepos2096584"`, и мой прогон +после починки показывает там `service_roles_inside_documents 1` — то есть ровно этот случай на живой книге. + +⛔ **M-2: тревога не приходила никуда.** Из пяти счётов логировались два; 126 документов, схлопнутых в 6 +глав-китов, печатали в stderr **ноль байт**. Починено не пятью вызовами, а ОДНИМ репортёром `IngestNotes()` +и рефлексионным сторожем, который краснеет на любом новом неподключённом счётчике: пять мест — это пять +шансов забыть шестой. + +⚠ **Замер EPUB владельца через новый путь (мой, не верификатора):** Kristoff — 71 глава `declared`, из них +**64 короче 200 знаков** (min 18, медиана 29, max 397 878); isekai — 44 главы, 9 коротких; fifty_shades — 32 +главы, 3 коротких. `title_raw` заполнен у 71/71, 44/44 и 32/32. ⛔ Цена Kristoff названа: 64 единицы +манифеста несут не текст книги, а строки заднего листинга, и пойдут в оплату как главы — вопрос владельца. + +⚠ **Объявление D39.183, замеренное:** регэксп ингеста стал допускать пробел между маркером и цифрой, чтобы +ингест и чанкер читали заголовок одинаково. Разница на всех стендовых файлах — **ноль** (蛊真人 2996→2996, +голден 8→8, оба ja-txt без изменений). + +⚠ **Находка о СВОЁМ коде из дофикса:** прежний `resolveHref` раскодировал href ДО среза фрагмента, значит +литеральный `#` в имени файла (приезжающий как `%23`) обрезал имя. Два почти-дубля резолвера сравнивались +друг с другом и расходились молча — «один источник на факт» я заказывал сам и сам же не выдержал. Сведены. + +Каталог 205 → **210**, пять новых прогнаны: 5 RED, 0 неожиданных. + ### 04.09 — ОТЧЁТ вайр-батча «род · экран цели · заголовки инъекций» (сессия `textmachine-main-7e`, промт `BACKEND_WIREBATCH_SESSION_PROMPT.md`) > **ПЕРВОЙ СТРОКОЙ, потому что промт этого требует: `internal/lang/data/` НЕ ТРОНУТ НИ БАЙТОМ.** Пункт 3 сделан снятием РЕНДЕРА в Go. Предъявление, а не утверждение: `diff -r <(git archive HEAD backend/internal/lang | tar -xO) …` идентично, и `tmctl manifest --json` из HEAD и из дерева на `example/book.yaml` дают ТОТ ЖЕ `manifest_key` `e996b9d4f129006e9faa6237fb1635a82e32c06c056b195072fae15f582021f6` и ТОТ ЖЕ `unit.id` `f8ad8c8f114997c5:3d2213f2:0` (средний сегмент — `cutTag`). ⇒ пере-чеканки `unit.id` нет, `recut` у платформы не сработает, `unit_resolutions` книги параллельного платного прогона целы. diff --git a/docs/architecture/05-decisions-index.md b/docs/architecture/05-decisions-index.md index 4328a012..4740ebae 100644 --- a/docs/architecture/05-decisions-index.md +++ b/docs/architecture/05-decisions-index.md @@ -1,4 +1,4 @@ -# Реестр D-нот — карта актуальности v2 (D1–D39.207; титул — носитель головы, бампать при каждом аппенде) +# Реестр D-нот — карта актуальности v2 (D1–D39.208; титул — носитель головы, бампать при каждом аппенде) > ⚠ **Колонку «тело» `counts.py --check` НЕ сторожит по устройству:** он сверяет полноту НОМЕРОВ, а не > место тела, поэтому колонка держится дисциплиной лендинга. Не нашёл тело по колонке — иди в слайсы, @@ -266,3 +266,4 @@ | 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 решена владельцем. Порог десяти глав снят лендингом | ратифицировано | живое тело | приёмка · движок · деньги | | D39.207 | 05.09 | **АКТ ВЕРИФИКАЦИИ обоих актов приёмки холодной сессией без пака** (воркри `/tmp/tm-verify-0509` на `d766007`, $0): 15 из 15 фактических утверждений ПОДТВЕРЖДЕНЫ, три прогоном; 7 находок вне карты (F1 — три протухших «финальных» числа в журнале, включая «0 SURVIVED» против четырёх; F2/F3 — имена в Go-комментариях, не разрешающиеся ни во что; F5 — `/tmp/.git` ломает `go build` под `/tmp`). **Норма: утверждение о замере ИЛИ о причине непроверки обязано цитировать КОМАНДУ.** Дыра скипа платформы замерена: 373 против 6 при неотличимом `exit 0` | ✅ | +| D39.208 | 06.09 | **АКТ: платформенный пак «форма заказа» ПРИНЯТ С ДОФИКСОМ**, залендено двумя актами (код + канон 0.11.0), гейт версии не подгоняли. Центральное: пак читал цену движка, но считал в ГЛАВАХ там, где движок считает в ЮНИТАХ — полоса символьного заказа стояла бы `0/N` навсегда. ⭐ **Норма: фикстура, в которой две РАЗНЫЕ величины совпадают, делает весь класс их расхождений невидимым** — девять находок при зелёной батарее. ⚠ Моя ошибка лендинга: pathspec молча уронил 5 untracked-файлов, включая миграцию; хук предупреждал, я обрезал его вывод пайпом | ✅ | diff --git a/docs/architecture/05-decisions-log.md b/docs/architecture/05-decisions-log.md index cc289924..a7f710a7 100644 --- a/docs/architecture/05-decisions-log.md +++ b/docs/architecture/05-decisions-log.md @@ -1,4 +1,4 @@ -# Журнал решений оркестратора — контракт D1–D39.207 (живой файл: карта · эрраты · живые тела · голова D39.124+ (подрезка D39.139); тела закрытых эр — в слайсах `docs/archive/architecture/`, указатель ниже; реестр всех нот — `05-decisions-index.md`) +# Журнал решений оркестратора — контракт D1–D39.208 (живой файл: карта · эрраты · живые тела · голова 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+). @@ -2538,3 +2538,24 @@ $2.00» не мерил никто), **а утверждение о ПРОШЛО **5. НОРМА, КУПЛЕННАЯ ЭТОЙ ВЕРИФИКАЦИЕЙ — и она про МЕНЯ, а не про зоны.** Пятнадцать фактов устояли; **три из четырёх находок — про ПРИЧИНЫ, приписанные к верным фактам без прогона** (F4 «проверит только боевой хост» · F5 «`-buildvcs` обходить не нужно» · и мой заказ, требовавший невозможного, вскрытый одним `--stat`). ⇒ **Утверждение, которое ссылается на замер ИЛИ объясняет, почему что-то НЕ проверено, обязано цитировать КОМАНДУ, показывающую это.** Норма адресована в первую очередь актам приёмки: акт точен там, где называет ФАКТ, и слаб там, где называет ПРИЧИНУ. Она проходит собственный критерий `D39.202` п.7 — снижает цену проверки, а не требует бдительности. **6. Что верификатор НЕ проверил** (его список, не сокращённый): каталог мутаций целиком не перегонял — проверил СОСТАВ статически, то есть повторил дыру приёмки, а не закрыл её · живую пару `exit 10`/`exit 0` не воспроизводил (вердикт о рантайме — PLAUSIBLE) · сценарий `mv` под открытым дескриптором не воспроизводил, хотя F4 показывает, что здесь это исполнимо · пять рехёрсов восстановления с настоящим `drop database` постфактум невоспроизводимы · процессные счёты обоих актов · гонку `MS-reserve-under-the-gate` · `battery-stand` (каталога `books` в воркри нет по построению). ⚠ И собственная ложная зелень, объявленная им САМИМ: первый прогон батареи шёл через `| tail -80`, харнесс отчитался «exit code 0», пока `make` печатал `Error 1` — обрезанный вывод, `D39.202` п.3; числа выше сняты пере-прогоном без пайпа. + + +## D39.208 — АКТ ПРИЁМКИ ПЛАТФОРМЕННОГО ПАКА «ФОРМА ЗАКАЗА ПЕРЕВОДА»: ПРИНЯТ С ДОФИКСОМ, залендено двумя актами; норма о ВЫРОЖДЕННОЙ ФИКСТУРЕ (06.09) ✅ + +**1. Что заландено и в каком порядке.** Код — `platform/` 55 файлов, следом `36ea8b8` (миграция `00033` и четыре тест-файла, см. п.6). Канон — `c470f93`, `info.version` 0.10.0 → 0.11.0. **Порядок ратифицирован заранее:** код первым живёт с ЧЕСТНО КРАСНЫМ гейтом версии контракта, канон вторым его гасит; гейт не подгоняли под мир, а мир привели к гейту. + +**2. Метод — и он сменился по слову владельца.** Верификацию крутили НЕ сессии, а мои собственные агенты: сессии в этом проекте — строители, узкий скоуп; проверка своей работы — контур оркестратора. Две линзы: **слепая** (судила заказ и дифф, отчёт зоны не открывала; подняла живую БД и прогнала 19 новых тестов поимённо — все PASS, не скипы) и **вне карты** (читала отчёт как КАРТУ, чью слепоту меряет). Обе — read-only, $0. + +**3. Что устояло.** Механика денег сделана ПОВЕДЕНИЕМ: холд от проекции движка (`k×expected + step_max [+ book_once]`), аддитивный `step_max`, отказ вместо догадки при отсутствующей цене, заказ хранится ИДЕНТИЧНОСТЬЮ (не ординалом), `--max-units` едет в argv и пересчитывается на каждом спавне. **`PD-440` снят по построению**, а не обещанием: остаток комнаты на последнем вызове = `hold − billed ≥ step_max`, предъявлено на проводе (`expected 8.3 → hold 10.444828`). + +**4. ⛔ ЦЕНТРАЛЬНАЯ НАХОДКА — ПАК ЧИТАЛ ЦЕНУ ДВИЖКА, НО СЧИТАЛ НЕ В ЕГО ЕДИНИЦАХ.** Заказ, холд и `--max-units` — в ЮНИТАХ; полоса, `delivered_chapters`, `ordered_chapters` — в ГЛАВАХ. Следствие: символьный заказ книги без структуры оставлял полосу `0/N` на весь срок жизни прогона и `delivered_chapters: 0` навсегда. ⚠ И тяжесть не в полосе: **тот же файл двадцатью строками выше ОТКАЗЫВАЕТ в допуске книге без дерева ИМЕННО этими словами** — пак объявлял состояние недопустимым в одном месте и вводил его в другом. А поскольку `declared` ведётся как `none` (временное правило, строка 297), символьный заказ сегодня — единственная форма частичной покупки для КАЖДОГО EPUB и каждой не-CJK книги. Починено зоной: полоса такого прогона считается в юнитах, `delivered_chapters` для него **null**, а не `0` («ноль читается как ничего не произошло»). + +**5. ⭐ НОРМА, КУПЛЕННАЯ ЭТИМ ПАКОМ, И ОНА СИЛЬНЕЕ ЛЮБОЙ ОТДЕЛЬНОЙ НАХОДКИ (формулировка зоны).** Три раунда ревью нашли в работе ДЕВЯТЬ вещей, и **батарея была зелёной на всех девяти**. Собственный адверсариальный проход зоны поймал часть, но центральное не поймал — **потому что фикстуры зоны делали два РАЗНЫХ числа ОДНИМ**: во всём `platform/` не было главы больше чем из одного юнита (`units_total, 1`), а все вызовы `TranslateArgs` шли с `maxUnits = 0`. ⇒ **Фикстура, в которой две различные величины совпадают, делает весь их класс расхождений НЕВИДИМЫМ, и никакой батареей это не ловится.** Подмена «юнитов» на «главы» в спавне оставалась зелёной; именованный артефакт приёмки эту ось не щупал ни одной из восьми посадок. Лечение — не тест, а ФИКСТУРА: зона завела первую, где числа глав и юнитов различаются, и девятая посадка немедленно покраснела по имени. + +**6. ⛔ МОЯ ОШИБКА ЛЕНДИНГА, И ОНА ТОГО ЖЕ КЛАССА, ЧТО ЛОВИЛИ ВЕСЬ ДЕНЬ.** Первый коммит взял 55 путей из 60: **pathspec-форма МОЛЧА роняет неотслеживаемые файлы**, и снаружи остались миграция `00033` — центральный артефакт пака — и четыре тест-файла. Хук предупреждает об этом ровно такой строкой; я **обрезал его вывод через `| tail -3`** и предупреждения не увидел, то есть исполнил ту самую «обрезанную выдачу», от которой предостерегал зоны весь день. Историю НЕ переписывал: недостающее добрано отдельным коммитом `36ea8b8` с сообщением о том, что произошло. ⇒ **Правило: вывод пре-коммит-хука не пропускать через пайп никогда** — он единственный, кто видит untracked-под-pathspec. + +**7. Что осталось названным, а не построенным** (в отчёте зоны и в obstacle-секции, по моему требованию): денежный ползунок объявлен на проводе, но отправить его нечем и оценки под ВЫБРАННЫЙ заказ нет — половина ратифицированной формы (`D39.196` §4) · `getRunOptions` приобрёл 409, внесён в состав минора · «упрощение резюма» не сделано, и **сверка комплектности исправлена зоной с «(1) ДА» на «ЧАСТИЧНО»** — ошибка отчёта, названная ею самой. ⚠ Плюс: стоимость чтения формы выросла (агрегация по юнитам с коррелированным `not exists` вместо строки на главу), план не снимался — стоит в отчёте рядом с празднованием снятой квадратичности на том же пути. + +**8. Что я назвал неверно.** Из двенадцати пунктов дофикс-листа зона **отклонила один с уликой**: `platform/docs/BACKLOG.md`, который я числил носителем отозванного запрета, **не существует** (`ls` пуст, греп пуст). Остальные три носителя того же пункта были и закрыты. ⇒ ратификация «не защищаю вердикт верификатора потому, что сам его заказал» исполнена в первом же случае, где она понадобилась. + +**9. Границы вердикта — честно.** Обе линзы **батарею не гоняли** (хост нагружен, `D39.197` п.5). Слепая: `go build`/`go vet` + 19 новых тестов с живым DSN. Вне-карты: только `go build`/`go vet`; её находки 1 и 4 помечены **PLAUSIBLE** — выведены чтением SQL и Go, не наблюдением. **`OF-verdict-lies` не воспроизводил никто**, живой HTTP-прогон формы заказа не делался, форма глазами не смотрена ни зоной, ни приёмкой. Пере-снятые зоной числа: `MAKE-EXIT=2` (единственный красный — ратифицированный гейт версии, погашен актом п.1), `RUN 845 · PASS 839 · SKIP 5 · FAIL 1`, линтер 0 issues, `ALARM PD-count 14 (baseline 14)`.