Three presentation faults you spotted on the place pages. All three were found by looking at a rendered page — every automated check passed on all of them.
They carried no class at all, so they rendered as default blue underlined browser links beside a site that styles table links as body colour with a brand hover. RankingsView sets .schoolLink { color: var(--text-primary); text-decoration: none } with --brand-strong on hover; the place tables now follow it, and running-copy links take the brand colour.
b) The heading was jargon — and I invented it
RWM expected appears nowhere else on the site. METRIC_DEFINITIONS already names the measure, surfaced at /api/metrics:
name: Reading, Writing & Maths Combined % description: % meeting expected standard in reading, writing and maths
The heading now reads Reading, writing & maths, with the full definition in the tooltip. Secondary tables read Attainment 8.
c) The column was 30% empty, and that was structural
On /schools/brentwood, 8 of 27 rows were blank. An unphased place page listed both primaries and secondaries but showed a single primary-only measure, so every secondary row was empty.
Neither obvious fix works: picking the other measure just inverts which rows are blank, and putting both in one column mixes a percentage with a 0–90 score — two incomparable scales under one heading.
Each phase now gets its own table, with the measure that applies to it. A blank cell inside one now means the school genuinely has no published result, which is worth saying — so it says Not published rather than a bare dash.
Before
After
One table, RWM expected, 30% blank
Primary schools (19) — Reading, writing & maths
Secondary schools (8) — Attainment 8
Phased pages (/schools/brentwood/primary) still show a single table with no redundant heading.
Verification
Backend 100 · frontend 253 · tsc --noEmit clean · next build green · 84 e2e journeys. Five new component tests covering exactly the three faults, including one asserting the jargon heading cannot come back.
I also verified every CSS class the component references exists in the stylesheet — a missing CSS module class fails silently, which is how unstyled links shipped in the first place.
Three presentation faults you spotted on the place pages. All three were found by looking at a rendered page — every automated check passed on all of them.
**Stacked on #117** (title fix).
## a) Links were unstyled
They carried no class at all, so they rendered as default blue underlined browser links beside a site that styles table links as body colour with a brand hover. `RankingsView` sets `.schoolLink { color: var(--text-primary); text-decoration: none }` with `--brand-strong` on hover; the place tables now follow it, and running-copy links take the brand colour.
## b) The heading was jargon — and I invented it
`RWM expected` appears nowhere else on the site. `METRIC_DEFINITIONS` already names the measure, surfaced at `/api/metrics`:
> `name`: Reading, Writing & Maths Combined %
> `description`: % meeting expected standard in reading, writing and maths
The heading now reads **Reading, writing & maths**, with the full definition in the tooltip. Secondary tables read **Attainment 8**.
## c) The column was 30% empty, and that was structural
On `/schools/brentwood`, **8 of 27 rows were blank**. An unphased place page listed both primaries and secondaries but showed a single primary-only measure, so every secondary row was empty.
Neither obvious fix works: picking the other measure just inverts which rows are blank, and putting both in one column mixes a percentage with a 0–90 score — two incomparable scales under one heading.
**Each phase now gets its own table**, with the measure that applies to it. A blank cell inside one now means the school genuinely has no published result, which is worth saying — so it says **Not published** rather than a bare dash.
| Before | After |
|---|---|
| One table, `RWM expected`, 30% blank | **Primary schools** (19) — Reading, writing & maths |
| | **Secondary schools** (8) — Attainment 8 |
Phased pages (`/schools/brentwood/primary`) still show a single table with no redundant heading.
## Verification
Backend 100 · frontend 253 · `tsc --noEmit` clean · `next build` green · 84 e2e journeys. Five new component tests covering exactly the three faults, including one asserting the jargon heading cannot come back.
I also verified every CSS class the component references exists in the stylesheet — a missing CSS module class fails silently, which is how unstyled links shipped in the first place.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
https://claude.ai/code/session_015mWQnpye9F299NVRCCSRvj
Three presentation faults on the place pages, all found by looking at a
rendered page rather than at a test.
An unphased place page showed one primary-only measure for a list holding both
phases: 8 of 27 rows on /schools/brentwood were blank, because secondaries
have no reading-writing-maths score. Picking the other measure would only have
inverted which rows were empty, and putting both in one column would have
mixed a percentage with a 0-90 score. Each phase now gets its own table, so a
blank cell means the school genuinely has no published result — which is worth
saying, and now says "Not published" rather than a bare dash.
"RWM expected" was invented here. The site already names the measure in
METRIC_DEFINITIONS, surfaced at /api/metrics: "Reading, Writing & Maths
Combined %". The heading now reads "Reading, writing & maths" with the full
definition in the tooltip.
Links carried no class at all, so they rendered as default blue underlined
browser links beside a site that styles table links as body colour with a
brand hover. They now follow RankingsView's convention, and running-copy links
take the brand colour.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015mWQnpye9F299NVRCCSRvj
tudor
merged commit 0f1ca660cb into fix/place-title-brand-doubling2026-08-21 20:53:21 +00:00
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Three presentation faults you spotted on the place pages. All three were found by looking at a rendered page — every automated check passed on all of them.
Stacked on #117 (title fix).
a) Links were unstyled
They carried no class at all, so they rendered as default blue underlined browser links beside a site that styles table links as body colour with a brand hover.
RankingsViewsets.schoolLink { color: var(--text-primary); text-decoration: none }with--brand-strongon hover; the place tables now follow it, and running-copy links take the brand colour.b) The heading was jargon — and I invented it
RWM expectedappears nowhere else on the site.METRIC_DEFINITIONSalready names the measure, surfaced at/api/metrics:The heading now reads Reading, writing & maths, with the full definition in the tooltip. Secondary tables read Attainment 8.
c) The column was 30% empty, and that was structural
On
/schools/brentwood, 8 of 27 rows were blank. An unphased place page listed both primaries and secondaries but showed a single primary-only measure, so every secondary row was empty.Neither obvious fix works: picking the other measure just inverts which rows are blank, and putting both in one column mixes a percentage with a 0–90 score — two incomparable scales under one heading.
Each phase now gets its own table, with the measure that applies to it. A blank cell inside one now means the school genuinely has no published result, which is worth saying — so it says Not published rather than a bare dash.
RWM expected, 30% blankPhased pages (
/schools/brentwood/primary) still show a single table with no redundant heading.Verification
Backend 100 · frontend 253 ·
tsc --noEmitclean ·next buildgreen · 84 e2e journeys. Five new component tests covering exactly the three faults, including one asserting the jargon heading cannot come back.I also verified every CSS class the component references exists in the stylesheet — a missing CSS module class fails silently, which is how unstyled links shipped in the first place.
🤖 Generated with Claude Code
https://claude.ai/code/session_015mWQnpye9F299NVRCCSRvj