# health-digest

Утренний пуш по здоровью и недельный разбор в бота **@natasha_health_bot**.

Данные не собирает — читает то, что уже лежит в волте после `health-sync`, плюс дневник питания.

## Команды

```bash
python3 digest.py --dry-run                  # печать сообщения без отправки
python3 digest.py --dry-run --date 2026-08-01
python3 digest.py                            # отправка в бот
python3 weekly.py --date 2026-08-02          # цифры недели (уходят в промпт Claude)
./weekly.sh                                  # полный недельный разбор + архив в волт
python3 -m unittest discover -s tests -t .   # тесты
```

Зависимостей нет — только стандартная библиотека Python 3.9+.

## Устройство

| Модуль | Отвечает за |
|---|---|
| `parsers.py` | чтение markdown-таблиц волта (дневной ряд, тренировки, дневник питания, замеры) |
| `week.py` | границы недели, прогресс против ступени ВОЗ, скользящий вес, блок «Сегодня» |
| `message.py` | сборка утреннего сообщения |
| `weekly.py` | недельные агрегаты + рендер цифр для Claude |
| `digest.py` | чтение конфига и файлов, отправка в Telegram |
| `weekly.sh` | воскресный разбор: цифры → Claude → бот → архив в волт |

## Правила формата — закреплены тестами

1. **Вес показывается только рядом со средним за 7 дней.** Одиночная цифра не выводится никогда — 1 августа 2026 такая цифра привела к неверному выводу «набрала».
2. **Состав тела в ежедневный не попадает** — только в недельный разбор.
3. **По еде — цифры без норм, остатков и оценок** (правило из гайда по дневнику питания).
4. **Ежедневный никогда не молчит** — нет данных, значит явная пометка, а не тишина.

Запреты недельного разбора (не раскладывать прибавку веса на жир/мышцы по двум импедансным замерам, не предлагать резать калории) живут в `weekly-prompt.md`.

## Конфиг

`config.json` — пути к файлам волта и ступени ВОЗ с датами перехода. Ступень переключается сама, править код не нужно.

Путь к волту переопределяется переменной `HEALTH_VAULT` (на Pi — `/home/rasp/obsidian-vault`).

`.env` (права 600, в `.gitignore`): `HEALTH_BOT_TOKEN`, `TELEGRAM_OWNER_USER_ID`.

## Деплой

Pi, systemd — юниты в `deploy/`:

| Юнит | Расписание |
|---|---|
| `health-digest-daily` | ежедневно 06:50 Екб |
| `health-digest-weekly` | вс 19:30 Екб |

Оба висят на `tg-notify@` — падение юнита пишет в личку.

Таймер стоит на 06:50, а не 07:00, потому что в 07:00 стартует `tgstat-pull` с `pull --rebase` в том же волт-клоне.

На Маке `health-sync` гоняется дважды: 06:30 (чтобы вчерашний день был полным к утреннему пушу) и 17:00. После синка он явно дёргает `vault-sync/sync.sh`.

Полная спека — `projects/vibe-coding/docs/{vibe-coding} {plan} health-digest спека – 2026-08-01.md` в волте.
