(int) env('OTP_TTL_MINUTES', 5), 'otp_max_attempts' => (int) env('OTP_MAX_ATTEMPTS', 5), 'otp_rate_limit_per_phone' => (int) env('OTP_RATE_LIMIT_PER_PHONE', 3), // per 10 minutes 'pairing_token_ttl_minutes' => (int) env('PAIRING_TOKEN_TTL_MINUTES', 30), 'wa_otp_driver' => env('WA_OTP_DRIVER', 'log'), 'pairing' => [ // Balanced target seats: 4 slots (BEGINNER treated as HIGH-like by default) 'balanced_target' => ['LOW', 'MID', 'MID', 'HIGH'], // Seat fill order 'seat_order' => [1,2,3,4], // Pace-of-play guardrails 'max_high_like_per_flight' => 2, // Course balancing: spread assigned seats across A/B unless course_pref is set 'course_balance' => true, // Semi-hard course preference: // true => always try preferred course first; only fallback if no seats exist on preferred. // false => treat as soft preference (score-based). 'course_pref_semi_hard' => true, // Hole bottleneck guardrail: // Distribute HIGH/BEGINNER across start holes (shotgun) to avoid stacking slow flights on same hole. 'hole_balance_high_like' => true, // Penalty weight for assigning high-like players onto already high-like-heavy holes. 'hole_high_like_penalty' => 12, ], 'xendit' => [ 'api_key' => env('XENDIT_API_KEY', ''), 'webhook_token' => env('XENDIT_WEBHOOK_TOKEN', ''), ], ];