Ник Бастин, разработчик с опытом работы над PouchDB и fake-indexeddb, решил проверить, насколько далеко можно зайти с ИИ-агентом при наличии чёткой спецификации и готового набора тестов. Объектом эксперимента стал IndexedDB — браузерный API для хранения структурированных данных на стороне клиента. Это не тривиальный CRUD: API включает транзакции с режимами долговечности, курсоры, несколько типов ключей (в том числе ключи-массивы), планировщик микрозадач в стиле JavaScript и обработку специфичных объектов вроде Date и ArrayBuffer.
В качестве инструмента Бастин выбрал Claude Code с техникой Ralph loop. Суть подхода проста до абсурда: агент запускается в Bash-цикле, получает Markdown-файл с инструкциями и текстовый файл для отслеживания прогресса, после чего каждую новую итерацию начинает с чистого контекста. Логика за этим стоит конкретная — чем длиннее сессия с LLM, тем сильнее деградирует качество ответов. Перезапуск с чистого листа компенсирует этот эффект. Реализация, которую использовал автор, — 24 строки Bash от разработчика Мэтта Покока, запущенные в контейнере Podman с флагом --dangerously-skip-permissions.
| Реализация | Версия | Пройдено | % |
|---|---|---|---|
| Chrome | 144.0.7514.0 | 1651 | 99,9% |
| Firefox | 146.0a1 | 1498 | 90,6% |
| Safari | 231 preview | 1497 | 90,6% |
| Ladybird | 1.0-cde3941d9f | 1426 | 86,3% |
| fake-indexeddb | 6.2.5 | 1369 | 82,8% |
| One-shot | 1279 | 77,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-специфичные аспекты: порядок выполнения микрозадач, автоматические транзакции, сериализация объектов — требовали отдельной реализации. Агент справился с ними одной сессии без ручного вмешательства.

