# Ночь ведёт код: четыре шага, модель без ручки, без Python

Ночная память (Rollup) была одним ходом чат-модели с инструментами: скилл на 143 строки
плюс четыре файла фаз, `read_file`/`write_file`/`write_card`/`memory_search`, запуск
семи Python-скриптов автографа из хода, отметки прогресса в файле дня, которые ставит
модель. Модель сама решала, сколько шагов сделать, и каждый шаг пересылал ей всю ночь
заново. Жалобы пользователей за месяц росли из этого: 37 шагов и 2,44 млн входных
токенов за два дня при 11,6 тыс. выходных (#247); ход, живущий на сервере после выхода
раннера, 41 шаг и 2,84 млн, и новая попытка на каждом старте (#249); CORE с пустыми
разделами через `write_file` (#201, #220); `vault/vault` из построенного моделью пути
(#199, #242); таймаут хода, вешающий чат владельца (#216, #218); битые ссылки хабов от
пересборки индексов (#230). Из 42 починок ночи за месяц 16 — сторожа от того, что модель
сделала с ручкой в руках. У ASB с автографом та же схема работает, потому что там одна
модель с родными инструментами, короткий промпт, один пользователь и глушение ошибок; у
Ивы любая модель через eve, свои инструменты, пять семейств провайдеров и ночь без
присмотра.

**Решение (26–27.09.2026, слово владельца).** Круг ведёт код. Step — один из четырёх этапов:
день → карточки → связи → CORE. Вход собирает код; на этапе может быть несколько вызовов для
частей дня, пачек карточек по восемь и готовых периодов. Каждый вызов — один запрос и один структурный
ответ; общее число и входные токены ограничены Ceiling. Ответ A сам называет `refs`; дополнительного поиска
или открытого цикла нет. Файлы пишет только код. Он проверяет схему, цитаты, CAS и существование обоих файлов
связи; MOC ночью не ведётся. Замещённые строки уходят в датированный архив Card. Правка человека побеждает ночную при стабильном файле от последней сверки хеша до атомарного переименования; условие стабильности в остаточном окне задано явной предпосылкой `NightWriter.HumanPublishStable`.
Готовность дня живёт в выжимке и кэше `data/`; совместимая отметка в сыром дне остаётся на один релиз для отката.
Предел ночи считает код до каждого запроса. Модель ночи та же, что в чате, без тихой
подмены; значения предела утверждаются после замера на реальных днях. Чат днём получает
те же базовые действия и тот же писатель: переписать CORE или день целиком нельзя.
Понимание дня остаётся у модели целиком: код не разбирает человеческих слов.

Память — только TypeScript. Все 19 Python-скриптов автографа уходят из Ивы: Python уходит из памяти; Telegram-юзербот остаётся на Python. Их проверки делает писатель при записи, а оценку здоровья графа и «свежесть»
никто не читал. Месяц становится календарным. «Забудь это» — отдельная операция по
явной команде: перечень следов, «да» владельца, удаление везде, включая историю git.

**Отвергнуто.** Открытый цикл инструментов у модели с потолком шагов (как в ASB):
дороже, потому что каждый шаг пересылает переписку, и ведёт себя по-разному у разных
моделей — все жалобы пришли именно из открытого цикла. Переписать семь используемых
скриптов на TypeScript: писатель делает те же проверки в момент записи, отдельный уход
не нужен (максимальное упрощение, слово владельца). Отдельная дешёвая модель ночи:
тихая подмена (philosophy §5). Переделка дневного контекста в той же волне: другая
подсистема, отдельный замер; пока — напоминание «нажмите /new» при заполненном окне. (05.10.2026: напоминание снято, вместо него
свёртка между ходами — ADR-0021.)

**Порядок.** Этапы 1–3 строятся одной серией: новый писатель, кэш и CAS, периоды, дневные инструменты,
выключатель, удаление старой ночи и Python. Этап 4 — бета для всех. Этап 5 — «забудь это».

**Точки удаления.** Старая ночь, `memory-processor`, свободная правка vault через `write_file`, старые отметки,
`scripts/autograph/` (Python памяти) удаляются в том же релизе; Python и `uv` остаются только у Telegram-юзербота. Остаётся только совместимая отметка готового дня на один
релиз, чтобы откат не переразбирал уже готовые дни.

**Прогресс большого дня (20.10.2026, #309).** После каждой части A код атомарно сохраняет
ответ и отпечаток входа в `pass.progress` кэша дня. Следующая попытка начинает с первой
несохранённой части, получая выжимки уже разобранных. `pass.a` появляется после всех
частей; Card и выжимка публикуются прежним писателем. Временный сетевой сбой,
включая HTTP 408/5xx, сохраняет попытки дня. Паузы перед продолжением растут:
5 секунд, 30 секунд, затем по 2 минуты в пределах Ceiling и срока ночи. После срока
продолжит следующая ночь. Обрез пределом сохраняет попытки дня, старые записи `cut`
читаются для отката и пропускаются при подсчёте. Три настоящих отказа дня исчерпывают
`MAX_FAILED_ATTEMPTS`; успех стирает попытки. Отказ ключа или квоты сохраняет остановку до следующего запуска.
Изменённый во время разбора вход сохраняет прогресс и ждёт восстановления входа;
соседние дни и остальные шаги ночи продолжаются. Читатель 0.5.5 принимает и сохраняет дополнительное
поле, а незавершённый A при откате разбирает целиком. Модель — `specs/NightProgress.tla`;
публикацию выжимки и её хеши по-прежнему описывает `specs/NightWriter.tla`.
