Skip to content

Background Services

  • OutboxDispatcher — polls outbox_messages every 5 seconds. Dispatches session.uploaded to FeedService and AchievementService; leaderboard.submit to AchievementService. Retries up to 5 times with error logging.

  • TrackProcessingService — polls track_processing_jobs every 3 seconds. For each job: normalizes track points via PCA, aligns with prior versions via Procrustes 2D, resamples to 1000 waypoints, fuses with running weighted average, computes confidence, freezes a TrackVersion when drift < 0.5m over 10 submissions. Infrastructure for Phase 2 canonical track registry.

  • DataRetentionService — periodic cleanup of old sessions (configurable retention window).


Session Upload & Events

POST /v1/sessions received
  → Create SessionEntity + LapEntity rows
  → If TrackPoints: enqueue TrackProcessingJobEntity
  → Write OutboxMessageEntity("session.uploaded")
  → Return { sessionId, receivedAt }

OutboxDispatcher (5s poll):
  → FeedService.PostAsync() → FeedEntryEntity (1h dedup)
  → AchievementService.CheckSessionUploadAsync()
      → check: first session, 10/50 sessions, multi-game, quality, time-of-day
      → TryEarn() for each matching achievement

TrackProcessingService (3s poll):
  → Normalize → Align → Resample → Fuse → Check convergence
  → On stable: freeze TrackVersionEntity (GeoJSON centerline)