Changelog
The version istacit_deid.__version__. Install a specific one with
pip install "tacit-deid==<version>".
0.5.1
A patch release; upgrade withpip install -U "tacit-deid[detector,gliner,llm]". No change to the
boundary artifact: the schema stays 1.2.
- Your own formats always win. A hit on a pattern in
custom_identifiersis never refused by a detection guard. In 0.5.0 a letters-only code (such asward-kowh) or a local date style (such asclinic day 14) could be dropped by a guard and cross verbatim. If you usecustom_identifiers, upgrade. - The audit provenance names every Stage-0 recognizer, including the UK postcode and day-month date recognizers.
0.5.0
Includes every change listed under 0.4.0, which was not published on its own. No change to the boundary artifact: the schema stays 1.2. Upgrade: the default detector stack is now[presidio, gliner-pii-open]. Install with
pip install -U "tacit-deid[detector,gliner,llm]". The model downloads about 0.7 GB on first use,
or loads from a local directory named by TACIT_DEID_GLINER_PII_OPEN_MODEL. To keep the previous
behaviour, set detectors: [presidio].
- Higher recall by default.
gliner-pii-open(knowledgator/gliner-pii-base-v1.0, Apache-2.0) joins Presidio. In Tacit’s tests it found 97.0% of the planted identifiers in 294 synthetic health records against 77.4% for Presidio alone, and 65.2% against 44.9% in 20 synthetic doctor and patient dialogs (one run each). Without theglinerextra the first command stops and names the fix. - Clinical facts stay. A clinician role (“the GP”, “a consultant”), a generic department or facility (“A&E”, “gastroenterology”), a pronoun or kin word tagged as a name (“I”, “mum”), and a word tagged as a number (“blood pressure” as a health-plan number) stay in the text. A patient’s own occupation (“I’m a doctor”) and a named institution (“Christchurch Hospital”) are replaced.
- More identifiers caught. UK postcodes; dates said with an ordinal or in words (“the 18th of November”, “twenty-third of April, nineteen seventy-five”); phone numbers and dates written with Unicode spaces or hyphens.
- Speaker labels. Diarization labels such as
SPEAKER_00:are no longer tagged as names. - Long transcripts. Model windows start and end on whole words, so part of a word is never replaced.
0.4.0
No change to the boundary artifact: the schema stays 1.2.- Fewer refused transcripts. The judge loop applies a number the judge wrote as digits to
the spoken form in the transcript (
54to “fifty-four”,1986to “nineteen eighty-six”), and a proposal whose words are split by a hyphen where the transcript has a space (fifty-threeto “fifty three”). - Clinical facts stay. A proposal the judge itself labels as clinical content (
SYMPTOM,CONDITION,ACTION_ADVICE) is ignored. Any other label still applies. - Rare conditions. The clinical-rarity check knows about 10,800 names and synonyms of disorders Orphanet confirms are rare (CC BY 4.0). A beat naming one is dropped. Before, only tuberculosis fell below the floor.
- NZ NHI numbers are checked against their check character, in the current format and the
expanded format issued from 2027. A number that fails is still detected, because a misheard
NHI still identifies the patient.
validate: nhiis available tocustom_identifiers. NHI surrogates always fail the check, so a surrogate is never a real NHI. - Five more identifier types with their own token and surrogate: UK NHS numbers, US passport numbers, US ITINs, DEA numbers, and crypto wallets.
- A warning when
detectorsleaves outgliner-pii, naming the recall gap (41.5% against 86.2% on 2,000 Nemotron-PII records). The default stays[presidio]. - The singling-out entry in the audit log says it covers age band and sex only.
0.3.0
- Your own identifier formats:
custom_identifiersintacit_deid.yaml, each a name, a pattern, and an identifier type, with optional context words and a checksum by name (luhn,abn,tfn,acn,medicare,ssn). A hit takes that type’s token, surrogate, gate, and audit path. A bad entry stops the command when the config loads, naming itself. inspect --surveylists what the detectors left in place that looks like an identifier, by shape with a masked example, never the values: the list to turn intocustom_identifiers.
0.2.0
The artifact contract gained one value, so this is a minor version. Upgrade withpip install -U tacit-deid. If you self-host Tacit, upgrade it first: a deployment from before
this change rejects unspecified as an unknown age band.
- Schema 1.2:
age_bandmay beunspecified, assexalways could. With no age and no date of birth in a transcript, 0.1.x had to guess a band; the extractor now answersunspecifiedand is told never to guess one. A stated age or date of birth still yields its band. - The singling-out gate judges an unstated band against every band, the whole population on that axis, the way it always treated an unstated sex.
- A sealed 1.1 artifact is still valid, and an artifact that omits
schema_versionis still read as 1.1.
0.1.1
Fixes found by running 0.1.0 on an ordinary consultation. Upgrade withpip install -U tacit-deid.
- A date of birth becomes the patient’s age band and is never taken for the visit date. In 0.1.0 a date of birth that was the only full date in a transcript filled as “today”, and the age band was left to a guess.
- The extractor answers
unspecifiedfor sex unless the transcript states it, and a name whose sex is unknown gets a surrogate that signals neither. - The default detector finds street addresses and an employer named after a work cue.
- A part of a detected name (“Thanks Marigold”) is replaced wherever it stands alone.
- No detector replaces a speaker label (
Doctor:), a generic work word (work,site), or a relative time phrase (last night). Withgliner-piistacked, 0.1.0 wrote beats such as “after a their occupation dinner”. - The
named-entityandclinical-raritygates no longer readpassed: falseon an artifact that crossed; what they repaired is indetail. - A beat left with nothing but placeholder phrases (“the patient with an organisation”) is dropped.
roundtrip --plantedtakes the path to a JSON file of plain strings or typed entries, and a wrong path or shape is a one-line message. In 0.1.0 the help said “JSON list” and every mistake was a traceback.
0.1.0
First published version.- The de-identification pipeline: Stage-0 detectors (Presidio, optional GLiNER), tokenization to
typed placeholders, a judge loop to fixpoint, surrogate fill, beat extraction, singling-out and
clinical-rarity gates, and a sealed
BoundaryArtifact(schema 1.1, sha256-jcs integrity). - Inputs: plain text, the common speech-to-text JSON shapes, JSON Lines, WebVTT, SubRip, CSV, TSV,
Word, PDF, directories, and zip archives; a keep list; a preflight (
inspect); batch runs with a manifest. - Transport to Tacit: send, materialize, regenerate, pull, fidelity, and the round-trip oracle;
the tokenized transcript as an opt-in second crossing (
send_tokenized_transcript, off by default). - The canary tripwire and the defensibility report.
- Condition prevalence comes from national statistics under licences that allow commercial redistribution (US federal works, CC BY 4.0, Open Government Licence v3.0), one cited page per figure. See Data licenses.