## Why Приложение строить не на чем. Сегодня сервис отвечает «записи нет» на упавшую базу и «внутренняя ошибка» на негодный файл: код ответа называет место, где отказ случился, а не его причину. Экран, собранный на таком контракте, показывает человеку «не найдено», когда на самом деле лежит хранилище. Списка своих записей у сервиса нет вовсе, карточка и текст едут одним ответом, а пределы, которыми сервис ограничивает загрузку, приложению неоткуда узнать — кроме как повторить их своей константой и разойтись с сервером молча. ## What Changes - **BREAKING.** Опрос готовности убирается целиком вместе со своими именами полей. Стадия проекта — стройка, на сервере данных нет, а внешней программы на прежнем контракте не существует: своего токена у неё не было. - **BREAKING.** Приложение уезжает из общего пространства `/api/` в своё `/app/`. Общее пространство принадлежит хранилищу, и обновление библиотеки вправе занять там имя рядом с нашим. - **BREAKING.** Приём стоит тем же адресом, что и список, и отличается методом: он заводит аудиозапись, а не кладёт файл. Ответ приёма отдаёт список заведённых записей и место под признак повторного файла — форма согласуется один раз, чтобы соседние задачи её не переписывали. - Отказ отвечает своей причиной: сбой хранилища виден как сбой, негодная запись — как негодная, отказ по чужому имени — как отказ. Тело отказа одной формы на всех адресах приложения, и собирает его одно место. - Появляется чтение своего архива: страница записей новыми сверху, карточка записи без текста и текст названного вида — сплошной либо репликами со временем. Шестичасовая расшифровка больше не задерживает показ шапки. - Появляется адрес, которым сервис объявляет свои пределы: потолок размера записи, частота опроса, перечень известных расширений, потолок тем. - Запись подписывается именем файла, данным отправителем: имя ложится своей колонкой и не спорит с заголовком, который дал человек либо посчитала языковая модель. Длина ограничена, управляющие знаки убраны. - Длительность и размер переезжают колонками записи: список читается без содержимого, а обе величины приём узнаёт у источника метаданных и так. ## Capabilities ### New Capabilities - `archive`: архив своих записей глазами приложения — пространство адресов приложения и единая форма отказа, пределы, которыми сервис ограничивает загрузку, и чтение своего архива: страница записей, карточка и текст названного вида. ### Modified Capabilities - `intake`: приём переезжает на новый адрес и меняет форму ответа на список; опрос готовности убирается целиком; имя, данное отправителем, доходит до самой записи отдельной колонкой, оставаясь за пределами имени файла в хранилище и журнала. - `access`: область слоя предъявления сессии названа адресами приложения, и среди них появляется вопрос «кто вошёл». - `storage`: у записи появляются колонки имени файла отправителя, длительности и размера. - `pipeline`: исход своей записи владелец узнаёт карточкой записи, а не убранным опросом готовности; два требования называли держателем нормы адрес, которого больше нет. ## Impact - Приём и чтение записей по HTTP: все адреса приложения, коды ответа и форма тела. - Схема хранилища: новый шаг под три колонки записи. - Слой предъявления сессии и своё правило ограничителя частоты переезжают на новый корень. - Правило неизвестного пути в приложении перечисляет корни сервиса, а не один. - Внешней программе на прежнем контракте ломается всё; такой программы у сервиса сегодня нет.