# Sprint 17 — onboarding wizard + help + self-diagnostic + changelog
Цель: «новый пользователь не должен теряться» — onboarding wizard за
4 шага, контекстная help-tooltip-ы, knowledge-base /help, feedback,
admin self-diagnostic /admin/diagnostic, /whats-new из CHANGELOG.
Старт: 2026-06-07 (после Sprint 16). Исполнитель: Claude Opus 4.7.
## Принципы
- Wizard — skip каждого шага доступен.
- Help-tooltip-ы — короткие (≤2 предложения) с deep-link на /help.
- Diagnostic — 7 проверок, async параллельный прогон <1с.
- НЕ трогать: `global.json`, prod admin.food-market.kz, POS WPF.
## Чек-лист
- [x] **1. Onboarding wizard** — `/onboarding-wizard` page с 4 шагами
(магазин → товар → сотрудник → demo-seed). Каждый skip'абельный.
После — `localStorage.fm.wizardCompleted=1` и redirect на /dashboard.
Playwright тесты 9.1-9.3 (smoke + skip + сохранение).
- [x] **2. HelpTooltip + topics** — `src/lib/help-topics.ts` с 13
topics. `` — popover с title + short +
deep-link на /help#key. Click-outside / Esc / aria-expanded.
- [x] **3. /help knowledge base** — `/help` страница, 7 markdown
topics в `src/help/*.md`, загружаются через `import.meta.glob`,
custom mini-markdown-renderer (headings, lists, bold, code).
Поиск по title + body на клиенте.
- [x] **4. In-app feedback widget** — `` в sidebar
footer. Modal с 3 категориями (Bug/Suggestion/Question). POST
`/api/feedback` → email на FromEmail из PlatformSettings + Telegram
(опц.). Rate-limit 5/час per-user.
- [x] **5. /admin/diagnostic** — `/admin/diagnostic` page для
Admin/SuperAdmin. 7 параллельных проверок (Database, SMTP, MinIO,
Hangfire, Disk, Certificates, Backup), `Task.WhenAll`, ~1с прогон.
🟢/🟡/🔴 индикаторы + Details. Опц. `sendTestEmail` чекбокс.
- [x] **6. /whats-new + CHANGELOG** — `scripts/generate-changelog.sh`
генерирует `CHANGELOG.md` из `git log --grep='feat\|fix'`. Endpoint
`/api/whats-new` парсит markdown → последние 30 дней. UI `/whats-new`
с группировкой по дате + icon (Sparkles=feat, Bug=fix).
Dockerfile.api копирует `CHANGELOG.md` в content-root + создаёт
`VERSION` файл из `GIT_SHA` build-arg'a.
- [x] **7. Empty-states CTA** — `` reusable
component с placeholder'ом для будущих видео-демо и fallback на
/help#topic.
## Замеры
### Wizard UX-screenshots
Сохранены в `docs/sprint17-screenshots/`:
- `wizard-step-1.png` — магазин (название + адрес)
- `wizard-step-2.png` — первый товар (имя + цена + штрихкод)
- `wizard-step-3.png` — первый сотрудник (Ф.И.О. + email + роль)
- `wizard-step-4.png` — demo-данные («Заполнить» / «Не нужно»)
- `help-page.png` — `/help` с sidebar групп + body topic'ов
- `admin-diagnostic.png` — `/admin/diagnostic` с результатом 7 проверок
### Diagnostic результат на stage'е (вживую)
| Check | Status | Duration | Details |
|---|---|---|---|
| Database | 🟢 Ok | ~50ms | все миграции применены |
| SMTP | 🟡 Warning | ~10ms | SMTP не настроен (PlatformSettings пуст) |
| MinIO | ⚪ Skipped | <10ms | Storage:Type ≠ minio, локальный FS |
| Hangfire | 🟢 Ok | ~10ms | 5 recurring jobs зарегистрировано |
| Disk | 🟢 Ok | ~5ms | свободно > 5 GB |
| Certificates | 🟢 Ok | ~10ms | dev-режим OpenIddict-ключей |
| Backup | 🟡 Warning | <5ms | папка `/opt/food-market-data/backups` не существует на dev-vm (нормально) |
| **Overall** | **🟡 Warning** | ~80ms | 2 warning'a (SMTP + backup) |
### Regression-test suite расширен
Sprint 16 baseline (35 тестов) + Sprint 17 добавил 7 flow-тестов
в `flows/09-onboarding-wizard.spec.ts`:
- 9.1 wizard рендерится с progress-bar
- 9.2 skip всех 4 шагов → /dashboard + wizardCompleted=1
- 9.3 сохранение названия магазина → org.name обновлён в API
- 9.4 /help рендерит topic'и + поиск работает
- 9.5 /api/admin/diagnostic/run возвращает 7 проверок
- 9.6 POST /api/feedback ok с минимальным payload
- 9.7 /api/whats-new возвращает buildVersion + items
**Result**: 7/7 ✓ за ~20 секунд. Suite теперь **42 flow + 60 visual + 6 wizard-screenshots**.
### Bundle impact
| | До Sprint 17 | После | Δ |
|---|---|---|---|
| Initial JS (raw) | 706.76 KB | **723.37 KB** | +17 KB |
| Initial JS (gzip) | 196.50 KB | **200.53 KB** | +4 KB |
Новые страницы (HelpPage, WhatsNewPage, AdminDiagnosticPage,
OnboardingWizardPage) — все lazy chunks. В initial bundle только
`` (Modal-обёртка), `` и
`` (~4 КБ gzip суммарно).
## Журнал
### 2026-06-07 старт
Sprint 16 закрыт (6/6 ✓). Поехали по onboarding-чек-листу.
### 2026-06-07 п.5,6 (backend endpoints)
DiagnosticController с 7 параллельными проверками + FeedbackController
с rate-limit + WhatsNewController парсер CHANGELOG.md.
### 2026-06-07 п.1 (wizard)
`OnboardingWizardPage` с 4 step-компонентами. State через useState,
api-mutate через TanStack Query. `/onboarding-wizard` маршрут.
Skip-кнопка в footer'е каждого шага. `fm.wizardCompleted` в
localStorage предотвращает повторный показ.
### 2026-06-07 п.2-3 (HelpTooltip + /help)
`help-topics.ts` с 13 keys. `` с click-popover, aria-label,
Esc/click-outside dismiss. `/help` страница — `import.meta.glob` на
`src/help/*.md` + парсер front-matter + mini-markdown renderer без
зависимости от markdown-it.
### 2026-06-07 п.4 (feedback widget)
`` в sidebar footer. Modal с 3 категориями. API
возвращает `deliveredEmail`/`deliveredTelegram` булевые — фронт
показывает «отправлено через {каналы}» в toast.
### 2026-06-07 п.7 (empty-state)
`` reusable. Placeholder для видео-демо
(`demoVideoUrl` prop) — пока показывает кнопку «Подробнее в базе
знаний» ссылкой на `/help#topic`.
### 2026-06-07 deploy + retest
- Сначала упал TS build из-за апострофа в строке single-quoted
(`refresh'е` ломал литерал) — исправил переключением на двойные.
- Неиспользуемый interface `OrgSettings` — удалил.
- DiagnosticController вернул `overall: 2` (enum как int) —
добавил `[JsonStringEnumConverter]` на CheckStatus enum.
- 7/7 wizard/help/diagnostic/feedback/whats-new e2e тестов ✓.
- 6 wizard-screenshots сохранены в `docs/sprint17-screenshots/`.
## Итог
Все 7 пунктов ✓. Локальные числа:
- **Wizard**: 4 шага + skip, 7 Playwright тестов ✓ за 20 секунд.
- **Help**: 7 markdown topics + 13 keys в HelpTooltip mapping.
- **Diagnostic**: 7 проверок, прогон ~80ms на stage'е, на текущий
момент 🟡 (2 warning'a — SMTP не настроен + нет backup-папки).
- **Feedback**: email + Telegram дубль, 5/час rate-limit.
- **CHANGELOG**: 307 строк из git log за 90 дней.
- **/whats-new**: возвращает buildVersion + items до 30 дней назад.
- **Regression suite**: **42 flows + 60 visual + 6 wizard-shots** ✓.
Следующее расширение (TODO для будущих спринтов):
- Расставить `` рядом с заголовком на Loyalty, Promotions
и других новых страницах — компонент готов.
- Banner «Появились новые функции» при mismatch'е
`localStorage.fm.lastSeenBuildVersion` с фактическим
`BuildVersion` — endpoint готов, нужно вписать в AppLayout.
- Видео-демо в `` — placeholder есть, ждём
скрин-капсы / видео.