Field schema and reference rules
Every gold.json uses exactly these field names. Extractors return the same keys; the scorer normalises dates, money and organisation names before comparing.
Fields (schema 0.1.0)
| Field | Type | Meaning | Reference |
|---|---|---|---|
notice_type | enum tender_notice, contract_award_notice, contract_details_notice, contract_change_notice, contract_document | What kind of document this is. | PA 2023 ss.50, 53, 75 |
notice_reference | string | Published notice identifier as printed (e.g. 004213-2026). Null for a bare contract document. | |
contracting_authority critical | string | Full legal name of the buying authority as printed. | |
contracting_authority_type | enum sub_central, central | Councils are sub-central authorities; this decides the threshold row. | PA 2023 Sch 1 |
supplier_name critical | string | Awarded supplier's legal name. For a multi-lot award, the supplier of lot 1 (per-lot suppliers go in 'lots'). | |
supplier_registration_number | string | Companies House / registration number as printed, or null. | |
contract_title critical | string | Title of the contract/procurement as printed. | |
contract_reference | string | The authority's own contract reference (e.g. WBC/2026/0071). | |
procurement_type | enum goods, services, works | Main category. Decides the 10%/15% modification thresholds. | PA 2023 s.74(4) |
light_touch | boolean | True if the contract is a light touch contract (health, social care, education and other Schedule-listed services). Decides which threshold row applies. | PA 2023 s.9, Sch 1 |
procedure | enum open, competitive_flexible, direct_award, framework_call_off | Award procedure used. | PA 2023 ss.19-20, 41 |
cpv_codes | list[string] | All CPV codes printed, 8 digits each, no check digit suffix. | |
notice_published_date | date | Date the notice was published. | |
award_date | date | Date of the award decision. | |
contract_signed_date | date | Date the contract was entered into (signed). Null if not stated. | |
contract_start_date critical | date | Contract commencement date. | |
contract_end_date critical | date | Initial expiry date (before any options). | |
extension_options_months | integer | Total months of extension options available at award. 0 if none. | |
maximum_term_months | integer | Initial term plus all extension options, in months. | PA 2023 s.74(3)(a) |
contract_value_gbp critical | money | Total contract value as stated (for the full initial term; add options only if the document says the value includes them). | |
value_includes_vat | boolean | True if the stated value is inclusive of VAT. | |
number_of_tenders_received | integer | Tenders received, as printed. | |
kpis | list[string] | Names of the key performance indicators set for the contract, in document order. | PA 2023 s.52 |
payment_terms_days | integer | Days from receipt of a valid invoice to payment, as printed. | PA 2023 s.68 |
standstill_end_date | date | Date the standstill period ends (award notices). | PA 2023 s.51 |
lots | list[object] | One object per lot: {lot_number:int, lot_title:string, supplier_name:string|null, value_gbp:money|null, awarded:boolean}. Empty list if the contract has no lots. | |
modification_number | integer | Sequential number of this modification to the contract. | PA 2023 s.75 |
modification_date | date | Date the modification takes effect (or was made). | |
modification_description | string | Short description of what is changing, as printed. | |
modification_ground critical | enum sch8_para1_provided_for, sch8_para2_urgency, sch8_para3_unforeseeable, sch8_para4_known_risk, sch8_para5_additional, sch8_para6_restructuring, s74_non_substantial, s74_below_threshold | Legal ground relied on for the modification. | PA 2023 s.74(1), Sch 8 |
original_contract_value_gbp | money | Contract value before this modification. | |
revised_contract_value_gbp | money | Contract value after this modification. | |
value_change_gbp critical | money | Signed change in value caused by this modification (revised minus original). | |
value_change_percent | number | value_change_gbp as a percentage of original_contract_value_gbp, rounded to 1 dp. | |
original_end_date | date | End date before this modification. | |
revised_end_date critical | date | End date after this modification. | |
term_change_months | integer | Signed change in term, in months. | |
contract_change_notice_published | boolean | Whether the document states that a contract change notice was published before the modification. | PA 2023 s.75 |
voluntary_standstill | boolean | Whether a voluntary standstill period is stated for the modification. | PA 2023 s.76 |
Flags a rule engine is expected to raise
Computed by crtest/pa2023.py from the gold fields. Thresholds are inclusive of VAT and follow the Procurement Act 2023 (Threshold Amounts) (Amendment) Regulations 2025 for procurements commenced on or after 1 January 2026; earlier figures are kept for older procurements.
| Rule | Severity | Description |
|---|---|---|
PA23-threshold-in-scope | info | Estimated value meets or exceeds the relevant threshold, so Part 2/3/4 of the Act apply. |
PA23-s51-standstill-short | high | Standstill ends fewer than 8 working days after the award notice was published. |
PA23-s52-kpi-min3 | high | Contract value above £5m but fewer than three KPIs are set. |
PA23-s53-cdn-late | medium | Contract details notice published more than 30 days after the contract was entered into. |
PA23-s68-payment-over-30d | medium | Stated payment terms exceed 30 days; the 30-day implied term applies regardless. |
PA23-s74-exceeds-below-threshold | high | Modification relies on the below-threshold ground but changes value by more than 10% (goods/services) or 15% (works). |
PA23-s74-substantial-term | high | Modification changes the term by more than 10% of the maximum term at award and no Schedule 8 ground is given. |
PA23-sch8-para3-cap-50pc | high | Unforeseeable-circumstances modification increases value by more than 50%. |
PA23-s75-ccn-required-not-published | high | A contract change notice was required (value change over 10%/15% or term change over 10%) but the document states none was published. |
PA23-s77-publish-modified-contract | info | Qualifying modification to a contract over £5m: a copy of the modified contract must be published within 90 days. |
AUDIT-retrospective-extension | high | Modification is dated after the contract's original end date (the contract had already expired). |
AUDIT-direct-award-above-threshold | medium | Direct award of an above-threshold contract; check the s.41 justification. |
Scoring rules
- Gold null and prediction null: not counted. Gold null and prediction non-null: wrong (invented value).
- Dates: compared as ISO after parsing
3 March 2026,3rd March 2026,03/03/2026,2026-03-03,03-Mar-2026. - Money: within 0.1% or £1 after parsing
£1,234.56,£2.31m,£4 200 000,1,234.00 GBPand words-and-figures. - Names: case, punctuation, "Limited"/"Ltd" and trading-as suffixes normalised; similarity ≥ 0.92 counts as correct.
- Lots: every lot must match on number, awarded flag, supplier and value.
- Flags: only high-severity rule ids are scored, as precision/recall across cases.