Fetchly AI · Продуктовая спецификация · v1

Dog Journey: как собрать это в iOS

Интерактивный путь изучения своей собаки — без перегруза. Документ объясняет простым языком, из каких экранов состоит фича, как они работают и что нужно, чтобы их собрать. Все скриншоты — сгенерированные ч/б прототипы.

12 экранов SwiftUI прототипы: gpt-image-2 по мотивам PDF «Dog Journey — концепция»
Суть

Одна идея, которую нельзя потерять

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

В исходной концепции всё это показано как одна большая карта, которую можно таскать и масштабировать. На телефоне так делать не стоит: гигантская карта красива на слайде, но в руке она превращается в мелкие кнопки и вопрос «где я?». Duolingo прошёл этот путь и отказался от свободного дерева навыков в пользу простой вертикальной дорожки — прохождение выросло.

Главный принцип реализации

Карта — это данные, а не экран. Граф блоков с зависимостями лежит в JSON. А интерфейс показывает его тремя «окнами» разной подробности: одна карточка «что делать сейчас» → дорожка ветки → обзор всей карты.

УРОВЕНЬ 1

«Сегодня»

Главный экран. Одна рекомендованная карточка, ноль выбора. Сюда пользователь возвращается каждый день.

УРОВЕНЬ 2

Дорожка ветки

Вкладка Journey. Три ветки, внутри каждой — вертикальный путь из блоков. Обычный скролл, крупные кнопки.

УРОВЕНЬ 3

Обзорная карта

Вся карта одним взглядом, только для просмотра. Даёт ощущение масштаба пути — как и хотела команда.

Решение команды «карта видна целиком, включая будущие блоки» сохраняется: будущие блоки видны серыми на дорожке, а весь маршрут — на обзорной карте.

Экраны

12 экранов, по порядку пользовательского пути

Каждый экран: что видит пользователь → как это работает → из чего собирать. Компоненты названы стандартными средствами SwiftUI — почти всё здесь нативное, без самописной графики. Важно: в блоках нет квизов — вместо них шаг «проверь на своей собаке», три варианта которого показаны на экранах 06–06в.

Экран «Сегодня»: карточка Recommended now и прогресс трёх веток
01 · today
Экран 01

«Сегодня» — ежедневная точка входа

Что видит пользователь

Одну большую карточку «Recommended now»: какой блок пройти и почему он важен именно для его собаки. Ниже — «Продолжить», если бросил блок на середине, и три тонких полоски прогресса веток.

Как это работает

  • Рекомендация всегда одна. Её выбирает простое правило: самая слабая метрика собаки → ближайший доступный блок этой темы.
  • Никакого списка «всё, что можно сделать». Одна карточка = ноль паралича выбора.

Из чего собирать

ScrollView + VStack, карточки — обычные RoundedRectangle. Данные: поле recommended_block_id из манифеста карты.

Вкладка Journey: три карточки веток с прогрессом
02 · journey / branches
Экран 02

Journey — выбор ветки

Что видит пользователь

Общий прогресс («6 из 21») и три ветки: Health & body, Mind & behavior, Breed & lifestyle. На рекомендованной ветке — метка «Recommended». Внизу — ссылка «View full map».

Как это работает

  • Ветки параллельны: можно заниматься здоровьем и поведением одновременно — как зафиксировано в концепции.
  • Daily routines в первой версии не отдельная ветка: её действия (питание, уход) встроены в блоки трёх основных веток. Отдельной веткой станет во второй версии.

Из чего собирать

List или VStack из трёх NavigationLink. Прогресс считается из статусов блоков, ничего отдельно хранить не нужно.

Вертикальная дорожка ветки с узлами в разных состояниях
03 · journey / path
Экран 03

Дорожка ветки — сердце фичи

Что видит пользователь

Вертикальный путь из круглых узлов, как в Duolingo. Пройденные — закрашены с галочкой. Текущий — крупнее, с меткой «Now». Будущие — серые пунктирные с замочком, но с видимыми названиями: масштаб пути понятен заранее.

Как это работает

  • Тап по любому узлу открывает шторку-превью (экран 04). По заблокированному — шторка объясняет, что пройти сначала.
  • Экран открывается со скроллом к текущему узлу, а не к началу.

Из чего собирать

ScrollView + LazyVStack, соединительная линия — простая Shape между узлами. Никакого канваса, зума и физики. Это обычный список с красивыми ячейками — VoiceOver и Dynamic Type работают бесплатно.

Шторка-превью блока с тремя строками и кнопкой Start
04 · node preview sheet
Экран 04

Шторка-превью блока

Что видит пользователь

Ровно три строки: что узнает → почему это важно именно для его собаки → какое действие сделает. И кнопка «Start · 4 min» с честной оценкой времени.

Как это работает

  • Персональная строка («Impulse Control 22 — самая слабая метрика») подставляется из AI-портрета собаки. Это то самое «почему блок важен для конкретного питомца» из концепции.
  • Три строки — жёсткий лимит. Если хочется четвёртую, текст переехал из превью в теорию.

Из чего собирать

.sheet + presentationDetents([.medium]). Самый дешёвый экран документа.

Карточка теории с иллюстрацией и коротким текстом
05 · block / theory
Экран 05

Теория — карточки, а не статья

Что видит пользователь

3–5 карточек по 2–3 предложения, листаются свайпом. Одна мысль — одна карточка. Наверху точки прогресса, всегда виден выход.

Как это работает

  • Правило объёма: блок целиком проходится за 3–5 минут. Если теория не влезает — это два блока, а не длинная теория.
  • Формулировки — по правилам безопасности из концепции: без диагнозов, без ярлыка «агрессия».

Из чего собирать

TabView со стилем .page. Контент — из CMS/JSON, картинки — простые line-иллюстрации.

Почему без квизов

Квиз проверяет память («что ты запомнил про собак вообще») и в приложении уже приелся. Вместо него — шаг «Проверь на своей»: пользователь применяет только что изученное к собственной собаке одним тапом или жестом. Понимание проверяется применением, «неправильно» не существует, а каждый ответ становится датированной записью в профиле — растёт та самая «глубина профиля» из концепции. В блоке по-прежнему ровно одно взаимодействие: нагрузка не выросла, наоборот — работает узнавание, а не припоминание.

Визуальный самоскрининг: три силуэта кондиции тела, вопрос «что похоже на Q?»
06 · check / self-screen
Экран 06 · проверка, вариант А (дефолт)

«Найди у своей» — визуальный самоскрининг

Что видит пользователь

3–4 крупные картинки-эталона из только что изученной теории (силуэты кондиции тела, оттенки дёсен, состояние шерсти) и один вопрос: «Что больше похоже на Q сейчас?» Один тап — готово.

Как это работает

  • Это тот же чек понимания: чтобы выбрать, нужно распознать концепт из теории. Но ответ — не балл, а датированное наблюдение в профиле (кондиция тела, состояние шерсти).
  • «Неправильно» не существует. Тревожный выбор мягко ведёт дальше: «стоит показать ветеринару на плановом визите» — без красных алармов.
  • Обязательная подпись: «Это наблюдение, не диагноз».

Из чего собирать

3–4 переиспользуемых шаблона (карточки-эталоны, живая шкала-слайдер) на весь контент. Выбор пишется в профиль как observation с датой.

Проверка руками: зажмите лакомство в кулаке, три кнопки-исхода
06б · check / hands-on
Экран 06б · проверка, вариант Б (Health, собака рядом)

«Проверь прямо сейчас» — 30 секунд с собакой

Что видит пользователь

Одну карточку-инструкцию («Зажмите лакомство в кулаке — что сделает Q?», «Потрогайте уши — тёплые или горячие?») и три крупные кнопки-исхода. Любой исход раскрывает интерпретацию: «что это говорит о вашей собаке».

Как это работает

  • Сильнейший вариант для Health-ветки: проверка понимания и реальное действие блока сливаются в один шаг — блок становится даже короче, чем с квизом.
  • Обязательна честная кнопка «Q не рядом — напомнить позже» без чувства вины: блок сохраняется, вечером приходит мягкий пуш, проверка закрывается одним тапом.
  • Только заведомо безопасные проверки; темы здоровья — с подписью «не заменяет ветеринара».

Из чего собирать

Карточка + три кнопки, отложенный пуш через UNUserNotificationCenter. Исход пишется в профиль как поведенческий маркер с датой.

Прогноз: слайдер «сколько секунд Q выдержит команду ждать» с зоной нормы
06в · check / predict
Экран 06в · проверка, вариант В (Mind, раз в 2–3 блока)

«Прогноз» — сначала предскажи, потом проверь

Что видит пользователь

Один слайдер: «Сколько секунд Q выдержит команду "ждать"?» После ответа раскрывается ориентир для породы и возраста, и кнопка «Проверим?» ведёт прямо в действие блока.

Как это работает

  • Прогноз создаёт личную ставку («а я угадал?») — любопытство вместо экзамена. Промах — не фейл, а интрига; большая дельта подаётся тепло: «теперь знаете точно».
  • Дельта «ожидание/факт» — уникальные данные: насколько владелец знает свою собаку. Со временем из неё можно собрать отдельную метрику знакомства с питомцем.
  • Вопросы — «на перенос» (применение, смежный факт), не дословно из теории, иначе это снова квиз.

Из чего собирать

Slider + карточка-раскрытие. Прогноз и факт пишутся парой в профиль.

Форма сохранения веса с крупным полем и авто-зачётом
07 · block / action
Экран 07

Действие — момент, ради которого всё

Что видит пользователь

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

Как это работает

  • Это существующие экраны приложения, открытые в контексте блока. Ничего нового не пишем — переиспользуем формы веса, вакцин, документов.
  • Авто-зачёт: если данные уже есть (вес вносили раньше), показываем «Нашли 2 записи — засчитать автоматически». Правило из концепции: не заставлять вводить повторно.
  • Без действия блок не считается пройденным — это главное отличие от «просто почитал».

Из чего собирать

Существующие формы + обёртка «шаг блока». Флаг завершения действия пишется в статус блока.

Экран завершения блока: что изменилось и что открылось
08 · block / done
Экран 08

Результат — что изменилось и что дальше

Что видит пользователь

Галочку, список «что изменилось» (курс начат, вес добавлен в историю) и один следующий открывшийся блок с кнопкой «Continue».

Как это работает

  • Показываем один следующий шаг, а не три. Хочет выбрать сам — вернётся на дорожку.
  • Здесь же назначается отложенный возврат, если блок его предполагает: «взвесьте Q через 2 недели» → пуш → блок Progress review.

Из чего собирать

Простой экран + UNUserNotificationCenter для отложенного пуша. Лёгкая хаптика .success, без конфетти-шоу.

AI-расшифровка портрета: карточки-инсайты по метрикам
09 · ai interpretation
Экран 09

AI-расшифровка — самый первый блок

Что видит пользователь

Карточки-инсайты по метрикам его собаки: «Bond 55 — Q проверяет, где вы, на прогулке: хорошая ориентация на человека». В конце — «Recommended first» и кнопка «Show my path».

Как это работает

  • Это первое, что человек видит после онбординга. Правило концепции: карта начинается с нового знания, а не с повтора анкеты.
  • Текст генерируется один раз при создании собаки и кешируется. Формулировки проходят правила безопасности (мягкие, без диагнозов).
  • Кнопка «Show my path» открывает дорожку — так пользователь впервые попадает на Journey уже понимая, почему маршрут именно такой.

Из чего собирать

Те же карточки-страницы, что и теория (TabView). Контент — один вызов LLM на регистрацию, хранится с профилем.

Обзорная карта: три вертикальные линии веток целиком
10 · full map
Экран 10

Обзорная карта — витрина масштаба

Что видит пользователь

Всю карту одним взглядом: три линии веток, закрашенное пройденное, метка «Now», чекпоинт, где ветки сходятся. Подпись «6 of 21 completed».

Как это работает

  • Только просмотр: тап по узлу открывает ту же шторку-превью, никакого перетаскивания и зума.
  • Это эмоциональный экран («сколько мы уже прошли!») и место, где видны связи между ветками. Открывается по кнопке — не является основной навигацией.
  • Во вторую версию: шеринг картинкой — «путь Q за 3 месяца».

Из чего собирать

Один Canvas-рендер по заранее посчитанным координатам из манифеста. Строится за вечер, потому что интерактив минимальный.

Правила

Состояния блока

Ровно четыре состояния, как в концепции. Состояние не хранится — оно вычисляется из прогресса и зависимостей.

CompletedТеория пройдена, проверка «на своей» сделана, действие выполнено (или засчитано автоматически).
Recommended nowОдин на всю карту. Выбирается правилом: слабая метрика → приоритет владельца → порядок ветки.
AvailableМожно открыть прямо сейчас, но это не текущий приоритет.
LockedНазвание и описание видны. Шторка честно показывает, что пройти сначала, со ссылкой на нужный блок.

Флоу одного блока

Каждый блок — законченный мини-сценарий на 3–5 минут. Шесть шагов концепции складываются в пять экранов.

1Превьюшторка: что узнаю, почему важно для Q, какое действие
2Теория3–5 карточек свайпом, одна мысль на карточку
3Проверь на своейсамоскрининг, проверка руками или прогноз — один жест
4Действиереальная функция приложения или авто-зачёт
5Результатчто изменилось + один следующий шаг
Данные

Карта — это один JSON-манифест

Манифест генерируется один раз при регистрации собаки (возраст, порода, метрики портрета) и дальше не перестраивается — меняются только статусы. Это в точности решение команды «карта стабильна».

{
  "dog_id": "q-123",
  "age_range": "puppy_4_8m",
  "recommended_block_id": "impulse-control",
  "branches": [
    {
      "id": "mind",
      "title": "Mind & behavior",
      "blocks": [
        {
          "id": "impulse-control",
          "title": "Impulse control",
          "needs": ["behavior-basics"],       // что пройти сначала
          "theory": "cms://impulse-101",      // карточки теории
          "check": {
            "type": "predict",                // или self_screen, hands_on
            "content": "cms://impulse-predict",
            "fallback": "self_screen"         // если собака не рядом
          },
          "action": {
            "type": "start_course",           // или save_weight, add_vaccine...
            "course_id": "impulse-course",
            "auto_complete_if": "course_started"  // правило авто-зачёта
          },
          "personal_note": "Impulse Control 22 — самая слабая метрика Q"
        }
      ]
    }
  ]
}

Статус блока приложение считает само: completed = теория + проверка «на своей» + действие; locked = не все needs закрыты; recommended = совпал с recommended_block_id; иначе available.

Запуск

Что в первую версию, что потом

V1 — проверяем идею
  • Один возрастной диапазон (щенки), 3 ветки × 5–7 блоков
  • Все экраны, кроме обзорной карты: «Сегодня», ветки, дорожка, шторка, флоу блока с проверками «на своей», AI-расшифровка
  • Два шаблона проверки на старте: самоскрининг + проверка руками (прогноз — чуть позже)
  • Рекомендация простым правилом (без ML)
  • Только существующие функции приложения как действия
  • Авто-зачёт, если данные уже есть
V2 — усиливаем
  • Экран 10: обзорная карта + шеринг пути
  • Чекпоинты слияния веток
  • Daily routines как отдельная ветка
  • Диалог с AI-кинологом внутри блоков
  • Ещё форматы проверок: свайп AI-гипотез «Похоже на моего?», мини-сценарии «что сделаешь?», фото-чек с AI-разбором, «если—то» планы в финале ключевых блоков
  • Пуш-петля возврата («взвесьте через 2 недели» → Progress review)
  • Остальные возрастные диапазоны
Метрики

Как поймём, что работает

Шесть показателей из концепции, переведённые в конкретные события аналитики.

СобытиеЧто измеряетПоказатель из концепции
journey_openedОткрыл карту / вкладку JourneyНачало пути
ai_interpretation_completedДочитал AI-расшифровку до концаНачало пути
block_started / block_completedНачал и завершил блок целикомОбучение
check_completed (type)Сделал проверку «на своей» (самоскрининг / руками / прогноз); для прогноза пишется дельта ожидание/фактОбучение + Глубина профиля
action_completed (type, first_time)Сделал действие; first_time — впервые воспользовался функцией через JourneyИзучение функций
course_started_from_journeyНачал курс после объяснения проблемыПрактика
profile_records_addedСколько данных о собаке появилось через картуГлубина профиля
journey_return_d7Вернулся к карте в течение неделиВозврат
Критерий успеха

Пользователь понимает, почему ему предлагают следующий шаг, открывает функции в правильном контексте и постепенно собирает полноценную историю своей собаки. Если действия не делаются (только чтение) — фича не работает, сколько бы блоков ни проходили.

Команде

Чеклист следующих шагов

  1. Утвердить структуру трёх веток и порядок первых 5–7 блоков в каждой (контент уже есть — берём из текущих материалов).
  2. Написать контент блоков для одного возрастного диапазона: теория-карточки, проверки «на своей» (эталоны-картинки, инструкции 30-секундных проверок, вопросы-прогнозы), персональные строки.
  3. Согласовать правила безопасных формулировок AI-расшифровки (без диагнозов, без ярлыков).
  4. Связать каждый блок с конкретным действием и правилом авто-зачёта.
  5. Собрать кликабельный прототип из этих 10 экранов и прогнать на 5–7 владельцах: понимают ли маршрут, делают ли действия.
  6. Разработка V1: манифест + дорожка + флоу блока (оценочно 3–4 недели одной паре iOS + бэкенд).
  7. Запуск на часть аудитории, смотрим воронку block_started → action_completed.