# SHARENTA — продуктовый аудит и дорожная карта **Дата:** 23 сентября 2026 **Основание:** код репозитория (веб: Next.js App Router, контур `applyContourAction`, Android Compose-клиент того же `/api/contour`). **Версия:** актуализировано с учётом решений владельца продукта от 24 сентября 2026. **Не проверялось в браузере в исходном аудите.** Часть сценариев (вход, каталог, сделка) подтверждалась ранее на локальном пилоте; текущий документ не считает UI «готовым» только по названию экрана. Главная функция продукта: соединять арендодателя и арендатора, помочь найти вещь, договориться и вернуться за следующей арендой. Ориентир механики — BlaBlaCar: нашёл предложение → связался → организовал сделку в интерфейсе. SHARENTA при этом остаётся площадкой аренды вещей, а не поездок. Платежи, SMS, внешний KYC и УКЭП **не подключены** — это честно отражено в UI (`SettlementNotice`, копирайт KYC). Этот план не предлагает подключать провайдеров, пока владелец продукта явно не решит иначе. --- ## 1. Краткое описание текущего продукта SHARENTA — рабочий городской пилот: публичный каталог, карта OSM, карточка юнита, заявка на даты, чат сторон, цепочка сделки (заявка → документы → подписи → фото выдачи → аренда → фото возврата → отзыв), кабинет с двумя рейками CRM, модерация объявлений и ручной KYC. Слоган в шапке: «Найди. Возьми. Верни.» Что уже является **настоящим контуром**, а не макетом: - Поиск и фильтры (`/api/catalog`, `applyFilters`) по названию, бренду, модели, описанию, характеристикам, категории, цене, рейтингу, городу, датам. - Бронь с блокировкой пересечений (`canCreateBooking`, `BUSY_BOOKING_STATUSES`, advisory lock в Postgres). - Чаты, привязанные к объявлению/сторонам. - Документы сделки генерируются при подтверждении владельца (шаблоны + хеш содержимого, не УКЭП). - Выдача и возврат требуют фото и чек-лист. - Отзыв после `completed`: арендатор — о юните, владелец — об арендаторе. - Избранное, городская подписка на пустой город, тикеты поддержки, in-app уведомления, буст в ранжировании без оплаты. Что выглядит как продукт, но **не является законченной пользовательской ценностью**: тарифы PRO/MAX, реферальные выплаты, каналы push/email/telegram, «просмотры» в аналитике, сортировка «по расстоянию», процент ответов владельца, Android-цифры рефералки. --- ## 2. Фактический статус существующих функций Легенда статуса: | Метка | Значение | | ----- | -------- | | **Работает** | Есть UI + реальное действие в контуре / API | | **Частично** | Есть каркас, но не закрывает сценарий | | **Маркетинг / заглушка** | Экран или копирайт без соответствующей логики | | **Нет** | В коде не найдено | ### 2.1. Обнаружение | Функция | Статус | Что может пользователь | Чего нет / проблема | | ------- | ------ | ---------------------- | ------------------- | | Главная лента `/` | Работает | Категории, карточки, «ещё», пустой город | Нет сортировки на самой главной; состояние фильтров общее с поиском | | Поиск `/search` | Работает | Запрос, AI-разбор фразы, фильтры, «свободен на выходные» | Пустой результат только «измените формулировку», без соседних городов и подписки | | Категории `/categories` | Работает | 10 категорий, лента категории | Подкатегории транспорта ведут в `/search` **без фильтра** | | Карта `/map` | Работает | Пины Leaflet, карточка снизу, диплинк `?id=` | Нет геолокации пользователя, радиуса, фильтров на карте; лимит 120 | | Фильтры | Работает | Категория, цена/день, рейтинг, доступность, «проверенные», даты, все города / город шапки, сорт | Нет бренда/модели как отдельных контролов (они есть в полнотексте); «по расстоянию» сортирует **зашитый** `distanceKm`, не GPS | | Карточка `/listings/[id]` | Работает | Фото, цена, залог, вкладки обзор/хар-ки/календарь/условия/отзывы, избранное, шаринг ссылки, AI по юниту, бронь | Нет блока «похожие»; бренд/модель не как отдельные поля UI; просмотры не пишутся | | Профиль владельца `/users/[id]` | Работает | Био, звёзды из отзывов, активные объявления, «написать» | `responseRate` — **сидовое число**, не считается по чатам; нет подписки на владельца | | Избранное `/favorites` | Работает | Сердце на карточке и PDP, гостевой список + `claimGuestFavorites` | Нет в нижней навигации, только кабинет | | Недавно просмотренные | Нет | — | Поле `listing.views` есть, **инкремента при открытии нет** | | Похожие / рекомендации | Нет как продукт | AI-текст «рядом ещё N похожих» | Нет карусели и фида | | Сохранённый поиск | Нет | — | Есть только `watchCity` из пустого города | | Подписка на появление в городе | Работает | Кнопка в `CityEmptyState`; при `createListing` уходит in-app notice | Нет управления подписками вне пустого экрана; нет query-алертов | ### 2.2. Аккаунт и создание предложения | Функция | Статус | Что может пользователь | Чего нет / проблема | | ------- | ------ | ---------------------- | ------------------- | | Регистрация / вход `/login` | Работает | Логин (почта или имя) + пароль, сессия cookie/Bearer | Нет OAuth, сброса пароля по почте (копирайт честный) | | Онбординг `/welcome` | Работает | Язык, слайды, роль, гость | Android стартует с ленты/демо, без этого потока | | Создание `/landlord/create` | Работает | 5 шагов: тип → фото → AI → цена/город → выдача → модерация | **Нет календаря доступности**; **координаты всегда 55.752, 37.591 (Арбат)**; район по умолчанию «Арбат»; новые объявления помечаются `verified: true` в `publishDraft` без проверки | | Редактирование `/cabinet/listings/[id]` | Работает | Название, описание, цена, залог, фото, выдача, пауза, клик по дням календаря | Нет смены точки на карте; отклонённое нельзя явно «отправить снова на модерацию» отдельным статусом (правка есть, статус сам не едет в `moderation`) | | Календарь доступности | Работает | PDP, бронь, редактирование, `/cabinet/calendar` | В создании объявления отсутствует; кабинетный календарь подсвечивает только start/end, не весь период | ### 2.3. Сделка и общение | Функция | Статус | Что может пользователь | Чего нет / проблема | | ------- | ------ | ---------------------- | ------------------- | | Заявка `/book/[id]` | Работает | Даты + время получения/возврата, сообщение, итог = дни × `pricePerDay` | Гость выбирает даты, отправка после входа; **KYC `verified` обязателен**; своё объявление нельзя; сообщение заявки **не копируется в чат** | | Подтверждение / отказ | Работает | Владелец: подтвердить → статус брони `documents` + пакет документов; отклонить → `rejected` | Нет встречного предложения и других дат; отказ терминальный | | Instant book | Нет | — | Всегда `requested` → действие владельца | | Чат `/messages` | Работает | Текст, фото, системные статусы, привязка к listing, непрочитанные | Вопрос до заявки спрятан в иконке на карточке владельца; нет быстрых ответов | | Кабинеты `/cabinet`, `/landlord` | Работает | Единый аккаунт, переключатель роли, CRM две рейки, список броней | Дубли экранов (кабинет / landlord / CRM / finance / analytics) | | Выдача / возврат | Работает | Фото + чеки; без них нельзя `active` / `completed` | Место и время передачи — свободный `pickupNote`, без точки на карте и подтверждения слота | | Документы | Работает | Генерация при подтверждении, просмотр, подпись флагом в приложении | Не УКЭП; два хранилища (`documents` и `dealDocuments`) | | Отзывы | Работает | После `completed`, один на автора/бронь, ответ владельца | Не обязательны; нет «забронировать снова» с карточки отзыва | | Доставка | Частично | Enum `meetup` / `pickup` / `delivery` + заметка | Нет логистики, адреса, стоимости доставки | Цепочка статусов брони (код): `requested → documents` (кнопка «Подтвердить») `→ signed → active → completed`, либо `rejected` / `cancelled` / `expired` / `noshow` / `unreturned`. Статус `confirmed` в типах есть, в живом пути почти не сохраняется. ### 2.4. Возврат, рост, админка, Android | Функция | Статус | Что может пользователь | Чего нет / проблема | | ------- | ------ | ---------------------- | ------------------- | | История аренд | Работает | `/bookings`, CRM | Нет CTA повторной заявки с теми же датами/юнитом | | Уведомления | Частично | In-app список, бейдж, mark all read | Каналы `push`/`email` пишутся в аудит сделки, **доставки нет**; время всегда «только что» | | Модерация | Работает | Админ approve/reject, опциональный AI-hint | — | | KYC | Частично | Заметка ≥20 символов → админ вручную | Без админа новая регистрация **не бронирует**; OCR нет (копирайт честный) | | Тикеты | Частично | Создать, админ меняет статус | Нет переписки по тикету; «чат поддержки» ведёт в обычные `/messages` | | Жалобы | Работает | `/security/report` создаёт тикет; блок пользователя | — | | Буст `/services` | Частично | Покупка пишет `purchases` + `boostedUntil`, влияет на сорт | Нет оплаты; «+40% просмотров» — маркетинговая строка | | PRO / MAX | Маркетинг | Чек покупки | **Нет entitlements**, кабинет компаний / филиалов / сотрудников отсутствует | | Рефералка `/referral`, `/r/[code]` | Частично | Код запоминается при регистрации; статистика 10% от **покупок услуг**, не аренды | Выводов денег нет; Android показывает **зашитые** 12 / 8 / 4250 ₽ | | AI | Частично | Поиск, ассистент каталога, разбор фото, цена, брифинг сделки, модерация | Без `AI_API_KEY` — mock; не выдумывает объявления (это правильно) | | Аналитика владельца | Частично | Сделки, избранное, отзывы из контура | `views` не считаются; «спрос» как отдельный продукт нет | | Мультиединицы / почасовая / комплекты | Нет | Модель: 1 listing = 1 юнит, цена за сутки | Не предлагать, пока суточная модель не стабильна | | Android | Частично | Лента, поиск, карта OSM, карточка, бронь, чат, кабинет, объявление, админ KYC/модерация/тикеты, ассистент | Нет CRM/finance/welcome; рефералка фейковая; city watch не виден | Дубли, которые **не надо плодить вторым контуром**: избранное vs `listing.favorites` (счётчик); кабинет vs `/landlord`; буст «в ленте» и «в поиске» (один флаг); документы сделки vs legacy `documents`; чат с карточки, из брони и из профиля. --- ## 3. Сценарий A. Арендатор | Шаг | Сейчас | Улучшить | Не хватает | | --- | ------ | -------- | ---------- | | 1. Открывает SHARENTA | Онбординг / гость / лента «Рядом с вами»; город в шапке | Городской пилот на Vercel без Postgres эфемерен (не тема этого плана, но влияет на доверие) | — | | 2. Категория или поиск | Главная, `/search`, `/categories`, шапка | Общее состояние `query`/`filters` путает при переходах | Подкатегории транспорта не фильтруют | | 3. Место и период | Город шапки; даты в фильтрах и «выходные»; карта отдельно | Даты спрятаны в панели фильтров, не на первом экране поиска | Живой радиус / «рядом со мной»; сорт «по расстоянию» врёт | | 4. Сравнивает выдачу | Карточки, цена, бейджи, нагрузка, рейтинг из отзывов | Нельзя открыть два юнита рядом | Нет сравнения, похожих, recently viewed | | 5. Карточка | Полная PDP | CTA «Забронировать» сильнее, чем «спросить» | Похожие внизу | | 6. Цена, условия, фото, владелец | Есть; владелец кликабелен; календарь вкладкой | `distanceKm` и район у новых объявлений фиктивные | Честный пин на карте у свежих юнитов | | 7. Вопрос или заявка | Чат с иконки; бронь с опциональным message | Message не попадает в чат; вопрос не primary CTA | Явный «Написать владельцу» рядом с бронью | | 8. Ответ владельца | In-app notice + чат, если владелец зашёл | Если владелец не в приложении — тишина | Push/email (зависимость от решения по каналам) | | 9. Согласовать даты | Только новый запрос или отказ | Календарь на брони один месяц | Встречные даты, правка периода без новой заявки | | 10. Подтвердить договорённость | Подпись флагом после документов | Статусы `documents` vs кнопка «Подтвердить» | Понятный чеклист «что дальше» одним языком | | 11. Место и время передачи | Время в заявке; `pickupNote` если владелец заполнил | Легко пропустить | Подтверждённый слот + точка; напоминание в чат | | 12. Пользуется и возвращает | Статусы active / complete / unreturned; фото | Арендатор меньше кнопок, чем владелец | Арендатору ясно, что делать в день возврата | | 13. Отзыв | Ссылка после completed | Легко уйти, не оставив | Напоминание; повторный заказ с той же карточки | | 14. Вернуться | История броней, избранное, профиль владельца | Надо искать вручную | Repeat CTA, подписка на владельца, похожие | **Узкое место сценария A:** после «нашёл» следующий шаг — либо жёсткая заявка с KYC, либо спрятанный чат. Нет мягкого BlaBlaCar-шага «написать и договориться», а отказ владельца обнуляет путь. --- ## 4. Сценарий B. Арендодатель | Шаг | Сейчас | Улучшить | Не хватает | | --- | ------ | -------- | ---------- | | 1. Регистрируется | Логин/пароль, роль | KYC не нужен, чтобы **сдать**, только чтобы **взять** | — | | 2. Создаёт объявление | Нижняя вкладка «Сдать», мастер | 5 шагов нормальны | Календарь и карта в мастере | | 3. Фото, описание, цена | Фото обязательны; AI предлагает, не публикует сам | Можно пропустить AI и застрять без названия до финала | Подсказки хар-к без AI (шаблоны категории) | | 4. Локация и доступность | Текстовый город; выдача meetup/pickup/delivery | Координаты и район зашиты | Реальная точка; закрытые дни до модерации | | 5. Публикует | `status: moderation`, в ленте не видно | `verified: true` на сыром юните вводит в заблуждение | Явный статус «на проверке» в кабинете уже есть — не ставить «Проверен» до модерации | | 6. Получает обращения | Notice «новая заявка», CRM `needsAction` | Легко не заметить, если не открывать колокольчик | Список входящих на первом экране кабинета уже частично есть (`actionDeals`) — усилить, не дублировать новым inbox | | 7. Отвечает на вопросы | Чат | Нет шаблонов | Быстрые ответы: «свободно», «залог», «где встреча» | | 8. Подтверждает или альтернатива | Подтвердить / отклонить | Отклонить = тупик для арендатора | Предложить другие даты / короткий комментарий отказа | | 9. Согласовывает передачу | `patchDealFields` (заметка, способ) пока документы готовы | Скрыто в Deal Workspace | Явный блок «когда и где отдаём» | | 10. Передаёт | Фото выдачи → «Начать аренду» | — | — | | 11. Получает обратно | Фото возврата | — | Напоминание в день endDate | | 12. Завершает | «Завершить аренду» / «Не вернул» | — | — | | 13. Получает отзыв | Арендатор может написать; владелец оценивает гостя | Не форсится | — | | 14. Управляет и принимает новые | Пауза, цена, календарь, буст | Аналитика просмотров фейковая | Не строить второй кабинет; довести текущий | **Узкое место сценария B:** объявление появляется «не там» на карте и без календаря, а на входящую заявку можно только да/нет. --- ## 5. Список обнаруженных продуктовых проблем 1. **Связь со владельцем слабее брони.** Основной CTA — «Забронировать». Чат вторичен. Текст заявки не становится сообщением в треде. 2. **Нет торга по датам.** Отказ конечен; согласование = новая заявка и снова KYC-гейт. 3. **Новое объявление врёт карте.** `publishDraft` пишет lat/lng Арбата и `distanceKm: 0.3` независимо от города. 4. **Календарь не часть публикации.** Владелец закрывает дни только после создания. 5. **Пустой поиск беднее пустого города.** City empty: соседние города + watch. Search empty: одна фраза. 6. **KYC ручной — стоп-кран первой аренды.** Новый человек не отправляет заявку, пока админ не нажмёт Verify. 7. **Статусы сделки говорят на двух языках** (booking vs deal; кнопка «Подтвердить» пишет `documents`). 8. **«Проверен» и «просмотры» и «% ответов» и «по расстоянию»** выглядят как живые метрики, часть из них — сиды или константы. 9. **Уведомления существуют только внутри открытого сайта.** Для BlaBlaCar-ритма «написал — ответил» этого мало, но внешние каналы — отдельное продуктовое решение, не инфраструктурный фетиш. 10. **PRO/буст/реферал продают то, чего нет** (оплата, выплаты, права PRO). Это ломает доверие сильнее, чем отсутствие функции. 11. **Возврат пользователя не собран:** нет recently viewed, похожих, repeat booking, follow. 12. **Android отстаёт точечно** (фейковая рефералка опаснее отсутствующего CRM). 13. **Дубли кабинетов** повышают стоимость любой доработки хозяина. Не проблемы этого плана (уже сделано или сознательно отложено): поиск по каталогу, антидаблбук, фото сделки, честный копирайт «деньги мимо платформы», модерация, избранное, city watch. --- ## 6. Приоритетный список P1 / P2 / P3 Правило: P1 — без этого трудно **найти → связаться → договориться → арендовать**. P2 — быстрее договариваются и возвращаются. P3 — рост бизнеса. Не включать то, что уже работает. ### P1 #### P1-1. Вопрос владельцу как равный шаг рядом с заявкой - **Проблема:** арендатор не понимает, что можно написать до брони; текст заявки пропадает из диалога. - **Для кого:** обе стороны. - **Сейчас:** `openConversation` с иконки; `createBooking.message` лежит на брони. - **Сделать:** на PDP вторая явная кнопка «Написать»; при заявке копировать message первым сообщением в связанный чат; с брони — тот же тред. - **Зависимости:** нет. - **Почему P1:** это механика BlaBlaCar без новой сущности. - **Готово когда:** с карточки и из заявки открывается один чат по юниту; текст заявки виден владельцу в чате. - **Тесты:** contour `createBooking` создаёт/линкует conversation + user message; браузер: карточка → чат; бронь с текстом → тред содержит текст. #### P1-2. Ответ на заявку: другие даты или короткий отказ, не только «нет» - **Проблема:** отказ убивает сделку; согласование дат невозможно внутри заявки. - **Для кого:** обе стороны. - **Сейчас:** `setBookingStatus` confirm/reject. - **Сделать:** действие владельца «предложить даты» (новые start/end, бронь остаётся или переходит в ожидание ответа арендатора) + опциональный комментарий при отказе, уходящий в чат. Не плодить вторую CRM. - **Зависимости:** P1-1 (чат как канал). - **Почему P1:** иначе «договориться» вне платформы или с нуля. - **Готово когда:** владелец может сменить период без новой заявки; арендатор принимает/отклоняет; пересечения по-прежнему блокируются `canCreateBooking`. - **Тесты:** overlap lock на предложенных датах; UI оба статуса; нельзя занять чужой busy span. #### P1-3. Честная точка на карте и город при публикации - **Проблема:** все новые юниты сидят в одной точке Арбата; карта и «рядом» врут. - **Для кого:** арендодатель (ввод), арендатор (поиск). - **Сейчас:** `publishDraft` hardcode lat/lng/district; город — текстовое поле. - **Сделать:** выбор города из тех же `CITIES` + ручной пин на карте или адрес → lat/lng; district не подставлять «Арбат», если город другой; `distanceKm` не показывать, пока нет гео пользователя (лучше скрыть, чем врать). - **Зависимости:** нет. - **Почему P1:** без этого карта и «рядом с вами» ломают доверие к каталогу. - **Готово когда:** объявление в Казани не рисуется на Арбате; редактирование тоже меняет координаты. - **Тесты:** publish с городом ≠ Москва; карта показывает пин; регресс фильтр `listingInCity`. #### P1-4. Доступность в мастере создания - **Проблема:** владелец публикует «всегда свободно», календарь находит только потом. - **Для кого:** арендодатель, косвенно арендатор. - **Сейчас:** `unavailableDates` через `toggleListingDate` после создания. - **Сделать:** шаг или блок в review: закрыть дни до отправки на модерацию. Не отдельный продукт календаря. - **Зависимости:** нет (усиливает P1-2). - **Почему P1:** заявки на занятые дни = лишние отказы. - **Готово когда:** дни, закрытые в мастере, видны на PDP и блокируют `createBooking`. - **Тесты:** publish с unavailableDates; book на закрытый день отклоняется. #### P1-5. Пустой поиск с следующим действием - **Проблема:** «нет таких юнитов» заканчивает сценарий. - **Для кого:** арендатор. - **Сейчас:** `EmptyState` без CTA; `CityEmptyState` уже умеет соседей и watch. - **Сделать:** переиспользовать паттерн city empty: снять фильтр, соседний город, «смотреть всю категорию», watch города если пусто из‑за города. **Не** делать want-ad в P1. - **Зависимости:** city watch уже есть — не дублировать тип подписки. - **Почему P1:** поиск — главный вход; тупик убивает цикл. - **Готово когда:** на нуле результатов ≥2 действия, которые меняют выдачу или оставляют watch. - **Тесты:** UI-тест/браузер: запрос без хитов показывает CTA; watch не создаётся дважды. #### P1-6. Понятный статус заявки одним языком - **Проблема:** «Подтвердить» ≠ `confirmed`; арендатор не видит «что делать завтра». - **Для кого:** обе стороны. - **Сейчас:** Deal Workspace + сырые статусы. - **Сделать:** чеклист на `/bookings/[id]`: заявка → ответ владельца → подписи → фото выдачи → аренда → фото возврата → отзыв. Без новой state-машины, только UX поверх существующих статусов. - **Зависимости:** нет. - **Почему P1:** организация сделки — ядро продукта. - **Готово когда:** обе стороны на одном экране видят текущий шаг и единственную кнопку следующего. - **Тесты:** снапшот копирайта по статусам; регресс `canOwnerAct` / `canRenterCancel`. #### P1-7. Снять ложные бейджи с нового объявления - **Проблема:** `verified: true` при публикации; сорт «по расстоянию» по сиду. - **Для кого:** арендатор (доверие). - **Сейчас:** `publishDraft` + `filters.sort === "distance"` по `distanceKm`. - **Сделать:** `verified` только после модерации/KYC владельца (как решите в вопросах); скрыть или переименовать сорт, пока нет гео. - **Зависимости:** P1-3 для честного distance. - **Почему P1:** вранье метрик хуже отсутствия метрик. - **Готово когда:** свежий юнит без галочки «Проверен», пока модерация не прошла; сорт distance не обещает GPS. - **Тесты:** publish → listing.verified false; модерация approve не обязана ставить verified, если это другой смысл (зафиксировать в копирайте). ### P2 #### P2-1. Похожие объявления на карточке - **Проблема:** сравнение только «назад в ленту». - **Для кого:** арендатор. - **Сейчас:** SQL `similarity` для ранга поиска; AI-текст. - **Сделать:** блок 4–8 юнитов той же категории/города, исключая текущий. Не персональный ML. - **Зависимости:** каталог уже есть. - **Готово когда:** PDP внизу кликабельная сетка; пусто, если кандидатов нет. - **Тесты:** не показывает себя; только `status=active`. #### P2-2. Недавно просмотренные + счётчик просмотров владельца - **Проблема:** аналитика врёт; арендатор не возвращается к вчерашней карточке. - **Для кого:** обе стороны. - **Сейчас:** `views` сид/поле без инкремента. - **Сделать:** писать просмотр (уникальный за сессию) в контур; лента «смотрели» в кабинете/поиске. Без отдельной аналитической платформы. - **Зависимости:** нет. - **Готово когда:** открытие PDP увеличивает views; владелец видит то же число в analytics. - **Тесты:** contour increment; гость не падает. #### P2-3. Повторить аренду - **Проблема:** повтор = ручной поиск юнита. - **Для кого:** арендатор. - **Сейчас:** `/bookings` история. - **Сделать:** на completed «Запросить снова» → `/book/[id]` с теми же дефолтными длительностями, если юнит active. - **Зависимости:** бронь уже умеет даты из URL (`readBookDates`). - **Готово когда:** один тап из истории. - **Тесты:** paused listing не даёт CTA. #### P2-4. Избранное заметнее; подписка на владельца — нет, если не решите иначе - **Проблема:** избранное спрятано в кабинете. - **Для кого:** арендатор. - **Сейчас:** `/favorites` работает. - **Сделать:** вход из кабинета уже есть — добавить сердце в шапку или счётчик. **Не** делать «коллекции». Follow владельца — только если P2-3 и избранного мало (см. вопросы). - **Зависимости:** нет. - **Готово когда:** избранное открывается за один тап с главной оболочки. - **Тесты:** гостевое избранное по-прежнему claim после логина. #### P2-5. Instant confirmation — оба режима предусмотрены - **Проблема:** каждая заявка ждёт человека. - **Для кого:** обе стороны. - **Сейчас:** всегда requested. - **Сделать:** флаг объявления «подтверждать сразу», если календарь закрыт и нет пересечений; иначе не трогать. - **Зависимости:** P1-4; условия автоматического подтверждения нужно закрепить в настройках объявления. - **Готово когда:** юнит с флагом создаёт бронь сразу в `documents` (или согласованный статус) без кнопки владельца; без флага — как сейчас. - **Тесты:** overlap + instant не обходит lock. #### P2-6. Сохранённый поисковый запрос - **Проблема:** watch только на город. - **Для кого:** арендатор. - **Сейчас:** `watchCity`. - **Сделать:** **не начинать**, пока не закрыт P1-5. Затем: сохранить текущие query+фильтры, notice при новом listing-хите. Расширить city watch, не плодить второй inbox. - **Зависимости:** P1-5. - **Готово когда:** из поиска «сообщить, если появится»; срабатывает на `createListing` после модерации. - **Тесты:** не спамит на каждое обновление контура. #### P2-7. Быстрые ответы владельца - **Проблема:** типовые вопросы каждый раз с нуля. - **Для кого:** арендодатель. - **Сейчас:** свободный чат. - **Сделать:** 3–5 шаблонов в чате («сегодня свободны», «залог X», «встреча у метро»). - **Зависимости:** P1-1. - **Готово когда:** вставка текста, не автобот. - **Тесты:** сообщение сохраняется как обычное user message. #### P2-8. Честность Android-рефералки и сервисов - **Проблема:** нативные цифры 12/8/4250 ₽ расходятся с вебом. - **Для кого:** обе стороны на Android. - **Сейчас:** `ReferralScreen` MiniStat hardcoded; web `referralStats()`. - **Сделать:** те же числа, что веб, или убрать блоки. Не чинить весь паритет Android в P2. - **Зависимости:** нет. - **Готово когда:** нет зашитых KPI. - **Тесты:** ручной экран / снимок. #### P2-9. Переписка по тикету поддержки - **Проблема:** тикет — одно сообщение без ответа. - **Для кого:** обе стороны + админ. - **Сейчас:** create + смена статуса. - **Сделать:** простые реплики в том же тикете (не новый мессенджер). Связать «чат поддержки» копирайтом с тикетами, не с `/messages`. - **Зависимости:** нет. - **Готово когда:** пользователь видит ответ админа. - **Тесты:** contour addTicketMessage; права только стороны и админ. ### P3 Не делать, пока P1 не закрыт. Кратко, чтобы не изобретать заново: | ID | Задача | Зачем | Сейчас | Заметка | | -- | ------ | ----- | ------ | ------- | | P3-1 | Права PRO (не новый кабинет) | Компании проката | Покупка без entitlements | Сначала решить, нужен ли PRO; иначе **спрятать** тарифы | | P3-2 | Оплата буста | Продвижение | Буст уже ранжирует | Только после выбора провайдера PM | | P3-3 | Want-ad «ищу вещь» | Спрос без оффера | City watch | Отдельный рынок; не дублировать watch | | P3-4 | Комплекты / add-ons | Чек больше | Нет | Рано при 1 юнит = 1 listing | | P3-5 | Почасовая / долгая ставка | Гибкость | Только сутки | Ломает календарь и итог; не смешивать | | P3-6 | Несколько единиц / филиалы | Прокат | Нет | Другая модель инвентаря | | P3-7 | Push/email | Вернуть к ответу | Каналы в аудите | Имеет смысл после P1-1, это продукт «достучаться», не Kafka | | P3-8 | Реферальные выплаты | Рост | Учёт % от услуг | Без кассы платформы — только отчёт, как сейчас | | P3-9 | Расширенный AI | Скорость листинга | Уже есть разбор фото и поиск | Не центр плана | | P3-10 | Follow владельца | Возвращаемость | Нет | После P2-3, если избранного мало | --- ## 7. Рекомендуемый порядок разработки Не параллелить новый кабинет, новый мессенджер и PRO. 1. **P1-1** чат = канал договорённости (включая текст заявки). 2. **P1-6** чеклист статусов на существующей сделке (быстрый UX, снижает путаницу пока идут 3–5). 3. **P1-7** убрать ложные бейджи/сорт. 4. **P1-3** точка на карте при создании и редактировании. 5. **P1-4** дни недоступности в мастере. 6. **P1-2** встречные даты (опирается на чат и календарь). 7. **P1-5** пустой поиск. 8. **P2-3** repeat из истории. 9. **P2-1** похожие на PDP. 10. **P2-2** просмотры как правда. 11. **P2-4** вход в избранное. 12. **P2-7** шаблоны ответов. 13. **P2-8** Android реферал не врать. 14. **P2-9** ответы в тикетах. 15. P2-5 — реализовать оба режима подтверждения после календаря и фиксации правил автоматического подтверждения. 16. P2-6 — сохранённый поиск с уведомлением по новым совпадениям; пользователь сам включает подписку. 17. Push/email — предусмотреть in-app, email и browser push с настройками типов уведомлений; доставку подключать отдельной задачей. 18. PRO, платные услуги, want-ad и выплаты — только после отдельных продуктовых решений. Android: повторять те же P1 на уже существующих экранах Compose, **не** поднимать отдельный продукт. Исключение — P2-8 сразу, это баг доверия. --- ## 8. Зависимости между задачами ``` P1-1 (чат) ├── P1-2 (другие даты в том же диалоге) └── P2-7 (шаблоны) P1-3 (пин) └── P1-7 (distance имеет смысл только после пина / скрытия сорта) P1-4 (календарь в create) ├── P1-2 (предложение дат) └── P2-5 (instant book, если разрешите) P1-5 (пустой поиск) └── P2-6 (saved search) P2-3 (repeat) └── P3-10 (follow — опционально) PRO / оплата / want-ad / hourly / multi-unit └── ничего из P1; не начинать раньше решения PM ``` Существующие модули, на которые опираться, а не заменять: `applyContourAction`, `canCreateBooking`, `useCatalogListings`, `CityEmptyState`, `DealWorkspace`, `watchCity`, dual CRM. --- ## 9. Критерии готовности (сводка) См. поле «Готово когда» у каждой задачи. Общий критерий **пилота сценария**: Новый арендатор без демо-карточек: находит юнит в своём городе → пишет владельцу **или** шлёт заявку с текстом в чате → владелец предлагает другие даты или подтверждает → обе стороны видят один следующий шаг → фото выдачи → фото возврата → отзыв → из истории можно запросить тот же юнит. Новый арендодатель: публикует фото, цену, **свою** точку, закрытые дни → после модерации юнит на карте там, где указал → видит входящую заявку и отвечает не только «нет». Регрессы, которые нельзя сломать: нет двойной брони, гость не читает чужие чаты, KYC-копирайт не обещает OCR, деньги аренды не «принимаются» UI, AI не выдумывает юниты. --- ## 10. Вопросы владельцу продукта Без этих ответов часть бэклога нельзя честно брать в работу. 1. **KYC до первой заявки:** оставить ручной стоп (сейчас так) или разрешить заявку/чат, а выдачу держать до Verify? Это главный тормоз сценария A. 2. **Instant book:** нужен ли флаг «подтверждать сразу», или пилот всегда с живым «да» владельца (ближе к BlaBlaCar)? 3. **Деньги:** аренда по-прежнему только напрямую? Буст/PRO остаются бесплатной записью в контур или прячем витрину `/services`, пока нет провайдера? 4. **PRO:** реальные права (лимиты объявлений, сотрудники) или убрать маркетинговые тарифы, чтобы не обещать кабинет компаний? 5. **Гео пилота:** один город / список `CITIES` / свободный ввод города мира? От этого зависит P1-3. 6. **Want-ad («ищу дрель»):** нужен в этой волне или достаточно city watch + пустой поиск? 7. **Каналы связи:** достаточно in-app на пилот или нужен хотя бы email на «новая заявка» / «вам написали»? 8. **Подписка на владельца** vs усилить избранное и repeat — что ближе к «вернуться»? 9. **Android:** паритет P1 на тех же экранах или веб — источник правды, приложение догоняет позже? 10. **Галочка «Проверен» на юните:** это KYC владельца, модерация объявления или ручной бейдж? Сейчас смыслы смешаны (`listing.verified` vs `user.kyc`). --- ## Метод и ограничения аудита - Читались страницы `src/app/**`, контур `src/lib/contour.ts`, типы, каталог, deal-engine, CRM, Android `Store.kt` / экраны. - **Не** запускался полный ручной прогон всех 14 шагов A/B в этом аудите. - Не предлагается перепись стека, микросервисы, смена дизайн-системы, вторая библиотека компонентов. - Функции, которые уже есть, не стоят в бэклоге как новые. --- ## Сводная таблица | Функция | Статус сейчас | Что требуется | Приоритет | | ------- | ------------- | ------------- | --------- | | Главная лента | Работает | Не дублировать; общее состояние фильтров не трогать без нужды | — | | Поиск, фильтры, категории | Работает; транспорт-подкатегории пустые | Починить подкатегории вместе с поиском, не новым каталогом | P1-5 смежно | | Карта | Работает | Честные пины новых юнитов | P1-3 | | Карточка объявления | Работает | CTA «Написать»; похожие | P1-1, P2-1 | | Профиль владельца | Работает | Не считать responseRate живым; follow — вопрос PM | P3/вопрос | | Регистрация и вход | Работает | Не переделывать | — | | Создание объявления | Работает без гео и календаря | Пин + закрытые дни; не ставить verified | P1-3, P1-4, P1-7 | | Редактирование / пауза | Работает | Смена координат; resubmit rejected | P1-3, позже | | Календарь доступности | Работает после публикации | Внести в мастер | P1-4 | | Заявка на даты | Работает + KYC-гейт | Текст в чат | P1-1; KYC — вопрос 1 | | Подтверждение / отказ | Работает, отказ терминальный | Другие даты | P1-2 | | Instant book | Нет | Только после вопроса 2 | P2-5 | | Чат | Работает, вторичен на PDP | Сделать основным каналом | P1-1 | | Кабинеты / CRM | Работает, экраны дублируются | Не плодить третий кабинет | — | | Выдача / возврат | Работает | Чеклист статусов | P1-6 | | Документы и подпись | Работает как демо-флаг | Не имитировать УКЭП | — | | Отзывы | Работает | Repeat с истории | P2-3 | | Избранное | Работает, слабо видно | Вход в оболочке | P2-4 | | История просмотров | Нет; views не считаются | Сессионные просмотры | P2-2 | | Похожие | Нет UI | Блок на PDP | P2-1 | | Подписка на поиск | Нет; есть city watch | Сначала пустой поиск | P1-5 → P2-6 | | Уведомления | In-app | Не строить push без вопроса 7 | P3-7 | | Модерация | Работает | — | — | | KYC | Ручной, блокирует бронь | Решение PM | вопрос 1 | | Тикеты | Без треда | Реплики | P2-9 | | Android | Тот же контур, дыры | Не врать реферал; догонять P1 | P2-8 | | PRO / компании | Маркетинг | Спрятать или entitlements | вопрос 4 / P3-1 | | Буст | Ранжирование без оплаты | Честный копирайт уже есть; витрина — вопрос 3 | P3-2 | | Реферал | Код и отчёт на вебе | Android совпасть; выплаты не выдумывать | P2-8 / P3-8 | | AI поиск и листинг | Работает + mock | Не центр плана | P3-9 | | Мультиединицы, почасовка, комплекты, want-ad | Нет | Не в этой волне | P3 | | Доставка как логистика | Enum + заметка | Точка передачи в P1-3, не служба доставки | — |