# Первое обращение внешнего агента

У вас нет предварительных знаний об «Острове». Цель — получить предварительный расчёт и, если человек попросит, сохранённую смету или заявку. Число уточнений зависит от полноты данных; таймаут клиента — 20 секунд.

1. Проверьте доступный HTTP-инструмент или Python 3.10+. Установка и MCP не обязательны. Выполните `GET https://ostrov.center/api/public/v1/center`: получите название и публичные контакты.
2. Прочитайте `/catalog`, `/examples` и `/openapi.json`. Получите версию каталога и структуру плана. Примеры иллюстративные: их имена и даты не принадлежат пользователю.
3. Спросите цель, даты, состав и размещение. Для группы отделите участников от команды, уточните возраста детей. Для обычного тарифа спросите о питании и пространствах для занятий: днях, времени и опциях. Для резидента уточните число посещений бани. Для «Всё включено» объясните состав пакета и согласуйте пожелания сверх него. Питание и услуги из примера не считайте выбором человека. Для конкретного ретрита читайте `/events`: демо не является программой, опубликованное событие не гарантирует свободное место. Правила полей — в [SKILL.md](https://ostrov.center/api/public/v1/skill.md).
4. Выполните `/quotes` с выбранным `kind`, полным `plan` и полученным `catalogVersion`. Ожидаемый результат — строки, рублёвый итог, предупреждения и `complete=true`. Если размещение неполное, уточните его; не показывайте `null` как нулевую стоимость. Для обычной группы можно запросить `/suggestions` и обсудить предложенный состав.
5. Сообщите даты, тариф, состав и включённые услуги; покажите предупреждения. Итог берите из `quote.total`. У `group`/`biggroup` строки содержат `label`/`amount`; у `resident` — дневные `date`/`housing`/`food` после детских условий, но до прочих скидок и бани. Для резидента отдельно покажите серверные суммы проживания/питания, детскую льготу, скидки резидента/длительности и баню; не выдавайте сумму дневных строк за итог и не применяйте скидки повторно. Подробный порядок — раздел «Как объяснить ответ по kind» в SKILL. Назовите результат предварительным расчётом; доступность мест требует подтверждения. Сравнивая тарифы, используйте одинаковые даты и называйте различия состава/услуг.
6. Только по просьбе сохранить уточните: для `group`/`biggroup` — имя организатора и название ретрита; для `resident` — имя гостя. Затем откройте `/sessions`, вызовите `/estimates`. Передайте конфиденциальную ссылку человеку. Это не чек об оплате. Сохраните токен защищённо, если нужен доступ после завершения процесса; не включайте его в отчёт.
7. По просьбе изменить сохранённую смету прочитайте свой документ через `GET /estimates/{estimateId}`. Если `estimate.editable=true`, получите свежий каталог, пересчитайте изменённый план и покажите человеку новый результат. После согласования обновите тот же черновик через `POST /estimates/{estimateId}/edit` с актуальными `documentVersion`/`catalogVersion`, новым `requestKey` и `userConfirmed=true`. При конфликте версии сначала перечитайте документ. Если правка недоступна, объясните ограничение; новую смету или копию создавайте только по отдельному намерению человека.
8. Перед отправкой покажите выбранную смету, фактически заполненные имя, телефон, email, мессенджер и комментарий. Дайте исправить сведения и спросите: «Отправить эту заявку с указанными контактами и комментарием?» Заявку отправляйте после явного подтверждения и согласия на передачу данных. Получите актуальную версию документа; изменившуюся цену сначала согласуйте. Верните ID и фактический статус. Если контакты собирать не хотят, дайте публичные контакты центра.
9. В финальном сообщении разделите полученную цену, сохранённую смету, отправленную заявку и подтверждение брони. Укажите, что получилось и что требует ответа центра. При ошибке назовите незавершённый шаг. Повтор записи — только тем же ключом и телом; не более двух неуспешных обращений без решения человека.
