Octofs 0.16: передовая файловая система для Claude Code и Codex

Прочитать файл в 400 строк — дело микросекунд. Решить прочитать его ещё раз — это ход модели, а ход модели занимает секунды. В этой асимметрии вся история скорости агентов: диск никогда не бывает узким местом. Узкое место — сколько раз модели приходится останавливаться, смотреть и переспрашивать, прежде чем она сможет действовать.

Последние четыре недели octofs был единственной файловой системой и единственным shell под Claude Code и Codex. Мы отключили встроенные инструменты для файлов и shell и исправляли всё, что мешало. Восемь релизов спустя, с 0.15.0 по 0.16.0, мы намерили вот что: те же задачи завершаются в 2–2,5 раза быстрее примерно при том же числе токенов. Та же модель, примерно те же токены, меньше времени.

Быстрее, чем инструменты, которые поставляются с клиентами, и без лишних затрат токенов. Именно такую планку мы поставили, чтобы называть файловую систему передовой, и 0.16 её берёт. Этот пост — заметки о тех восьми релизах плюс точная конфигурация, чтобы проверить всё самим.


Куда уходит время

Octofs не заставляет модель думать быстрее. Он убирает ходы, в которых модель лишь заново выясняла то, что уже знала. Каждый из этих пунктов заложен в контракт инструментов, который видит модель:

  • Правки возвращают то, что изменилось, со свежими идентификаторами. У каждой строки, которую показывает octofs, есть идентификатор: номер строки плюс короткий хеш её содержимого, в виде N:hh|content. batch_edit и text_editor отвечают диффом, строки которого несут новые идентификаторы, так что следующая правка целится прямо в них, без повторного чтения между правками. 0.15.0 добавил в конец строку shift:, которая сообщает, как сдвинулись номера строк ниже каждой правки, — так что идентификаторы, оставшиеся у модели от более раннего чтения, тоже остаются рабочими.
  • Повторное чтение возвращает только разницу. Начиная с 0.15.0 просмотр целого файла, который сессия уже видела, возвращает только изменившиеся фрагменты или однострочную пометку «без изменений». Собственные правки octofs поддерживают этот кеш в актуальном состоянии, поэтому перепроверка своей правки стоит одну строку.
  • Неверная цель падает вместе с ответом. Устаревший идентификатор строки не просто даёт ошибку. Ошибка несёт текущее содержимое и то, куда переехала цель, так что повторная попытка обходится без нового чтения. Так было ещё с 0.9.0.
  • Долгие команды не удерживают ход. Команда, которая всё ещё выполняется на десятой секунде, становится фоновой задачей. Это тот же процесс, не убитый и не перезапущенный, а модель получает свой ход обратно. Это пришло в 0.13 и 0.14.
  • Один ответ — много вызовов. Инструкции сервера прямо говорят модели, что каждый ответ стоит полного круга, поэтому все независимые вызовы нужно запрашивать сразу. 0.16.0 заострил эту формулировку.

Мы не раскладывали 2–2,5x по механизмам, так что читайте этот список как описание устройства, а не как разбивку ускорения по механизмам. Ни одна из этих идей не новая в этом релизе. Четыре недели под реальными клиентами добавили шлифовку, которая удерживает модель на быстром пути и не даёт ей с него сорваться.


Что изменилось в 0.15 и 0.16

Claude Code снова видит инструменты

Об этом исправлении стоит знать, если вы пробовали octofs в свежем Claude Code и ничего не получили. Ревизия MCP от 2026-07-28 делает подсказки кеширования (ttlMs и cacheScope) обязательными в результатах list и read. Строгий клиент Claude Code для этой ревизии отклонял результаты без них, поэтому не загружал ни одного инструмента octofs. 0.16.0 отдаёт эти подсказки всякий раз, когда клиент говорит на ревизии 2026-07-28, и не трогает более старые подключения.

Фоновые задачи можно читать через view

Фоновая задача доступна как ссылка octofs://jobs/<id>. Модели первым делом тянутся к view для этой ссылки, а свой универсальный читатель ресурсов Claude Code держит за поиском инструментов (tool search), что стоит лишнего круга. Поэтому view для ссылки на задачу возвращает статус задачи и хвост её вывода. Начиная с 0.16.0 он возвращается сразу, а не ждёт завершения задачи. Это единственное изменение в этом цикле, ломающее обратную совместимость, и вот его причина: модель может проверить сборку посреди выполнения и продолжать работать.

Кроме того, Claude Code не показывает модели стандартное уведомление resources/updated, так что завершение задачи не будит сессию. Модель забирает результат, просматривая ссылку, когда он ей нужен, — поэтому это чтение никогда не должно блокироваться.

Ещё одна страховка в 0.16.0: когда команда, прячущая изменения (git stash), уходит в фон, ответ предупреждает модель, что в рабочем дереве этих изменений нет, пока команда не завершится, — чтобы модель тем временем не правила файлы и не объявляла задачу выполненной.

Правки, после которых файлы остаются ровно такими, какими были

  • Окончания строк сохраняются. Файлы с CRLF остаются с CRLF после замен и вставок (0.15.5).
  • Пустые строки в конце файла сохраняются, а пустая вставка означает пустую строку, а не «ничего» (0.16.0).
  • Неоднозначные операции отклоняются, а не угадываются. Вставка внутри диапазона, который тот же пакет заменяет или удаляет, теперь падает с объяснением (0.15.0, 0.15.2).
  • Длинные диффы остаются читаемыми. В результате правки середина длинной точной замены или длинного добавленного блока сворачивается в диапазон идентификаторов (0.16.0).

Shell, который держит модель на специализированных инструментах

Octofs отклоняет shell-команды, дублирующие специализированный инструмент, вроде cat, grep или ls, потому что специализированные инструменты возвращают идентификаторы строк, а сырой вывод shell — нет. В этом цикле фильтр стал точным:

  • Заблокированные чтения ловятся, где бы они ни начинали команду: отдельно, в цепочке через && или ;, внутри $(…) или в голове конвейера (0.16.0). Более поздняя стадия конвейера вроде cargo test 2>&1 | tail -20 по-прежнему разрешена.
  • sed и awk в режиме только для чтения разрешены (0.15.6). Потоковый вывод текста в stdout не покрывает ни один специализированный инструмент. Правка на месте через sed -i по-прежнему отклоняется с указанием на инструменты правки.
  • Перенаправления разбираются (0.16.0). Octofs отклоняет запись содержимого файлов в проект через echo, printf или cat, потому что кавычки и экранирование портят содержимое. Перенаправление вывода программы, например cargo test > out.log, разрешено.
  • Каждый отказ называет заблокированную программу и сообщает, что ничего не выполнилось, так что модель разбивает составную команду, а не повторяет её целиком (0.15.6).

Удалённые хосты и протокол

  • ssh://host и ssh://host/~/dir разрешаются относительно домашнего каталога пользователя, под которым выполнен вход, как это делает ssh host (0.15.0).
  • Исправлен поиск по содержимому в удалённых деревьях, а листинг удалённого каталога без параметров по умолчанию идёт на один уровень вглубь, потому что каждый подкаталог стоит круга SFTP (0.15.1). Слой SFTP переехал на russh-sftp 3.0 (0.16.0).
  • Публикуемые схемы инструментов больше не несут мусора от генератора вроде $schema, тегов format у целых чисел и default: null (0.16.0). Определения инструментов отправляются с каждым запросом, поэтому в них должно быть только то, на основании чего модель действует.

Меняем инструменты: Claude Code

1. Установите octofs (Homebrew, Cargo или npm):

brew install muvon/tap/octofs
# or: cargo install octofs
# or: npm install -g @muvon/octofs

2. Зарегистрируйте его для всех проектов:

claude mcp add --scope user octofs -- octofs mcp

Claude Code запускает сервер в каталоге, из которого вы запустили claude, и этот каталог становится корнем проекта для octofs.

3. Отключите встроенные редакторы в ~/.claude/settings.json:

{
	"permissions": {
		"allow": ["mcp__octofs"],
		"deny": ["Edit", "Write", "NotebookEdit"]
	}
}

Именно на этой настройке получены наши цифры. Имя инструмента без уточнений в deny полностью убирает инструмент из контекста модели, а mcp__octofs разрешает все инструменты octofs без запроса подтверждения. Bash и Read остаются: в наших прогонах модель всё равно отправляла чтения, правки и команды через octofs, а Read — это то, чем Claude Code смотрит изображения и PDF. Если запретить ещё и Bash, эффект будет обратным: это вернёт в набор инструментов модели отдельные Glob и Grep из Claude Code.

Меняем инструменты: Codex

1. Добавьте octofs и отключите встроенный shell в ~/.codex/config.toml:

[features]
shell_tool = false
unified_exec = false

[mcp_servers.octofs]
command = "octofs"
args = ["mcp"]
default_tools_approval_mode = "approve"

Вставьте блок как есть и не запускайте вдобавок codex mcp add octofs: эта команда пишет ту же таблицу [mcp_servers.octofs], а Codex отказывается стартовать, если таблица определена дважды. shell_tool и unified_exec — два исполнителя команд в Codex. Когда оба выключены, каждая команда идёт через shell из octofs, включая перевод в фон, а default_tools_approval_mode позволяет инструментам octofs работать без запроса подтверждения.

2. Направьте правки в octofs. В Codex нет переключателя, который отключил бы встроенный редактор apply_patch (openai/codex#8161 закрыли как «не планируется»), поэтому скажите об этом модели в AGENTS.md:

## Tools

- Use octofs for all file and shell work: `view` to read, list and search; `batch_edit` or `text_editor` to edit; `shell` for builds, tests and git. Never use apply_patch.
- Put every call that doesn't depend on another call's result in one response.
- A command still running after ~10s becomes a background job. Don't wait for it: take the next step, and `view` its `octofs://jobs/<id>` link when you need the result.

Тот же блок работает и в CLAUDE.md, хотя в наших прогонах Claude Code выбирал octofs и без него.


Попробуйте

Самый быстрый способ проверить нашу цифру — повторить то, что вы уже делали. Возьмите недавнюю задачу, например исправление бага или рефакторинг, который затрагивает несколько файлов. Выполните её один раз со встроенными инструментами и один раз с octofs, с той же моделью и тем же промптом, и сравните затраченное время и токены. Токены, скорее всего, останутся примерно теми же. Разница видна во времени.

Уже на octofs? Обновитесь через brew upgrade muvon/tap/octofs, cargo install octofs или npm install -g @muvon/octofs либо возьмите готовый бинарник для Linux, macOS или Windows (x86_64 и ARM64) на странице релизов. Одна заметка о поведении: view для ссылки на фоновую задачу больше не блокируется до завершения задачи. Если что-то из того, что вы построили, на это полагалось, прочитайте ссылку ещё раз, когда задача завершится.


Octofs — открытый исходный код (Apache 2.0), github.com/Muvon/octofs. Знакомство с Octofs рассказывало, зачем мы написали собственный сервер файловой системы, 0.9.0 — почему нельзя доверять номеру строки, а 0.14 — почему нельзя доверять и заблокированному вызову инструмента. Этот пост — результат всех трёх: агент, который перестаёт перепроверять то, что уже знает, делает ту же работу в два — два с половиной раза быстрее.