# Instructions

- Following Playwright test failed.
- Explain why, be concise, respect Playwright best practices.
- Provide a snippet of code with the fix, if possible.

# Test info

- Name: tests/ui/district-delegates.spec.ts >> AS delegate district has a current00 canonical and historical98 redirect
- Location: tests/ui/district-delegates.spec.ts:11:7

# Error details

```
Error: AS:98 must redirect rather than retire or retain an old owner

expect(received).toBe(expected) // Object.is equality

Expected: 301
Received: 410
```

# Page snapshot

```yaml
- generic [active] [ref=f1e1]:
  - banner [ref=f1e2]:
    - heading "American Samoa At-Large Congressional District" [level=1] [ref=f1e3]
    - paragraph [ref=f1e4]: Congressional District Profile
  - generic [ref=f1e5]:
    - generic [ref=f1e6]:
      - generic [ref=f1e7]: Not signed in
      - generic [ref=f1e9]:
        - link "Log in" [ref=f1e10] [cursor=pointer]:
          - /url: /outpost.goauthentik.io/start?rd=https%3A%2F%2Fus.elect.info%2Fdistricts%2Fas-00%2F
        - link "Create an account" [ref=f1e11] [cursor=pointer]:
          - /url: /signin/register?rd=https%3A%2F%2Fus.elect.info%2Fdistricts%2Fas-00%2F
    - toolbar "Member tools" [ref=f1e12]:
      - button "All cycles (Sign in to use the cycle facet)" [disabled] [ref=f1e13] [cursor=pointer]:
        - generic [ref=f1e17]: All cycles
      - button "Graph (Sign in to use Graph)" [disabled] [ref=f1e20] [cursor=pointer]:
        - generic [ref=f1e29]: Graph
  - generic [ref=f1e32]:
    - heading "Overview" [level=2] [ref=f1e33]
    - generic [ref=f1e34]:
      - term [ref=f1e35]: District ID
      - definition [ref=f1e36]: AS-00
      - term [ref=f1e37]: State
      - definition [ref=f1e38]:
        - link "American Samoa" [ref=f1e39] [cursor=pointer]:
          - /url: https://us.elect.info/states/
      - term [ref=f1e40]: District Number
      - definition [ref=f1e41]: "00"
      - term [ref=f1e42]: Total Candidates
      - definition [ref=f1e43]: "33"
      - term [ref=f1e44]: Election Cycles
      - definition [ref=f1e45]:
        - generic [ref=f1e46]:
          - link "2026" [ref=f1e47] [cursor=pointer]:
            - /url: https://us.elect.info/elections/2026/
          - text: ","
          - link "2024" [ref=f1e48] [cursor=pointer]:
            - /url: https://us.elect.info/elections/2024/
          - text: ","
          - link "2022" [ref=f1e49] [cursor=pointer]:
            - /url: https://us.elect.info/elections/2022/
          - text: ","
          - link "2020" [ref=f1e50] [cursor=pointer]:
            - /url: https://us.elect.info/elections/2020/
          - text: ","
          - link "2018" [ref=f1e51] [cursor=pointer]:
            - /url: https://us.elect.info/elections/2018/
          - text: ","
          - link "2016" [ref=f1e52] [cursor=pointer]:
            - /url: https://us.elect.info/elections/2016/
          - text: ","
          - link "2014" [ref=f1e53] [cursor=pointer]:
            - /url: https://us.elect.info/elections/2014/
          - text: ","
          - link "2012" [ref=f1e54] [cursor=pointer]:
            - /url: https://us.elect.info/elections/2012/
          - text: ","
          - link "2010" [ref=f1e55] [cursor=pointer]:
            - /url: https://us.elect.info/elections/2010/
          - text: ","
          - link "2008" [ref=f1e56] [cursor=pointer]:
            - /url: https://us.elect.info/elections/2008/
          - text: ","
          - link "2006" [ref=f1e57] [cursor=pointer]:
            - /url: https://us.elect.info/elections/2006/
          - text: ","
          - link "2004" [ref=f1e58] [cursor=pointer]:
            - /url: https://us.elect.info/elections/2004/
          - text: ","
          - link "2002" [ref=f1e59] [cursor=pointer]:
            - /url: https://us.elect.info/elections/2002/
          - text: ","
          - link "2000" [ref=f1e60] [cursor=pointer]:
            - /url: https://us.elect.info/elections/2000/
          - text: ","
          - link "1998" [ref=f1e61] [cursor=pointer]:
            - /url: https://us.elect.info/elections/1998/
          - text: ","
          - link "1996" [ref=f1e62] [cursor=pointer]:
            - /url: https://us.elect.info/elections/1996/
          - text: ","
          - link "1994" [ref=f1e63] [cursor=pointer]:
            - /url: https://us.elect.info/elections/1994/
          - text: ","
          - link "1992" [ref=f1e64] [cursor=pointer]:
            - /url: https://us.elect.info/elections/1992/
          - text: ","
          - link "1990" [ref=f1e65] [cursor=pointer]:
            - /url: https://us.elect.info/elections/1990/
          - text: ","
          - link "1988" [ref=f1e66] [cursor=pointer]:
            - /url: https://us.elect.info/elections/1988/
          - text: ","
          - link "1986" [ref=f1e67] [cursor=pointer]:
            - /url: https://us.elect.info/elections/1986/
          - text: ","
          - link "1984" [ref=f1e68] [cursor=pointer]:
            - /url: https://us.elect.info/elections/1984/
          - text: ","
          - link "1982" [ref=f1e69] [cursor=pointer]:
            - /url: https://us.elect.info/elections/1982/
          - text: ","
          - link "1980" [ref=f1e70] [cursor=pointer]:
            - /url: https://us.elect.info/elections/1980/
    - paragraph [ref=f1e71]:
      - link "View office details for U.S. Representative - American Samoa District 00" [ref=f1e72] [cursor=pointer]:
        - /url: https://us.elect.info/offices/house/as-00/
  - generic [ref=f1e73]:
    - heading "Candidates" [level=2] [ref=f1e74]
    - generic [ref=f1e76]:
      - generic [ref=f1e77]:
        - generic [ref=f1e78]:
          - combobox "Search entities" [ref=f1e79]
          - status [ref=f1e80]
        - button "Search" [ref=f1e81] [cursor=pointer]
      - generic [ref=f1e82]:
        - heading "Candidates" [level=3] [ref=f1e84]
        - generic [ref=f1e85]:
          - link "FALEOMAVAEGA, ENI DEM | $277,940" [ref=f1e86] [cursor=pointer]:
            - /url: /politicians/4d3191d3-af1e-978f-2edf-1e94b21c39c2/
            - generic [ref=f1e87]: FALEOMAVAEGA, ENI
            - generic [ref=f1e88]: DEM | $277,940
          - link "AMATA, AUMUA REP | $228,255" [ref=f1e89] [cursor=pointer]:
            - /url: /politicians/ecb335cb-781a-e23f-f9b0-a7377e343520/
            - generic [ref=f1e90]: AMATA, AUMUA
            - generic [ref=f1e91]: REP | $228,255
          - link "SUNIA, FOFO I F CONGRESSMAN DEM | $16,375" [ref=f1e92] [cursor=pointer]:
            - /url: /politicians/c29d2286-76bb-f003-1fe2-d94b1781c7e5/
            - generic [ref=f1e93]: SUNIA, FOFO I F CONGRESSMAN
            - generic [ref=f1e94]: DEM | $16,375
          - link "HANNEMANN, GUS NNE | $4,000" [ref=f1e95] [cursor=pointer]:
            - /url: /politicians/f9545091-9070-34e2-9a58-12cbe57d0e0d/
            - generic [ref=f1e96]: HANNEMANN, GUS
            - generic [ref=f1e97]: NNE | $4,000
          - link "KING YOUNG, SANDRA S DEM | $2,500" [ref=f1e98] [cursor=pointer]:
            - /url: /politicians/a49b4dbc-c943-f407-d8bc-5644486d47fb/
            - generic [ref=f1e99]: KING YOUNG, SANDRA S
            - generic [ref=f1e100]: DEM | $2,500
          - link "KUAEA, LOUISE LEALAI MRS. DEM | $1,000" [ref=f1e101] [cursor=pointer]:
            - /url: /politicians/4bbee212-b239-008f-67ea-91b02cce6201/
            - generic [ref=f1e102]: KUAEA, LOUISE LEALAI MRS.
            - generic [ref=f1e103]: DEM | $1,000
          - link "AMOEUALOGO SALANOA, SOLI REP | $1,000" [ref=f1e104] [cursor=pointer]:
            - /url: /politicians/7900ad0b-c8e7-81ae-487e-5a9948b8ef7b/
            - generic [ref=f1e105]: AMOEUALOGO SALANOA, SOLI
            - generic [ref=f1e106]: REP | $1,000
          - link "LANGKILDE, FAGAFAGA DANIEL DEM | $1,000" [ref=f1e107] [cursor=pointer]:
            - /url: /politicians/b780729f-22e0-cbdd-7d89-9e98f4540787/
            - generic [ref=f1e108]: LANGKILDE, FAGAFAGA DANIEL
            - generic [ref=f1e109]: DEM | $1,000
          - link "TUFELE, F LI'AMATUA IND | $100" [ref=f1e110] [cursor=pointer]:
            - /url: /politicians/a673e5be-cb48-68e4-a077-bcd5f944ca86/
            - generic [ref=f1e111]: TUFELE, F LI'AMATUA
            - generic [ref=f1e112]: IND | $100
          - link "FAALEVAO, TAUTAI AVIATA FANO REP" [ref=f1e113] [cursor=pointer]:
            - /url: /politicians/0e23b2a9-7674-45e0-f159-937ee2cb8981/
            - generic [ref=f1e114]: FAALEVAO, TAUTAI AVIATA FANO
            - generic [ref=f1e115]: REP
          - link "FANO, RON IND" [ref=f1e116] [cursor=pointer]:
            - /url: /politicians/02386f00-304e-c31f-780f-73a4685f2822/
            - generic [ref=f1e117]: FANO, RON
            - generic [ref=f1e118]: IND
          - link "MULITAUAOPELE, I DEM" [ref=f1e119] [cursor=pointer]:
            - /url: /politicians/0e44587a-548f-f8ca-2a72-dde35083216e/
            - generic [ref=f1e120]: MULITAUAOPELE, I
            - generic [ref=f1e121]: DEM
          - link "TAGO, ACE A IND" [ref=f1e122] [cursor=pointer]:
            - /url: /politicians/4976ff6d-5a95-b00c-c884-bff63ce65017/
            - generic [ref=f1e123]: TAGO, ACE A
            - generic [ref=f1e124]: IND
          - link "JONES, TIM UNK" [ref=f1e125] [cursor=pointer]:
            - /url: /politicians/613ed9eb-bb68-eeb9-5e35-6c27a4bcfb5e/
            - generic [ref=f1e126]: JONES, TIM
            - generic [ref=f1e127]: UNK
          - link "SUITONU-CHAPMAN, MELEAGI N" [ref=f1e128] [cursor=pointer]:
            - /url: /politicians/616b6ff3-0a6e-3e3e-37a7-12ade1196acb/
            - generic [ref=f1e129]: SUITONU-CHAPMAN, MELEAGI
            - generic [ref=f1e130]: "N"
          - link "LUTU, AFOA MOEGA IND" [ref=f1e131] [cursor=pointer]:
            - /url: /politicians/06db725c-7605-4c6b-9866-78c6d0b6ebaf/
            - generic [ref=f1e132]: LUTU, AFOA MOEGA
            - generic [ref=f1e133]: IND
          - link "AL-SHERI, FATUMALALA LEULUA'IALI'I A. NNE" [ref=f1e134] [cursor=pointer]:
            - /url: /politicians/de885a51-7b8f-b2ca-47e3-61c37114f94b/
            - generic [ref=f1e135]: AL-SHERI, FATUMALALA LEULUA'IALI'I A.
            - generic [ref=f1e136]: NNE
          - link "TUUFULI, MOA A LII TELE DEM" [ref=f1e137] [cursor=pointer]:
            - /url: /politicians/ba56b860-c5cc-d943-749c-1161ed3dd1e1/
            - generic [ref=f1e138]: TUUFULI, MOA A LII TELE
            - generic [ref=f1e139]: DEM
          - link "PENE, SEIGAFOLAVA R IND" [ref=f1e140] [cursor=pointer]:
            - /url: /politicians/43eee0c4-2f68-3414-7f62-fe8b92c5fcf4/
            - generic [ref=f1e141]: PENE, SEIGAFOLAVA R
            - generic [ref=f1e142]: IND
          - link "TULAFONO, TOGIOLA UNK" [ref=f1e143] [cursor=pointer]:
            - /url: /politicians/f7f63bc4-abe3-8b06-a0c6-b31b79fd6a91/
            - generic [ref=f1e144]: TULAFONO, TOGIOLA
            - generic [ref=f1e145]: UNK
          - link "SATAUA, SILI K IND" [ref=f1e146] [cursor=pointer]:
            - /url: /politicians/811acbe4-a649-92cd-5bb3-909e65262e22/
            - generic [ref=f1e147]: SATAUA, SILI K
            - generic [ref=f1e148]: IND
          - link "LEDOUX, LEROY IND" [ref=f1e149] [cursor=pointer]:
            - /url: /politicians/81714aa3-e78e-959d-dae3-ce42b58dc705/
            - generic [ref=f1e150]: LEDOUX, LEROY
            - generic [ref=f1e151]: IND
          - link "JAMIAS, MAPU S. DEM" [ref=f1e152] [cursor=pointer]:
            - /url: /politicians/ac7b4ef0-0be6-444a-67d1-410dccc267fe/
            - generic [ref=f1e153]: JAMIAS, MAPU S.
            - generic [ref=f1e154]: DEM
          - link "LANCASTER, ROSIE TAGO N" [ref=f1e155] [cursor=pointer]:
            - /url: /politicians/db0f4ce0-e9fa-2066-0f1d-5ab96494c6fd/
            - generic [ref=f1e156]: LANCASTER, ROSIE TAGO
            - generic [ref=f1e157]: "N"
          - link "GALEA'I, FAL'IVAE A IND" [ref=f1e158] [cursor=pointer]:
            - /url: /politicians/84f7dc06-5ccf-d026-3958-6a64274ed3b7/
            - generic [ref=f1e159]: GALEA'I, FAL'IVAE A
            - generic [ref=f1e160]: IND
          - link "TUIKA, TUIKA IND" [ref=f1e161] [cursor=pointer]:
            - /url: /politicians/b53d9d40-6553-f27b-36db-02eb83ba7d66/
            - generic [ref=f1e162]: TUIKA, TUIKA
            - generic [ref=f1e163]: IND
          - link "MATA'UTIA, TU'AU KERETI, JR. DEM" [ref=f1e164] [cursor=pointer]:
            - /url: /politicians/c2ca9862-d5df-60be-205b-d643a4e6bb07/
            - generic [ref=f1e165]: MATA'UTIA, TU'AU KERETI, JR.
            - generic [ref=f1e166]: DEM
          - link "CRICHTON, ORETA TUFAGA-MAPU DEM" [ref=f1e167] [cursor=pointer]:
            - /url: /politicians/cc1ff94c-02f0-f915-60ee-fb7f8818894f/
            - generic [ref=f1e168]: CRICHTON, ORETA TUFAGA-MAPU
            - generic [ref=f1e169]: DEM
          - link "UDE, MARK IND" [ref=f1e170] [cursor=pointer]:
            - /url: /politicians/e0275a3a-319e-1178-f14a-c53ba333c2c2/
            - generic [ref=f1e171]: UDE, MARK
            - generic [ref=f1e172]: IND
          - link "AE, MUAVAEFAATASI AE, JR. IND" [ref=f1e173] [cursor=pointer]:
            - /url: /politicians/e4514cc2-72c1-2223-62a6-2a160c78dbc7/
            - generic [ref=f1e174]: AE, MUAVAEFAATASI AE, JR.
            - generic [ref=f1e175]: IND
        - generic [ref=f1e176]: Showing all 30 results
  - contentinfo [ref=f1e178]:
    - paragraph [ref=f1e179]:
      - link "elect.info" [ref=f1e180] [cursor=pointer]:
        - /url: https://us.elect.info/
      - text: "| Data from"
      - link "Federal Election Commission" [ref=f1e181] [cursor=pointer]:
        - /url: https://us.elect.info/datasources/fec.gov/
      - text: "| Generated 2026-10-23"
```

# Test source

```ts
  1  | import { test, expect } from '@playwright/test';
  2  | import { canonicalPath, toRelativePath } from './helpers';
  3  | 
  4  | // Release contract after the coordinated graph + PagePaths cutover (#462): all six
  5  | // delegates exist as current00 entities; the index and00 alias serve them, their
  6  | // live UUID pages canonicalize to00, and historical98 aliases redirect to00.
  7  | // This is intentionally red on the old98 graph / stale alias snapshot. The local
  8  | // district-categories fixture still proves98 rows keep safe current-UUID links;
  9  | // neither that fixture nor these inventory assertions may be skipped for missing rows.
  10 | for (const state of ['AS', 'GU', 'MP', 'VI', 'DC', 'PR']) {
  11 |   test(`${state} delegate district has a current00 canonical and historical98 redirect`, async ({ page, request }) => {
  12 |     const dataResponse = page.waitForResponse(response => {
  13 |       if (!response.url().includes('/api/graphql') || response.request().method() !== 'POST') return false;
  14 |       try {
  15 |         const body = response.request().postDataJSON();
  16 |         const variables = body?.variables;
  17 |         const filters = String(variables?.filter).split(',');
  18 |         return /\bbrowseEntities\s*\(/.test(body?.query || '') && variables?.entityType === 'District' &&
  19 |           filters.includes('district_type:cd') && filters.includes(`state:${state}`);
  20 |       } catch { return false; }
  21 |     });
  22 |     await page.goto(`/districts/?state=${state}&tab=congressional`);
  23 |     const payload = await (await dataResponse).json();
  24 |     expect(payload.errors, `${state}: current inventory query must succeed`).toBeUndefined();
  25 |     const inventory = payload.data?.browseEntities;
  26 |     expect(inventory?.total, `${state}: full congressional inventory must contain exactly one delegate`).toBe(1);
  27 |     expect(inventory?.hasMore, `${state}: delegate inventory must not be truncated`).toBe(false);
  28 |     const rows = inventory?.results;
  29 |     expect(rows, `${state}: exactly one delegate must remain in the graph`).toHaveLength(1);
  30 |     const row = rows[0];
  31 |     expect(row.state).toBe(state);
  32 |     expect(row.district).toBe('00');
  33 |     const metadata = JSON.parse(row.metadata || '{}');
  34 |     expect(metadata.district_type).toBe('cd');
  35 |     expect(metadata.district_slug.toLowerCase()).toBe(`${state.toLowerCase()}-00`);
  36 |     expect(row.id).toMatch(/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i);
  37 | 
  38 |     await expect(page.locator('#district-state-select')).toHaveValue(state);
  39 |     const result = page.locator('.entity-search-result');
  40 |     await expect(result).toHaveCount(1, { timeout: 15000 });
  41 |     await expect(result).toContainText(`${state}-00`);
  42 |     const canonical = `/districts/${state.toLowerCase()}-00/`;
  43 |     await expect(result).toHaveAttribute('href', canonical);
  44 |     const response = await page.goto(canonical);
  45 |     expect(response?.status(), `${state}:00 must serve, not redirect or miss`).toBe(200);
  46 |     await expect(page.locator('h1')).toBeVisible();
  47 |     expect(canonicalPath(await page.content())).toBe(canonical);
  48 | 
  49 |     const storage = await request.get(`/districts/${row.id}/`, { maxRedirects: 0 });
  50 |     expect(storage.status(), `${state}: graph-current UUID page must serve`).toBe(200);
  51 |     expect(canonicalPath(await storage.text()), `${state}: current UUID must share00 canonical`).toBe(canonical);
  52 |     const historical = await request.get(`/districts/${state.toLowerCase()}-98/`, { maxRedirects: 0 });
> 53 |     expect(historical.status(), `${state}:98 must redirect rather than retire or retain an old owner`).toBe(301);
     |                                                                                                        ^ Error: AS:98 must redirect rather than retire or retain an old owner
  54 |     expect(toRelativePath(historical.headers()['location'] || '')).toBe(canonical);
  55 |   });
  56 | }
  57 | 
```