BREAKING CHANGE: regex fallback is now opt-in (patterns no longer defaults
to presets.swiss). With no fallback an LLM failure throws AnonymizationError
(fail-closed) and the pre-filter is bypassed; at least one of llm/patterns is
required. AnonymizationResult gains a required `legend`; anonymizeChunks seed
is now { mapping, legend? } and returns legend.
- prompt: model may coin new UPPERCASE abbreviations and returns a 'legende'
explaining every abbreviation used (French); backfilled by DEFAULT_LEGEND
- PatternDef.meaning surfaces in the legend; swiss/generic presets get meanings
- AnonymizationError (exported) wraps the cause on fail-closed
- README: drop the chatbot provenance line; add 'How it works' + nLPD sections
- 34 tests / 99% coverage; bump to 0.2.0
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2.6 KiB
2.6 KiB
Changelog
All notable changes to this project are documented here. The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
[0.2.0] - Unreleased
Added
legendon every result — abbreviation → French meaning (PER→Personne,M→Masculin), safe to forward to a downstream LLM so it understands the placeholder tokens. Backed by a built-inDEFAULT_LEGENDso coverage is guaranteed even if the model omits entries.- The default prompt now lets the model coin new uppercase abbreviations for entities/attributes/
context it discovers and return their meanings in
legende. PatternDef.meaning— optional human label for a tag, surfaced in thelegend.presets.swiss/presets.genericship French meanings.AnonymizationError(exported) — thrown when anonymization can't complete and no fallback exists; carries the originating error in.cause.
Changed (breaking)
- Regex fallback is now opt-in.
patternsno longer defaults topresets.swiss. With no fallback, an LLM failure throwsAnonymizationError(fail-closed) and the pre-filter is bypassed. At least one ofllmorpatternsis required, or the constructor throws. AnonymizationResultgained a requiredlegendfield;LlmProvider.anonymizeBatchreturnslegend.anonymizeChunks(chunks, seed)—seedis now{ mapping, legend? }(was the bare mapping) and the return includeslegend.
[0.1.0] - Unreleased
Added
- Initial public release.
Anonymizer— pre-filter → LLM → regex fallback, bidirectional validation, deterministic coreference, and de-collision across question and retrieved chunks (anonymize,anonymizeChunks,deanonymize).makeStreamDeanonymizer— streaming-safe de-anonymization that never leaks a split placeholder.openAICompatibleProvider— pluggable LLM detection over any OpenAI-compatible Chat Completions API.presets.swissandpresets.genericregex pattern sets; fully configurable custom patterns.- Regex-only mode (no LLM provider required).
PatternDef.validate— optional second-stage predicate to cut false positives;presets.genericuses it for a Luhn check on credit-card candidates, and de-overlaps its phone/date/IP patterns.openAICompatibleProviderretries transient failures (network/timeout/429/5xx) viaretriesandretryDelayMsoptions; non-transient 4xx and malformed responses are not retried.- Hardened the
nameHintheuristic:g/yflags are stripped internally so.test()is stateless.