[backend][B] Сад: детерминированный расчёт роста из активностей, config/garden.yaml, GET /me/{token}/garden #118
Notifications
Due Date
No due date set.
Blocks
#115 [epic] Грант ВШЭ и пилот «Династия»: голосовой ввод + сад (геймификация)
MedITron/PTSRaiAgent
#119 [web] Сад на экране «Сегодня»: иллюстрация по стадиям, прогресс, чек-лист дня
MedITron/PTSRaiAgent
#120 [clinical] Вычитка сада: тексты без давления, правила роста, материалы от врача
MedITron/PTSRaiAgent
Reference: MedITron/PTSRaiAgent#118
Reference in New Issue
Block a user
Описание
Часть эпика «Демо к гранту ВШЭ и пилоту „Династия“». Слайд 13: «Любая полезная активность растит сад. Геймификация — общая оболочка над всеми модулями». Источники роста: приём лекарств, дневник/чек-ин, регулярные опросы, материалы от врача. Принципы без давления:
Желаемый результат
config/garden.yaml(ADR-008): очки за активность, дневной лимит по каждому типу (чтобы пять сообщений подряд не давали пятикратный рост), пороги стадий (росток → куст → цветение → …), количество растений.app/services/garden.py: детерминированный расчёт из существующих таблиц без новой таблицы и без миграции (ADR-003):dosesсо статусом taken (отметка «Принял(а)», в том числе с опозданием);daily_checkins(чек-ин или запись дневника);scale_results(завершённый назначенный опрос);app.core.clock(демо-часы, ADR-005), чтобы на демо можно было промотать неделю и увидеть рост.GET /api/v1/me/{token}/gardenвозвращает{points, stage, stage_title, next_stage_at, progress_to_next (0..1), plants: [{kind, stage}], today: [{activity, done, title}]}.Подзадачи
config/garden.yamlи загрузчикapp/services/garden.pyapp/api/patient_web.py, схема ответаscripts/,data/), что сад Андрея выглядит живымtests/test_services_garden.py: монотонность, лимиты, независимость от баллов, граница суток по демо-часамАнализ
Ограничения и риски
Архитектурный выбор
Расчёт «на лету» из существующих событий, а не отдельная таблица очков: нет миграций, нет рассинхрона, история переигрывается при смене правил в yaml. Цена — несколько COUNT по пациенту на запрос, для демо и пилота несущественно.
Как проверить
make seed→GET /me/<token>/gardenу Андрея → стадия > 1. Отметить дозу →pointsвыросли. Промотать демо-часы на 7 дней без активности →pointsне уменьшились.make lint test.2026-10-31
config/garden.yaml,app/services/garden.py(расчёт на лету из doses/daily_checkins/questionnaire_records/scale_results), ручка/me/{token}/garden, тесты.