Вышел анонс Bun 1.4.0. И это не столько очередной релиз JavaScript-рантайма, сколько, возможно, самый масштабный публичный кейс agentic coding на сегодняшний день.
Bun 1.3.14 стал последней версией на Zig. Bun 1.4.0 — первая версия, основная кодовая база которой переписана на Rust. На момент публикации новая версия пока доступна через canary:
bun upgrade --canaryПричина переезда — не скорость. С ней у Bun и так все было хорошо.
Проблемой была стабильность на границе между JavaScriptCore с его garbage collector и вручную управляемой памятью Zig: use-after-free, double-free, утечки в редких error path и другие ошибки жизненного цикла объектов.
Можно было продолжать ловить их ASAN, фаззингом и code review. Но в Rust значительная часть таких проблем превращается в ошибку компиляции, а
Drop гарантированно освобождает ресурсы при выходе объекта из scope.Но самое интересное здесь — как именно переписывали Bun.
Это не был промпт «Claude, перепиши мне Bun на Rust».
Сначала Джарред Самнер вместе с Claude подготовил
PORTING.md: формальные правила преобразования паттернов Zig в Rust. Затем отдельный workflow проанализировал lifetimes всех полей структур и собрал их в LIFETIMES.tsv.После этого запустили около 50 динамических workflows в Claude Code:
— один агент реализует изменение;
— два независимых агента делают adversarial review и специально ищут, почему код неправильный;
— еще один агент применяет найденные исправления.
На пике одновременно работали 64 Claude в четырех worktree. За 11 дней они обработали 1 448 Zig-файлов, сделали 6 502 коммита, а итоговый diff составил больше миллиона добавленных строк. В пике агенты генерировали около 1 300 строк кода в минуту.
Стоимость до merge:
— 5,9 млрд uncached input tokens;
— 690 млн output tokens;
— 72 млрд cached token reads;
— примерно $165 000 по API-прайсу.
По оценке Джарреда, вручную такая миграция заняла бы примерно год работы трех инженеров, полностью знающих кодовую базу. Поэтому обычной командой они, скорее всего, вообще никогда не стали бы ее делать.
При этом тесты не удаляли и не скипали. На разных платформах прогонялось больше миллиона
expect() и около 60 тысяч тестов.Что получилось в Bun 1.4:
— исправлено 128 воспроизводимых багов из Bun 1.3.14;
— устранены все утечки памяти, которые удалось инструментировать;
— повторный
Bun.build() больше не раздувает процесс до гигабайт: после 2 000 сборок потребление памяти стабилизируется примерно на 609 МБ вместо 6,7 ГБ;— бинарник стал примерно на 20% меньше на Linux и Windows;
— большинство нагрузок ускорилось еще на 2–5%;
— запуск Claude Code на Linux стал быстрее примерно на 10%.
Конечно, это пока не полностью идиоматичный safe Rust. Около 4% Rust-кода находится внутри
unsafe, потому что Bun продолжает работать с JavaScriptCore и большим количеством C/C++-библиотек. Но теперь потенциально опасные места хотя бы явно размечены и постепенно могут рефакториться.И вот здесь, мне кажется, самое важное.
Это уже не история про то, что «ИИ научился писать код». Код он научился писать давно.
Это история про то, что правильно построенный harness позволяет сделать миграцию кодовой базы, которую команда раньше даже не стала бы начинать:
— формализовать правила;
— разложить работу на независимые циклы;
— отделить implementer от reviewer;
— запустить adversarial review;
— зафиксировать поведение огромной тестовой системой;
— исправлять не отдельные ошибки агентов, а сам workflow, который эти ошибки порождает.
Ну вы поняли, да?
Разработчик будущего не переписывает миллион строк руками. Он проектирует систему, которая может безопасно переписать миллион строк и доказать, что результат работает.
https://bun.com/blog/bun-in-rust