## Why

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

## What Changes

- Записи, их метаданные и файлы съезжаются в одно хранилище, и владелец получает
  панель, где видит задачу строкой, правит её и слушает саму запись.
- **BREAKING** Раскладка файлов на диске меняется: плоского каталога с именами по
  идентификатору не остаётся, файл ложится в раскладку хранилища. Момент перехода
  назначает человек.
- **BREAKING** Прежние данные не переносятся. Сервис начинает с чистого каталога
  и заводит свою схему сам.
- Файл перестаёт отдаваться чтением с диска и отдаётся ссылкой, которую хранилище
  строит по записи.
- Захват задачи воркером становится одним неделимым шагом: две задачи одному
  состоянию больше не достаются.
- У задачи появляется число попыток. Задача, исчерпавшая их, переходит в
  состояние «мертва»: из выборки исчезает, но остаётся видна владельцу и
  возвращается в работу снятием состояния.
- Пауза перед повтором нарастает с номером попытки.
- Сборка перестаёт требовать CGO.
- Появляется секрет, которого не было: пароль владельца от панели. В
  конфигурации он не лежит.

## Capabilities

### New Capabilities

- `storage`: где живут запись, её метаданные и её файл; как файл попадает в
  хранилище и как отдаётся обратно; что владелец видит и правит в панели; с
  каким состоянием сервис поднимается на чистом каталоге.

### Modified Capabilities

- `pipeline`: захват задачи становится неделимым; появляются число попыток,
  нарастающая пауза и состояние «мертва» вместо признака ошибки, исключающего
  задачу навсегда; описывается срок протухания захвата.
- `intake`: принятая запись уезжает в хранилище, а не в плоский каталог;
  требование «имя отправителя в хранилище не попадает» остаётся в силе и в новой
  раскладке.

## Impact

- Хранилище задач и файлов целиком: прежний слой запросов, построитель запросов и
  механизм миграций уходят вместе с каталогом `migrations/`.
- Договор между ядром и хранилищем: интерфейсы репозиториев задач и файлов.
- Состав полей задачи: прибавляется число попыток, признак ошибки уступает место
  состоянию в перечне состояний.
- Ключи конфигурации: путь к базе и путь к каталогу файлов заменяются одним
  каталогом данных.
- Приём по HTTP и приём из Telegram — в части того, куда кладётся принятая
  запись.
- Сборка образа: набор зависимостей меняется, требование CGO уходит.
- Документы: схема хранилища, инварианты и запреты с путями, модель угроз в части
  того, из чего строятся пути.
