feat(core): scrub() и pseudo_id() + тесты #31

Merged
Eleboba merged 1 commits from feat/2-privacy into dev 2026-10-03 15:01:29 +03:00
Owner

Что меняется

Реализованы scrub() (обезличивание текста перед LLM, guardrail №1) и pseudo_id() (HMAC-токен связи identity ↔ clinical). Словарь имён — в config/privacy/names_ru.yaml.

Closes #2

Зона

core

Как проверить

make lint test
uv run pytest -q tests/test_privacy.py

Публичный API (сигнатуры не менялись):

  • scrub(text: str) -> ScrubbedText — плейсхолдеры [PHONE] [EMAIL] [SNILS] [PASSPORT] [INN] [CARD] [DATE] [ADDRESS] [NAME] [URL] [HANDLE], идемпотентна.
  • pseudo_id(snils: str, key: str | None = None) -> str — 32 hex, ValueError на не-11-значный СНИЛС.

Чек-лист

  • rebase на origin/dev
  • make lint + make test зелёные
  • лог в issue (### 2026-10-03)
  • нет ПДн в логах, нет реальных данных, нет секретов
  • общие файлы не затронуты (добавлен только config/privacy/names_ru.yaml)

🤖 Generated with Claude Code

## Что меняется Реализованы `scrub()` (обезличивание текста перед LLM, guardrail №1) и `pseudo_id()` (HMAC-токен связи identity ↔ clinical). Словарь имён — в `config/privacy/names_ru.yaml`. Closes #2 ## Зона core ## Как проверить ``` make lint test uv run pytest -q tests/test_privacy.py ``` Публичный API (сигнатуры не менялись): - `scrub(text: str) -> ScrubbedText` — плейсхолдеры `[PHONE] [EMAIL] [SNILS] [PASSPORT] [INN] [CARD] [DATE] [ADDRESS] [NAME] [URL] [HANDLE]`, идемпотентна. - `pseudo_id(snils: str, key: str | None = None) -> str` — 32 hex, `ValueError` на не-11-значный СНИЛС. ## Чек-лист - [x] rebase на origin/dev - [x] make lint + make test зелёные - [x] лог в issue (### 2026-10-03) - [x] нет ПДн в логах, нет реальных данных, нет секретов - [x] общие файлы не затронуты (добавлен только `config/privacy/names_ru.yaml`) 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Eleboba added 1 commit 2026-10-03 15:00:49 +03:00
feat(core): implement scrub() and pseudo_id() with tests
CI / ruff · pytest (pull_request) Successful in 24s
585f0af273
Rule-based PII scrubber: phones, e-mails, SNILS (checksum-aware), passport,
INN, cards, dates of birth, addresses, URLs/handles and person names
(dictionary in config/privacy/names_ru.yaml + declension, patronymic and
surname heuristics). Idempotent via fixed-point iteration; false-positive
guards for ordinary clinical text. pseudo_id normalises SNILS to 11 digits
and returns HMAC-SHA256 truncated to 32 hex chars.

Refs #2

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Eleboba merged commit bfccc21a58 into dev 2026-10-03 15:01:29 +03:00
Eleboba deleted branch feat/2-privacy 2026-10-03 15:01:30 +03:00
Sign in to join this conversation.