Технологии
Авторы funes объяснили, почему память coding agents живёт в одном Lance dataset
Локальная память для coding agents хранит исходные passages, векторные эмбеддинги и BM25-индекс в одном Lance-датасете: один артефакт вместо трёх хранилищ, дешёвая переиндексация и fail-closed проверка секретов при публикации.

Один датасет вместо трёх систем
funes индексирует traces Claude Code, Codex, pi и Hermes в один локальный Lance-датасет и отдаёт агенту инструменты `recall` и `get`. Каждый завершённый ход добавляет несколько chunks, а каждый passage сохраняет исходный текст, точное происхождение и векторный эмбеддинг. Идея проекта с самого начала формулировалась как «память — это датасет, а не сервис»: локальная память лежит в Lance-датасете, а общая — в Hugging Face dataset, который принадлежит пользователю и по умолчанию приватный.
Почему Lance
Внутри один каталог `chunks.lance` из трёх частей: `data` с текстом, происхождением и векторами, `_indices` с BM25- и векторными индексами и `_versions` с закоммиченными версиями датасета. Такой расклад заменяет три системы — document store, vector store и отдельный поисковый движок, — которые иначе пришлось бы держать синхронными: авторы формулируют это как «один артефакт вместо трёх».
Практические следствия перечислены прямо: новые chunks дописываются без перезаписи датасета, каждый коммит создаёт версию, к которой можно откатиться, оба индекса остаются рядом с данными. Lance поддерживает быстрый случайный доступ для реранка и работает in-process с локальным диском или объектным хранилищем, поэтому funes остаётся библиотекой, а не ещё одним сервисом, который нужно разворачивать и поддерживать.
Гибридный поиск и установка
На запросе funes выполняет vector search для семантики и BM25 для точных имён, флагов, ошибок и идентификаторов, затем реранжирует лучших кандидатов и применяет весовой коэффициент свежести, чтобы новые решения весили больше. `recall` возвращает ранжированные passages из реальных сессий с указанием происхождения и команду `get` для открытия окружающих ходов. Инструмент `ask` сначала извлекает passages локально и только потом просит выбранного агента ответить по ним, поэтому для проверки доказательств авторы советуют всё же `recall`.
Установка идёт одним бинарём, а подключение к агенту — командой вида `funes add codex` (доступны также `claude`, `pi` и `hermes`): она строит первый индекс, регистрирует инструменты и ставит hooks, чтобы новые ходы индексировались автоматически. Дальше агент вызывает `recall` сам, когда старый контекст начинает иметь значение, а память можно запросить и вручную — например, `funes recall "why did we switch off the streaming parser"`.
Общая память остаётся датасетом
Общая память строится из того же датасета: он публикуется как Hugging Face dataset, который принадлежит пользователю и по умолчанию приватный. При чтении удалённой памяти funes кэширует файлы датасета локально, поэтому повторные обращения работают быстро и без постоянной сети, а публикация получает карточку датасета и тег funes. Ещё один аргумент за Lance в том, что его append-only датасеты дают дешёвые инкрементальные записи, а Hub — кэширование и дедупликацию контента.
Переиндексация без повторного эмбеддинга
Завершённые ходы дают детерминированные chunk ID, поэтому переиндексация дешева: funes не делает эмбеддинги заново для уже записанных chunks. Память описывается как пересобираемый артефакт, а исходные transcripts остаются источником истины. LLM в пути индексации нет: разбор transcripts, чанкинг блоков, локальный эмбеддинг и запись в Lance-датасет идут детерминированно, а модель эмбеддингов закреплена и записана в датасете — funes отказывается запрашивать память, построенную несовместимой моделью.
Секреты на пути к публикации
Agent traces содержат локальные пути, stack traces, нерелизнутые планы, отладку по конкретным клиентам и иногда вставленные credentials. Поэтому публикация защищена отдельным контуром: при наличии TruffleHog индексация редактирует найденные секреты ещё до записи, а на `funes push` всегда работает fail-closed проверка тех строк, которые покидают машину, — если блок всё ещё содержит секрет, funes его не отправляет.
Что это меняет
Mantis рассказывал о запуске funes 4 сентября; новая публикация объясняет инженерную сторону проекта — почему авторы выбрали Lance и как разделили детерминированную индексацию и публикацию. Практический интерес здесь не в самой модели памяти, а в размере операционной поверхности: один датасет-артефакт можно скопировать, версионировать и откатить теми же средствами, что и остальные данные, а переиндексация не превращается в пересчёт всех эмбеддингов. Ограничение тоже названо прямо: funes не переписывает историю в базу знаний, а служит слоем локального recall для уже проделанной работы, тогда как архитектурные контракты и документация должны оставаться в устойчивых документах.