Container manifest reads for the UI: detail by digest, per-manifest tags, referrers count, and platform triple (S17 container-redesign fast-follow)

Closed Beta blocker: Must exist before the first customer (UI)

There is no way to fetch a single container manifest, and list rows lack tags and platform data. For the user: the Docker/OCI version detail page, one of the UI's core screens, cannot exist.

Problem

The Docker and OCI version detail page and the container rows of the version list need reads the management API does not serve. The manifest path .../images/{image_id}/manifests/{digest} has a DELETE and no GET, and the manifests list withholds three things the design renders per row.

Design element Missing from the contract State in the tree
Manifest detail page GET .../manifests/{digest} No route. S17's "Artifact resources (Phase 3)" records the addressing intent: by digest, not by UUID.
Tags column, tag badges, pull-by-tag snippet tags per manifest Tags are readable per image only, through listContainerTags, so a Tags column costs up to 10 extra requests per page at the 1,000-tag cap.
Referrers column and tab A referrers count per manifest, and a management referrers endpoint The list carries subject_digest per row and nothing aggregates it.
Platforms column and block architecture, os, and os_variant per manifest Stored on container_manifests since the image-config reader landed, withheld by the serializer. The doc-only fix that closed the earlier issue left the serialization untracked.

S17 records all of this as the "Container-redesign fast-follow" in its Follow-ups, together with annotations on the detail, a raw manifest payload endpoint, and an index's child digests. monolith/S06 asks S17 to give that entry a work item. This is it.

Ask

An S17 contract patch and its implementation:

  1. GET .../images/{image_id}/manifests/{digest}: the list element plus annotations.
  2. tags on each manifest, on the list and the detail.
  3. A referrers count on each manifest, and GET .../manifests/{digest}/referrers listing direct referrers.
  4. architecture, os, and os_variant on each manifest.
  5. Child digests on an index, for the Platforms block.
  6. A raw manifest payload endpoint.

S17 fixes the fetch mechanism: page-bounded reads (a batched per-page query or a lateral subquery, chosen by profiling, never table-wide), with a denormalized counter as the documented fallback.

Out of scope here: a source field on manifests or images. No column exists, and S17 puts it behind a schema decision.

Impact

While the detail route is missing, the Docker and OCI version detail page cannot render. While the list fields are missing, every container row of the version list shows empty Tags, Platforms, and Referrers columns.

Workstream status (2026-09-16 08:31 UTC)

graph TD
# Step MR Status Closed beta
1 Remote-cached manifests-list contract case test(managementapi): sweep the cached manifests... (!2506 - merged) • Hayley Swimelar • 19.4 Merged Blocking
2 Manifest read seams chore(managementapi): the manifest read seams a... (!2515 - merged) • Hayley Swimelar • 19.4 Merged Blocking
3 Schema split over ContainerManifestBase and its pin docs(openapi): split the container manifest sch... (!2517 - merged) • Hayley Swimelar • 19.4 Merged Blocking
4 Manifest read operations, pending entries, and Bruno requests docs(openapi): declare the three container mani... (!2521 - merged) • Hayley Swimelar • 19.4 Merged into !2517 (merged) Blocking
5 Widen the manifests-list projection to the platform triple chore(datastore): widen the manifests-list proj... (!2508 - merged) • Hayley Swimelar • 19.4 Merged Blocking
6 Manifest detail route feat(managementapi): serve the container manife... (!2536 - merged) • Hayley Swimelar • 19.4 Merged Blocking
7 Platform triple on the manifest responses feat(managementapi): the platform triple on the... (!2537 - merged) • Hayley Swimelar • 19.4 Merged Blocking
8 Tag names by manifest ids chore(datastore): the windowed tag-names read o... (!2516 - merged) • Hayley Swimelar • 19.4 Merged Blocking
S17 amendment: remote tags window docs(specs): bound the remote manifest tags arr... (!2504 - merged) • Hayley Swimelar • 19.4 Merged Blocking (gated Step 9)
9 Tag names by manifest ids, remote chore(datastore): the windowed remote tag-names... (!2538 - merged) • Hayley Swimelar • 19.4 Merged Blocking
10 Tag preview, count, and detail tags, with the page-facts seam feat(managementapi): tag preview, count, and th... (!2540 - merged) • Hayley Swimelar • 19.4 Merged Blocking
11 Batched referrers count chore(datastore): the batched referrers count o... (!2582 - merged) • Hayley Swimelar • 19.4 Merged Follow-on
12 referrers_count on the manifest responses feat(managementapi): serve referrers_count on b... (!2589 - merged) • Hayley Swimelar • 19.4 Merged Follow-on
13 Referrers list-row page chore(datastore): the referrers list-row page o... (!2580 - merged) • Hayley Swimelar • 19.5 Merged Follow-on
14 Referrers list route feat(managementapi): serve the container manife... (!2654 - merged) • Hayley Swimelar • 19.5 Merged Follow-on
15 Parent digests by child ids chore(datastore): the batched parent-digest rea... (!2579 - merged) • Hayley Swimelar • 19.5 Merged Follow-on
16 Parents preview, count, and detail parent_digests feat(managementapi): the parents preview, and p... (!2661 - merged) • Hayley Swimelar • 19.5 Merged Follow-on
17 Children by parent ids chore(datastore): the windowed child-edge read ... (!2581 - merged) • Hayley Swimelar • 19.5 Merged Follow-on
18 Children preview, count, and detail children feat(managementapi): children preview, count, a... (!2588 - merged) • Hayley Swimelar • 19.5 Merged Follow-on
19 annotations on manifest detail feat(managementapi): serve annotations on the c... (!2574 - merged) • Hayley Swimelar • 19.4 Merged Follow-on
20 Raw manifest payload route feat(managementapi): serve the raw manifest pay... (!2587 - merged) • Hayley Swimelar • 19.5 Merged Follow-on
21 Covering index for the hosted tag-names read chore(datastore): widen the container_tags mani... (!2659 - merged) • Hayley Swimelar • 19.5 Merged Blocking
Edited by Hayley Swimelar