- адреса приложения переехали в своё пространство `/app/`, опрос готовности убран целиком: рубеж и причину остановки владелец узнаёт карточкой записи, текст — отдельным адресом названного вида - заведена единая точка отображения доменной ошибки и слой, приводящий к той же форме отказы библиотеки: тело несёт машиночитаемый код рядом с сообщением - у записи появились имя файла отправителя, длительность и размер своими колонками, а у ленты владельца — свой индекс: без него страница сканировала весь архив сервиса
2.3 KiB
2.3 KiB
Страница архива задаётся ключом, а не номером
- Дата: 2026-08-15
- Источник: openspec/changes/archive/2026-08-15-app-json-contract/design.md, раздел «Страница задаётся ключом, а не номером»
Решение
Постраничное чтение своих записей идёт непрозрачным ключом по паре «время заведения и идентификатор». Номер страницы отвергнут.
Почему
«Приём пишет в голову той же таблицы записей, которую читает список, и человек, загрузивший запись и листающий свой архив, — штатный сценарий. Номер страницы сдвинул бы окно на единицу: последний элемент первой страницы пришёл бы вторым разом первым элементом второй, а один элемент между ними не пришёл бы никогда. Отказ молчаливый — ни кода, ни строки в журнале, — и человек видел бы архив, в котором записи нет.»
Ключ полный: у записей, принятых одним запросом, время совпадает, и порядок между ними одним лишь временем не определён.
Последствия
+запись, заведённая между двумя страницами, не даёт ни повтора, ни пропуска;+порядок между записями с равным временем устойчив;−экран с нумерацией страниц так не сделать — листать можно только «дальше». Архиву это не нужно;−ключ приходит от клиента и потому разбирается: время приводится к виду хранилища, иначе побайтовое сравнение молча обращает условие в постоянную истину или ложь.