# `door_to_file` — харнесс холодного прогона «от двери до ФАЙЛА» Инструменты пака «ХОЛОДНЫЙ ПРОГОН A»: одна настоящая книга (蛊真人, главы 1–3, zh→ru) проводится от интейка до скачанного файла, и у каждого узла печатается, ЧЕМ он предъявлен. Пре-регистрация, таблица ожидаемых исходов и результаты — `docs/experiments/24-door-to-file.md`. | Файл | Что делает | Чем проверен | |---|---|---| | `drive.sh` | драйвер фаз: гейт · вход · грант · интейк · опции · старт · вахта · улика · подпись · резюм · выгрузка · сбор · формы. **Отказывает**, а не предупреждает | подсадка чужого бинаря, бинаря без штампа и неверного sha — каждый отказ назвал ИМЕННО подсаженное | | `collect.py` | сборщик следов: фриз-гейт, Postgres платформы, диск движка, отчёт сборки, деньги в µUSD | подсадка ненулевого банка, удержанного юнита и открытой резервации — покраснел по всем трём осям | | `spread.py` | сколько РАЗНЫХ передач получил один канонический термин в ОТГРУЖЕННОМ тексте (строка бэклога 406) | `--selftest`: подсаженная вторая форма ловится, склонение той же формы не двоится, неотрендеренный термин даёт 0 | | `stub/` | $0-заглушка провайдера `local` на `127.0.0.1:11434` | перенос штатной `fakeProvider` стенда (`platform/internal/runner/translate_resnapshot_live_test.go`) | | `zeropipe/` | рендер боевого пайплайна на $0-пару | перенос штатного `zeroCostPipeline` (`platform/internal/runner/bankapply_live_test.go`); печатает счёт достижимых ПЛАТНЫХ моделей в обоих файлах | ## Три вещи, которые стоит знать, прежде чем переиспользовать это 1. **`sed` по `model:` из рецепта стенда НЕДОСТАТОЧЕН.** Модели несут ещё и гейты (`model` и `classify_model`), а на `pipeline-c1` терминолог с классификатором резолвятся в ПЛАТНОГО провайдера, когда все стадии уже обнулены. Поэтому `zeropipe` — порт готового рендера, а не sed. 2. **Ноль достижимых платных моделей печатается рядом с их числом в боевом файле.** Иначе «конфиг чист» и «прибор промолчал» неотличимы: замерено 8 достижимых платных моделей в `pipeline-c1.yaml` и 0 в рендере. Счёт идёт по ЗНАЧЕНИЯМ разобранного YAML, а не по тексту: текстовый счёт считал бы комментарии, а у рендера их нет — он выглядел бы чистым в тот момент, когда комментарии отпали. 3. **Книга, которую пайплайн переводит бесплатно, не может быть продана.** `ingest.Manifest.priced()` отказывает при `step_max_usd <= 0`, а на $0-паре он именно ноль ⇒ `409 not_priced` и старта нет. Дымовой стенд поэтому даёт локальной модели НОМИНАЛЬНУЮ цену — одной строкой в своём `models-smoke.yaml`, — и это объявлено в отчёте, а не спрятано.