Take the cold run from a plan to an order the tree can check: twenty corrections, four of them about money that would have been spent on nothing

This commit is contained in:
heaven 2026-09-11 03:40:05 +03:00
parent 6fb0c84b50
commit 0fcd8d8707
2 changed files with 286 additions and 189 deletions

View file

@ -1,269 +1,365 @@
# Промт: полигон-пак «ХОЛОДНЫЙ ПРОГОН A — от двери до ФАЙЛА, настоящая книга, настоящие деньги»
> ⚠ **Редакция 2 (11.09).** Первая редакция прошла опровергателя и получила **двадцать** находок, из них
> четыре денежных и три, обнулявших смысл прогона. Все внесены. Места, где я ошибался, помечены
> «⛔ ИСПР.» — читай их внимательнее прочего: там сказано, чему НЕ верить.
## 1. Какая проблема и что решит твой результат
Мы построили весь путь: гость заводит книгу → платформа берёт деньги в холд → движок переводит → человек
подписывает банк терминов → редакторская волна → выгрузка → файл. **Каждый кусок предъявлен по отдельности.
Книги, прошедшей его ЦЕЛИКОМ до конца, не было ни разу.** Это строка бэклога **16** дословно: «цена
ДОВЕДЁННОЙ ДО КОНЦА книги не измерена». Ближайшая попытка — 04.09 — дошла до скачанного EPUB, но упёрлась в
денежный потолок и до `exports.complete = true` не добралась.
денежный потолок.
**ИСПР. 1: СУДЬИ НА ЭТОМ ПУТИ НЕТ.** Боевой конфиг `pipeline-c1.yaml` несёт ДВЕ стадии — `draft` и `edit`;
`role: judge` живёт только в `c2` и Фазой 0 прямо не исполняется (`backend/internal/config/pipeline.go:506-508`).
Там же `escalation.budget_usd: 0` ⇒ эскалация НЕ исполняется вовсе, и `gates.coverage.enabled: false` — один
из пяти гейтов выключен. Путь, который ты проверяешь: **черновик → редактор → четыре $0-гейта → выгрузка**.
Так и пиши в пре-реге; «судья» из моей первой редакции — моя ошибка.
**Твой результат:** одна настоящая книга (3 главы zh→ru) проведена от двери до файла, открытого человеком, и
**у каждого узла пути напечатано, ЧЕМ он предъявлен** — по трём независимым следам, а не по самоотчёту
движка. Плюс честный список того, что на этом пути сломано: прогон **ничего не чинит**, он только называет.
Зачем это сейчас: мы собираемся размораживать фронт и звать людей. Сегодня никто в проекте не может
ответить, что именно увидит первый гость, — и ни один трекер этого не знает, потому что знание такого рода
добывается только прохождением.
**у каждого узла напечатано, ЧЕМ он предъявлен**. Плюс честный список того, что на этом пути сломано: прогон
**ничего не чинит**, он только называет.
## 2. Зона записи и git
**Зона: `eval/` + `docs/experiments/`**, пинг оркестратору — секция «Полигон» в `docs/PROGRESS.md`.
**Сессия НЕ коммитит — КРОМЕ пре-рег-фризов**, и это единственное исключение во всём проекте (право
полигона). Фриз-коммит объявляется оркестратору ВСЛУХ до коммита. Канон git — `CLAUDE.md`
§«Git-координация мультисессий»: никаких `git add -A`, `reset --hard`, `checkout` поверх грязного дерева.
**`backend/` и `platform/` — ЧИТАТЬ, не править.** Соблазн будет: чтобы прогон поехал, не хватает
артефакта и, возможно, конфига. Класть их надо **в worktree-копию** (см. §4.2), а не в главное дерево —
`backend/.gitignore` знает только `/tmctl /tmvet /tmmutate`, всё остальное там станет untracked-мусором и
сломает фриз. `.env` **не читать** (гардрейл), путь к ключам передаётся переменной, см. §4.2.
⚠ Что должно пережить рестарт — в РЕПОЗИТОРИЙ, а не в скретчпад: скретчпад чистит не только твой процесс.
**Сессия НЕ коммитит — КРОМЕ пре-рег-фризов** (право полигона, единственное исключение в проекте).
Канон git — `CLAUDE.md` §«Git-координация мультисессий». ⛔ `backend/` и `platform/` — ЧИТАТЬ, не править;
недостающие артефакты класть **в worktree-копию**, не в главное дерево. `.env` **не читать**.
**ИСПР. 2 — АДРЕСАТ ФРИЗ-ОБЪЯВЛЕНИЯ.** Канон говорит «объявляется ВЛАДЕЛЬЦУ вслух до коммита», но владелец
отошёл, а §13 запрещает его беспокоить. Разрешаю так: **объявление идёт мне по каналу; канала нет ⇒
объявление печатается ОТДЕЛЬНОЙ секцией отчёта ДО строки фриз-коммита, и это засчитывается.**
**Правка ЗАКАЗА на лету доезжает только РЕЛЕЕМ:** я пере-передаю её отдельным сообщением, ты
эхо-подтверждаешь своими словами и выносишь отдельным пунктом отчёта.
## 3. Карта чтения — ЗАКОН, дальше только по её ссылкам
1. `CLAUDE.md` — цели владельца и гардрейлы.
2. `docs/experiments/09-pilot-protocol.md` + `eval/README.md` — как устроена полигон-зона и пре-регистрация.
3. `docs/experiments/00-provider-quirks.md`**оплаченные** провайдерские факты; читать ДО первого платного
вызова. Цены и окна — греп `ПИК DEEPSEEK`.
4. `platform/docs/STACK_DECISIONS.md` §«Стенд разработчика» — рецепт подъёма стенда и инвентарь каналов шва.
2. `docs/experiments/09-pilot-protocol.md` + `eval/README.md` — устройство полигон-зоны и пре-регистрация.
3. `docs/experiments/00-provider-quirks.md`**оплаченные** провайдерские факты; ДО первого платного вызова.
4. `platform/docs/STACK_DECISIONS.md` §«Стенд разработчика» (строка 463) — рецепт стенда и инвентарь каналов.
5. Строки бэклога **16** и **224** (`docs/BACKLOG.md`, греп `^| N |`).
**Ратифицированное и замеренное, что нужно для работы (в теле промта, не искать):**
**Ратифицированное и замеренное — в теле промта, не искать:**
- **`D39.144`** — банк подписывается ВЕСЬ ОДНИМ ОК; резюм снимает стоп при ЛЮБОМ состоянии решений.
- **`D39.178`** — сборка выгрузки идёт `--partial`: **книга с дырами всё равно соберётся и откроется.**
Это ратифицировано и правильно — и это же главный способ, которым твой прогон может соврать (§5.1).
- **`D39.194` п.1** — цикл замкнут живьём 04.09, EPUB прошёл `epubcheck` 5.3.0; до `complete=true` не дошли.
- **Претрейн:** 蛊真人 узнаётся моделями 4 из 5. ⇒ **пак НЕ делает никаких утверждений о КАЧЕСТВЕ перевода.**
Узлы судятся механизмом — кадрами, флагами, леджером, — а не чтением текста. Это не осторожность, а
условие осмысленности: на знакомом моделям тексте суждение о качестве стоит ноль.
- **Норма денег полигона:** «не влезает в бюджет — СТОП и пинг, не резать молча». Подъём потолка просят при
СРАБАТЫВАНИИ стопа, а не по проекции: прогнозный запрос оставляет ложный след «владелец согласился на
пере-оплату», которой не было. ⚠ Носитель нормы — ролевой промт оркестратора; **ссылку на `D39.108` п.1 я
снял 11.09, пере-проверив: в теле ноты этой формулировки НЕТ** (нота — приёмка экспов 18/19/20). Норма
действует, атрибуция была ложной.
- **Живость длинного платного прогона проверяется АКТИВНО:** один вызов редактора законно идёт до ~21 минуты
(`attempt_max_s: 1240`). Сторожи по РОСТУ `events.jsonl` и числу строк `request_log`, а не по ожиданию
финального уведомления: зависшая задача от идущей неотличима по молчанию.
- **`D39.178`** — сборка выгрузки идёт `--partial`. ⛔ **ИСПР. 3: я огрубил ноту.** Полностью: неполная книга
уходит **С ПОМЕТКОЙ и маркером на месте КАЖДОЙ дыры**; «молчаливый полный файл на книге с дырой ПО-ПРЕЖНЕМУ
ЗАПРЕЩЁН»; граница `D25.1` осталась открытой. То есть дверь строит всегда, но обязана СКАЗАТЬ.
- **`D39.194` п.1** — цикл замкнут живьём 04.09, EPUB прошёл `epubcheck` 5.3.0. ⚠ Слова `complete` в теле ноты
нет: что книги, доведённой до `complete = true`, не было, говорит строка **16**, а не нота.
- **Претрейн:** 蛊真人 узнаётся моделями 4 из 5 ⇒ **пак НЕ делает утверждений о КАЧЕСТВЕ перевода.** Узлы
судятся механизмом — кадрами, флагами, леджером.
- **Норма денег полигона:** «не влезает в бюджет — СТОП и пинг, не резать молча»; подъём потолка просят при
СРАБАТЫВАНИИ стопа, не по проекции. ⚠ Носитель — ролевой промт оркестратора; атрибуцию `D39.108` п.1 я снял
11.09 фантом-гардом (в теле ноты формулировки нет).
- **Живость проверяется АКТИВНО:** один вызов редактора законно идёт до ~21 минуты
(`attempt_max_s: 1240`, `backend/configs/models.yaml:78` — ⚠ это ПОТОЛОК уровня ПРОВАЙДЕРА, не типичная
длительность). ⛔ **ИСПР. 4: `events.jsonl` и `request_log` — ОДИН носитель** (диск одного процесса), и
растущий лог не есть работа. Сторожи по РАЗНЫМ осям: число строк `request_log` (движок) **и** `book_events`
/ `run_attempts.last_seq` (платформа), плюс `systemctl show` юнита. Каденция — раз в 3040 минут, доклад
«жив» — мне, одной строкой с двумя числами.
**Какие полигонные нормы здесь НЕ действуют и почему.** «Арм без фактора · дедуп + декой · пороги
различимости · запрет судьи-родственника» — это нормы СРАВНИТЕЛЬНОГО замера. Твой пак сравнением не
является: в нём одна рука, нет судейской линзы и нет слепого чтения. Поэтому вместо них действует
пре-регистрация ОЖИДАЕМЫХ ИСХОДОВ (§4.3) — она играет ту же роль: не даёт прочитать «ноль ошибок» как успех.
Не согласен — скажи с доводом, это законный ход.
**Какие полигонные нормы здесь действуют, а какие нет — ИСПРАВЛЕНО.** «Пороги различимости» и «запрет
судьи-родственника» не работают: судейской линзы и сравнения рук в паке нет. **Но «арм без фактора» и «декой»
работают, и я был неправ, объявив их неприменимыми** — см. §4.0 п.3 и §5 п.10. Пре-регистрация ожидаемых
исходов (§4.3) действует в полную силу.
## 4. Состав: четыре фазы. Порядок ЖЁСТКИЙ, содержимое — по разметке внутри
## 4. Состав: четыре фазы. Порядок ЖЁСТКИЙ
### 4.0 Фаза 0 — $0-ДЫМ ПО ЗАГЛУШКЕ. **Делай РОВНО так, и это первая работа пака**
### 4.0 Фаза 0 — $0-ДЫМ. **Делай РОВНО так, и это первая работа пака**
**Ни одного платного вызова, пока дым не прошёл целиком.** Дым гоняет ТОТ ЖЕ драйвер и ТЕ ЖЕ сборщики
следов, что и платная фаза, но на заглушке провайдера (`~/tm-p9-work/fake_provider.py`; Go-порт —
`backend/internal/pipeline/translate_resnapshot_live_test.go`, греп `fake`; рецепт пайплайна на
`local-qwen3-8b``platform/docs/STACK_DECISIONS.md` §«Стенд разработчика»).
⛔ **Ни одного платного вызова, пока дым не прошёл целиком.**
Что дым обязан доказать ДО денег: стенд поднят и порт отвечает ТВОЕМУ pid · гость заведён · книга принята ·
прогон стартовал · кадры доехали · узел подписи ответил · резюм прошёл · **выгрузка собралась и файл
скачался** · все три сборщика следов печатают то, что обещали. Дым идёт на ОТДЕЛЬНОЙ книге и отдельной
базе — платная книга обязана быть первой в своей.
1. **Инструмент заглушки — ОДИН, и он ШТАТНЫЙ: `local-qwen3-8b`**, провайдер `kind: local` на
`127.0.0.1:11434`; рецепт — `platform/docs/STACK_DECISIONS.md` §«Стенд разработчика» (sed по `model:` из
платного конфига). ⛔ **ИСПР. 5: в первой редакции я назвал `~/tm-p9-work/fake_provider.py` — это чужой
двухнедельный скрипт в чужом домашнем каталоге, а не штатный механизм, и с `local` они несовместимы
(разные адаптеры).** Если поднять `local`-слушателя нечем, скажи мне — это развилка, а не твоё решение.
2. **Что дым обязан доказать ДО денег:** стенд поднят и порт отвечает ТВОЕМУ pid · гость заведён · книга
принята · прогон стартовал · кадры доехали · узел подписи ответил · резюм прошёл · **выгрузка собралась и
файл скачался** · все сборщики следов печатают то, что обещали.
3. ⛔ **ПОЗИТИВНЫЙ КОНТРОЛЬ КАЖДОГО СБОРЩИКА — обязателен, стоит $0 и снимает сразу три дыры пака.**
Засей в стендовую БД заведомо НЕНУЛЕВОЙ банк и заведомо удержанный юнит и **потребуй, чтобы сборщики стали
КРАСНЫМИ**. Сборщик, не покрасневший на подсадке, в платную фазу НЕ ДОПУСКАЕТСЯ. Довод: критерии §5 п.1 и
§4.4 одинаково удовлетворяются молчащим прибором — «счётчики нулевые» и «прибор ничего не прочитал»
неотличимы, а банковый сборщик на платной руке работает первый раз в жизни (на заглушечной прозе банку
неоткуда взяться).
4. ⚠ **Дым меняет ТРИ фактора разом** (провайдер + книга + база) — значит при провале платной руки он не
разделяет причину. Держи это в голове и, где дёшево, меняй по одному.
5. **Прибор §4.5 п.2 (счёт расхождения форм) строится и пинится ЗДЕСЬ**, на бесплатном материале
(`books/gu-zhenren/coldrun-v16/guzhenren-coldrun-v16.db.book.epub`), а не после траты денег.
⚠ Дым на заглушке **вырождает сами узлы** (майнинг, гейты, банк): на заглушечной прозе банку неоткуда взяться.
Это ожидаемо. Дым проверяет ТРУБУ, а не содержимое; содержимое проверяет фаза 2.
### 4.1 Предусловия стенда — **делай РОВНО так; список пере-снят и ИСПРАВЛЕН**
### 4.1 Предусловия стенда — **делай РОВНО так; список замерен 11.09, пере-проверь каждое**
Каждое из них СЕГОДНЯ не выполнено, и каждое способно сжечь «холодность» платной книги:
1. ⛔ **Артефакта контраста майнинга нет ни одного на файловой системе.** `CheckMiningContrast` откажет на
старте `translate` — это $0, но останется `failed`-прогон, а следующий старт той же книги пойдёт уже как
ПРОДОЛЖЕНИЕ, и книга перестанет быть холодной. Рецепт и пин — `docs/experiments/16-bank-mining.md:183`:
jieba 0.42.1 `dict.txt`, sha256 `7197c3211ddd98962b036cdf40324d1ea2bfaa12bd028e68faa70111a88e12a8`
(вне git по построению, воспроизводим; строка бэклога **251** — живое подтверждение, что на этой машине
его нет). ⚠ **Ловушка имени:** в конфигах путь называется `mining-contrast.zh.txt`
(`backend/configs/pipeline-c1.yaml:139`) и резолвится ОТ КАТАЛОГА `pipeline.yaml`, а источник артефакта
зовётся `jieba_dict_general_zh.txt` — это один файл под двумя именами, и греп по слову `contrast` в
доке его не находит: там он по-русски. Сверяй sha, а не имя.
2. `eval/.venv` не существует, jieba не установлен.
3. Кластер Postgres опущен (`~/.local/pgsql/bin/pg_ctl`, данные в `~/.local/share/tmstand/pgdata`, порт
55433). ⛔ **Кластер НЕ сносить и чужие базы не трогать:** в нём лежат данные платного прогона 04.09.
Заводи СВОЮ базу.
4. `epubcheck`/`java` на хосте нет — а валидатор скачанного файла нужен. Поставь ДО фриза и назови в пре-реге
(версию — числом).
5. Порт может отвечать ЧУЖИМ процессом (`PD-447`): опознавай стенд по pid-на-порту, а не по ответу.
6. На диске есть СТАРЫЕ стендовые копии `tmctl` (`PD-432`) — годится только бинарь из §4.2.
1. ⛔ **Артефакта контраста майнинга на ФС нет ни одного** (два независимых полных скана; контроль: под `$HOME`
просмотрено 390 083 файла). `CheckMiningContrast` откажет на старте `translate` — $0, но останется
`failed`-прогон, и следующий старт той же книги пойдёт как ПРОДОЛЖЕНИЕ. Рецепт и пин —
`docs/experiments/16-bank-mining.md:183`: jieba 0.42.1 `dict.txt`, sha256
`7197c3211ddd98962b036cdf40324d1ea2bfaa12bd028e68faa70111a88e12a8`. ⚠ **Ловушка имени:** в конфигах файл
зовётся `mining-contrast.zh.txt` (`backend/configs/pipeline-c1.yaml:139`) и резолвится ОТ КАТАЛОГА
`pipeline.yaml`, а источник — `jieba_dict_general_zh.txt`. ⛔ **И ловушка проверки: гард делает только
`os.Stat`** — рядом на диске лежит ФАЛЬШИВЫЙ кандидат `~/tm-p9-work/cfg/contrast-zh.txt` (992 байта, sha не
тот), и гард им удовлетворится. **Сверяй sha, а не имя.**
2. **jieba ставится, это НЕ блокер** (испр.: `python3 -m venv` есть, `ensurepip` даёт pip 25.1.1, pypi достижим).
3. **Кластер Postgres поднят, но БЕЗ TCP-порта:** `listen_addresses` пуст, слушает только unix-сокет.
Подключаться `-h /tmp -p 55433 -U postgres` (ОС-роль `ubuntu-26` в нём не заведена). ⛔ Кластер НЕ сносить,
чужие базы не трогать — там данные платного прогона 04.09; заводи СВОЮ.
4. ⛔ **ИСПР. 6: `epubcheck`/`java` на хосте нет, и поставить их сессия НЕ может** — passwordless sudo
отсутствует, а §13 запрещает беспокоить владельца. ⇒ **валидатор EPUB НЕ обязателен.** Узел судится
`txt`-выгрузкой плюс структурным чтением EPUB (zip + `container.xml` + `nav`), и «файл ОТКРЫТ» значит
**человек прочитал первый абзац перевода и сказал, что это связный русский текст**, а не `cat`. Ставишь
`epubcheck` без sudo из тарбола в `~/.local` — законно, версию назови числом.
5. **Порт может отвечать ЧУЖИМ процессом** (`PD-447`): опознавай стенд по pid-на-порту. Сегодня стенд не
поднят вовсе: `tmplatformd`-процессов 0, дефолтный `127.0.0.1:8080` свободен.
6. ⛔ **Годится ТОЛЬКО бинарь из фриз-воркри.** Настоящих стендовых копий `tmctl`/`tmvet`/`tmmutate` — **34**
(вне `$HOME` и `/tmp` — 0); среди них бинарь от 24.08 на `PATH` (`~/.local/bin/tmctl`), носитель `PD-432`.
Копии заводятся и в скретчпадах ⇒ негоден ЛЮБОЙ бинарь не из фриз-воркри.
7. ⛔ **ИСПР. 7 — ПЯТЬ ПЕРЕМЕННЫХ ОКРУЖЕНИЯ РЕШАЮТ, СУЩЕСТВУЕТ ЛИ ПУТЬ ВООБЩЕ, и в первой редакции их не
было.** `TM_PLATFORM_EXPORT_FORMATS` по умолчанию **ПУСТ** ⇒ все три ручки выгрузки НЕ монтируются, и
последняя треть пути для тебя не существует (404) · `TM_PLATFORM_ENGINE_BIN` пуст ⇒ нет ни прогонов, ни
интейка · `TM_PLATFORM_BOOKS_DIR` пуст ⇒ нет `POST /v0/books` · `TM_PLATFORM_ENGINE_CEILING_ARG` пуст ⇒
ручка старта смонтирована, но КАЖДЫЙ старт отказывает · `TM_PLATFORM_ENGINE_KEYS_PATH` — см. п.8.
**Пин ДО фриза: `GET /v0/capabilities` показывает непустой `export_formats`.**
8. ⛔ **Ключи провайдера.** Значение `TM_PLATFORM_ENGINE_KEYS_PATH` даю я; в окружении его сейчас нет, и
правдоподобного кандидата на диске тоже. **Нет значения ⇒ СТОП ДО фриза** — платного пути без него не
существует, а `.env` читать запрещено гардрейлом.
9. **Субъект и деньги заводятся НА МАШИНЕ, не по HTTP:** самореги нет (маршрутов с `auth` в таблице — 0 из
19), пополнения по HTTP нет (`credit`/`grant`/`balance` — 0 из 19). Путь: `POST /auth/dev-login` при
`TM_PLATFORM_DEV_LOGIN` (тогда деплой не может быть с OIDC) либо `tmplatformctl token issue`; деньги —
`tmplatformctl grant --user <id> --usd <amount>`.
10. ⛔ **Каталог книги `coldrun-v16/` УЖЕ занят прошлым прогоном** — там `project.db` (68 строк `request_log`
на $0.436), `events.jsonl`, сайдкары банка, `bin/tmctl` без VCS-штампа, и `book.yaml`, указывающий в
ЧУЖОЙ домашний каталог. **Исходник читается ТОЛЬКО как файл; рабочий каталог платной книги — новый и
пустой; шаблон `book.yaml` оттуда НЕ переиспользовать.**
### 4.2 Фриз — **делай РОВНО так**
**Фриз = sha коммита ПЛЮС бинари, собранные из `git worktree add <путь> <sha>`.** Замер 11.09: сборка из
главного дерева даёт `vcs.modified=true` от ОДНОГО untracked-файла — то есть главное дерево негодный
источник. Драйвер перед каждым платным шагом печатает `go version -m` обоих бинарей и **ОТКАЗЫВАЕТ**, если
`vcs.modified=true` или revision ≠ фриз-sha. Артефакты (контраст, шаблоны) класть в worktree ПОСЛЕ сборки.
**Фриз = sha коммита ПЛЮС бинари, собранные из `git worktree add <путь> <sha>`.** Довод — не «дерево грязное»
(оно сейчас чистое), а **главное дерево движут параллельные сессии**: в нём прямо сейчас работают движковая и
платформенная. Драйвер перед каждым платным шагом печатает `go version -m` и ОТКАЗЫВАЕТ при `vcs.modified=true`
или чужом revision.
**В фриз-коммит идут:** `docs/experiments/24-<имя>.md` — пре-рег с таблицей ожидаемых исходов (§4.3), sha256
среза книги, список глав с `units_total` (снято $0 до фриза), провайдер и пайплайн; `eval/<каталог>/`
драйвер, обход HTTP, три сборщика следов и сверка; шаблон `book.yaml` с абсолютными путями в worktree.
**Без пере-фриза** (но печатается в отчёт): величина гранта, `TM_PLATFORM_HOLD_FACTOR_PERCENT`, TTL выгрузки.
**Граница:** меняется ЧТО покупается или чем судится — новый фриз-коммит и строка девиации в отчёте;
меняется СКОЛЬКО можно потратить — объявление в отчёте.
⚠ Правка собственного драйвера ПОСЛЕ фриза — тоже новый фриз, а не «поправил и поехал».
**ИСПР. 8 — ФРИЗ-ГЕЙТ УМЕЕТ ОБНУЛИТЬ СЕБЯ.** У линкованного воркри `.git` — ФАЙЛ, поиск корня VCS в Go его
пропускает и уходит выше; напоровшись на посторонний `/tmp/.git`, сборка падает с «error obtaining VCS status»,
и штатное лечение `GOFLAGS=-buildvcs=false` **стирает штамп целиком**, то есть убивает сам гейт
(эррата `D39.202`). ⇒ **перед сборкой `test ! -e /tmp/.git`; `-buildvcs=false` в фриз-сборке ЗАПРЕЩЁН;
воркри — вне репозитория и вне общего скретчпада.** ⚠ И штамп снимается **на КАЖДУЮ попытку**, а не один раз:
резюм может сменить бинарь под тем же прогоном (`TM_PLATFORM_RESUME_MAY_CHANGE_ENGINE`, колонка
`runs.engine_binary`) — сверяй по `run_attempts`, а не по тому, что лежит на PATH в конце.
Ключи провайдера — **не читая `.env`**: путь передаётся переменной `TM_PLATFORM_ENGINE_KEYS_PATH`, платформа
отдаёт его движку аргументом `--keys-file`, мимо своего процесса.
**В фриз-коммит:** `docs/experiments/24-<имя>.md` — пре-рег с таблицей ожидаемых исходов (§4.3), sha256
исходника и **sha256 ФАКТИЧЕСКОГО pipeline-YAML** (платформа берёт файл ЦЕЛИКОМ через `TM_PLATFORM_BOOK_TEMPLATE`,
пер-полевого оверрайда нет ⇒ «прогон на c1» без sha — утверждение без носителя), список глав с `units_total`;
`eval/<каталог>/` — драйвер, сборщики следов и сверка; шаблон `book.yaml` с абсолютными путями в worktree.
**Без пере-фриза** (но печатается в отчёт): грант, `TM_PLATFORM_HOLD_FACTOR_PERCENT`, TTL выгрузки.
**Граница:** меняется ЧТО покупается или чем судится — новый фриз; меняется СКОЛЬКО тратить — объявление.
⚠ Правка собственного драйвера после фриза — тоже новый фриз.
### 4.3 Пре-регистрация ожидаемых исходов — **делай РОВНО так; это главный рубеж пака**
### 4.3 Пре-регистрация ожидаемых исходов — **главный рубеж пака**
**До первого платного вызова** в фриз-коммите лежит таблица: **узел → что ДОЛЖНО произойти, числом или
строкой → чем это будет предъявлено (три следа) → что будет считаться ПРОВАЛОМ узла.**
Без неё ноль ошибок читается как успех, а любой исход — как ожидаемый.
строкой → чем предъявлено → что считается ПРОВАЛОМ узла.**
**Три следа — это три РАЗНЫХ носителя, и они названы поимённо** (приор, снят разбором 11.09; пере-снимай
адреса командой): **(1) Postgres стенда** — `books` · `chapters` · `units` · `runs` · `run_attempts` ·
`reservations` · `credit_ledger` · `book_events` · `exports`; **(2) диск движка и systemd** — `events.jsonl`
в каталоге книги (кадры `hello/progress/unit_done/bank_stop/ceiling/spend/finished`), маркер выхода юнита,
`project.db`/`request_log` (читать `mode=ro` ПОСЛЕ выхода процесса), сайдкары `.bank.json` и
`mined-signature.yaml`, `journalctl --user -u tm-run-<run>-<n>`; **(3) HTTP и файл** — ответы ручек, SSE,
скачанные байты и их sha256.
**Следы — по РАЗНЫМ носителям:** **(1) Postgres стенда** (`books`·`chapters`·`units`·`runs`·`run_attempts`·
`reservations`·`credit_ledger`·`book_events`·`exports`); **(2) диск движка и systemd** (`events.jsonl` с
кадрами `hello/progress/unit_done/bank_stop/ceiling/spend/finished`; `project.db`/`request_log` — читать
`mode=ro` можно НА ХОДУ, WAL это разрешает; сайдкары `.bank.json`, `mined-signature.yaml`, `.bank-stop.txt`;
**systemd-маркер выхода** `<StateDir>/runs/<runID>-<attempt>.exit` — это маркер ЮНИТА systemd, не
переводческого юнита); **(3) HTTP и файл** — ответы ручек, SSE, скачанные БАЙТЫ и их sha256.
**Деньги сходятся ЧЕТЫРЬМЯ числами, и они печатаются:** Σ `request_log.cost_usd` = `spend.committed_usd`
из кадра = Σ `credit_ledger` settlement = (грант баланс). Открытых резерваций на конце — 0.
**ИСПР. 9 — И ЧЕСТНО ПРО НЕЗАВИСИМОСТЬ: следов не три.** Postgres платформы **материализуется из
`events.jsonl` движка** (`Sink materializes a stream into the reporting database… not an event store`), а
текст, сверку и файл платформа получает теми же `tmctl export/status/build`. ⇒ **«три следа сошлись» означает
"одна БД согласна сама с собой"**. По-настоящему независимы только скачанные БАЙТЫ и их sha256; биллинга
провайдера у нас нет. Так и напиши в пре-реге — это не отменяет сверку, но меняет, что она доказывает.
### 4.4 Фаза 2 — платный прогон. **Книга задана, объём задан; всё остальное — твоё решение с доводом**
**ИСПР. 10 — ДЕНЕЖНОЕ РАВЕНСТВО НАЗВАНО НЕТОЧНО.** Кадр несёт `committed_micro_usd` (целые микро-доллары),
а `committed_usd` — поле ДРУГОГО носителя, `tmctl status --json`; конверсия округляет ВВЕРХ. `request_log`
объявлен ТЕЛЕМЕТРИЕЙ, а не источником денег («деньги живут в spend/checkpoints»), и редрайв удаляет чекпойнты —
это законный класс расхождения. ⇒ печатай в МИКРО-долларах и как ПРОВЕРКУ, а не тождество:
Σ `request_log.cost_usd``spend.committed_micro_usd` ≈ Σ `credit_ledger` settlement ≈ (грант баланс);
расхождение — назвать, а не подогнать. **Открытых резерваций на конце — 0** (холд дебетует баланс отдельной
строкой `kind='hold'`).
**Книга:** `books/gu-zhenren/coldrun-v16/guzhenren-ch1-10.gb18030.txt`, **главы 13** (≈4 юнита; глава 1
двухъединичная — **пере-проверь манифестом ДО фриза**, и если многоединичной главы в срезе нет, СТОП и пинг:
без неё редакторская волна не покажет своего худшего случая, а ради него прогон и затевается).
⚠ Имя эксперимента выбери НЕ `coldrun-a`: каталог `books/gu-zhenren/coldrun-a/` уже занят прогоном 24.08.
### 4.4 Фаза 2 — платный прогон
**Узел подписи банка — самое ценное место прогона, и у него известная дыра.** Платформа на стопе показывает
`total 0, signed 0` (строка **224**): у её секции предложений читателя нет. ⛔ **Узел засчитывается пройденным
ТОЛЬКО если движковый сайдкар показал предложения (`.bank.json` `proposed[] ≥ 1` либо
`mined-signature.yaml`), А платформа показала ноль** — тогда это измеренная дыра с уликой. Если предложений
нет и у движка — это ДРУГОЙ факт, и его надо назвать отдельно.
**Решение, которое принимаешь ты:** провести через дверь ОДНО настоящее решение по банку (рекомендация:
`approve`, подготовленный из сайдкара движка — единственный способ провести дверь правок по пути) либо
резюмить неподписанным (`D39.144` это разрешает). Выбор объяви в пре-реге ДО прогона, не после.
**Книга:** `books/gu-zhenren/coldrun-v16/guzhenren-ch1-10.gb18030.txt` (57838 байт, sha256
`0b5f9b0266d8c32ac717a41211d2ed15d4f2a07f37a701fb686e255ab6c89f37`, 10 глав маркерами `第一节…第十节`).
⚠ Имя эксперимента — НЕ `coldrun-a`: каталог занят прогоном 24.08.
**ИСПР. 11 — ОБЪЁМ ЗАКАЗА БЫЛ ДВУСМЫСЛЕН, реши и объяви в пре-реге.** Интейк главами резать НЕ умеет
(форма несёт `title`/`source_lang`/`target_lang`), объём покупается членом `chapters` на старте прогона.
Значит либо **(а)** режешь файл до 3 глав и грузишь срез — тогда `units_total` книги и заказ совпадают; либо
**(б)** грузишь весь файл и заказываешь 3 главы — тогда узел выгрузки судится по `ordered_chapters` /
`delivered_chapters`, а НЕ по `units_total`. **Рекомендую (а)**: сверка честнее и дешевле.
⚠ И `delivered` — это `finished.volume.delivered`, а секции `volume` у цельнокнижного заказа НЕТ вовсе
(платформа не передаёт `--max-units`); плюс `Delivered` считает только юниты, «never completed before» — после
резюма это уже не `units_total`.
**ИСПР. 12 — ГЛАВЫ 13 ТОЛЩЕ СРЕДНЕЙ.** Замер по БД прошлого прогона того же исходника: глава 1 — 4 чанка,
глава 2 — 3, глава 3 — 2, остальные по 2 (контроль: всего 23 строки `chunk_status`). **9 из 23 чанков = 39 %
книги в 30 % глав.** ⚠ И пин «≥1 глава с `units_total ≥ 2`» из первой редакции охраняет то, чего не бывает
(таких глав все десять) и НЕ охраняет то, что случится — недооценку объёма. Замени пин на **«сумма
`units_total` по заказанным главам совпадает с пре-регом»**.
**УЗЕЛ ПОДПИСИ БАНКА — самое ценное место прогона, и здесь я ошибался дважды.**
**ИСПР. 13a: читатель у секции предложений ПОСТРОЕН.** Платформа считает `bank_terms` (`count(*)` и
`filter (where status='approved')`), а строки туда пишет `SaveBank` из движкового сайдкара. Наблюдённый ноль
объясняется МОМЕНТОМ обновления: банк пересчитывается, только когда книга «в покое» (нет прогонов с
`finished_at is null`), а при банк-стопе статус уходит в `awaiting_bank` РАНЬШЕ закрытия строки прогона.
**ожидаемый исход: платформа показывает ноль ПОКА строка прогона не закрыта и НЕнулевое ПОСЛЕ.** Ноль после
закрытия — дефект; ненулевое до — тоже факт. ⛔ Прежняя формулировка («узел засчитан, только если платформа
показала ноль») НАКАЗЫВАЛА исправное поведение — снята.
**ИСПР. 13b: улику уничтожает резюм, который пак сам заказывает.** `proposed[]` в `.bank.json` берётся из
поля в памяти ОДНОГО процесса, а `exportBank` зовётся в том числе на СТАРТЕ каждого прогона и перезаписывает
файл атомарно. ⇒ **сними sha256 и КОПИЮ `<project_db>.bank.json` в момент `awaiting_bank`, ДО
`bank/corrections` и ДО резюма.** Более живучие улики того же факта — `mined-signature.yaml` и `.bank-stop.txt`:
они пишутся при каждом заходе в майнинг.
**ИСПР. 13c: банк-стопа может не случиться вовсе.** Стоп требует трёх условий разом: флаг `--verify-bank`
И наличие edit-волны И **кластер, которого не показывал ни один прежний стоп** (движок помнит показанные
поверхности). Иначе — авто-продолжение с неподписанным банком, и **второй прогон по той же книге не
остановится никогда**. Это девятый способ выродиться: узел не пройден не потому, что сломан, а потому, что не
наступил. Назови исход явно.
**Дверь решения зовётся `POST /v0/books/{bookId}/bank/corrections`**, `action ∈ approve|decline`, пачкой
(персональных ручек по терминам нет, таблица `bank_decisions` мертва). «Подпись» завершается одним
`POST /v0/runs/{runId}/resume`. **Решение, которое принимаешь ты:** провести ОДНО настоящее решение через
дверь (рекомендую — иначе дверь правок остаётся непройденной) либо резюмить неподписанным. Объяви ДО прогона.
**Чего делать НЕЛЬЗЯ:** чинить найденное · править `backend/`/`platform/` · менять срез или пайплайн после
фриза без нового фриза · тихо пополнять баланс при срабатывании потолка · интерпретировать провайдерскую
аномалию без вендор-доки (`CLAUDE.md`: идём в официальную доку, НЕ гадаем).
фриза без нового фриза · тихо пополнять баланс · интерпретировать провайдерскую аномалию без вендор-доки.
### 4.5 Фаза 3 — $0 после прогона. **Состав делай РОВНО так, глубину выбирай сам**
### 4.5 Фаза 3 — $0 после прогона
1. **Сверка каждой строки пре-рег-таблицы** с фактом: ожидание → факт → сошлось/нет → чем предъявлено.
2. **Механический счёт расхождения форм по ОТГРУЖЕННОМУ тексту** (не по черновику): сколько канонических
терминов отданы более чем одной передачей и в каких главах. ⚠ Это МЕХАНИЧЕСКИЙ счёт, а не суждение о
качестве (§3, претрейн). Он нужен, потому что сегодня такой меры по финальному тексту не существует
вовсе: движок считает разброс форм по ЧЕРНОВИКУ на стопе майнинга.
3. **Список сломанного** — каждая находка строкой: что · где (`file:line` или таблица) · чем предъявлена ·
насколько уверен (замерено / прочитано / подозрение). Это будущие ряды бэклога; заводить их буду я.
1. **Сверка каждой строки пре-рег-таблицы**: ожидание → факт → сошлось/нет → чем предъявлено.
2. **Механический счёт расхождения форм по ОТГРУЖЕННОМУ тексту** (прибор построен в фазе 0, §4.0 п.5):
сколько канонических терминов отданы более чем одной передачей и в каких главах. ⚠ Это МЕХАНИЧЕСКИЙ счёт,
не суждение о качестве. Он нужен, потому что такой меры по финальному тексту сегодня не существует вовсе
(строка бэклога **406**).
3. **Список сломанного**строкой на находку: что · где · чем предъявлена · «замерено / прочитано /
подозрение». Ряды бэклога заведу я.
## 5. Чем прогон вырождается — восемь способов, и их снятие. **Адверсариальный проход веди по ним**
## 5. Как прогон вырождается — десять способов и их снятие
Самое дорогое здесь — прогон, прошедший «зелено» и не измеривший ничего. Способы названы, снятия заданы:
1. ⛔ **Дверь выгрузки ВСЕГДА строит** (`--partial`). **Снятие:** `exports.complete = true` И нулевые счётчики
отчёта сборки И `finished.outcome` в списке успеха И все `units.state='translated'`.
**ИСПР. 14: ни `complete`, ни счётчики на API НЕ ОТДАЮТСЯ.** `wireExport` несёт 7 полей, и запрет
умышленный («what does NOT cross: … whether the file came out whole»). ⇒ `complete` читается **из
Postgres**, счётчики — **из stdout `tmctl build` или лога платформы**. ⚠ И проверяй не пять полей, а
**семь**: к `pending/withheld/incomplete/stale/ghost` добавь `stale_unknown` и `config_drift` — под дрейфом
конфига `stale_units` механически 0, и `complete: true` при этом ЗАКОНЕН. Ноль без `stale_unknown=false`
не доказывает ничего.
2. **Срез не тот, что в пре-реге.** Снятие: $0-манифест ДО фриза (`tmctl manifest --json` даёт `units_total` и
по книге, и по главе; ⚠ он ПЕРЕЗАПИСЫВАЕТ `<project_db>.manifest.json` и требует записываемого каталога),
сверка после интейка, расхождение — стоп ДО оплаты.
3. **Узел подписи** — §4.4, три исправления.
4. **Деньги мимо сверки** — §4.3 ИСПР. 10; строки `request_log` с непустым `err` или `finish_reason ≠ stop`
перечисляются поимённо. (На опорном прогоне 08.09 таких было **32 % трат**.)
5. ⛔ **ИСПР. 15 — СТОРОЖ ПОТОЛКА СМОТРЕЛ НА СТРОКУ, КОТОРОЙ НЕ БУДЕТ.** `credit_exhausted` «больше не
производится для собственного потолка прогона» — это счёт АККАУНТА; потолок прогона даёт
**`run_limit_reached`**. Полный словарь: `run_limit_reached · credit_exhausted · daily_ceiling ·
ceiling_unknown`. ⇒ **ЛЮБОЕ непустое `paused_reason` = СТОП и пинг.** Прогон при этом не `failed` —
контракт это запрещает.
6. **Чужой стенд и ложная зелень:** порт чужого процесса · ничьи базы · старый `tmctl` · `vcs.modified`.
Снятие: pid-на-порту · своя база · штампы по КАЖДОЙ попытке · контрольные числа **и по `runs`, и по
`run_attempts`** (резюм после банк-стопа гарантирует вторую попытку — «прогонов = 1» этого не видит).
7. **Отказ на старте не бесплатен для ЭКСПЕРИМЕНТА** (артефакт контраста): $0 по деньгам, но после `failed`
книга уже не холодная. Снятие: дым и предусловия ДО загрузки платной книги; платной книге — свежий id.
8. **Претрейн** — никаких суждений о качестве.
9. ⛔ **НОВОЕ: прогон может НЕ КУПИТЬ НИЧЕГО и выйти успешным — реплей чекпойнтов.** `RequestHash` адресует
чекпойнт, попадание пропускает вызов провайдера и стоит $0 (колонка `request_log.tm_hit` — «ответ взят из
чекпойнта»); гварда «`project_db` обязан быть новым» в коде НЕТ. Если платная книга ляжет на путь, где
остались чекпойнты дыма под тем же снапшотом, прогон пройдёт зелёным почти бесплатно и измерит пустоту.
**Снятие:** `test ! -e <project_db>` до старта · `select count(*) from request_log where tm_hit=1` = 0
после · `select distinct model_actual from request_log` **не содержит `local-*`**.
10. ⛔ **НОВОЕ: молчащий прибор удовлетворяет три центральных критерия сразу** (§5 п.1, §4.4, §4.3).
**Снятие — позитивный контроль сборщиков в фазе 0** (§4.0 п.3). Если вносить в пак что-то одно, вносить
это.
1. ⛔ **Дверь выгрузки ВСЕГДА строит.** `--partial` ратифицирован: книга с дырами соберётся и откроется, и
файл на диске будет выглядеть успехом. **Снятие:** узел «выгрузка» пройден только при
`exports.complete = true` **и** нулевых счётчиках отчёта сборки (`pending/withheld/incomplete/stale/ghost`)
**и** `finished.outcome = clean` **и** `delivered = units_total` **и** всех `units.state='translated'`.
2. **Многоединичной главы фактически нет** (нарезка могла сдвинуться). **Снятие:** $0-манифест ДО фриза, пин
«≥1 глава с `units_total ≥ 2`», сверка после интейка; расхождение — стоп ДО оплаты.
3. **Пустота узла подписи прочтётся как «нечего подписывать»** — см. §4.4.
4. **Деньги мимо сверки.** Оплаченный `2xx` с оборванным телом выглядит таймаутом; обрыв ДО заголовков не
стоит ничего и не оставляет следа. **Снятие:** четырёхстороннее равенство §4.3 печатается числами; строки
`request_log` с непустым `err` или `finish_reason ≠ stop` перечисляются поимённо.
5. **Потолок посреди редактуры.** Проекция цены — НИЖНЯЯ граница (на 08.09 факт был ×3.6 от неё). Прогон
встанет `paused credit_exhausted` — это законное состояние, и экспорт после него соберёт частичную книгу
(см. п.1). **Снятие:** ожидаемый исход — `ready` и пустой `paused_reason`; `paused` = СТОП и пинг
оркестратору, без тихого пополнения.
6. **Чужой стенд и ложная зелень:** порт отвечает чужим процессом · ничьи базы в кластере · старый стендовый
`tmctl` · `vcs.modified=true`. **Снятие:** pid-на-порту · своя база · оба `go version -m` в отчёте ·
контрольное число «прогонов по этой книге = 1».
7. **Отказ на старте не бесплатен для ЭКСПЕРИМЕНТА** (артефакт контраста, §4.1 п.1): $0 по деньгам, но
книга после `failed` уже не холодная. **Снятие:** дым и предусловия — ДО загрузки платной книги; платная
книга получает свежий id.
8. **Претрейн** (§3): никаких суждений о качестве. **Снятие:** пре-рег объявляет это прямо.
**И общий мандат самопроверки ИСПОЛНЕНИЕМ:** ревью СВОЕГО кода драйвера, СВОИХ запросов и ПОЛУЧЕННЫХ
результатов. Самоотчёт «проверено» без исполнения регулярно оказывается ложным и здесь стоит денег.
Субагентов спавнить **РАЗРЕШЕНО и требуется** (иначе дефолт-запрет харнесса тихо победит), модель задавай
ЯВНО. ⛔ Отрицательный замер печатает КОНТРОЛЬНУЮ ВЕЛИЧИНУ рядом с нулём: «строк с ошибкой 0, строк прибор
прочёл 47». Не «проверено с контрольной строкой» — само число.
⛔ **Критик полноты — на КАЖДУЮ фазу, а не на пакет в конце.**
**Мандат самопроверки ИСПОЛНЕНИЕМ:** ревью СВОЕГО кода драйвера, СВОИХ запросов и ПОЛУЧЕННЫХ результатов.
Субагентов спавнить **РАЗРЕШЕНО и требуется**, модель задавай ЯВНО. ⛔ Отрицательный замер печатает
КОНТРОЛЬНУЮ ВЕЛИЧИНУ рядом с нулём. ⛔ **Критик полноты — на КАЖДУЮ фазу.**
## 6. Предметные оси ревью
**Полигон/замеры:** пере-вывод чисел из СЫРЬЯ (не из чужой сводки); независимость сигналов — три следа
обязаны быть разными носителями, а не тремя проекциями одного; вывод на агрегате до вскрытия единиц запрещён.
**Деньги:** из сырого леджера ДВУМЯ независимыми путями; леджер — нижняя граница.
**Полигон/замеры:** пере-вывод чисел из СЫРЬЯ; вывод на агрегате до вскрытия единиц запрещён; ⚠ про
«независимость сигналов» — читай §4.3 ИСПР. 9: здесь она ограничена, и это надо не обходить, а назвать.
**Деньги:** из сырого леджера двумя путями; леджер — нижняя граница.
## 7. Записка-план ДО работы
До первой команды пришли оркестратору ≤15 строк: как ведёшь фазы · где ждёшь сопротивления · что считаешь
спорным в самом заказе. Пре-рег-таблица §4.3 присылается ОТДЕЛЬНО и до фриза — я её читаю.
До первой команды — мне ≤15 строк: как ведёшь фазы · где ждёшь сопротивления · что считаешь спорным в заказе.
Пре-рег-таблица §4.3 присылается ОТДЕЛЬНО и ДО фриза — я её читаю. Канала нет — обе идут секциями отчёта.
## 8. Заявление = команда
Каждое число и каждая категорика — с командой, которой получены, и её выводом. **Число называет ДЕРЕВО**
(sha либо «рабочее дерево + что незакоммичено») **и ПОПУЛЯЦИЮ** (что именно посчитано).
Каждое число и каждая категорика — с командой и её выводом. **Число называет ДЕРЕВО и ПОПУЛЯЦИЮ.**
## 9. Эхо-протокол старта
ДО первой команды пришли **оркестратору первым действием, по адресу из `/tmp/textmachine-channel`**
(`SendMessage`, роль `ОРКЕСТРАТОР`) ≤10 строк: скоуп · инварианты · не-делать — **СВОИМИ словами**.
Дословный пересказ промта подтверждает канал, но не понимание. Канала нет — эхо первой секцией отчёта.
ДО первой команды — мне первым действием, по адресу из `/tmp/textmachine-channel` (`SendMessage`, роль
`ОРКЕСТРАТОР`), ≤10 строк: скоуп · инварианты · не-делать — **СВОИМИ словами**.
## 10. Что НЕ удалось — обязательная секция отчёта
Что не проверено · что не воспроизвелось · где данных не хватило · какой узел пришлось объявить непройденным.
**«Не измерено» вместо догадки.** «Не проверено» ≠ «опровергнуто».
Что не проверено · что не воспроизвелось · где данных не хватило · какой узел объявлен непройденным и почему.
**«Не измерено» вместо догадки.**
## 11. Канал вопросов и право отказаться
Конфликт промта с кодом или доками — **пинг оркестратору, НЕ интерпретация**. Право сказать «этого делать не
надо» с аргументом — есть, и такие развилки поощряются. Всё, что касается денег сверх названного потолка, —
через меня.
Конфликт промта с кодом — **пинг мне, НЕ интерпретация**. Право сказать «этого делать не надо» с аргументом —
есть. Всё про деньги сверх названного — через меня.
## 12. Прямой канал
`CLAUDE.md` §«Связь между сессиями»: `/tmp/textmachine-channel`, свой блок дописать первым делом, живость
адресата — `ListAgents`. Роли в файле нет или имя не отвечает ⇒ **КАНАЛА НЕТ, и это НОРМАЛЬНЫЙ случай:
сессии подряд НЕ опрашивать**, вопрос — секцией в отчёт.
`CLAUDE.md` §«Связь между сессиями»: `/tmp/textmachine-channel`, свой блок первым делом, живость — `ListAgents`.
Роли нет или имя не отвечает ⇒ **КАНАЛА НЕТ, это НОРМАЛЬНЫЙ случай**, вопрос — секцией в отчёт.
## 13. Критерий завершённости
Работа завершена, когда: **каждая строка пре-рег-таблицы имеет исход** (сошлось · не сошлось с уликой ·
не проверено с причиной) · файл скачан и ОТКРЫТ, и это сказано отдельно · деньги сведены четырьмя числами ·
все находки перечислены с разметкой «замерено / прочитано / подозрение» · фриз-коммиты и девиации названы ·
артефакты в ДЕРЕВЕ, а не в письме · явное **«работа завершена, править не планирую»**.
**Пак доводится до конца САМОЙ сессией** (слово владельца 11.09): владельца не беспокоить, меня не тегать
«просто так» — приёмка идёт последней и вторым кругом тебе не служит.
Работа завершена, когда: **каждая строка пре-рег-таблицы имеет исход** · **у каждого пункта §4 есть исход**
(сделано · не делаю с доводом · пинг) · **круги СОШЛИСЬ** — последний проход критика полноты не дал НОВЫХ
находок · файл скачан и ПРОЧИТАН человеком (см. §4.1 п.4 — что это значит) · деньги сведены и расхождения
названы · находки размечены «замерено / прочитано / подозрение» · фризы и девиации названы · артефакты в
ДЕРЕВЕ · явное **«работа завершена, править не планирую»**.
**Пак доводишь до конца ТЫ.** Владельца не беспокоить, меня не тегать «просто так».
## Деньги — ДВА числа, и они разные
## Деньги — ДВА числа, и первое ИСПРАВЛЕНО
**Ожидаемая трата ≈ $0.30** (замер 08.09: 10 глав за `committed = $1.259217` ⇒ ≈$0.13/глава; ⚠ вниз это не
масштабируется линейно — майнинг платится раз на книгу).
**Машинный КАП ≈ $2.32.5** — это ХОЛД, а не ожидание: книжный бонд на `c1` равен $2.00
(`budget_usd` + `classify_budget_usd`), и грант обязан быть не меньше холда, иначе допуск откажет.
Владелец санкционировал платный прогон, зная оба числа.
**ИСПР. 16: ожидание $0.30 было занижено дважды.** (а) главы 13 несут 39 % книги, а не 30 %; (б) опорный
замер 08.09 снят на стенде с книжным потолком терминологии **$0.07**, тогда как у `c1` он **$2.00** — в 28 раз
выше. ⇒ **ожидание $0.350.50, хвост до $0.65.**
⛔ **Стоп-правила, каждое — остановка и пинг, а не решение сессии:**
- фактическая трата дошла до **$0.80** — стоп, пинг, ждёшь моего слова;
- прогон встал `paused credit_exhausted` — стоп и пинг (тихо не пополнять);
- срез оказался без многоединичной главы — стоп ДО оплаты;
- бинарь не из фриза (`vcs.modified=true` или чужой revision) — стоп до устранения.
**ИСПР. 17 — САМОЕ ДОРОГОЕ: «грант обязан покрывать холд, иначе допуск откажет» — НЕВЕРНО.** При нехватке
баланса холд САМ ужимается ровно на книжный бонд и прогон **допускается** с `bondFunded = false`
(`platform/internal/pricing/pricing.go:198-224`: `if base+bookOnce <= balance { … } return base, false`;
пин зоны — баланс $1.00, книга 5 глав, бонд $2.00 → `covers_all`, `AffordableChapters = 5`,
`BondFunded = false`). Отказ достижим только при балансе ниже ≈$0.26. **Следствие:** грант $2.00 даёт
стартующий прогон, чей `--ceiling-usd` не несёт бонда, и терминологическая консолидация с классификатором
ловят отказ резерва — «потолок, слишком малый для них, стоит КАЧЕСТВА, а не прогресса». Пре-рег измерит
пайплайн без фазы майнинга и не узнает об этом.
⇒ **грант ≥ 1.25×expected + step_max + 2.00. $2.5 безопасно, $2.3 впритык, $2.0 — ТИХАЯ ДЕГРАДАЦИЯ.**
**Пин пре-рега: `term_consistency_funded: true` в ответе ручки, иначе СТОП ДО оплаты.**
⛔ **Стоп-правила — каждое остановка и пинг, а не решение сессии:**
- фактическая трата дошла до **$1.00** (порог поднят с $0.80: один оборванный ответ его сорвал бы);
- `paused_reason` НЕПУСТО — любое из четырёх значений;
- срез не совпал с пре-регом — стоп ДО оплаты;
- `term_consistency_funded: false` — стоп ДО оплаты;
- бинарь не из фриза — стоп до устранения.
## Отчёт
`docs/experiments/24-<имя>.md` (пре-рег + результаты) + `eval/<каталог>/` (драйвер и сборщики) + секция
«Полигон» в `docs/PROGRESS.md` + сообщение мне: таблица «узел → ожидание → факт → чем предъявлено» ·
четыре числа денег · список сломанного с разметкой уверенности · что сказал твой критик полноты по каждой
фазе · секция §10 · **что ты сам считаешь слабым местом прогона**.
`docs/experiments/24-<имя>.md` (пре-рег + результаты) + `eval/<каталог>/` + секция «Полигон» в
`docs/PROGRESS.md` + сообщение мне: таблица «узел → ожидание → факт → чем предъявлено» · деньги с названными
расхождениями · список сломанного с разметкой уверенности · что сказал критик полноты по КАЖДОЙ фазе ·
секция §10 · **что ты сам считаешь слабым местом прогона**.
⛔ Последний абзац отчёта — план или обещание? Значит работа не кончена: сделай сейчас.

View file

@ -40,6 +40,7 @@
| Платформа · ДЕНЬГИ И ПРАВДА | активного НЕТ | пак ОТРАБОТАН и **ПРИНЯТ С ДОФИКСОМ 07.09** — акт **D39.221**, контрактный минор **0.13.0**; промт в `archive/prompts/` с баннером исхода. ⚠ **Синхронный разрез приёма остановлен правилом остановки и заландён построенным, но НЕ готовым** — десять пунктов несёт строка бэклога **332**, и она же заказ следующему паку зоны; ложный инвариант бюджета заландён осознанно (окно 8 с при дефолте в 16 минутах) |
| Платформа · ФОРМА ЗАКАЗА | активного НЕТ | пак ОТРАБОТАН, ПРИНЯТ С ДОФИКСОМ и ЗАЛЕНДЕН 06.09 — акт **D39.208**, код + канон **0.11.0**; промт уведён в `archive/prompts/ORDER_FORM_SESSION_PROMPT_2026-09-05.md` с баннером исхода. ⚠ **НЕ построено, хотя заказывалось:** денежный ползунок на проводе объявлен, а отправить его нечем, и оценки под ВЫБРАННЫЙ заказ нет; «упрощение резюма» не сделано — обе позиции живут строками бэклога, брать их как новый пак СЛЕДУЮЩЕЙ сессии, не читать промт как задание |
| Платформа · прежний | активного НЕТ | пак «пустить внутрь можно» ОТРАБОТАН и ПРИНЯТ С ДОФИКСОМ 05.09 — акт **D39.201** (`7e2226a` + `3e84716`), промт в `archive/prompts/` с баннером исхода. Следующая работа зоны — строки **294** (зеркало словаря под минор потока) ⚠ (строка 293 — зона ОРКЕСТРАТОРА, не платформы: правило игнора общее для всех рабочих деревьев клона) |
| **Полигон · ХОЛОДНЫЙ ПРОГОН A** | [POLYGON_COLD_RUN_A_SESSION_PROMPT.md](POLYGON_COLD_RUN_A_SESSION_PROMPT.md) | ✅ **ВЫДАН 11.09**: настоящая книга (3 главы zh→ru) от двери платформы до ФАЙЛА, платный провайдер — строка бэклога **16** («цена доведённой до конца книги не измерена»). Ожидание $0.350.50, кап ≈$2.5. ⚠ **Редакция 2:** опровергатель дал 20 находок, четыре денежных — в том числе «грант обязан покрывать холд» ОПРОВЕРГНУТО (холд сам ужимается на бонд, прогон стартует с `bondFunded=false` и тихо теряет фазу майнинга) и сторож потолка смотрел на `credit_exhausted`, которого для потолка прогона больше не производят |
| Полигон · РЕМОНТ ПРИБОРА | [POLYGON_INSTRUMENT_REPAIR_SESSION_PROMPT.md](POLYGON_INSTRUMENT_REPAIR_SESSION_PROMPT.md) | ⛔ **ПРИПАРКОВАН 11.09 — НЕ БРАТЬ** (баннер в шапке): слот зоны отдан холодному прогону A по норме «один промт на зону»; пере-выдаётся сразу после закрытия A актом. ⚠ Его гейт **ИДЁТ ПЕРЕД любым следующим платным ЗАМЕРОМ**, включая продолжение фазы Д**: три эрраты носителей БАННЕРАМИ · гигиена стенда (300, 265) · линза против ИСХОДНИКА + порог различимости (319, 143). Санкции на платный замер НЕ несёт |
| Полигон · фаза Д | [POLYGON_EXP2223_REDO_SESSION_PROMPT.md](POLYGON_EXP2223_REDO_SESSION_PROMPT.md) | ⛔ **ПРИПАРКОВАНА 11.09 — НЕ БРАТЬ** (баннер в шапке), сверх прежнего: ⚠ **ПРИОСТАНОВЛЕНА до лендинга «РЕМОНТА ПРИБОРА»**: линза замера меряет верность ЧЕРНОВИКУ, а руке велено отходить от него по исходнику (`D39.215` п.3) ⇒ продолжать замер до починки значит покупать числа, которые ничего не значат. ⚠ Прежний указатель на `PACKAGE4` снят: остаток вынесен строкой 327, промт ретирован |
| Фронт | активного НЕТ | **ЗОНА ЗАМОРОЖЕНА** (D39.136 п.2 + D39.147: разморозка отдельным словом владельца, не привязана к P7); перечень первого касания — в зонном журнале |