Your own identifier formats

The shipped detectors know names, dates, phone numbers, emails, addresses, employers, occupations, UK postcodes, and the structured identifiers of four countries (New Zealand, Australia, the United Kingdom, and the United States). They do not know your record-number format, your ward and clinic names, or your local date style. Nothing can, in advance. So before the first run on a new dataset, find what the detectors leave in place, and tell the SDK about it in the config.

1. Survey a sample

The survey runs the local detectors over the sample, with no model call and nothing sent anywhere, and lists what they left in place that looks like an identifier: codes that mix letters and digits, long digit runs, and capitalized words outside sentence starts and speaker labels. Each row is a shape, a count, and one masked example. Values never appear: the shape AA-9A9A9A9A9 and the example KZ-7B******* are enough to recognise a format, and no value leaves your boundary.
Read the rows against your own data. The first is a patient ID. The second is a ward name. The third is a referral number. --json gives the same rows as data.

2. Add an entry for each format

The identifier types a type can name: The config is checked when it loads, not when a pattern first fires. An invalid expression, an unknown type or check, a pattern that matches the empty string, or one loose enough to match every word stops the command with the entry’s name in the message. A custom pattern wins an overlap with the built-in detectors. Kowhai Ward configured as a LOCALITY stays one, whatever the name model thinks of it. A custom pattern is an instruction, not a guess, so the detection guards never refuse it. The guards keep a clinician role, a generic department, a relative time, or a word tagged as a number in the text when a detector proposes one; a hit on your own format is always replaced, even when it has no digits or reads like a date phrase. Custom patterns run inside the Presidio member, so they apply whenever presidio is in detectors, including the default [presidio, gliner-pii-open].

3. Survey again

The three rows are gone. What remains is what you have decided is not an identifier, or what the judge loop will catch. Then run for real.

What the survey cannot see

It reads text. A value that is spoken as words (“my number is four four one seven”), a value that changes shape between records, or a value that is an ordinary word in your data (a clinic named “Sunrise”) will not appear as a shape. Read a few cleaned transcripts by eye once per dataset; run writes them into the local ledger, which stays inside your boundary.