Детектор кризиса (guardrail №2): лексикон риска с нормализацией и обработкой отрицаний + LLM-сигнал (берём максимум), фиксированный кризисный скрипт для пациента и семьи. Recall acute = 100% на eval-наборе из 99 фраз.
make lint test
uv run python -c "from app.core.safety import check, crisis_reply; r = check('хочу покончить с собой'); print(r); print(crisis_reply(r.categories).text)"
## Что меняется
Детектор кризиса (guardrail №2): лексикон риска с нормализацией и обработкой отрицаний + LLM-сигнал (берём максимум), фиксированный кризисный скрипт для пациента и семьи. Recall acute = 100% на eval-наборе из 99 фраз.
Closes #4
## Зона
core
## Как проверить
```bash
make lint test
uv run python -c "from app.core.safety import check, crisis_reply; r = check('хочу покончить с собой'); print(r); print(crisis_reply(r.categories).text)"
```
API для других зон:
- `check(text: ScrubbedText, llm_signal: RiskLevel | None = None) -> SafetyResult` (`level`, `categories`, `matched_rules`, `negated_rules`, `source`) — без сырого текста.
- `crisis_reply(categories: list[str], audience: Literal["patient","family"] = "patient") -> CrisisScript` — `.text` готов к отправке дословно.
## Чек-лист
- [x] rebase на origin/dev
- [x] make lint + make test зелёные
- [x] лог в issue (### YYYY-MM-DD)
- [x] нет ПДн в логах, нет реальных данных, нет секретов
- [x] общие файлы не трогал
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Что меняется
Детектор кризиса (guardrail №2): лексикон риска с нормализацией и обработкой отрицаний + LLM-сигнал (берём максимум), фиксированный кризисный скрипт для пациента и семьи. Recall acute = 100% на eval-наборе из 99 фраз.
Closes #4
Зона
core
Как проверить
API для других зон:
check(text: ScrubbedText, llm_signal: RiskLevel | None = None) -> SafetyResult(level,categories,matched_rules,negated_rules,source) — без сырого текста.crisis_reply(categories: list[str], audience: Literal["patient","family"] = "patient") -> CrisisScript—.textготов к отправке дословно.Чек-лист
🤖 Generated with Claude Code