Initial commit: digital reception monorepo (M1-M11 + demo extensions)

This commit is contained in:
2026-05-25 12:59:54 +05:00
commit b9f88194d9
182 changed files with 20578 additions and 0 deletions
+40
View File
@@ -0,0 +1,40 @@
# 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`.