Reducing Skill Disparity Drop-off in Competitive Matchmaking
I have 12,000 kills in Apex Legends with a KDR between 1.1 and 1.2. I am not a casual player but I am not a ranked grinder either. I mastered movement and gun mechanics because those are the skills that transcend every meta change. Everything else shifts every season: weapon rotations, ring strategies, legend compositions. The fundamentals do not.
And yet I rage quit ranked, repeatedly. Not because I lost. Because the losses felt structurally unfair. I would drop into a lobby where the skill floor was significantly above mine, die within 30 seconds of landing, and watch the rest of the match from a spectator view. My teammates were often in the same position. Three people who should not have been in the same lobby, placed there by a system that saw a number and matched it, without any understanding of session state.
I represent the most commercially dangerous player segment in a competitive live service title: high enough skill to feel wronged by bad matchmaking, not invested enough in ranked to push through it. I did not submit a support ticket. I just stopped playing ranked. This is a silent retention problem that SR alone cannot diagnose.
Before a player exits, the session is already telling you what is happening. The signals are there if you are instrumenting at the right granularity. Most matchmaking systems instrument at the match level. The problem lives at the session level.
A deteriorating session looks like this:
None of these signals require inference. They are observable events in the match result payload. The gap is that current systems aggregate them into SR delta and move on. A session-aware system reads them in real time and acts before the player closes the client.
The proposed solution is a lightweight Session State Engine that sits between the match result pipeline and the matchmaking queue. It does not replace SR. It does not rewrite the ranking system. It adds a session-level layer that adjusts lobby composition dynamically, without touching the player's visible rank.
Every active player session is classified into one of three states:
| State | Definition |
|---|---|
| STRUGGLING | 3 or more consecutive early eliminations in the current session. Damage output below session baseline. Queue hesitation detected. Player is at churn risk. |
| BALANCED | Default state. Win/loss within expected range for current SR. No consecutive elimination streak. Session is healthy. |
| PERFORMING | Win streak or sustained high damage output relative to lobby average. Player is in flow state. Lobby difficulty can increase. |
State transitions are triggered by session events, not cumulative SR. This is the critical distinction. SR is a career metric. Session state is a real-time signal.
| Transition | Trigger |
|---|---|
| BALANCED → STRUGGLING | 3 consecutive early eliminations. OR damage output drops below 60% of session baseline for 2 consecutive matches. |
| STRUGGLING → BALANCED | 1 match with meaningful engagement (top half survival OR above-average damage). Player has had a positive experience. |
| BALANCED → PERFORMING | 2 consecutive wins OR damage output above 140% of lobby average for 2 consecutive matches. |
| PERFORMING → BALANCED | Any loss, or 1 match with below-average damage output. Flow state is fragile. Do not hold it artificially. |
When a player is in STRUGGLING state, the matchmaking service draws from a lobby pool where the mean SR is within a tighter band below the player's current SR. The adjustment is not visible to the player. Their SR display, rank badge, and leaderboard position are unchanged. What changes is the lobby they are placed in for the next one to two matches.
This is not win-trading or artificial inflation. It is a confidence restore mechanic, the same principle that makes onboarding flows give new players early wins before introducing competitive pressure. The player earns their way back to balanced lobbies through performance, not through time served.
The engine slots into the existing match lifecycle without requiring changes to the core ranking system:
Match result payload published to event bus on game completion. Contains: player_id, elimination_time, damage_output, placement, match_duration.
Session State Service reads the event, updates the player's current session record, and evaluates state transition logic.
Current state (STRUGGLING / BALANCED / PERFORMING) written with a session-scoped TTL. Expires when the player has been offline for 30 minutes.
On queue entry, Matchmaking Service reads session state and adjusts the effective SR band for lobby formation. Visible SR is never modified.
Every state transition emits an analytics event. This feeds the monitoring dashboard and informs threshold calibration over time.
The state transition logic described above is entirely deterministic. Functions own the logic. Rules are written in code and auditable. This is deliberate.
Introducing a model to decide when a player is struggling introduces a black box into a system that directly affects player experience. If the model makes a wrong call, you cannot explain it to a player who feels they were placed in an unfair lobby. Deterministic thresholds are explainable, tunable, and trustworthy.
AI earns its place in this system at the predictive layer, not the decisioning layer:
The AI layer observes, recommends, and alerts. The Session State Engine decides and acts. These are different responsibilities and they should live in different parts of the system.
A feature like this should not be measured by SR changes or win rates. Those are lagging indicators that blend too many variables. The right metrics are session-level and behavioural:
| Metric | Definition & Target |
|---|---|
| Session recovery rate (Primary) | Percentage of STRUGGLING sessions that transition to BALANCED within 2 matches. Target: above 50% within 60 days of launch. |
| Session length in STRUGGLING (Primary) | Average number of matches played per session when a player enters STRUGGLING state. Baseline before launch. Target: increase of 1 or more matches post-launch. |
| Ranked re-engagement rate (Secondary) | Percentage of players who queued ranked in a given week and returned the following week. This is the retention metric the engine is ultimately designed to move. |
| SR integrity (Guardrail) | Mean SR per tier must not shift more than 3% from pre-launch baseline within 30 days. The engine must not inflate the ladder. |
| Lobby quality complaints (Guardrail) | Support ticket volume related to matchmaking fairness. Should not increase. If it does, the PERFORMING state lobbies may be too aggressive. |
I would run this as a staged rollout, starting at 10% of the ranked population in week one and expanding based on session recovery rate and SR integrity guardrails. Full rollout only after both primary metrics show improvement and both guardrails are clean.