From a5b22962404d8d520c12bc64dddadda404dcad7b Mon Sep 17 00:00:00 2001 From: Tudor Date: Tue, 21 Jul 2026 12:08:50 +0100 Subject: [PATCH] fix(rankings,admissions): correct accuracy issues from education audit MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Follow-up audit of the rankings and admissions pages. Admissions (AdmissionsView.tsx): - National Offer Day no longer claims offers publish "from 12:01 am"; release times are set per-council (often late afternoon, some overnight), so it now tells parents to check their council's page. - Secondary preference count no longer states a flat "up to six" (that's London/Pan-London); most LAs allow three to six. Mirrors the hedge the primary step already used. - Added the two deadlines that most often catch parents out: selective schools' separate entrance-test registration (months earlier), and faith schools' supplementary information form sent direct to the school. Covered in both the primary and secondary criteria steps. - Reworded the equal-preference tip so it's precise: order is the tie-break among schools you qualify for (you get the highest-ranked one), not irrelevant. Rankings (RankingsView.tsx): - Subtitle "Top-performing schools by X" -> "Schools ranked by X", so it isn't nonsensical for context/equity/absence metrics. - KS2 progress isn't published for 2023/24 or 2024/25 (no KS1 baseline). Selecting a primary progress metric on a recent year used to dead-end on a generic "No rankings found". Added a scoped caveat to the progress hint and an explanatory empty-state (primary only — secondary Progress 8 is published). Added an admissions smoke journey (static content, stable milestones). Verified with tsc --noEmit and next build. Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_0146VHeLAWjDVE2B5uU67jCB --- e2e/tests/journeys.spec.ts | 12 ++++++++++++ nextjs-app/components/AdmissionsView.tsx | 10 +++++----- nextjs-app/components/RankingsView.tsx | 13 ++++++++++--- 3 files changed, 27 insertions(+), 8 deletions(-) diff --git a/e2e/tests/journeys.spec.ts b/e2e/tests/journeys.spec.ts index ab4ce8f..f290eae 100644 --- a/e2e/tests/journeys.spec.ts +++ b/e2e/tests/journeys.spec.ts @@ -438,6 +438,18 @@ test('compare chart on mobile shows school chips with tap-to-focus', async ({ pa await expect(chips.first()).toHaveAttribute('aria-pressed', 'false'); }); +test('admissions guide renders its key milestones', async ({ page }) => { + // Static content page — assert the guide loads and the load-bearing + // milestones parents rely on are present (dates are statutory, so these + // strings are stable invariants, not data-refresh-sensitive). + await page.goto('/admissions'); + await expect(page.getByRole('heading', { name: /School Admissions Guide/i })).toBeVisible(); + await expect(page.getByRole('heading', { name: /Primary school admissions/i })).toBeVisible(); + await expect(page.getByRole('heading', { name: /Secondary school admissions/i })).toBeVisible(); + // National Offer Day is the milestone the whole guide builds toward. + await expect(page.getByText(/National Offer Day/i).first()).toBeVisible(); +}); + test('rankings page loads a populated table', async ({ page }) => { await page.goto('/rankings'); await expect(page.getByRole('heading', { name: /rankings/i }).first()).toBeVisible(); diff --git a/nextjs-app/components/AdmissionsView.tsx b/nextjs-app/components/AdmissionsView.tsx index 73b14c0..b3d8264 100644 --- a/nextjs-app/components/AdmissionsView.tsx +++ b/nextjs-app/components/AdmissionsView.tsx @@ -61,7 +61,7 @@ interface Step { const SECONDARY_STEPS: Step[] = [ { title: 'Check entry criteria', - body: 'Look at each school\'s admissions policy — catchment areas, faith criteria, sibling priority, and aptitude tests vary widely.', + body: 'Look at each school\'s admissions policy — catchment areas, faith criteria, sibling priority, and aptitude tests vary widely. Two deadlines catch parents out: grammar and other selective schools need separate entrance-test registration months earlier (often by September), and faith schools often want a supplementary information form sent directly to the school alongside the council application.', tool: { label: 'Find schools & view their admissions history', href: '/' }, }, { @@ -73,14 +73,14 @@ const SECONDARY_STEPS: Step[] = [ { date: '31 October', title: 'Application deadline', - body: 'Submit your ranked list of up to six schools. Councils treat all preferences equally — list schools in the genuine order you want them, not strategically.', + body: 'Submit your ranked list of schools — most councils allow three to six preferences (London boroughs typically six). Councils treat all preferences equally, so list schools in the genuine order you want them, not strategically.', highlight: 'deadline', tool: { label: 'Compare performance to order your preferences', href: '/rankings' }, }, { date: '1 March', title: 'National Offer Day', - body: 'Results are published online, usually from 12:01 am. You\'ll receive an email or letter with your allocated school.', + body: 'Your allocated school appears on the council\'s online admissions portal and is sent by email. Release times are set by each council — often from late afternoon, though some publish overnight — so check your council\'s page rather than refreshing at midnight.', highlight: 'offer', tool: { label: 'Look up your allocated school', href: '/' }, }, @@ -100,7 +100,7 @@ const SECONDARY_STEPS: Step[] = [ const PRIMARY_STEPS: Step[] = [ { title: 'Research entry criteria', - body: 'Faith schools, language units, and distance-based catchments differ by school. Start by reading each school\'s admissions policy on their website or the council\'s website.', + body: 'Faith schools, language units, and distance-based catchments differ by school. Start by reading each school\'s admissions policy — and note that faith schools often require a supplementary information form sent directly to the school, in addition to the council application.', tool: { label: 'Find schools & view their admissions history', href: '/' }, }, { @@ -144,7 +144,7 @@ interface Tip { const TIPS: Tip[] = [ { heading: 'Equal preference rule', - body: 'Councils rank offers by your eligibility for each school, not by the order you listed them. You cannot game the system — put schools in the order you actually want them.', + body: 'Councils consider every school you list before making any offer, then give you the highest-ranked one you qualify for. Your order only decides which qualifying school you get — you can\'t game it, so list schools in the order you genuinely want them.', }, { heading: 'Late applications go to the back', diff --git a/nextjs-app/components/RankingsView.tsx b/nextjs-app/components/RankingsView.tsx index 0c4a618..dbf7949 100644 --- a/nextjs-app/components/RankingsView.tsx +++ b/nextjs-app/components/RankingsView.tsx @@ -118,7 +118,7 @@ export function RankingsView({

School Rankings

- Top-performing schools by {metricLabel.toLowerCase()} + Schools ranked by {metricLabel.toLowerCase()} {!selectedArea && rankings.length > 0 && — showing top {rankings.length}}

@@ -143,7 +143,10 @@ export function RankingsView({

{currentMetricDef.description}

)} {isProgressScore && ( -

Progress scores: 0 = national average. Positive = above average.

+

+ Progress scores: 0 = national average. Positive = above average. + {isPrimary && ' KS2 progress isn’t published for 2023/24 or 2024/25 (there’s no key stage 1 baseline) — pick an earlier year to rank by it.'} +

)} {/* Filters */} @@ -218,7 +221,11 @@ export function RankingsView({ {rankings.length === 0 ? ( router.push(`${pathname}?phase=${selectedPhase}`), -- 2.54.0