- Use !== instead of != for null/undefined comparisons
- Replace non-null assertions with type-predicate filters
- Use Array#toSorted() instead of mutating sort()
- Replace manual thenable mock with a real Promise + attached orderBy
- Remove unused imports/variables (Badge, CardHeader, CardTitle, eliminated, advanced, ownershipMap)
- Hoist makeChampionsQpConfig to module scope since it captures no closure variables
https://claude.ai/code/session_01RYK7NCjcaah545979wupcM
- Fix "Advanced" badge in SwissStageTab: condition was `isAdvanced && stageEliminated === null`, missing teams eliminated at later stages; now just `isAdvanced`
- Default active tab to highest active Swiss stage rather than Champions whenever no playoff games have a winner yet
- Remove dead `eventResults` query from the CS2 loader branch (Cs2MajorEventView has no prop for it)
- Remove dead `teamsInStage` variable and unused `StageStatusBadge` component
- Serialize `createdAt`/`updatedAt` on playoff match rows in both CS2 and bracket loader branches (matches how seasonMatches dates are handled)
- Replace inline `formatEventDate` in event detail route with shared `~/lib/date-utils` version
- Add defensive DB-level limit to `getUpcomingScoringEvents` (max(limit*5, 50)) to cap unbounded fetch
https://claude.ai/code/session_01RYK7NCjcaah545979wupcM
Part 1 — CS2 playoff matches now appear in upcoming schedule:
getUpcomingEventsForDraftedParticipants (all-compete path) now also
picks up events with upcoming playoff_match_games.scheduledAt, so CS2
Champions Stage bracket games set via the admin bracket UI surface on
both /upcoming-events and the sport_season EventSchedule panel.
getUpcomingScoringEvents is updated to sort by earliest bracket game
time when eventDate/eventStartsAt are absent or past.
Part 2 — Auto floor-score CS2 Champions Stage qualifiers:
assignCs2EliminationQP now writes provisional floor event_result rows
(placement=5, QP = tie-split of slots 5–8) for the 8 Champions Stage
advancing teams once all Stage-3 exits are known. The bracket admin's
result entry overwrites these via onConflictDoUpdate.
Part 3 — Public event detail view:
New route /leagues/:leagueId/sports-seasons/:sportsSeasonId/events/:eventId
shows CS2 Swiss stage progress (W-L table + matches per stage) and the
Champions Stage bracket, bracket events (tennis/golf bracket + groups),
and results tables for QP/racing events. EventSchedule and
UpcomingCalendarPanel event rows now link to this detail page.
https://claude.ai/code/session_01RYK7NCjcaah545979wupcM