Site icon AppTractor

Промпт-контракты — от гадания к выпуску кода

Код был неплохой. Он компилировался. Он работал. Он даже выглядел чистым.

Но он решал не ту задачу. Я просил auth-флоу на Supabase с row-level security. В итоге получил красивую, production-готовую систему аутентификации — только на Firebase.

Claude Code вытащил классический reverse card для всего моего стека. Это как заказать пиццу и получить идеально приготовленное ризотто. Технически впечатляет. По сути — мимо.

И вот тогда я осознал неприятную вещь: я не писал код с Claude Code. Я играл в рулетку.

Если вы просто вводите промпты на естественном языке в Claude Code и надеетесь на лучшее — вы тоже бросаете кости. Только вместо dungeon master — ИИ без контекста и с бесконечной уверенностью в себе.

Ловушка вайб-кодинга

Вот как выглядит vibe-coding в реальности:

> Build me a dashboard for my SaaS

Claude Code пишет 3000 строк в 14 файлах. Вы смотрите на вывод, как на магическую картинку — вроде что-то видите, но не уверены.

Запускаешь.

Что-то ломается.

Пишешь: «fix it».

Он чинит одно — ломает три других. Это уже не дебаг. Это игровой автомат за $100 в месяц.

Через 45 минут у вас вроде бы что-то работает, но вы до конца не понимаете — как именно. Поздравляю, вы поддерживаете кодовую базу, написанную инопланетным интеллектом, который не помнит, что её писал. Что может пойти не так.

Я жил в этом цикле месяцами. Выпустил два SaaS-проекта почти полностью через Claude Code. И без преувеличений — около 30% времени уходило на откат и переделку того, что он уверенно строил не туда. Это как парное программирование с гением, у которого амнезия и ноль понимания твоего репозитория.

Проблема была не в интеллекте Claude Code. Opus 4.6 — абсурдно мощная модель. Это буквально синьор, который прочитал весь Stack Overflow и запомнил всё. Включая неправильные ответы.

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

Make it responsive. Add error handling. Use best practices.

Это не инструкции. Это гороскоп. А Claude Code — не гадалка. Это подрядчик. вы же не отдашь строителю салфетку с надписью «построй дом, чтобы красиво» и не будете ожидать дом мечты? Стены, возможно, будут. Но туалет окажется на кухне — потому что вы не сказали, что так нельзя.

Промпт-контракты — фикс

Я наткнулся на концепцию Prompt Contracts — писать промпты как юридические контракты с четырьмя обязательными блоками:

GOAL (ЦЕЛЬ) — чёткий критерий успеха

CONSTRAINTS (ОГРАНИЧЕНИЯ) — жёсткие ограничения

OUTPUT FORMAT (ВЫВОД) — структура результата

FAILURE CONDITIONS (УСЛОВИЯ СБОЯ) — что делает результат неприемлемым

Я подумал: «Это мило для постов в блоге ChatGPT. Но выдержит ли это Claude Code , который будет создавать настоящий бэкенд в 3 часа ночи, когда вы питаетесь кофеином и совершаете неправильные жизненные поступки?»

Поэтому я это протестировал. В течение трёх недель подряд, в рамках двух SaaS-проектов, я заменял все вайб-промпты на промпт-контракты.

Спойлер: теперь я сплю спокойно.

Компонент 1: ЦЕЛЬ — перестаньте говорить «Сделай мне X»

Самым значительным улучшением стало то, что я заставил себя определить, что значит «готово», ещё до того, как Claude Code напишет хотя бы одну строчку кода.

До (вайб):

> Add a subscription system to the app

Это всё равно что сказать своему GPS-навигатору: «Отвези меня куда-нибудь в хорошее место». В итоге вы окажетесь где-нибудь. Это может быть ресторан со звездой Мишлен. А может быть, заправка в Огайо.

После (контракт):

> GOAL: Implement Stripe subscription management where users can 
> subscribe to 3 tiers (free/pro/team), upgrade/downgrade instantly, 
> and see billing status on /settings/billing.
> Success = a free user can subscribe to Pro, 
> see the charge on Stripe dashboard, and access 
> gated features within 5 seconds.

Разница не только в деталях — она в тестируемости. Когда Claude Code завершает работу, я могу проверить цель менее чем за минуту. Никакой двусмысленности. Никаких «ну, вроде работает» — кот Шрёдингера среди демонстраций программного обеспечения.

Одно это сократило время моей переписки с Claude Code примерно вдвое. Когда ИИ знает, как выглядит финишная линия, он перестаёт бродить по трассе, делая селфи.

Компонент 2: ОГРАНИЧЕНИЯ — стены, которые вас спасают

Здесь всё становится специфичным для Claude Code, потому что без ограничений Claude Code переделает весь ваш стек за вас. Это как нанять подрядчика по ремонту кухни, который придёт и скажет: «Я ещё и стену в вашей гостиной снёс, потому что фэн-шуй был нарушен».

Теперь я храню файл CLAUDE.md в корне каждого проекта, который служит постоянным слоем ограничений:

# CLAUDE.md — Project Constraints (always active)
## Stack (non-negotiable, I will mass git revert you)
- Frontend: Next.js 14+ App Router, TypeScript strict
- Backend: Convex for real-time data, Supabase for auth + storage
- Auth: Clerk (never roll custom auth, we are not animals)
- Styling: Tailwind only — no CSS modules, no styled-components
## Hard Rules
- Never install a new dependency without asking first
- Never modify the database schema without showing the migration plan
- All API calls go through Convex functions, never direct Supabase 
  client calls from components
- Environment variables go in .env.local, never hardcoded
  (I will find you and I will revert you)
## Patterns
- Use server components by default, client components only when 
  interactivity is required
- Error boundaries on every route segment
- Zod validation on every user input

До появления CLAUDE.md, Claude Code произвольно выбирал Prisma вместо Convex или заменял Clerk на NextAuth, потому что «он более распространён». Это как если бы ваш бариста решил, что вы на самом деле хотите чаю, потому что чай пьют больше людей во всём мире. Я не просил демократии. Я просил Clerk.

А теперь? Он остаётся в своей полосе. Каждый раз.

Совет: когда вы начинаете новую сессию Claude Code, ваше первое сообщение должно быть:

> Read CLAUDE.md and confirm you understand the project constraints 
> before doing anything.

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

Компонент 3: ВЫВОД — скажи ему точно, что нужно сделать

Вайб-кодинг позволяет Claude Code определять структуру. Это как сказать шеф-повару: «Удиви меня», а затем быть шокированным, когда вам подают деконструированный салат «Цезарь» в туфле.

До:

> Create an API endpoint for user onboarding

Claude Code решает: один огромный файл, встроенная валидация, никаких типов, всё в одной функции на 800 строк, которая выполняет аутентификацию, обращения к базе данных и отправку электронных писем за один раз. Это работает. Но это также преступление против вас в будущем, кому придётся это поддерживать.

После:

> FORMAT: 
> 1. Convex function in convex/users.ts (mutation, not action)
> 2. Zod schema for input validation in convex/schemas/onboarding.ts
> 3. TypeScript types exported from convex/types/user.ts
> 4. Include JSDoc on the public function
> 5. Return { success: boolean, userId: string, error?: string }

Теперь я получаю модульный, типизированный, документированный код — каждый раз. Не потому, что Claude Code не может создавать его самостоятельно, а потому, что без явных инструкций по форматированию он оптимизирует скорость, а не удобство сопровождения. Это как скоростное выполнение вашей кодовой базы. Вам это нужно для долгосрочной игры.

Это еще важнее, когда вы используете функцию команд агентов Claude Code для распараллеливания работы. Если ваши суб-агенты не следуют одному и тому же контракту форматирования, вы в конечном итоге объединяете код, который выглядит так, будто его написали пять разработчиков, которые общаются исключительно посредством пассивно-агрессивных сообщений в коммитах.

Компонент 4: УСЛОВИЯ СБОЯ — секретное оружие

Это компонент, который изменил все. Если Цель — это пряник, то Условия Сбоя — это кнут. И Claude Code реагирует на кнут так же, как разработчик реагирует на сообщение в Slack о сбое в работе — немедленно и с полным вниманием.

Определение того, что нарушает контракт, дает Claude Code отрицательное подкрепление. Это как дрессировка собаки: команда «сидеть» — это хорошо, но команда «НЕ на диван, НЕ на стол, НЕ на гостей» — вот что действительно спасает вашу мебель.

Вот реальный пример договора промпт-контракт, который я использовал на прошлой неделе:

> Build the /dashboard page.
>
> GOAL: Display user's active projects with real-time updates. 
> First meaningful paint under 1 second. User can create, archive, 
> and rename projects inline.
>
> CONSTRAINTS: Convex useQuery for data, no polling, no SWR. 
> Clerk useUser() for auth check. Redirect to /sign-in if 
> unauthenticated. Max 150 lines per component file.
>
> FORMAT: Page component in app/dashboard/page.tsx (server component 
> wrapper), client component in components/dashboard/ProjectList.tsx, 
> Convex query in convex/projects.ts. Tailwind only.
>
> FAILURE CONDITIONS:
> - Uses useState for data that should be in Convex
> - Any component exceeds 150 lines
> - Fetches data client-side when it could be server-side
> - Uses any UI library besides Tailwind utility classes
> - Missing loading and error states
> - Missing TypeScript types on any function parameter

Когда я запустил это, Claude Code с первого раза создал чистую панель мониторинга в реальном времени. Никакого Firebase. Никакой Prisma. Никаких загадочных npm-пакетов 2019 года с 12 звездами на GitHub и README, в котором написано «TODO». Никакого компонента-монстра на 1200 строк, после рефакторинга которого мне в будущем понадобилась бы терапия.

Сравните это с тем, что произошло месяцем ранее, когда запрос «создай мне панель мониторинга» выдал компонент, который импортировал Material UI (я не использую Material UI), использовал useEffect для получения данных (у нас есть Convex не просто так) и не имел никаких состояний загрузки. Просто чистый, незащищенный оптимизм, что данные всегда будут доступны мгновенно. Программный эквивалент оставления дома незапертым, потому что «это хороший район».

Условия сбоя действуют как ограничители. Claude Code не нужно гадать, что означает «хорошо», когда вы уже сказали ему, как выглядит «плохо». Разница между «ездите безопасно» и «не превышайте 80 км/ч, не проезжайте на красный свет, не выезжайте на шоссе в час пик». Одно — молитва. Другое — система.

Результаты (3 недели работы с промпт-контрактами)

Я отслеживал свой рабочий процесс в двух активных проектах. Цифры не прошли экспертную оценку — я всего лишь один разработчик в темной комнате, а не исследовательская лаборатория, — но закономерность была очевидна.

Частота отмены/отката снизилась примерно с 1 из 3 генераций до 1 из 10. Claude Code перестал создавать то, что мне не нужно. Моя мышечная память на команду git revert уже начинает ослабевать. Возможно, мне когда-нибудь придется заново выучить эту команду. А может и нет. Я с этим смирился.

Время от запроса до готового к использованию кода сократилось в среднем с 3 раундов обмена данными до 1,2 раундов. Большинство результатов промпт-контрактов были пригодны к использованию уже на первом или втором поколении. Это освободило время, которое я теперь трачу на важные вещи, такие как избыточное проектирование моего CLAUDE.md и добавление Условий сбоя.

Нарушения в файле CLAUDE.md (неправильная библиотека, неправильный шаблон, жестко закодированные значения) сократились с нескольких в день практически до нуля после того, как я добавил проверку соответствия ограничений в начале сессии. Комбинация CLAUDE.md + проверка соответствия ограничений — это, по сути, контрольный список перед полетом. Пилоты его не пропускают. И вам тоже не следует этого делать. Если, конечно, вы не хотите, чтобы ваш код врезался в метафорическую гору.

Самый большой сюрприз? Мои запросы стали короче со временем, а не длиннее. Как только в CLAUDE.md появятся постоянные ограничения, и вы усвоите 4-компонентную структуру, написание промпт-контракта для сложной функции займет, возможно, 60 секунд. Эти 60 секунд сэкономят вам 45 минут отладки и сомнений в правильности вашего выбора профессии.

Как начать сегодня

Вам не нужно полностью перестраивать свой рабочий процесс. Вам не нужно читать 400-страничную книгу по разработке промптов. Вам не нужно смотреть 3-часовое видео на YouTube, где кто-то объясняет концепцию в первые 4 минуты, а затем продает вам курс в течение оставшихся 2 часов 56 минут.

Начните с двух вещей:

Фреймворк промпт-контрактов не о том, чтобы писать больше кода. Он о том, чтобы думать 60 секунд, чтобы Claude Code не приходилось гадать 60 минут.

Я перешёл от азартных игр к поставке продуктов. Ваш ход.

Источник

Exit mobile version