Раскадровка бота — каждый экран и кнопка

Не схема-набросок, а сам бот: каждый блок — реальное сообщение целиком и реальные кнопки, как увидит пользователь. Стрелки подписаны нажатой кнопкой, показаны все ветки ответов. Тексты текущей логики — дословно из кода; целевой — по согласованному спеку. Оранжевым помечено, что меняем.

A · Онбординг (цель)A · Онбординг (код)B · УтроC · ТренировкаD · ЛогированиеE · ПланF · МенюG · РасписаниеРасхождения
A · Онбординг — ЦЕЛЕВАЯ

Сбор данных: точка А → точка Бцелевая · согласуем

Согласованный редизайн (спек §2c). На каждом шаге — узкие кнопки или строго валидируемый формат с переспросом. Усилие тапается (описания в тексте бота). Темп — персональные кнопки уже ПОСЛЕ замера формы: невозможную цель выбрать нельзя.
🧮 Зачем каждый вопрос — что он даёт плану: обычный бег + усилие → форма (VDOT), из неё считаю темпы всех тренировок · длинный бег + усилие → стартовая длинная и выносливость + сверка формы · объём → старт плана и потолок роста (≤10%/нед) · дни → на сколько частей режу недельный объём. Ни одно число не лишнее.
T1 · дистанция
Привет 👋 Я твой беговой коуч. Построю план под твою цель и каждый день буду подстраивать его под восстановление. На какую дистанцию бежим?
5 км10 км21.1 км42.2 км
▼ нажал «21.1 км»
T2 · дата · строгий формат
Когда забег? Напиши дату в формате ДД.ММ.ГГГГ — например 29.08.2026.
ввёл «в конце августа» — формат не тот
Не понял дату 🤔 Нужен формат ДД.ММ.ГГГГ, например 29.08.2026.
→ переспрашиваем, пока не введёт корректно
ввёл «29.08.2026» — ок
📅 29 августа 2026 · до гонки 10 недель → дальше
T3 · бег 1 · км
Теперь измерим твою форму — по одному обычному недавнему бегу. Сколько километров? Напиши числом — например 4.5.
▼ нажал «4.5»
T4 · бег 1 · время
За сколько пробежал эти 4.5 км? Формат ММ:СС — например 25:00.
▼ нажал «25:00»
T5 · бег 1 · усилие
Теперь измерим твою форму по этому бегу. Как он ощущался? 🟢 Спокойно (восстановительный) • дыхание носом, ровное · речь — болтал бы свободно · в конце мог бы пробежать ещё столько же 🟡 Бодро, но комфортно (выносливость) • дыхание чуть глубже, под контролем · речь — целыми предложениями с паузами · в конце пробежал бы ещё немного 🟠 Тяжело (порог) • дыхание ртом, частое · речь — только короткие фразы · в конце хватило бы ещё на 10–15 минут 🔴 Максимум (гонка) • дыхание на пределе · говорить не мог · выложился полностью, как на гонке
🟢 Спокойно🟡 Бодро
🟠 Тяжело🔴 Максимум
➕ Я знаю свой пульс
нажал «🟠 Тяжело»
⚙️ усилие → VDOT (форма)
темп 4.5 км / 5:33, доля порога f=0.88 → VDOT 35.9. (Тот же бег как 🔴 дал бы 33.6, как 🟢 — 45.2. Усилие — решающий множитель.)
нажал «➕ Я знаю свой пульс»
Введи средний пульс за тот бег — например 165.
▼ нажал «165»
⚙️ пульс → зона → VDOT
165 / макс ~187 = 88% → зона Z4 (порог) → VDOT 35.9 (тот же результат, точнее)
T6 · бег 2 · длинная → старт длинной
Теперь — самый длинный бег за последний месяц. По нему пойму, с какой длинной стартует план и насколько ты уже вынослив (длинную нельзя растить быстрее ~2 км/нед). Сколько километров?
до 55–1010–15
15–2020+
▼ нажал «10–15»
T7 · бег 2 · усилие (сверка формы)
Как ощущалась эта длинная — на том же языке, что и первый бег? Сверю одно с другим, так точнее пойму твою форму.
🟢 Спокойно🟡 Бодро🟠 Тяжело
▼ нажал «🟡 Бодро»
T8 · объём → старт + потолок роста
Сколько примерно набегаешь в неделю сейчас? От этого числа считаю старт плана и безопасный рост — не больше +10% в неделю.
до 1515–2525–40
40–6060+
▼ нажал «15–25»
T9 · дней/нед → деление объёма
Сколько дней в неделю готов бегать? На столько частей раскладываю недельный объём.
3456
▼ нажал «5»
⚙️ Вердикт выполнимости (домен B) считается здесь, ПОСЛЕ замера формы — и темп ниже предлагается только в выполнимых вариантах.
T10 · целевой темп · персональные кнопки
Прикинул твою форму (VDOT 35.9) и срок (10 недель). Вот реальные цели на дистанции:
🎯 6:00 /км — амбициозно
🏁 Просто добежать
Быстрее ~5:24 /км в кнопках нет: форму за 10 недель столько не нарастить — и бот честно об этом пишет строкой, а не прячет за кнопкой.
▼ нажал «🎯 6:00 /км — амбициозно»
T11 · план + согласование
Готово, план собран 🎯 10 недель: база → развитие → пик → подводка. Рост ≤10%/нед, каждая 4-я неделя разгрузочная, длинная растёт до ~14 км. Первая неделя: Лёгкий 5 · Темпо 6 · Лёгкий 5 · Длинная 10 · Лёгкий 4. Согласуем?
✅ Согласовать
✏️ Изменить план
нажал «✅ Согласовать»
Договорились 🤝 Тренировки не висят на днях недели — это набор сессий. Каждое утро спрошу «бежим или отдых?» и подберу лучшую из остатка. Завтра в 07:00 напишу первым с планом на день.
→ дальше каждый день: домен D / E
нажал «✏️ Изменить план»
Что поправить? Каждая кнопка — ровно один рычаг, никакого «ИИ перепридумал план»:
Меньше тренировокОбъём
Темп не мойДлинная великовата
Больше скорости
Меньше тренировокменяет дней в неделю ↓
меньше пробежек, каждая длиннее
Объёмменяет текущий объём ↕
масштабируется весь недельный объём
Темп не мойменяет пере-замер формы (бег + усилие) или пульс
сдвигаются все темпы тренировок
Длинная великоватаменяет доля и потолок длинной ↓
длинная растёт медленнее
Больше скоростименяет число/тип жёстких ↑
больше темпо и интервалов
→ нажал кнопку → меняю один вход профиля → build_plan пересобирает план целиком → снова показываю его с [✅ Согласовать / ✏️ Изменить] (шаг T11)
A · Онбординг — ТЕКУЩАЯ

Как бот спрашивает сейчас (в коде)текущая · в коде

Дословно из handlers.py. Отличия от целевой помечены оранжевым: форму берёт из «теста», а не из двух бегов + усилия; целевой темп спрашивает рано и общим списком.
C1
Привет 👋 Я твой беговой коуч. Помогу подготовиться к гонке: построю план и буду подстраивать его под твоё восстановление каждый день.
🔬 На чём основан расчёт
· дистанция
Давай поставим цель. Какая дистанция?
5 км10 км21.142.2
▼ нажал «21.1»
· дата · календарь + текст
Полумарафон — отличная цель: достаточно серьёзно и реально подготовиться.
Когда гонка? Выбери дату в календаре 👇 Или просто напиши — например «29.08.2026» или «29 августа».
⚠️ Здесь текущая логика спрашивает целевой темп до замера формы и общим списком — в целевой это шаг T10 после формы, персональными кнопками.
· целевой темп (рано)
До гонки 10 недель. Какой темп хочешь держать на дистанции? Это точка Б — по ней проверю реалистичность.
5:00–5:30 /км5:30–6:00 /км
6:00–7:00 /кммедленнее 7:00
просто добежать
▼ нажал «6:00–7:00 /км»
· форма · тест
Был за последние пару месяцев забег или тест на время? Это самый точный вход, чтобы оценить твою форму.
Да, был забег/тестНет
нажал «Да, был забег/тест»
Напиши дистанцию и время — например «5 24:30» или «10 50:00».
▼ нажал «5 24:30»
Принял: 5 км за 24:30 ⏱
нажал «Нет»
→ сразу к объёму
· объём
Сколько примерно набегаешь в неделю сейчас? Это нужно, чтобы рост был безопасным. Выбери ближайший диапазон (на границе бери больший), или впиши точно ✍️. Если подключён Strava — потом уточню по нему.
Меньше 10 км10–20 км
20–35 км35+ км
✍️ Ввести точно← Назад
▼ нажал «20–35 км»
· длинная
Какую дистанцию пробегал без остановки за последний месяц? На границе (например ровно 8 км) бери больший вариант, или впиши точно ✍️.
до 55–88–1212+
✍️ Ввести точно← Назад
▼ нажал «8–12»
· дней/нед
Сколько дней в неделю готов бегать?
234567
← Назад
▼ нажал «5»
· дни недели
Какие дни недели тебе удобно бегать? Отметь — потом можно поменять. Тренировки не привязаны жёстко к дням, это просто ориентир.
ПнВтСрЧтПтСбВс
← НазадГотово ▸
▼ нажал «Готово ▸»
· травмы
Есть травмы или что-то, что мешает бегать?
Нет, всё окДа, расскажу…
нажал «Да, расскажу…»
Расскажи, что беспокоит — пару слов.
▼ нажал «свободный текст»
нажал «Нет, всё ок»
→ к саммари
· саммари
Секунду, сверяюсь со Strava… 👀
Вот что я понял про тебя — поправь, если что не так: 🎯 21.1 км · 29 августа 2026 · через 10 недель Целевой темп: 6:00–7:00 /км Сейчас: • Объём ~27 км/нед • Длинная до 10 км • Привычный темп ~6:00 /км Всё так?
✅ Да, верно✏️ Поправить
нажал «✏️ Поправить»
Ок, давай заново — внимательнее.
→ перезапуск с дистанции
нажал «✅ Да, верно»
→ вердикт точка А → Б
· вердикт
Минуту, собираю план… 🧮
Точка А → Б. Сейчас бежишь спокойно ~6:00 /км, объём ~27 км/нед. Цель — 6:00–7:00 /км. Честно: за этот срок это реально.
🎯 Строим под цель
📉 Поставить реалистичнее
⚠️ Вердикт — это engine._assess_realism (3 исхода: реально / амбициозно / риск). В целевой — calculator.feasibility с двумя замками и причиной (домен B).
▼ нажал «🎯 Строим под цель»
· интро коуча + план
Готово, план собран 🎯 Прежде чем начнём — коротко, как мы будем работать. Моя задача — довести тебя до 21.1 км 29 августа 2026 здоровым, без травм. ☀️ Каждое утро смотрю твой recovery из WHOOP и спрашиваю самочувствие. 🎛 План живой. Не восстановился — двигаю тренировки. Цель важнее расписания. 💬 Говори честно. «Тяжело», «болит» — это данные, а не нытьё. 🛡 Безопасность вперёд. Не дам делать две тяжёлые подряд.
📊 Открыть мой план
⏰ Когда писать по утрам? (7:00)
🌅 План на день✍️ Занести тренировку
B · Каждое утро — адаптация

Recovery + самочувствие → нагрузкатекущая · вшито

Дословно из scheduler.py / morning.py. Структуру держит код (adaptation.decide), не уговоры. Работает и без WHOOP — тогда решает самочувствие.
M1 · 07:00 · самочувствие
Доброе утро! 🌅 Как себя чувствуешь сегодня? Это поможет мне настроить тренировку под тебя.
😴😐🙂😀🔥
😴=плохо · 😐=так себе · 🙂=нормально · 😀=хорошо · 🔥=отлично
▼ нажал «выбрал самочувствие»
⚙️ decide(recovery, mood, тип сегодня)
Лёгкий день / отдых → ok. Иначе тяжёлая: recovery ≤33 → смягчаем · recovery 34–66 и самочувствие ≤3 → смягчаем · нет WHOOP и самочувствие ≤2 → смягчаем · recovery ≥67 / бодр → по плану.
день отдыха
Сегодня день отдыха — восстанавливаемся 😴 Тело строится в покое.
тяжёлая + ты свеж (ok)
recovery 75% — отличное восстановление. Сегодня по плану длинная 12 км, тело готово. 🏃
✅ Принять
🏃 Что за тренировка?
«✅ Принять»
Отлично, вперёд! 💪 Вот сегодняшняя тренировка — разбор ниже 👇
→ сразу шлёт подробную карточку (домен C)
«🏃 Что за тренировка?»
→ подробная карточка тренировки (домен C)
тяжёлая + низкий recovery (смягчаем)
Сегодня по плану — Интервалы (тяжёлая). Но recovery 35% + ты отметил «так себе» — два сигнала вниз.
Гнать интенсивную на невосстановленном теле — не прогресс, а шаг к травме. Безопаснее смягчить и перенести скорость на день, когда восстановишься.
Что делаем?
🟢 Полегче — лёгкий 5 км
💪 По плану
😴 Отдых
▼ нажал «из ветки «смягчаем»»
«🟢 Полегче»
Готово. Сегодня — Лёгкий 5 км. Интервалы сдвинул на четверг — там восстановление должно быть лучше. Объём недели держим. Почему так: не гружу тяжёлым на низком recovery и не ставлю 2 тяжёлых подряд.
«💪 По плану»
Идём по плану 💪 Доверяй процессу — слежу, чтобы не было перегруза.
«😴 Отдых»
Принято — сегодня отдыхаем. Тело строится в восстановлении, не в беге. Почему так: на низком recovery отдых полезнее через силу.
📋 Как только тренировка взята (Принять / Полегче / По плану) — бот сразу шлёт подробную карточку: что это, как бежать (разминка / работа / заминка), темп и пульс, почему именно сегодня. Описание не прячем за кнопкой — это домен C. Только при «Отдых» карточки нет.
C · Что за тренировка

Карточка тренировки + 7 видовтекущая · вшито

По кнопке «🏃 Что за тренировка?» бот шлёт карточку (что / как бежать / темп+пульс / почему / дальше). Дальше — все 7 типов с описанием, которое бот показывает в плане.
C1 · карточка тренировки
Сегодня — Интервалы · 6 км Что это: чередование быстрых отрезков и восстановления — поднимает порог, после которого ноги забиваются. Как бежать: 🔥 разминка 1.5 км ⚡ 6 × 400 м быстро / 200 м трусцой 🧊 заминка 1.5 км Темп и пульс: 5:05 /км · зона 5 (максимум) Почему сегодня: recovery 75% — ты свеж, единственная скоростная на неделе. Дальше: Ср — Лёгкий 5 км, Чт — отдых
✅ Сделал — оценить
🔄 Перенести📱 Открыть в приложении
▼ нажал «✅ Сделал — оценить»
· оценка RPE
Как далась?
😀 Легко🙂 Норм
😮‍💨 Тяжело🥵 На пределе
Все 7 видов тренировок — описание, которое бот объясняет в плане и карточке:
🏃 Лёгкий
расслабленный бег в разговорном темпе — строит аэробную базу и ускоряет восстановление.
🏞 Длинная
самый длинный бег недели в лёгком темпе — развивает выносливость и жировой обмен.
🔥 Темпо
продолжительный отрезок в умеренно-тяжёлом темпе — поднимает лактатный порог, после которого темп «встаёт».
⚡ Интервалы
чередование быстрых отрезков и восстановления — поднимает порог, после которого ноги забиваются.
🌀 Фартлек
«игра скоростью»: чередуй быстрые и лёгкие участки по самочувствию — скорость без жёсткого давления.
⛰ Горки
повторы в гору на усилии — строит силу ног и экономичность бега без ударной нагрузки.
📈 Прогрессия
старт в лёгком темпе, финиш быстрее темпового — учит бежать быстро на усталых ногах.
Если сегодня отдых — отдельная карточка:
· карточка отдыха
😴 Сегодня — отдых Сегодня не бежим — и это часть плана, а не пропуск. Почему важно: мышцы крепнут не в беге, а в восстановлении между пробежками. Пропустишь отдых — копится усталость и растёт риск травмы. Если очень хочется двигаться: 10–15 мин растяжки, прогулка или 1–2 км очень медленно в зоне 1. Без скорости и без длины.
📱 Открыть в приложении
D · Занести тренировку

Логирование: авто / вручную / не бегалтекущая · вшито

Кнопка «✍️ Занести тренировку». Все ветки — дословно из кода.
L1
Окей. Подтянуть автоматически или внесёшь вручную?
🔄 Из WHOOP + Strava
✍️ Вручную
«🔄 Из WHOOP + Strava»
Нашёл пробежку за 25 июня: Strava: 8 км, темп 6:10 WHOOP: strain 12.4, пульс 148 Это была Лёгкий по плану. Как далась?
😀 Легко🙂 Норм
😮‍💨 Тяжело🥵 На пределе
«✍️ Вручную»
Сколько километров? Напиши числом — например 5 или 8.5.
8 — как в планеНе бегал сегодня
▼ нажал «8 — как в плане»
Принял, 8 км. Как далась?
😀 Легко🙂 Норм
😮‍💨 Тяжело🥵 На пределе
«Не бегал сегодня»
Окей, бывает — без вины. Перенести или пропустить?
🔄 Перенести⏭ Пропустить
«🔄 Перенести»
Перенёс — поймаем в другой день. Объём недели держу, ничего не теряем.
«⏭ Пропустить»
Пропустили — не страшно, идём дальше по плану. Завтра новый день.
▼ нажал «выбрал оценку»
· итог · RPE
Записал ✅ 8 км — норм. Отмечаю выполненной в плане. Раз идёт легко — следующие тренировки оставляю по плану.
E · Мой план

Просмотр плана и подсказкитекущая · вшито

Кнопка «📊 Открыть мой план» / /plan. Недели — раскрывающиеся блоки.
P1 · шапка плана
🏃 Твой план готов 🎯 Полумарафон — 21.1 км 📅 29 августа 2026 · через 10 недель 5 пробежки в неделю · всего ≈ 240 км Где ты сейчас → куда идём
Сейчас бежишь спокойно ~6:00 /км. Цель — спокойно и уверенно добежать дистанцию.
Как устроен план База · нед 1–4 — спокойный объём, фундамент Развитие · нед 5–6 — темпо и интервалы Пик · нед 7–8 — самые длинные и качественные Перед стартом · нед 9–10 — снижаем объём
📖 Как читать план
❤️ Темпы и зоны
Каждая неделя — раскрывающийся блок:
· неделя (раскрыта)
Неделя 1 · База · 20 км · 5 пробежек • Лёгкий — 5 км · 6:39 /км · зона 2 • Темпо — 6 км · 5:33 /км · зона 4 • Лёгкий — 5 км · 6:39 /км · зона 2 • Длинная — 10 км · 6:39 /км · зона 2 • Лёгкий — 4 км · 6:39 /км · зона 2 Зачем неделя: закладываем аэробную базу.
«📖 Как читать план»
📖 Как читать план Лёгкий — спокойный бег, можешь болтать на ходу. Тяжело = бежишь слишком быстро. Длинная — самый долгий бег недели, медленный. Цель — время на ногах. Темпо — долгий отрезок «комфортно-тяжело». Интервалы — короткие быстрые куски через отдых. Горки — повторы в подъём на усилии.
«Длинная 10 км · 6:30–6:50 /км · зона 2» → пробежать 10 км в спокойной зоне 2.
«❤️ Темпы и зоны»
❤️ Пульсовые зоны Зона 1 — очень легко · разминка Зона 2 — легко, разговорный · основная база, 80% бега Зона 3 — средне Зона 4 — тяжело · темпо, горки Зона 5 — максимум · интервалы
⚖️ 80/20: 80% времени легко (зоны 1–2), 20% тяжело. Так форма растёт без травм.
F · Меню

Команда /menu — все действиятекущая · вшито

MENU
⚙️ Чем могу помочь?
🎯 Новая цель
🔄 Пересобрать план
⏰ Время по утрам
🔬 На чём основан расчёт
🔌 Переподключить WHOOP/Strava
🗑 Сбросить всё
«🎯 Новая цель»
Ок, ставим новую цель 🎯 Давай заново.
→ онбординг
«🔄 Пересобрать план»
Пересобираю план… 🧮
Пересобрал план 🔄
📊 Открыть план
«⏰ Время по утрам»
Когда писать по утрам?
06:0007:0008:0009:00
«🗑 Сбросить всё»
⚠️ Это удалит твой профиль и весь план. Начнём заново?
✅ Да, сбросить❌ Отмена
«✅ Да, сбросить»
Готово — профиль и план удалены 🗑 Твои данные WHOOP и Strava сохранены — только цель и план обнулились. Поехали заново 👇
«❌ Отмена»
Отменено 🙂
G · Плавающее расписание

Бежим или отдых — выбор каждый деньцелевая · ещё не вшито

Спек §6b. Сессии недели не висят на днях — это набор (bucket). Сейчас бот ставит сессии по фикс-дням + сдвигает адаптацией (домен B); это — следующий шаг.
G1 · утро · выбор дня
Доброе утро! 🌅 recovery 68%. Бежим сегодня или отдых?
🏃 Бежим😴 Отдых
«😴 Отдых»
Принято, сегодня отдых 😴
≤2 отдыха подряд — на 2-й бот мягко предупредит
«🏃 Бежим»
⚙️ suggest_session(остаток, дни, streak, recovery)
ценное вперёд: длинная > качество > лёгкое · блок жёсткого при 2 жёстких подряд или низком recovery · длинная не падает с конца недели
Лучшее на сегодня из остатка недели — Длинная 12 км. Можно свапнуть на другую.
✅ Беру🔁 Другую
🟢 Полегче😴 Передумал, отдых
Конец недели (много отдыхал — дней не хватило): бережём длинную и качество, лишние лёгкие сгорают. Перенос на след. неделю не делаем — каждая неделя считается заново от рампы объёма (week_dropouts).
Расхождения

Что меняем: текущая → целевая

БлокСейчас (в коде)Целевая (согласуем)
Замер формыБерёт VDOT из «теста» или темпа Strava; усилие не спрашивает.Два бега (обычный + длинный) + усилие 🟢🟡🟠🔴 или пульс → VDOT по формуле.
Целевой темпСпрашивается рано, общим списком диапазонов (до замера формы).После замера — персональные кнопки, только выполнимые + «просто добежать».
Вердиктengine._assess_realism: реально / амбициозно / риск.calculator.feasibility: два замка → достижимо/амбициозно/нереалистично + причина + совет.
Дневной режимСессии на фикс-днях; адаптация утром сдвигает жёсткую.Плавающий набор; утром «бежим/отдых» → suggest_session из остатка.
Утренняя адаптацияrecovery + самочувствие → Полегче/По плану/Отдых. Реализовано.Без изменений — общий шаг для обеих логик.
rAIner · полная раскадровка · тексты из кода и спека · в бот не залито до согласования