Fix overlapping entity conflict resolution (#33)
authorStefan Gasser <redacted>
Fri, 16 Jan 2026 16:11:50 +0000 (17:11 +0100)
committerStefan Gasser <redacted>
Fri, 16 Jan 2026 16:11:50 +0000 (17:11 +0100)
commitdbb221a2130e1a97518d7a39abc75d4733873758
treeb2e912389b1650b18c9f389a775c9a0725cbe270
parentc8cc3cfc3449336bf8005b1445a9ed1a677ddcee
Fix overlapping entity conflict resolution (#33)

Implement Presidio-style conflict resolution for overlapping PII entities.

Problem: Presidio returns overlapping entities (e.g., both "Eric" and "Eric's")
which caused text corruption during masking.

Solution: Two-phase algorithm matching Presidio's Anonymizer logic:
1. Merge overlapping entities of same type (expand boundaries, keep highest score)
2. Remove conflicting entities of different types (contained or lower score loses)

- Add conflict-resolver.ts with resolveConflicts() and resolveConflictsSimple()
- Replace old removeOverlappingEntities with new conflict resolver
- Add 18 tests covering all conflict scenarios
- Delete old entities.ts (replaced by conflict-resolver.ts)
src/secrets/redact.ts
src/services/masking.test.ts
src/services/masking.ts
src/utils/conflict-resolver.test.ts [new file with mode: 0644]
src/utils/conflict-resolver.ts [new file with mode: 0644]
src/utils/entities.test.ts [deleted file]
src/utils/entities.ts [deleted file]
git clone https://git.99rst.org/PROJECT