---
title: Fix anonymous league-load cancellation dropping the Projected Points chart
type: task
status: completed
description: >-
  Fix a saga-cancellation race that left logged-out league pages stuck in a pending league record,
  so the Projected Points chart showed only Draft Picks.
base_uri: user:task/league/fix-anonymous-league-load-cancellation.md
created_at: '2026-09-08T18:12:44.363Z'
entity_id: f729dd26-e615-476b-abef-7c5b0a544057
finished_at: '2026-09-08T18:48:31.697Z'
observations:
  - ████████████████████████████████████████████████
  - ████████████████████████████████████████████████
owner_identity_uri: █████████████████████████
priority: High
public_read: true
tags:
  - user:tag/league-xo-football.md
updated_at: '2026-09-08T19:26:07.774Z'
visibility_analyzed_at: '2026-11-05T23:49:16.900Z'
---

## Context

Logged-out visitors to `https://xo.football/leagues/1` (and any `/leagues/:id`) see the "Projected Points+" chart render only its always-present "Draft Picks" series, with no per-position series. Root cause is established (see observations): a saga-cancellation race orphaned the league's `GET_LEAGUE_FULFILLED`, leaving `leagues[1]` stuck in the `GET_LEAGUE_PENDING` bare record.

## Agreed fix

1. `app/core/leagues/sagas.js`: register the five `load_league` watchers with `takeEvery` instead of `takeLatest`, so an in-flight league load is never cancelled. The saga's existing `isLoading || isLoaded` guard is the dedupe.
2. `app/core/app/sagas.js`: drop the redundant `load_league()` dispatch from `init()`'s anonymous `else` branch. Keep `handle_auth_failed`'s dispatch (required).

## Plan

- [x] Diagnose logged-out `/leagues/1` "Projected Points+" rendering only Draft Picks
- [x] Apply the two-file saga fix
- [x] Add a source-scan regression spec pinning the `takeEvery` watchers
- [x] Run `yarn test:isolated`, commit with explicit pathspec, do NOT deploy
