diff --git a/nextjs-app/components/compare/CompareAcademics.tsx b/nextjs-app/components/compare/CompareAcademics.tsx index 53a6a8a..08de1f0 100644 --- a/nextjs-app/components/compare/CompareAcademics.tsx +++ b/nextjs-app/components/compare/CompareAcademics.tsx @@ -150,13 +150,15 @@ export function CompareAcademics({ }); // 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) => { + // from. A bare "No data" reads as a gap on our side — say why. Judged + // PER SCHOOL on its own latest data year: a school whose data simply + // stops earlier (an unrelated gap) must not borrow the COVID explanation + // from a neighbour that does have 2024/25 data. + const p8NotPublished = urns.map((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; + return y >= 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; @@ -198,7 +200,7 @@ export function CompareAcademics({ > {banding[i]} - ) : p8NotPublished ? ( + ) : p8NotPublished[i] ? ( Not published — this GCSE year group sat no KS2 tests (COVID), so DfE has no baseline to measure progress from @@ -234,15 +236,21 @@ export function CompareAcademics({ 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; + // pupils the figure rests on. Taken from the SAME yearly row that supplies + // the displayed percentage: resolving eligible_pupils and the + // disadvantaged share independently could mix years and misstate the + // cohort behind the figure. + const cohorts = urns.map((urn) => { + const rows = data[String(urn)]?.yearly_data ?? []; + for (let i = rows.length - 1; i >= 0; i--) { + const row = rows[i]; + if (row.rwm_expected_disadvantaged_pct != null) { + if (row.eligible_pupils == null || row.disadvantaged_pct == null) return null; + const cohort = Math.round((row.eligible_pupils * row.disadvantaged_pct) / 100); + return cohort > 0 ? cohort : null; + } + } + return null; }); return (