0024 — Именованные вложения к опубликованной сборке
Статус: accepted. Дата: 2026-09-25.
Контекст
Сборкам нужны произвольные метки и metadata, а также внешние манифесты, отчёты и другие файлы. Метаданные уже имеют CAS-контракт; исходный blob и UPack manifest неизменяемы. Новый путь приёма байтов создал бы вторую реализацию целостности, квот и восстановления.
Решение
Основная сборка — существующий available artifact. Сохраняем annotations, добавляем отдельный ревизионный набор именованных ссылок на available artifacts того же repository. До 32 вложений, назначение manifest/sbom/signature/report/file. История append-only, страницы по 20; восстановление создаёт новую ревизию.
Domain валидирует описания ссылок; application владеет отдельным AttachmentStore и сценариями авторизации; PostgreSQL-адаптер проверяет targets, повторно разрешает managed credential и атомарно фиксирует snapshot, FK-ссылки и audit. Короткий row lock основного artifact сериализует CAS этой сборки. HTTP/SDK используют отдельные wire schemas/parsers. UI связывает существующие resumable transfers и новый каталог, не передаёт байты через управление metadata.
Используем annotation.read и annotation.write + artifact.read: это организация свойств сборки, без выдачи content.read или дополнительных административных полномочий. Registry описывает новые операции как catalog/repository. Границы зависимостей и ответы download-маршрутов не меняются.
Миграция 12 только добавляет новые таблицы. Старый сервер игнорирует их; новый требует миграцию перед запуском. Старые annotations/bytes не переписываются. При работе со смешанными версиями deployment клиент должен проверять capability до использования нового API.
Следствия и границы
Файл публикуется прежде привязки. Ошибка привязки оставляет самостоятельный доступный артефакт; повтор выполняется через reconciliation текущего набора. Удаление ссылки не удаляет файл, история удерживает старые targets. Будущий retention обязан учитывать FK-пины, которые могут удерживать значительный объём; удаления истории в этом этапе нет.
Метки произвольные и могут сосуществовать; это не автоматизированный release workflow. Нет атомарного изменения annotations и attachments одним вызовом, отдельной build-run сущности, проверки подписей, JSON Schema registry или исполнения манифестов. Полные исторические снимки annotations не добавляются. Attachment links не обходятся рекурсивно.
Контракт, восстановление и UX: BUILD_DETAILS.