# Inspection Status Beyond Ofsted's School Data — Design
**Date:** 2026-10-06
**Status:** approved design, not yet implemented
**Scope:**`tap_uk_gias` (two fields), `tap_uk_ofsted` (two FE streams), Ofsted
and GIAS staging, `int_ofsted_latest` / `fact_ofsted_latest`, new
`int_ofsted_fe_latest` and `int_ofsted_listed`, `dim_school`, monthly Ofsted DAG
selector, backend list and detail payloads, search badge, map card, school page
Ofsted section, compare Ofsted rows
**Fixes:** audit finding H4, from the 3 Oct 2026 accuracy audit
## Goal
Never label a school "Not yet inspected" unless Ofsted's own data lists it
without an inspection, and show every inspection result we can source, with its
date.
## The problem
The search badge and the map card (`buildOfstedListBadge`,
`nextjs-app/lib/utils.ts`) print "Not yet inspected" whenever we hold no Ofsted
record. The school page hides its Ofsted section for these schools, and compare
says "No inspection in our dataset". On production on 6 October 2026 (build
`2b5e681`), 2,587 listed schools have no Ofsted record. Joined with GIAS
(6 October 2026) and Ofsted's management information (31 August 2026):
| Group | Schools | Evidence |
|---|---|---|
| Independent schools inspected by ISI | 1,341 | GIAS `InspectorateName` = "ISI". GIAS holds no date, outcome or report link for any of them; ISI publishes no bulk data. |
| Further-education and post-16 providers inspected by Ofsted | 519 | In Ofsted's "Further education and skills" MI: 509 by Provider URN, 10 only by UKPRN through GIAS. 207 FE colleges, 129 special post-16 institutions, 97 higher-education institutions (their FE and apprenticeship provision), 78 16–19 academies and free schools, 8 others. Queen Mary's College (145175): Good, 6 December 2022. |
| Listed by Ofsted, never inspected | 263+ | New academies and free schools present in Ofsted's school MI with every inspection field `NULL`, e.g. Abbas and Templecombe Church School (150031, opened January 2024). "Not yet inspected" is Ofsted's own position for these. |
| No usable inspection data | about 460 | Secure units (inspected as children's homes), higher-education institutions outside the FE MI, newer independents, schools opened after the MI date. |
Of the 519 FE providers: 443 have only a grade from the previous framework
(overall effectiveness 1–4 and the inspection's first day); 45 also have a newer
report card under the renewed framework (from 10 November 2025); 2 have only a
report card; 29 are listed with no inspection. 116 FE providers nationally have
a short inspection after their latest full inspection; the MI gives its date
but not its outcome.
## Non-goals
- Area grades from the previous FE framework, and the report card's
programme-by-theme grid. The FE display is the headline and a link.
- ISI dates or outcomes (no data source).
- A per-school ISI link: ISI's pages use ISI's own identifiers, not URNs.
- Inspections of secure units and children's homes (social care framework).
- Changing how school-framework records are chosen (the C1 rule stands).
## Data
### Extractors
**GIAS (`tap_uk_gias`).** Declare `UKPRN` and `InspectorateName (name)` on the
establishments stream. They are plain values, not codes, so the generated GIAS
dictionaries (backend and pipeline copies, parity-tested) are untouched.
**Ofsted (`tap_uk_ofsted`).** Two streams from Ofsted's "Further education and
skills inspections and outcomes: management information from …" pages on
gov.uk. Pages are found through the gov.uk search API by that title prefix; a
new page appears each academic year.
-`ofsted_fe_providers`: the newest page's newest
`…further_education_and_skills_-_as_at_<date>.csv`. One row per provider:
(`10_November_2025_to_31_January_2026`, `…_to_28_February_2026`, …, sometimes
with a doubled underscore); the stream reads the file with the latest end date
from every page since November 2025, so a report card survives the next
year's page. Files named `new_provider_monitoring` or `monitoring_inspections`
are excluded. Fields: `Provider URN`, `Provider UKPRN`, `Inspection number`,
`First day of inspection`, `Date published`, `Safeguarding standards`.
Key: `inspection_number`.
Page and file selection, and the CSV-to-field mapping, live in a module that
imports only pandas and the standard library, so CI's pytest (no
`singer_sdk`) can test them against saved real page HTML and real headers.
The existing school-MI stream is unchanged. It already loads every row Ofsted
lists, inspected or not; `stg_ofsted_inspections` drops the uninspected rows.
### dbt
-`stg_gias_establishments` gains `ukprn` and `inspectorate_name`.
-`stg_ofsted_fe_providers` and `stg_ofsted_fe_inspections`: dates parsed as
`DD/MM/YYYY`; grades `1`–`4` cast to integers and `-` to null; safeguarding
`Met` / `Not met` to a boolean.
-`int_ofsted_fe_latest`, one row per URN we hold. A provider matches a school
by `Provider URN` = URN; failing that, by `Provider UKPRN` = the school's GIAS
`ukprn`. The rule, in the terms of the C1 current-status rule:
| FE record | `current_grade` | `latest_visit` |
|---|---|---|
| Report card newer than the previous-framework inspection (or no such inspection) | null; `rc_inspection_date`, `rc_safeguarding_met` set | the report card (`report_card`) |
| Previous-framework grade 1–4, no newer report card | that grade, dated by the inspection's first day, basis `graded` | the later of that inspection (`graded`) and any short inspection (`short`) |
| Grade `-` and no report card | — | no row |
A short inspection's outcome is not in the data, so it is a visit, never a
grade change.
-`int_ofsted_latest` / `fact_ofsted_latest` take FE rows only for URNs with no
school-framework record; a school record always wins. FE rows carry
`framework = 'Further education and skills'`; school area and report-card
area columns stay null. `latest_visit_kind` gains the value `short`.
-`int_ofsted_listed`: every URN Ofsted's data includes, inspected or not —
all rows of `raw.ofsted_inspections` (before staging's date filter) plus every