Гонка записи: память компании это не папка, а дисциплина
Сцена: 30 августа, две сессии в одном файле
30 августа, 10:08. Одна из наших сессий пишет запись в журнал решений. Около 11:00 пишет ещё одну. В 12:22 файл перезаписан параллельной сессией: другая ветка работы, своя версия журнала. Две записи первой сессии пропали. Пропали и четыре чужие: «Плагин сотрудника АПОД», «Структура контура сотрудника», «Агент РОП», «Обмен с контурами». Зато в перезаписавшей версии оказались десять записей, которых утром в файле не было. Размер файла 220 КБ. Правило «перечитай перед записью» обе стороны выполнили. Оно не помогло.
Восстанавливали объединением: сложили обе версии, ничего не выбросили, получили 24 заголовка. В летописи того дня осталась строка: Перечитывания перед записью недостаточно, когда файл большой и писателей несколько
.
В тот же день паспорт нашего шлюза, через который агенты ходят к инфраструктуре, зафиксировал правило: две сессии не пишут в одно состояние одновременно. Для серверов записали, на памяти команды нарушили в тот же день.
Это была третья потеря за десять дней.
Три потери за десять дней
Первая случилась 20 августа. Вспомогательная сессия перезаписала журнал решений версией без свежей записи. В тот же день две параллельные сессии собрали плагин команды под одним номером версии 0.21.0 с разным содержимым; закрыли переизданием 0.21.2. И в тот же день файл на 182 КБ при попытке сослаться на локальный документ превратился в служебную строку в 48 байт. Отчёт архивариуса за тот день был написан до того, как потерю заметили: Сегодня обошлось (файлы перечитывались перед записью, расхождений не было), но это везение, а не механизм
.
Вторую нашли 27 августа. Запись «Мозг и команда: три решения» физически отсутствовала в журнале. Причина: гонка записи с параллельной сессией 20 августа. Восстановили задним числом, с пометкой.
Третья, 30 августа, описана выше.
Между ними, 24-25 августа, случился эпизод другого рода. Файлы объявили утраченными «и на Диске, и в облаке». Нашлись они в проекте claude.ai, о котором никто в команде не думал как о резервной копии.
Реестр принципов команды после первой потери получил запись 11: Опора на память о прошлом чтении вместо актуального состояния на момент самой записи - это и есть гонка
. Третьей потере оно не помешало, потому что правило говорит «перечитай», а гонка происходит после перечитывания.
Одна опечатка дважды
26 августа мы разносили четыре ночных пакета в память, и часть текста модель переносила руками. В переносе появилось «АПОД ЛАФ» вместо «АПОД ЛАБ» и «в летописи» вместо «в летопись». Обе ошибки воспроизвелись в двух независимых попытках переноса одного и того же файла. Не случайная описка: модель спотыкается на одном месте дважды. Поймала их не пара глаз при вычитке, а побайтовая сверка оригинала и копии.
В тот же день метод переноса развернули. Транскрипт сессии хранит прочитанный файл байт в байт. Оригинал извлекается из транскрипта механически, правка накладывается скриптом, контрольная сумма MD5 на сервере сверяется с локальной копией. Так записали учёт работ, карточку производственного проекта и оба файла расписаний: ноль ручного переноса, совпадение по контрольной сумме с первого раза.
Для владельца перевод такой: если ИИ переписывает регламент из одного места в другое, он может изменить букву в названии компании, и глаз это пропустит, потому что читает смысл, а не байты. Проверять надо сравнением.
Файл, который перестал помещаться в один ход
31 августа первый плановый утренний разнос упёрся в стену: журнал решений вырос до 260 КБ и не проходил перезапись одним вызовом шлюза. Секретарь команды предложил вариант, руководитель ответил коротко: Что ты рекомендуешь, то и сделай
. Журнал разбили на помесячные файлы: июль, две части августа, сентябрь. Сам журнал стал указателем на 1,9 КБ.
Помесячные файлы сделали больше, чем починили запись. Они сузили окно гонки: закрытый месяц не трогает никто, в файле текущего месяца встречается меньше рук. У самого разноса с 31 августа есть один назначенный писатель и слот: секретарь команды, 07:00 по Москве. Две сессии перестают встречаться в одном файле не потому, что им запретили, а потому, что им негде.
6 сентября та же болезнь проявилась у файла фактов: 135 КБ. Генерация полного содержимого как аргумента одного вызова превысила лимит вывода модели, 64 000 токенов, ещё до добавления нового. Делегирование вспомогательной сессии не помогло: лимит действует на любой ход. Находки той ночи положили в отдельный файл-дополнение и оставили до утра.
7 сентября руководитель спросил команду: Что будет с целостностью контекста, если разрезать и факты?
Ответ команды: разбивать факты по месяцам будет ошибкой. Решения устаревают по дате, факты нет, и помесячная нарезка разбросала бы одну тему по нескольким файлам. Разбили на 9 тематических файлов. Проверка объёма до и после дала расхождение в 252 байта, ровно снятый общий заголовок.
Было / Стало / Что изменилось для владельца
| Было | Стало | Что изменилось для владельца |
|---|---|---|
| Один журнал на 260 КБ, пишут несколько сессий | Помесячные файлы и указатель; один писатель и один слот | Решение, принятое утром, не исчезает к обеду |
| Перенос текста руками модели, проверка глазами | Оригинал извлекается механически, правка скриптом, сверка MD5 | Опечатка вроде «ЛАФ» не доживает до документа |
| «Перечитай перед записью» как единственная защита | Перечитывание плюс контрольная сумма после каждой записи | Проверка вместо доверия: совпало или нет, видно по числу |
| Файл фактов растёт до потолка инструмента | 9 тематических файлов, расхождение объёма 252 байта | Память делят до отказа, а не после |
Что взять себе
- Перечитывайте актуальное состояние файла прямо перед записью и помните, что это защищает от старого содержимого, а не от параллельной записи. У нас правило соблюдалось во всех трёх потерях.
- Один писатель на файл памяти и один слот. Все остальные пишут предложения в свою папку, писатель разносит. Мы пришли к этому 31 августа, на следующий день после третьей потери.
- Контрольная сумма после каждой записи. Записали, сняли MD5 на сервере, сравнили с локальной копией. Разрезали файл, сравнили объём до и после.
- Делите файлы до того, как они перестанут помещаться в один ход инструмента. Журнал решений по месяцам, факты по темам: то, что устаревает по дате, режется по дате, то, что не устаревает, по смыслу.
- Не давайте модели переносить текст руками. Оригинал извлекать механически, правку накладывать скриптом. Опечатка «ЛАФ» воспроизвелась дважды, глазом её не поймали.
Карта ролей
Вопросы и ответы
Почему правила «перечитай перед записью» недостаточно?
Оно защищает от старого содержимого в голове пишущего, а гонка происходит после перечитывания: между чтением и записью в файл успевает записать другая сессия. У нас 30 августа обе стороны перечитали файл, и всё равно пропали шесть записей.
Как понять, что файл памяти пора делить?
Когда он перестаёт проходить одну операцию инструмента: у нас журнал решений в 260 КБ не прошёл перезапись одним вызовом, файл фактов в 135 КБ не уместился в лимит вывода модели. Делить лучше раньше: решения по месяцам, факты по темам, с проверкой объёма до и после.
Можно ли доверить ИИ перенос текста между файлами?
Ручной перенос, когда модель переписывает абзац по памяти, дал у нас «АПОД ЛАФ» вместо «АПОД ЛАБ» дважды подряд. Механический перенос, скриптом из сохранённого байт в байт оригинала, с контрольной суммой после записи, сошёлся с первого раза.
Следующий шаг
Хотите увидеть, сколько рук пишут в память вашей компании одновременно: Разобрать процесс с АПОД.