# Lab 03: Описать интерфейс модуля

## Цель

Научиться давать AI-агенту задачу не только “сделай функцию”, а “опиши и сохрани контракт модуля”.

## Мини-пример

Слабая просьба:

```text
Вынеси проверку скидки в отдельную функцию.
```

Проблема: агент может создать функцию, но оставить правила скидок размазанными по UI, API и тестам.

## Задание

Выберите небольшой кусок приложения: профиль, скидку, загрузку файла, отправку письма или любой похожий сценарий.
Опишите для агента интерфейс будущего модуля:

1. что модуль принимает на вход;
2. что возвращает;
3. какие ошибки возможны;
4. какие правила нельзя нарушать;
5. какие побочные эффекты допустимы;
6. через какой публичный сценарий проверить результат.

## Хороший ответ

```text
Нужно выделить модуль расчёта скидки.

Сначала найди все места, где сейчас считается или проверяется скидка.
Предложи один публичный интерфейс для расчёта: какие данные нужны на входе,
какой результат возвращается, какие ошибки возможны.

Не оставляй правила скидок в UI-компонентах. UI может только показать результат
и понятную ошибку. Правила допустимых скидок должны жить внутри модуля.

Неформальные правила:
- скидка не может быть меньше 0%;
- скидка не может быть больше максимума для роли пользователя;
- архивный промокод нельзя применить;
- повторный расчёт с теми же входными данными должен дать тот же результат.

Критерии приёмки:
- публичный интерфейс описан в коде или рядом с модулем;
- существующие сценарии скидок работают;
- недопустимая скидка возвращает понятную ошибку;
- тесты проверяют поведение через публичный интерфейс, а не внутренние helper-функции.
```

## Самопроверка

- В просьбе есть интерфейс, а не только “вынеси код”.
- Названы вход, результат и ошибки.
- Названы скрытые правила.
- Понятно, что должно остаться внутри модуля.
- Тесты защищают публичное поведение.
