Integrates the existing tenant affinity module into the proxy request
handling to enable noisy-neighbor isolation for multi-tenant deployments.
Changes:
- Add TenantAffinityManager to AppState with initialization
- Resolve tenant identity from X-Miroir-Tenant header in search handler
- Use pinned group for scatter planning when tenant affinity is active
- Session pin takes precedence over tenant affinity (plan §13.15 interaction)
- Add miroir_tenant_session_pin_override_total metric
- Fix tenant affinity tests to be robust against hash value variations
Tenant affinity modes:
- header: read tenant ID from X-Miroir-Tenant header
- api_key: derive tenant from API key via tenant_map table
- explicit: static map only, unknown tenants use fallback policy
Writes always fan out to all groups (consistency invariant).
Only reads honor tenant affinity for isolation.
Metrics: miroir_tenant_queries_total, miroir_tenant_pinned_groups,
miroir_tenant_fallback_total, miroir_tenant_session_pin_override_total
Closes: miroir-uhj.15
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>