Introduce `read_virtual_registry` custom role ability
## Summary Introduce a `read_virtual_registry` custom role ability at the group level to allow admins to grant virtual registry read access without broader group visibility. This was proposed in [this comment](https://gitlab.com/gitlab-org/gitlab/-/work_items/543045#note_3239906158) as a solution to unblock enterprise customers who were impacted by the 18.9 access requirements change ([#580977](https://gitlab.com/gitlab-org/gitlab/-/work_items/580977)). ## Problem After the 18.9 upgrade, virtual registry access now requires top-level group membership. This broke enterprise customers using SAML group-based access models with strict team isolation, where: - Users are **not** granted access at the namespace level; access is managed via SAML group links at the subgroup level. - Strict need-to-know principle: members of one team must not see or be aware of other teams. - Authentication is OIDC-based with short-lived credentials only — no personal/group/project access tokens. Existing workarounds are not viable: 1. **Adding users as Guest to the top-level group** — exposes all private subgroup names/structure, violating team isolation requirements. 2. **Deploy tokens / group access tokens / service accounts with PATs** — ruled out by credential policy. 3. **Separate top-level group for the virtual registry** — requires significant migration effort at scale. ## Proposed Solution Introduce `read_virtual_registry` as a new [custom role](https://docs.gitlab.com/user/custom_roles/) ability at the group level. The setup would look like: 1. Add all users to the top-level group at **Minimal Access** (grants no visibility into subgroups or projects). 2. Create a custom role based on Minimal Access with `read_virtual_registry` enabled. 3. Assign that custom role to those members. This addresses all three customer constraints: - **Team isolation preserved** — Minimal Access does not expose subgroup names or structure. - **No deploy tokens/PATs needed** — applies to existing OIDC-authenticated user identities. - **No migration required** — works within the existing namespace structure. ## Current State A PoC has been drafted locally and works as expected. The code change is relatively small — a single YAML definition that hooks into the existing custom roles framework. ## References - Original feedback thread: https://gitlab.com/gitlab-org/gitlab/-/work_items/543045#note_3238926660 - Proposal comment: https://gitlab.com/gitlab-org/gitlab/-/work_items/543045#note_3239906158 - Related access change: https://gitlab.com/gitlab-org/gitlab/-/work_items/580977
issue