diff --git a/CLAUDE.md b/CLAUDE.md index 69db07a..55cb93b 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -40,6 +40,12 @@ SpeechKit v3, Prometheus, `slog`. Сборка — Taskfile, образ — Dock пользователя и его сообщение в лог не пишутся — только длина и идентификаторы. Нарушение необратимо: строки уже уехали в журнал контейнера. **critical** + *Изъятие:* расширение — хвост после последней точки — в журнал попадает, потому + что стоит в собственном имени файла на диске, а путь логируется. Изъятие узкое + и кончается журналом: наружу, меткой метрики, расширение выходит только + приведённым к перечню известных форматов. Границу держит спека `intake`, + цена — [adr/ADR-2026-08-11-known-format-label.md](docs/adr/ADR-2026-08-11-known-format-label.md), + остаток — [docs/security.md](docs/security.md). - **Бот отвечает только тем, кто в белом списке.** Бот проверяет отправителя до любой работы, включая скачивание файла. Нарушение обратимо правкой конфига, но чужие записи к тому моменту уже обработаны за наши деньги. **critical** diff --git a/docs/security.md b/docs/security.md index 563032a..c730fc7 100644 --- a/docs/security.md +++ b/docs/security.md @@ -190,8 +190,9 @@ Telegram отправителю. 2026-08-11 задачей `no-user-filename-in-log`; запрет проверяют тесты приёма по HTTP на успешном пути и на пути отказа — они ищут значение, а не имя поля. -**Остаток: хвост после последней точки остаётся в журнале.** Расширение берётся -из имени отправителя дословно (`filepath.Ext`), поэтому имя +**Хвост после последней точки остаётся в журнале, и это объявленное изъятие** +инварианта приватности из [../CLAUDE.md](../CLAUDE.md), а не незакрытый остаток. +Расширение берётся из имени отправителя дословно (`filepath.Ext`), поэтому имя `запись.тайное-слово` отдаёт `тайное-слово`, а `Разговор с Петровым 11.08` — `08`. Оно стоит в собственном имени файла на диске, а путь к файлу логируется. Читает этот журнал владелец сервиса. Нормализация расширения на диске — отдельная