fix(compare): expert should-fixes S1-S4, S6 — banded chips, P8 reason, KS4 gap caption, all-through framing, cohort sizes
PR Checks / Frontend Typecheck + Tests (pull_request) Successful in 1m2s
PR Checks / Backend Smoke (pull_request) Successful in 7s
PR Checks / Build Backend (no push) (pull_request) Successful in 10s
PR Checks / Build Frontend (no push) (pull_request) Successful in 49s
PR Checks / Build Pipeline (no push) (pull_request) Successful in 10s
PR Checks / AI Code Review (Claude) (pull_request) Successful in 3m8s
PR Checks / Frontend Typecheck + Tests (pull_request) Successful in 1m2s
PR Checks / Backend Smoke (pull_request) Successful in 7s
PR Checks / Build Backend (no push) (pull_request) Successful in 10s
PR Checks / Build Frontend (no push) (pull_request) Successful in 49s
PR Checks / Build Pipeline (no push) (pull_request) Successful in 10s
PR Checks / AI Code Review (Claude) (pull_request) Successful in 3m8s
S1: first-choice chip banded (More than half / About 1 in 3 / Over 1 in 4
missed out) so a 44%-offered grammar isn't understated by half.
S2: Progress 8 explains its absence for 2024/25+ cohorts (no KS2 baseline,
COVID) instead of a bare 'No data'.
S3: KS4 trend charts get their own honest gap caption (2019/20-2020/21
unpublished; later years not in our dataset yet); y-axis 'Value'→'Score';
buildCompareChart exposes englandOnlyYears.
S4: all-through schools labelled in chips, rail caption says 'N schools ·
<phase> view' for mixed baskets, whole-school roll no longer judged
against the single-phase median, community section carries an all-ages
caveat.
S6 (spec §8.5): disadvantaged attainment shows the cohort behind it
('of ~50 disadvantaged pupils').
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0146VHeLAWjDVE2B5uU67jCB
This commit is contained in:
@@ -148,6 +148,15 @@ export function CompareAcademics({
|
||||
}
|
||||
return null;
|
||||
});
|
||||
// DfE stopped publishing Progress 8 from 2024/25: those GCSE year groups
|
||||
// sat no KS2 tests (COVID), so there is no baseline to measure progress
|
||||
// from. A bare "No data" reads as a gap on our side — say why.
|
||||
const latestYear = urns.reduce((max, urn) => {
|
||||
const rows = data[String(urn)]?.yearly_data ?? [];
|
||||
const y = rows.length ? Math.trunc(rows[rows.length - 1].year) : 0;
|
||||
return Math.max(max, y);
|
||||
}, 0);
|
||||
const p8NotPublished = latestYear >= 202425;
|
||||
const grade5 = latestValues(data, urns, 'english_maths_strong_pass_pct');
|
||||
const ebacc = latestValues(data, urns, 'ebacc_entry_pct');
|
||||
const att8Anchor = nationalAverages?.secondary?.attainment_8_score;
|
||||
@@ -189,6 +198,11 @@ export function CompareAcademics({
|
||||
>
|
||||
{banding[i]}
|
||||
</Chip>
|
||||
) : p8NotPublished ? (
|
||||
<span className={s.small}>
|
||||
Not published — this GCSE year group sat no KS2 tests (COVID), so DfE has no
|
||||
baseline to measure progress from
|
||||
</span>
|
||||
) : (
|
||||
<span className={s.small}>No data</span>
|
||||
)}
|
||||
@@ -218,6 +232,18 @@ export function CompareAcademics({
|
||||
const national = nationalAverages?.primary;
|
||||
const disadvantaged = latestValues(data, urns, 'rwm_expected_disadvantaged_pct');
|
||||
const disadvantagedAnchor = benchmarks?.primary?.disadvantaged_rwm_expected_pct ?? null;
|
||||
// Cohort size behind the disadvantaged figure (spec §8.5): these are small
|
||||
// groups where single pupils move the percentage — show roughly how many
|
||||
// pupils the figure rests on.
|
||||
const eligible = latestValues(data, urns, 'eligible_pupils');
|
||||
const disadvantagedShare = latestValues(data, urns, 'disadvantaged_pct');
|
||||
const cohorts = urns.map((_, i) => {
|
||||
const n = eligible[i];
|
||||
const share = disadvantagedShare[i];
|
||||
if (n == null || share == null) return null;
|
||||
const cohort = Math.round((n * share) / 100);
|
||||
return cohort > 0 ? cohort : null;
|
||||
});
|
||||
|
||||
return (
|
||||
<Section
|
||||
@@ -270,6 +296,9 @@ export function CompareAcademics({
|
||||
<span className={s.big} style={{ fontSize: '1.1rem' }}>
|
||||
{Math.round(value)}%
|
||||
</span>{' '}
|
||||
{cohorts[i] != null && (
|
||||
<span className={s.small}>of ~{cohorts[i]} disadvantaged pupils</span>
|
||||
)}{' '}
|
||||
{disadvantagedAnchor != null && (
|
||||
<Chip tone={verdict(value, disadvantagedAnchor, 5) === 'below' ? 'warn' : 'good'}>
|
||||
{verdict(value, disadvantagedAnchor, 5) === 'above' &&
|
||||
|
||||
Reference in New Issue
Block a user