41 lines
2.5 KiB
Markdown
41 lines
2.5 KiB
Markdown
# fixtures-runner
|
||
|
||
E2E-сценарии для Фазы 1. Генерирует синтетические треки с детерминированными эмбеддингами (через persona seed) и шлёт их через `apps/api /ingest/*` + `face-service /track-embeddings/raw`. Не требует реальных видео.
|
||
|
||
## Запуск
|
||
|
||
```bash
|
||
# Список сценариев
|
||
pnpm fixtures:run --list
|
||
|
||
# Запуск
|
||
pnpm fixtures:run --scenario=new-patient
|
||
pnpm fixtures:run --scenario=returning-patient
|
||
pnpm fixtures:run --scenario=left-without-service
|
||
|
||
# Realtime — с задержками между событиями (как «живой» поток)
|
||
pnpm fixtures:run --scenario=new-patient --mode=realtime
|
||
```
|
||
|
||
## Сценарии
|
||
|
||
| Имя | Описание |
|
||
|---|---|
|
||
| `new-patient` | A → B → C. Создаёт unmatched-трек для ручного enrollment в web-admin. |
|
||
| `returning-patient` | Тот же `personaSeed=1001` как у new-patient. После enrollment персона должна быть узнана автоматически → создаётся Visit. **Это критерий завершения Ф1.** |
|
||
| `left-without-service` | A → B → уход. Триггерит событие `left_without_service`. |
|
||
|
||
## Как это работает
|
||
|
||
- `personaSeed` → детерминированный 512-d L2-нормализованный вектор. Тот же seed = тот же вектор (с малым jitter между эмбеддингами одного трека). После enrollment в `new-patient` вектор привязан к `patient_id`. В `returning-patient` тот же seed → match.
|
||
- Эмбеддинги пишутся через face-service `/track-embeddings/raw` (без InsightFace-детекции, эмбеддинг сразу передаётся).
|
||
- События — через `apps/api /ingest/track-events`.
|
||
- При `triggerRecognition=true` после прогона runner вызывает `/recognize/embedding` и при match создаёт Visit напрямую через Prisma.
|
||
|
||
## Критерий приёмки M11
|
||
|
||
После прогона:
|
||
1. `pnpm fixtures:run --scenario=new-patient` — в БД появился unmatched-трек.
|
||
2. Через web-admin (или curl) — `POST /enrollment` для этого трека.
|
||
3. `pnpm fixtures:run --scenario=returning-patient` — `runner.visitCreated !== null`, в БД есть новый Visit с привязкой к тому же `patientId`.
|