ADR 0041: Восстановление клиентской очереди, поиск metadata и публикация UPack
Статус: accepted. Дата: 2026-09-26.
Решение и границы
Web сохраняет небольшие атомарные записи незавершённых download intents в OPFS. Область привязана к случайному sessionStorage ID, endpoint и проверенной сервером identity (profile/id/credentialId). Credentials и handles конечного назначения остаются только в памяти. Reload восстанавливает записи на паузе; явное продолжение требует нового выбора назначения. Web Lock защищает рабочую область вкладки, дублированная вкладка получает новую. Записи моложе семи дней не удаляются как abandoned в промежутке reload.
Staging разделён на сегменты по 8 MiB. Закрытие writer фиксирует сегмент, авария откатывает незакрытые записи. Это ограничивает цену checkpoint, не копируя растущий многогигабайтный файл. Prefix собирается из file-backed Blob частей и хешируется потоково; конечное сохранение выполняется только после проверки всей контрольной суммы. SDK знает только DownloadStorage и явное восстановление paused jobs; OPFS/сессии/диалоги принадлежат web. Queue history, глобальные задания, upload recovery и резервное копирование не подменяются этим механизмом.
GET search аддитивно принимает metadataKey и metadataValue как точную пару. q ищет literal substring имени или значения актуальных metadata без учёта регистра PostgreSQL. Annotation заменяет исходную metadata целиком. Application валидирует пределы и ACL, инфраструктура выполняет параметризованный SQL, contracts/SDK/UI/CLI описывают одинаковую семантику. Ответ/cursor/лимит 100 прежние. Нет новой БД-схемы, полнотекстового индекса или обещания постоянной задержки поиска: substring может сканировать каталог репозитория; действует общий PostgreSQL statement timeout 10 секунд; масштабный поисковый индекс потребует измерений и отдельного решения.
CLI packages publish FILE оркестрирует существующий resumable upload и registerPackage через SDK. Upload receipt остаётся источником идемпотентности. Регистрация подтверждается отдельно; в случае ошибки CLI сообщает фазу и artifact ID, сохраняет исходную ошибку и не удаляет загруженные байты. Повтор после потери ответа регистрации использует прежний артефакт. Создание ZIP и изменение опубликованного UPack не входят в команду.
Проверки
Общие гейты включают unit восстановленного scheduler, PostgreSQL/API metadata search и CLI retry после потери ответа регистрации, браузерные проверки identity, reload, Range, SHA-256, отмены и обеих локализаций/тем. Нативные разрешения файлового диалога и квота браузера на 5 GiB требуют отдельной стендовой приёмки.