---
title: Add a ranking-tier row axis split
type: task
status: cancelled
description: >-
  Let a data view split its rows by the FantasyPros redraft tier, rather than only reading the tier
  as a column or filter.
base_uri: user:task/league/add-ranking-tier-row-axis-split.md
created_at: '2026-10-17T16:42:11.011Z'
entity_id: 9373a189-b5fb-45ca-bc36-49a839d8aa90
finished_at: '2026-10-17T21:05:26.171Z'
observations:
  - ████████████████████████████████████████████████
owner_identity_uri: █████████████████████████
priority: Medium
public_read: true
relations:
  - relates [[████████████████████-███████████-███████-█████-███-███████-████-████████]]
tags:
  - user:tag/league-xo-football.md
updated_at: '2026-10-17T21:05:27.925Z'
visibility_analyzed_at: '2026-11-05T23:48:16.944Z'
---

Let a data view split its rows by the FantasyPros redraft tier, so a view can group players into tiers rather than listing them.

## Why this is not already done

[[████████████████████-███████████-███████-█████-███-███████-████-████████]] shipped the tier as a **column and a filter** — `player_season_ranking_tier` reads `ranking_tier` on `player_rankings_index` and can be filtered on. It deliberately did not ship the tier as a **row axis**, because a row axis is not a small addition on this codebase.

## What a row axis costs

`row_axes: ['year']` on a field declares which axes the field supports; the request's axis set is resolved separately, in `identity_for_row_grain_row_axes` in `repository/active/league/libs-server/data-views/row-grain-registry.mjs`, which maps an axis set to a grain identity (e.g. `player_year`, `team_year_position`). Adding a tier axis means:

- a new identity in that function, plus its validation rules (does a tier require `year`? does it exclude `week`? a tier is a season's, so by analogy with `team_year_position` it likely requires `year` and excludes `week`);
- a row-grain CTE in `libs-server/data-views/row-grains/player.mjs` projecting the new grain;
- the cache key and `describe-column` following the new identity;
- the client split UI accepting the axis.

## Open questions

- Is `tier` a row axis at all, or is the column plus a filter enough? The contributor asked for tiers, not for a split; this is scope nobody has asked for yet. Confirm the want before building it.
- A tier is null for every row outside the three redraft overall boards and past the top 200. A split over a mostly-null axis needs a rule for the null bucket — its own row, or dropped.
- Does the tier belong on `player_year` (one row per player-season, the tier of that season's board) or on a finer grain?
