Files
anonymizer/CHANGELOG.md
Mobiletic 669794522e feat!: optional fail-closed fallback, legend output, richer prompt & docs
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>
2026-06-25 15:28:04 +01:00

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

  • legend on every result — abbreviation → French meaning (PERPersonne, MMasculin), safe to forward to a downstream LLM so it understands the placeholder tokens. Backed by a built-in DEFAULT_LEGEND so 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 the legend. presets.swiss/ presets.generic ship 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. 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 or patterns is required, or the constructor throws.
  • AnonymizationResult gained a required legend field; LlmProvider.anonymizeBatch returns legend.
  • anonymizeChunks(chunks, seed)seed is now { mapping, legend? } (was the bare mapping) and the return includes legend.

[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.swiss and presets.generic regex pattern sets; fully configurable custom patterns.
  • Regex-only mode (no LLM provider required).
  • PatternDef.validate — optional second-stage predicate to cut false positives; presets.generic uses it for a Luhn check on credit-card candidates, and de-overlaps its phone/date/IP patterns.
  • openAICompatibleProvider retries transient failures (network/timeout/429/5xx) via retries and retryDelayMs options; non-transient 4xx and malformed responses are not retried.
  • Hardened the nameHint heuristic: g/y flags are stripped internally so .test() is stateless.