Files
transcriber/openspec/changes/archive/2026-08-11-no-user-filename-in-log/specs/intake/spec.md
T
av bd6001cd8d имя файла отправителя убрано из журнала приёма
- расширение приводится к перечню известных форматов прежде метки метрики:
  страница метрик открыта, и хвост имени уезжал на неё дословно
- проверки приёма перехватывают все три потока журнала и читают реестр метрик,
  каждая падает при снятии того, что сторожит
2026-08-11 16:37:58 +03:00

7.5 KiB
Raw Blame History

ADDED Requirements

Requirement: Имя файла, данное отправителем, не попадает в журнал

Приём SHALL не писать имя файла, данное отправителем, ни в одну свою журнальную запись — ни на успешном пути, ни на пути отказа, где имя могло бы приехать текстом ошибки. Имя приходит извне вместе с записью и принадлежит содержимому личной переписки наравне с текстом расшифровки; журнал уезжает в собранные логи, откуда строку не убрать.

Расширение, взятое из этого имени, в журнале остаётся: оно стоит в собственном имени файла на диске, и по нему прослеживается путь записи. Что именно попадает в журнал ради прослеживаемости, нормирует требование ниже; наружу расширение выходит только приведённым к известному виду — этому отдано третье требование.

Сценарии судят приём по HTTP, потому что имя, данное отправителем, доходит до сервиса только оттуда: из Telegram приходит путь, выданный самим Telegram, а не имя человека. Правка при этом ложится на общий шаг заведения задачи, через который идут оба входа, поэтому своей нормы приём из Telegram здесь не получает — её напишет задача, которая тронет его поведение.

Scenario: Имя записи не видно в журнале принятой записи

  • GIVEN источник метаданных читает запись и отдаёт её длительность
  • WHEN программа шлёт POST /api/audio с записью, чья основа имени несёт опознаваемую строку при обычном расширении .mp3
  • THEN ни одна журнальная запись приёма этой строки не содержит
  • AND расширение .mp3 в журнале допустимо

Scenario: Имя записи не видно в журнале при отказе приёма

  • GIVEN источник метаданных не может прочитать запись
  • WHEN программа шлёт POST /api/audio с записью, чья основа имени несёт опознаваемую строку
  • THEN ни одна журнальная запись приёма, включая запись об ошибке, этой строки не содержит

Requirement: Журнал приёма прослеживает запись

Приём SHALL писать в журнал идентификатор заведённого файла, расширение принятой записи и её размер в байтах. По ним путь записи собирается отбором по журналу, и удаление имени отправителя прослеживаемости не отнимает.

Расширение засчитывается присутствием собственного имени файла в хранилище: отдельного поля под него приём не заводит.

Scenario: Идентификатор, расширение и размер на месте

  • GIVEN источник метаданных читает запись и отдаёт её длительность
  • WHEN программа шлёт POST /api/audio с записью
  • THEN журнал приёма несёт идентификатор заведённого файла, расширение принятой записи и её размер в байтах

Requirement: Метка метрики несёт только известное расширение

Сервис SHALL приводить расширение принятой записи к известному виду прежде, чем употребить его меткой метрики: расширение приводится к нижнему регистру и сверяется с закрытым перечнем; совпавшее идёт приведённым, всякое другое MUST заменяться единым значением other. Перечень — mp3, wav, ogg, oga, opus, flac, m4a, aac, wma, mp4, mkv, mov, avi, webm, плюс audio: последнее не формат, а собственное умолчание сервиса на случай имени без расширения, и различать его от чужого хвоста метка обязана.

Страница метрик отдаётся без проверки отправителя, поэтому метка — поверхность пошире журнала: её читает кто угодно. Тем же ограничением снимается и рост числа временных рядов, которым иначе распоряжается анонимный отправитель.

Требование намеренно шире приёма: под него подпадает и метка шага конвертации. Когда конвертацию нормируют своей capability, обязанность переезжает туда вместе с ней.

Имя файла на диске это требование не трогает: там расширение остаётся тем, каким пришло, — это уже нормировано требованием «Имя файла в хранилище».

Настоящий формат записи, попавшей в other, остаётся видимым в журнале: значение other в метке означает «расширение не из перечня», а само оно стоит в поле пути журнальной строки приёма и в поле формата строки конвертации.

Scenario: Незнакомое расширение наружу не выходит

  • GIVEN источник метаданных читает запись и отдаёт её длительность
  • WHEN программа шлёт запись с именем, чей хвост после последней точки не принадлежит перечню known-форматов
  • THEN метка метрики принимает значение other
  • AND файл в каталоге хранения сохраняет пришедшее расширение

Scenario: Известное расширение идёт как есть

  • GIVEN источник метаданных читает запись и отдаёт её длительность
  • WHEN программа шлёт запись с именем sample.MP3
  • THEN метка метрики принимает значение mp3