Ночь ведёт код: четыре шага, модель без ручки, без 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.