# candidates-read-flag - [x] Создан OpenSpec change (proposal/design) — `skip_specs: true` - [x] `openspec validate candidates-read-flag` — чисто - [x] db/schema.sql: колонка posts.is_read INTEGER DEFAULT 0 - [x] web/app.py: миграция is_read при старте (_migrate, идемпотентно) - [x] web/app.py: GET /candidates и POST select/bulk: group_by по умолчанию 'date' - [x] web/app.py: при selected → UPDATE posts SET is_read=1 - [x] candidates.html: непрочитанные — fw-bold, выбранный — active-row (светло-голубая заливка) - [x] base.html: CSS .list-group-item.active-row (#dcecfc) - [x] Тест (TestClient): миграция, прочтение при selected, дефолт date, классы карточек - [x] Перезапуск `sudo systemctl restart vesti-web` - [x] Ручная проверка в браузере: дата по умолчанию, жирные непрочитанные, голубая заливка выбранного - [x] Обновить STATUS.md / TODO.md - [x] Бэкап (крон 2:45 делает сам, вручную НЕ запускать)