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