# 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`.