Spaces:
Running
Zorgfilter v1 — recognizer contract
Status: frozen test/specification contract; implementation not included
Workpackage: SCRUB-WP_CARE_PROFILE_RECOGNIZER_CONTRACT_TESTS
Purpose
Freeze what the dedicated Dutch care recognizer layer must and must not do before implementation begins.
The future implementation module is:
dutch_care_recognizers.py
Frozen public API:
get_dutch_care_entity_names()
get_dutch_care_recognizers(supported_language="en")
The supported language remains en because the current app invokes Presidio with language="en" while adding Dutch custom recognizers.
Dedicated entity contract
The care module owns sixteen explicit entities:
NL_PATIENT_NUMBER
NL_CARE_CLIENT_NUMBER
NL_MEDICAL_RECORD_NUMBER
NL_EPD_ECD_NUMBER
NL_HEALTH_INSURANCE_NUMBER
NL_REFERRAL_NUMBER
NL_TREATMENT_REFERENCE
NL_LAB_SAMPLE_NUMBER
NL_CARE_INCIDENT_NUMBER
NL_CARE_INDICATION_REFERENCE
NL_AGB_CODE
NL_CARE_PROVIDER_NAME
NL_CARE_ORGANIZATION
NL_CARE_LOCATION_REFERENCE
NL_ROOM_OR_BED_REFERENCE
NL_CARE_EVENT_DATE
The module does not reimplement generic PERSON, e-mail, address, BSN, date-of-birth, telephone or BIG recognition.
Positive contract corpus
The versioned contract contains:
- 17 care-reference/collision cases;
- 20 contextual review cases;
- 37 positive exact-span cases in total;
- 16 negative/clinical-preservation cases.
Positive cases freeze:
- exact expected value;
- intended entity type;
- approved replace or review-selected policy;
- surrounding label or professional role that must remain readable;
- forbidden conflicting entity types where precedence matters.
Value-only and context rules
Administrative care references
Labels remain readable and only the patient-specific value is returned.
Examples:
Patiëntnummer: PAT-2026-1148
^^^^^^^^^^^^^
Medisch dossiernummer: MD-2026-4412
^^^^^^^^^^^^
Verwijsnummer: VERW-2026-7711
^^^^^^^^^^^^^^
Care-provider names
Professional role words remain readable.
Rapporteur: verpleegkundige Omar El Idrissi
^^^^^^^^^^^^^^^^
A role without a name must not produce a provider-name result.
Organizations and locations
Only strongly labeled care organizations and bounded location phrases are in scope. Narrative organization inference remains a generic NER/profile concern.
Event dates
Only labeled care-event dates are classified as NL_CARE_EVENT_DATE, including admission, discharge, report, evaluation and incident dates. Date of birth remains NL_DATE_OF_BIRTH and is forbidden as a care-event result.
AGB/BSN precedence
The contract freezes the baseline collision:
AGB-code: 01020304
Expected:
NL_AGB_CODE
Forbidden:
NL_BSN
Conversely, BSN: 123456782 and an eleven-digit BIG number must never become NL_AGB_CODE.
AGB therefore requires strong label context and deterministic overlap handling. An arbitrary eight-digit number is not an AGB code.
Clinical-preservation negatives
The care recognizer layer must not convert these into care identifiers:
- blood pressure such as
123/78 mmHg; - temperature such as
36,8 °C; - medication and dosage such as
Metformine 500 mg; - administration times such as
20:00 uur; - laboratory values and reference ranges;
- glucose and other decimal results;
- pain scores;
- relative time such as
over zes weken; - DBC and ICD clinical/declaration codes;
- a generic word such as
kamerwithout a room code; - professional role words without a person name.
Rare-case indirect identifiability remains an audit concern and is not a positive regex contract.
Implementation requirements
The next package must:
- implement only the frozen public API and sixteen entities;
- return deterministic Presidio
RecognizerResultobjects with exact spans; - preserve context labels and role words according to the fixtures;
- pass all 37 positive and 16 negative contracts;
- preserve existing Dutch legal/general recognizer behavior;
- remain Streamlit-, network-, AI-, cloud- and file-write-free;
- avoid registering the new recognizers in the app until a later profile integration package.
Claim boundaries
- synthetic data only;
- contract success is not production readiness;
- generic NER is outside this module;
- no UI, export, Scrub Key or reinsert change;
- human review remains mandatory.