Floppy среди систем памяти
Честное сравнение памяти floppy с основными системами памяти для агентов: что у них сильно, что у нас уже есть, что взято у них — и что говорят измерения про лимиты квот и потолок насыщения заметками.
Точка отсчёта: собственный бенчмарк floppy (83 вопроса, 2026-09-09). Внешние данные: веб-исследование от 2026-09-13, источники внизу. Статусы заимствований сверены с кодом 0.24.1 (2026-09-14). Более ранний обзор смежной практики — память субагентов, командный синк, паттерн git-as-brain, с короткой секцией о трёх из систем ниже, — knowledge/LINKS.md; он несёт собственную рукописную таблицу проверки от 2026-09-05.
Вердикт коротко
Поле движется к нам, а не мы к нему. Letta — самая исследовательская из восьми систем — в 2026 перешла на git-версионируемые markdown-файлы («MemFS»); Anthropic задокументировала index-plus-leaves как конвенцию auto-memory. Файлы + git + маленький горячий индекс — это уже мейнстрим-доктрина, а не странность этого проекта.
Уникальное у floppy подтвердилось. Отбора на записи («что достойно заметки»), квотного ratchet и evidence/as_of на заметке нет ни в одной из рассмотренных систем. Отступление Mem0 v3 (отказ от LLM-судьи на пути записи) и «каша из обрывочных фактов» у практиков — прямое подтверждение, что автозапись без отбора не работает.
Разрыв по консолидации закрыт в 0.22.0–0.23.0. В первой версии этого обзора она была единственным классом механизмов, которого у floppy не было совсем; теперь есть все три: слияние при записи (правило agent-memory, 0.22.0), обряд consolidate и heat-лог открытий заметок (0.23.0). Первый прогон consolidate отработал 2026-09-13: −4,1k символов без поднятия квоты.
Потолок насыщения реален и измерен (context rot, memory saturation) — но для маршрутизации по именам он проявляется как ёмкость индекса, а не корпуса. Дефицитный ресурс — символы, загружаемые каждую сессию, а не символы на диске.
Наш собственный бенчмарк говорит: узкое место — захват, не хранение и не поиск. Все 12 проваленных вопросов не были записаны вовсе; ни один не был записан и потерян. Работа над квотами и индексами не сдвинет 43% — сдвинет привычка записывать в момент события.
Точка отсчёта: что мы знаем про свою память
Floppy — файловая память: markdown-заметки «один факт — один файл» с фронтматтером (type, evidence, as_of), трёхуровневое дерево индексов (роутер → половина → под-индекс), скоупы «где факт истинен» (проект / workplace / машина / common), квотный файл quota.lock с ratchet-правилом и обряды start / workstatus / wrap, где отбор фактов делает агент с человеком в петле. Хранение — git, чтение — навигация по именам без эмбеддингов. В 0.23.0 добавились два механизма, отсутствие которых нашла первая версия этого обзора: heat — машинный лог реально открытых заметок (строки дата слог в .floppy/heat.log, поверх него lint называет ни разу не открытые) — и обряд consolidate — проход по одной половине корпуса, который по собранным уликам (as_of, холодный список heat, пересечение wikilinks) предлагает слияния, переписывания и удаления; каждое изменение утверждает человек, пустой проход — валидный исход.
9 сентября 2026 мы прогнали единственный в этом сравнении собственный бенчмарк: 83 вопроса из 19 реальных сессий, голды из транскриптов, две руки (клон без памяти и клон с памятью), слепой судья.
В среднем память не добавляет ничего (+3,6 п.п., p=0,61) — но на четверти вопросов, где репозиторий молчит, она единственный источник: 10% → 43% (p=0,016). Внутри памяти работу делает статус-файл: NOW.md процитирован 17 раз, шесть заметок — по одному разу, четырнадцать — ни разу. Все 12 провалов — факты, которые никто не записал; ноль — «записано и не найдено». (Один прогон, sonnet отвечает и судит — нижняя оценка, не точное число. Заметки: floppy-memory-lifts-only-where-the-repo-is-silent, the-status-file-carries-the-memory-not-the-notes, the-ceiling-is-capture-not-retrieval в половине memory/ этого репозитория.)
Квоты на 2026-09-14: chars_max=75000 (поднимался трижды за неделю 09-05..09-09, каждый раз по правилу «корпус + 10%, в одном коммите с заметками»; при последнем поднятии честный пруинг ничего лишнего не нашёл), pointers_max=25 — при достижении индекс был разрезан на три половины, а не поднят. С тех пор у ratchet есть третий ответ между поднятием и пруингом: первый прогон consolidate по product/ (2026-09-13) дал одно слияние, одно удаление с названной заменой, две переписки на месте и одно отклонённое слияние, записанное с причиной; корпус ушёл 71649 → 67545 из 75000, и ни одно число quota.lock не двинулось.
Поле: восемь систем
Letta (экс-MemGPT) — рантайм агента, ярусная память
Три яруса: core memory — маленькие блоки, пришитые к контексту, которые агент редактирует сам; recall — вся история в Postgres; archival — pgvector, читается tool-call’ами. Sleep-time-агенты переписывают блоки в фоне (~5× меньше compute на инференсе — вендорская цифра). Затем разворот начала 2026: V1 архивирован, новый Letta Code хранит память как git-версионируемый markdown («MemFS»).
Сильное: лучшая прозрачность из восьми — контекст виден и редактируем целиком; их же бенчмарк-разоблачение — агент с обычными файлами даёт 74% на LoCoMo, выше векторных систем; фоновая консолидация как рабочий отгруженный механизм.
Слабое: качество памяти — заложник надёжности tool-calling; в archival нет дедупликации и консолидации (их issue #3116 признаёт накопление дублей); смена платформы V1 → Letta Code — реальный риск для интеграций.
Есть у нас: ярусность (MEMORY.md — core, заметки — archival), правка на месте, git-markdown — они пришли к нашему формату, не наоборот.
Взято, в 0.23.0: идея sleep-time стала обрядом consolidate — консолидация вынесена из конца рабочей сессии в отдельный проход. Отличие от Letta сознательное: не фоновый агент, а сессия по 96%-предупреждению квоты, и каждое изменение утверждает человек.
Mem0 — экстракция фактов, векторы
LLM извлекает короткие факты из диалога; в статье 2025 года есть фаза сравнения (ADD/UPDATE/DELETE/NOOP против существующих воспоминаний). OSS v3 (2026) от неё отказался: только ADD с MD5-дедупом точных дублей, конфликты отданы ранжированию при поиске. Граф, консолидация («Dream»), decay и expiration — только в платной платформе ($249/мес).
Сильное: простейшая интеграция (add/search) и крупнейшее распространение (~65k звёзд, эксклюзивная память AWS Agent SDK); дёшево на чтении — ~90% экономии токенов против полного контекста.
Слабое: самые оспоренные бенчмарки поля — их «SOTA» на LoCoMo разобрана Zep и Letta, а полный контекст бьёт Mem0 в их же постановке; практики описывают базу фактов как кашу из обрывочных, невалидных предложений с инжекцией неверных фактов в ответы; отказ v3 от UPDATE/DELETE — признание, что LLM-судья на записи не пережил продакшена.
Есть у нас: ровно то, чего нет у них — отбор до записи. Наша заметка про их бенчмарки (меряют recall, не selection) остаётся верной.
Не брать: автоматическую запись без отбора — главный урок этой системы отрицательный.
Zep / Graphiti — темпоральный граф знаний
Эпизоды → сущности и рёбра-факты с valid_at/invalid_at: противоречащий факт инвалидирует старое ребро, не удаляя его, — граф отвечает «что считалось истинным и когда». Чтение без LLM-вызовов, суб-секундное; запись — несколько LLM-вызовов на эпизод. Консолидация — community-узлы (кластеры сущностей). Self-hosted Zep свернули в 2025; остались Zep Cloud и Graphiti (Apache-2.0, ~31k звёзд) плюс свой Neo4j/FalkorDB.
Сильное: единственный механический ответ на смену фактов — supersession с историей, а не суждение LLM; быстрое детерминированное чтение.
Слабое: граф растёт монотонно, забывания нет, а загрузка «at scale becomes very expensive» (их же issue); не файлы — Cypher-запросы вместо git diff, руками не поправить; тоже комбатант бенчмарк-войн (84% → 58% → 75% на одном и том же LoCoMo).
Есть у нас: та же идея валидности — as_of + «переписать на месте», а историю убеждений бесплатно хранит git blame.
Взято, в 0.23.0: дисциплина явной инвалидации теперь шаг обряда, не привычка — consolidate предлагает удаление вместе с именем замены (первый прогон именно так удалил заметку про collation; заменой стала graduated-заметка в knowledge/). Механической проверки по-прежнему нет — осознанно: гейт на прозу учил бы вписывать замену не читая.
basic-memory — markdown + локальный поиск
Markdown — источник истины, SQLite — производный индекс, который пересобирает файловый вотчер; wikilinks и строки-observations образуют граф; MCP-сервер для любого клиента. Гибридный поиск: FTS + локальные эмбеддинги (FastEmbed) + опциональный reranker.
Сильное: ближайшая к floppy по духу — git-friendly, человекочитаемо, ноль LLM-затрат на записи; одна память на несколько инструментов (Claude Code, Cursor, Desktop) через MCP; поиск локальный, наружу ничего не уходит.
Слабое: никакой консолидации и никаких потолков — рост не ограничен ничем, курирование целиком на человеке; AGPL-3.0 и pre-1.0 (~v0.23) при маленькой команде; качество графа зависит от того, насколько аккуратно LLM пишет синтаксис, и ничто это не проверяет.
Есть у нас: файлы, wikilinks, фронтматтер, индексы; квоты и lint — то, чего нет у них.
Взять, позже: механику производного индекса с поиском — как опцию для корпуса, переросшего маршрутизацию по именам (наша записанная метка пересмотра: ~150 файлов).
LangMem (LangChain) — SDK, таксономия памяти
SDK, не хранилище: semantic / episodic / procedural память как JSON-документы в LangGraph BaseStore с векторным поиском. Фоновый memory manager по батчам транскриптов — извлекает, сливает похожее, инвалидирует противоречащее; debounce, чтобы серия сообщений дала один проход консолидации.
Сильное: чистая таксономия типов памяти; продуманный паттерн отложенной фоновой консолидации.
Слабое: фактически заморожен — v0.0.30, последний релиз октябрь 2025, внимание команды ушло в LangGraph; JSON в базе — не файлы, не git — и практически привязан к LangGraph.
Взято, в 0.23.0: форма «менеджер по батчу», применённая к корпусу, а не к транскриптам, — consolidate читает одну половину целиком за проход и решает по всем её заметкам разом, а не по одной.
Cognee — граф + векторы, пайплайн
ECL-пайплайн: извлечение сущностей и связей LLM-ом → граф (Neo4j/Kuzu) + векторное хранилище; ~14 режимов чтения от плоского RAG до многошагового обхода графа. Apache-2.0, ~31k звёзд, активная разработка на seed-инвестициях.
Сильное: единственная даёт структурные запросы через документы — связи сущностей, multi-hop.
Слабое: «налог GraphRAG» — каждая запись стоит LLM- и эмбеддинг-вызовов на тяжёлой инфраструктуре из трёх хранилищ; не читаемо человеком, аудит — запрос к графу; пруинг в зачатке.
Не брать: для памяти масштаба «десятки заметок на репозиторий» цена структурности не окупается — полезна как ориентир противоположного конца спектра.
Родное в Claude Code: CLAUDE.md, auto-memory, memory tool
CLAUDE.md (рекомендация Anthropic — до ~200 строк, длиннее — хуже adherence); auto-memory: индекс MEMORY.md, из которого грузятся только первые 200 строк / 25KB (дальше — тихая обрезка), плюс файлы-листья по требованию, и у лимита харнесс сам давит на консолидацию. API memory tool (memory_20250818) — файловые команды против вашего хранилища. Доктрина Anthropic едина: маленькое всегда-загружаемое ядро + just-in-time чтение.
Сильное: index-plus-leaves теперь задокументированная конвенция — floppy стоит на первоисточнике; всё — правимый markdown.
Слабое: нигде нет поиска — recall держится на качестве индекса; auto-memory локальна, между машинами не ходит; тихая обрезка индекса — известная нам ловушка.
Есть у нас: floppy и есть надстройка над этим паттерном, добавляющая то, чего тут нет, — скоупы, квоты с ratchet, evidence, обряды, синк через git.
Редакторные памяти, кратко: Cursor · Windsurf · Copilot
Cursor Memories: sidecar-модель наблюдает за чатами и предлагает воспоминания, человек утверждает; хранится в настройках Cursor — не в git, не переносимо. Windsurf Cascade: короткие авто-карточки в ~/.codeium/…, локально и непортируемо. Copilot instructions: только руками (.github/copilot-instructions.md, AGENTS.md) — полностью git-нативно, но ничего не накапливается само.
Есть у нас: принцип Cursor «память утверждает человек» — это наш wrap с человеком в петле, а с 0.23.0 и consolidate, где каждое слияние ждёт «да»; git-нативность Copilot — наш базовый слой.
Сводная таблица
| Система | Хранилище | Чтение | Рост / консолидация | Git-читаемость | Отбор на записи |
|---|---|---|---|---|---|
| floppy 0.24.x | markdown + git | индекс → имя, без поиска | квоты-ratchet + обряд consolidate (человек утверждает) + слияние при записи + heat-лог | полная | да — единственная |
| Letta | блоки + Postgres/pgvector → MemFS (git-markdown) | tool-calls, векторный | sleep-time переписывание блоков; в archival копятся дубли | не было → становится полной | нет (LLM пишет сам) |
| Mem0 OSS v3 | факты в векторной БД | семантический поиск | только ADD + MD5-дедуп; decay/консолидация платно | нет | нет |
| Zep / Graphiti | темпоральный граф | гибридный, без LLM, быстрый | инвалидация вместо удаления; растёт монотонно | нет | нет |
| basic-memory | markdown + производный SQLite | FTS + локальные векторы | ничего — растёт свободно | полная | нет |
| LangMem | JSON в BaseStore | векторный | фоновый manager: merge/invalidate (проект заморожен) | нет | нет |
| Cognee | граф + векторы + реляционка | 14 режимов, до multi-hop | memify обогащает; пруинг в зачатке | нет | нет |
| Claude Code auto-memory | markdown локально | индекс (200 строк) → файл | давление консолидации у лимита индекса | файлы да, синка нет | частично (модель решает) |
Все вендорские бенчмарки за этой таблицей — маркетинг до воспроизведения: один и тот же Zep на одном LoCoMo — 84% у себя, 58% у Mem0, 75% после исправлений, а агент с плоскими файлами у Letta бьёт обоих.
Потолок насыщения: что измерено в поле
Ощущение, что «есть какой-то потолок насыщенности заметками», — не иллюзия; обе его половины подтверждены независимыми измерениями.
Загруженный контекст вредит задолго до предела окна. Chroma «Context Rot» (2025, 18 моделей): качество деградирует с длиной входа даже на тривиальных задачах; один дистрактор измеримо снижает точность, дистракторы складываются. Сфокусированный промпт ~300 токенов отвечает лучше, чем полная история ~113k токенов, на тех же вопросах LongMemEval. (Сам LongMemEval, ICLR 2025: −30% у ассистентов на длинной истории, до −60% на временны́х вопросах.)
Накопленные воспоминания вредят поиску. «Memory saturation» — уже именованный феномен в литературе 2026: семантически похожие записи топят retrieval почти-дубликатами; рост числа подмешиваемых воспоминаний с малых значений до 5–10 снижает качество (разбавление контекста). Эффект показан для векторного поиска; для маршрутизации по именам аналог — длина индекса.
Забывание по возрасту забывает не то. Продолжение MemoryBank (Ebbinghaus-decay) 2026 года: кривая забывания «эффективно ограничивает размер памяти и время поиска, однако ведёт к существенному падению качества задач». Поле сошлось на инвалидации по противоречию, не по дате — что дословно наш принцип «old и wrong — разные вещи» и reporters-not-gates. (Инвалидацию шиппят: Zep — би-темпоральные рёбра; Mem0 — DELETE-операция, в платной платформе.)
Оптимальный размер индекса не опубликован нигде. Известные точки: лимиты по фиату (200 строк / 25KB у Anthropic), переключение Claude Projects «мало — грузим всё, много — RAG» и деградация задолго до окна у Chroma. Наши 25 указателей ≈ 4000 символов на индекс — одна из немногих измеренных точек в этом вопросе вообще. Ответ поля на насыщение всюду один: не больший индекс, а меньший горячий ярус плюс чтение по требованию.
Как жить с квотами — и как обойти потолок архитектурно
Диагноз сначала. Квоты у нас срабатывают не от мусора: корпус растёт живыми заметками, а ratchet-арифметика «корпус + 10%» гарантирует, что каждый всплеск роста упрётся в потолок. Это работа механизма, а не его отказ. Болело «между поднятием и пруингом нет третьего ответа»; с 0.23.0 он есть, и первый же прогон consolidate показал, что корпус, где «пруинг ничего не находит», всё же отдаёт 4,1k символов слияниями и переписываниями — удалять было нечего, а сжимать было что.
Ключевое различение, которое поле подтверждает: дорогие символы — те, что грузятся каждую сессию (MEMORY.md, индексы: pointers_max). Символы корпуса на диске почти бесплатны при чтении по именам — наш же бенчмарк показал, что retrieval при 49 файлах не является узким местом. Разным лимитам — разная строгость.
Сейчас: держать жёстко горячий ярус, спокойно поднимать корпусный. Пока консолидация честно отвечает «сжимать нечего», поднятие chars_max по правилу — штатный путь, не поражение. Первая версия обзора предлагала смягчить шаг до «корпус + 20%» — не взято: смягчение шага сделало бы поднятия реже ценой ослабления ratchet, а consolidate делает их реже, возвращая место (первый прогон — 5,7% корпуса) и оставляя каждое поднятие защищаемым актом. Индексные лимиты (pointers_max, тонкий MEMORY.md) — не трогать: они защищают то, что действительно измеримо дорого.
Сейчас: инвестировать в NOW.md, а не в число заметок. Измерено: статус-файл процитирован 17 раз против шести заметок по разу. Писать его по ходу сессии (открытый пункт про запись статуса до wrap) даёт больше, чем любая работа над квотами.
Внедрено в 0.22.0 — слияние при записи (A-Mem «эволюция памяти»). Правило «новая заметка тянет ревизию соседей по wikilinks» — теперь вторая половина проверки one-fact-per-file в agent-memory: перед сохранением открыть заметки, на которые новая ссылается, и влить/переписать, а не поставить рядом. Дёшево ровно потому, что делается в момент, когда контекст ещё держит всю картину.
Внедрено в 0.23.0 — обряд консолидации. Вышел как consolidate: по 96%-предупреждению квоты читает одну половину целиком (логируя чтения через heat), собирает улики по каждой заметке и предлагает нумерованный список слияний, переписываний и удалений — proposer, никогда не gate: каждое изменение ждёт «да» человека (принцип Cursor), а пустой проход — валидный исход, на который может сослаться следующее поднятие квоты. Первый прогон по product/ (2026-09-13): 1 слияние, 1 удаление с названной заменой, 2 переписки, 1 отклонённое слияние записано; корпус 71649 → 67545.
Внедрено в 0.23.0 — учёт чтений (heat). Вышел как verb heat: start велит сессии логировать каждую реально открытую заметку, а lint получил секцию «note heat», называющую ни разу не открытые, — reporter, не gate: лог — самоотчётный нижний порог (бенчмарк 09-09 измерил недоучёт), а холодная-но-верная заметка заслуживает места самим существованием. Лог машинно-локальный, вне квот, ignore-строка в .git/info/exclude — первая версия правила писала в .gitignore и была отловлена ревью в тот же день: дерево становилось навсегда грязным на пути, который guard отказывается коммитить.
Позже: порог смены режима чтения. Как Claude Projects: до порога — грузить индекс, после — искать. Наша записанная метка пересмотра — ~150 файлов; тогда добавить производный локальный индекс с поиском (механика basic-memory; для начала хватит FTS без эмбеддингов). Строить раньше — нет оснований: retrieval сейчас не узкое место, и это измерено.
Не делать. Автозапись без отбора (урок Mem0: каша из фактов); забывание по возрасту (урок MemoryBank: экономит место ценой качества); четвёртый уровень индекса (наша конвенция: глубже трёх не читают); эмбеддинги ради эмбеддингов при корпусе, который целиком меньше одной LoCoMo-беседы.
Итог
Архитектурно floppy стоит на стороне, к которой поле сдвигается само: файлы, git, тонкий индекс, человек в петле. Его уникальные части — отбор на записи, ratchet, evidence — в 2026 всё ещё ничем не закрыты, а провалы автозаписи их только подтверждают. Класс механизмов, который надо было догонять, — консолидация — догнан в 0.22.0–0.23.0 (слияние при записи, обряд consolidate, heat), и квота уже сработала как задумано: не стеной, а триггером ухода за корпусом. Открытыми остаются два фронта, и оба — не механика консолидации: захват (все 12 провалов бенчмарка — незаписанные факты; это двигает только привычка записывать в момент события) и отложенная метка ~150 файлов, после которой чтение по именам получит производный локальный поиск.
Проверка
| что | как установлено | дата |
|---|---|---|
| собственные числа floppy: бенчмарк, история квот, первый прогон consolidate | половина memory/ этого репозитория, quota.lock, CHANGELOG.md 0.22.0–0.23.0 | 2026-09-13 |
| статусы заимствований («есть у нас», «взято в …») | сверено с кодом, 0.24.1 | 2026-09-14 |
| всё про остальные восемь систем | вторичные источники ниже, независимо не воспроизводились | 2026-09-13 |
Ключевые источники (вендорские цифры — самоотчёты): Chroma «Context Rot» — trychroma.com/research/context-rot · LongMemEval — arxiv.org/abs/2410.10813 · Letta: разворот на MemFS — letta.com/blog/our-next-phase, «Is a Filesystem All You Need?» — letta.com/blog/benchmarking-ai-agent-memory, sleep-time — letta.com/blog/sleep-time-compute · Mem0 — arxiv.org/abs/2504.19413, миграция v2→v3 — docs.mem0.ai/migration/oss-v2-to-v3, разбор Zep — blog.getzep.com («Is Mem0 Really SOTA?») · Zep/Graphiti — arxiv.org/abs/2501.13956, github.com/getzep/graphiti · A-Mem (эволюция заметок) — arxiv.org/abs/2502.12110 · MemoryOS (heat) — arxiv.org/abs/2506.06326 · decay вредит — dl.acm.org/doi/full/10.1145/3803291.3803294 · memory saturation — arxiv.org/html/2603.07670 · Anthropic — code.claude.com/docs/en/memory, anthropic.com/engineering/effective-context-engineering-for-ai-agents · basic-memory — github.com/basicmachines-co/basic-memory · LangMem — langchain-ai.github.io/langmem
Перепроверять эту страницу, когда у системы из обзора выходит мажорная версия, и пересчитывать собственные числа, когда повторяется бенчмарк памяти; статусы «взято» стареют с релизами этого репозитория, а не с движением поля.