Files
transcriber/docs/adr/ADR-2026-08-15-cursor-paging.md
T
av 3a2da3004b приём и чтение записей сведены к одному контракту приложения
- адреса приложения переехали в своё пространство `/app/`, опрос готовности
  убран целиком: рубеж и причину остановки владелец узнаёт карточкой записи,
  текст — отдельным адресом названного вида
- заведена единая точка отображения доменной ошибки и слой, приводящий к той же
  форме отказы библиотеки: тело несёт машиночитаемый код рядом с сообщением
- у записи появились имя файла отправителя, длительность и размер своими
  колонками, а у ленты владельца — свой индекс: без него страница сканировала
  весь архив сервиса
2026-08-15 13:51:23 +03:00

2.3 KiB
Raw Blame History

Страница архива задаётся ключом, а не номером

  • Дата: 2026-08-15
  • Источник: openspec/changes/archive/2026-08-15-app-json-contract/design.md, раздел «Страница задаётся ключом, а не номером»

Решение

Постраничное чтение своих записей идёт непрозрачным ключом по паре «время заведения и идентификатор». Номер страницы отвергнут.

Почему

«Приём пишет в голову той же таблицы записей, которую читает список, и человек, загрузивший запись и листающий свой архив, — штатный сценарий. Номер страницы сдвинул бы окно на единицу: последний элемент первой страницы пришёл бы вторым разом первым элементом второй, а один элемент между ними не пришёл бы никогда. Отказ молчаливый — ни кода, ни строки в журнале, — и человек видел бы архив, в котором записи нет.»

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

Последствия

  • + запись, заведённая между двумя страницами, не даёт ни повтора, ни пропуска;
  • + порядок между записями с равным временем устойчив;
  • экран с нумерацией страниц так не сделать — листать можно только «дальше». Архиву это не нужно;
  • ключ приходит от клиента и потому разбирается: время приводится к виду хранилища, иначе побайтовое сравнение молча обращает условие в постоянную истину или ложь.