5 октября 2026 г.
ИИ-агент получает ошибку за пропуск проверки прав: gdp-ts требует доказательство в типах
gdp-ts связывает вызов чувствительной функции с подтверждением, что вызывающий код проверил права доступа.

Guillermo Rauch
@rauchg
Представляю gdp-ts: Ghosts of Departed Proofs для TypeScript. gdp-ts — это библиотека, линтер и скилл для ИИ, которые помогают безопаснее проектировать API. По этому контракту чувствительные функции требуют «доказательств», что вызывающий код выполнил проверку прав доступа. Компилятор проверяет эти доказательства при проверке типов и не даёт вашей команде и агентам выпустить код с катастрофическими ошибками безопасности и другими видами ошибок. Такие приёмы существуют давно, особенно в экосистемах вроде Haskell. Но ① необходимость ревью кода людьми и ② дополнительная сложность для разработчика и громоздкий синтаксис оставляли их нишевыми. Теперь ситуация перевернулась. Агенты пишут больше кода, чем мы успеваем проверить, и прекрасно работают в коротких циклах с жёсткими ограничениями, которые раздражали бы нас. Мы видим это по росту Rust, проверке заимствований, спорам об эстетике кода и всему такому. README и примеры воспроизводят реальное ограничение API-продукта Vercel: для смены пароля проекта нужно доказательство определённой роли и определённого права тарифа. Спасибо Мэтту Нунану и Олли Чарльзу за исследования в этой области. https://github.com/rauchg/gdp-ts
· 30,9 тыс. просмотров
В примере gdp-ts от 5 октября смена пароля проекта требует 2 подтверждений: роли пользователя и права тарифа.
Проверка до запуска. Раньше setPasswordProtection принимала projectId и password независимо от проверки доступа. Теперь TypeScript выдаёт ошибку компиляции, если подтверждения нет или оно относится к другому значению. Proof здесь означает значение в коде, которое связывает выполненную проверку с последующим действием.
gdp-ts состоит из библиотеки, линтера и скилла для ИИ-агентов. Гильермо Раух связывает такой подход с ростом объёма кода от агентов: проверяющий типы компилятор возвращает им конкретную ошибку для следующего исправления. Подобные приёмы давно применяют в Haskell.
Как подключить. Библиотека устанавливается командой `pnpm add @gdp-ts/core`, скилл для агента — `npx skills add rauchg/gdp-ts`. Нужен TypeScript 5.4 или новее. Библиотеку можно добавлять постепенно в существующий проект с любым runtime, без изменения работы с I/O.
Для ESLint 9+ в eslint.config.js импортируют gdp из `@gdp-ts/core/lint/eslint` и добавляют `...gdp()` после конфигурации typescript-eslint. Для Oxlint 1.86+ импортируют gdp из `@gdp-ts/core/lint/oxlint` и экспортируют `gdp()`. Preset блокирует подделку proofs через `as` и их создание вне доверенных модулей, а `gdp({ strict: true })` дополнительно запрещает `any` и остальные утверждения типов вне разрешённых файлов.
В репозитории есть базовый пример и 2 примера на Express. В базовом доступны `pnpm typecheck`, `pnpm test` и `pnpm start`. Проверки показывают рабочее правило: Viewer получает 403 при включении защиты, Member получает 200, а Owner на тарифе Hobby получает 403 из-за отсутствия права тарифа.
Проверка типов с proofs требует больше ресурсов. В синтетическом замере автора от 5 октября на 20 000 файлов TypeScript 7.0.2 проверял вариант с gdp-ts за 6,8 с и занимал 4,7 ГБ памяти. Вариант с обычными boolean-проверками занял 1,2 с и 1,2 ГБ, а TypeScript 5.9 и 6.0 с gdp-ts не уложились в стандартный heap Node на 4 ГБ.
Первоисточник: [репозиторий gdp-ts, README, примеры и бенчмарк](https://github.com/rauchg/gdp-ts).
В примере роль владельца проекта сама по себе не даёт права включить защиту паролем: функция требует ещё и подтверждение тарифа.
Первоисточник
