Ник Бастин, разработчик с опытом работы над PouchDB и fake-indexeddb, решил проверить, насколько далеко можно зайти с ИИ-агентом при наличии чёткой спецификации и готового набора тестов. Объектом эксперимента стал IndexedDB — браузерный API для хранения структурированных данных на стороне клиента. Это не тривиальный CRUD: API включает транзакции с режимами долговечности, курсоры, несколько типов ключей (в том числе ключи-массивы), планировщик микрозадач в стиле JavaScript и обработку специфичных объектов вроде Date и ArrayBuffer.

В качестве инструмента Бастин выбрал Claude Code с техникой Ralph loop. Суть подхода проста до абсурда: агент запускается в Bash-цикле, получает Markdown-файл с инструкциями и текстовый файл для отслеживания прогресса, после чего каждую новую итерацию начинает с чистого контекста. Логика за этим стоит конкретная — чем длиннее сессия с LLM, тем сильнее деградирует качество ответов. Перезапуск с чистого листа компенсирует этот эффект. Реализация, которую использовал автор, — 24 строки Bash от разработчика Мэтта Покока, запущенные в контейнере Podman с флагом --dangerously-skip-permissions.

РеализацияВерсияПройдено%
Chrome144.0.7514.0165199,9%
Firefox146.0a1149890,6%
Safari231 preview149790,6%
Ladybird1.0-cde3941d9f142686,3%
fake-indexeddb6.2.5136982,8%
One-shot127977,4%

Промпт содержал опечатки: например, автор написал typeof вместо instanceof. Агент разобрался с намерением самостоятельно. Технические условия задачи были жёсткими: TypeScript, Node.js v24, единственная зависимость — better-sqlite3, запуск WPT-тестов без модификации через shim-прослойки, изоляция тестов через подпроцессы, а не через vm (чтобы избежать cross-realm-проблем с проверками типов). Реализация должна была оставаться независимой от среды выполнения — с прицелом на возможный запуск в браузере поверх SQLite-on-WASM.

Реализация написана на TypeScript для Node.js, единственная зависимость — библиотека better-sqlite3.

Целевая планка составляла 90% тестов из подмножества Web Platform Tests. Агент её превысил: 1208 пройденных тестов из 1272, то есть 95%. Часть тестов была пропущена как неприменимые к среде Node.js. По более строгому полному набору WPT результат составил 77,4%. Работа заняла несколько часов — автор лёг спать после запуска и обнаружил результат утром.

Выбор Web Platform Tests как основы для работы агента — принципиальный момент. WPT — это тысячи тестов, которые сообщество веб-стандартов накапливало десятилетиями: они описывают поведение браузера вплоть до граничных случаев. Именно на них опираются новые браузерные движки — Ladybird и Servo. Бастин обратил внимание, что два других проекта по вайб-кодингу браузерных движков либо вовсе не использовали WPT, либо применяли их как вспомогательный инструмент. Между тем наличие формальной спецификации и приёмочных тестов — именно то, в чём LLM работают наиболее эффективно.

Выбор SQLite в качестве бэкенда не случаен: и Firefox, и WebKit используют его в своих реализациях IndexedDB. Часть сложной логики — транзакции, индексы — достаётся из SQLite почти бесплатно. Тем не менее JavaScript-специфичные аспекты: порядок выполнения микрозадач, автоматические транзакции, сериализация объектов — требовали отдельной реализации. Агент справился с ними одной сессии без ручного вмешательства.