RUGitHubInstall

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

View original Markdown ↗