S17 Phase 4: artifact writes (delete, bulk)

Summary

Artifact write endpoints for the management API, per ADR-009: delete, container tag mutations, and bulk delete on the format-specific artifact routes, extending the read surface from S17 Phase 3: format artifact reads (#312 - closed) • Hayley Swimelar.

Scope

  • Single-artifact delete: images, packages, versions, files
  • Container tag mutations: tag upsert with a digest body (the same upsert the push path performs) and untag
  • Bulk delete at every collection boundary ADR-009 names: DELETE .../images, .../images/:image_id/tags, .../packages, .../versions, .../files

Gated on

  • S20 Lifecycle management (&22815): the deletion machinery these endpoints invoke.
  • Closed-beta deletion scope: whether closed beta ships soft deletion or permanent delete only is still open (discussion); it decides these endpoints' semantics.

Out of scope

Quarantine, now tracked in S17: artifact quarantine endpoints (#482) • Unassigned. ADR-009 defines it as a per-artifact PATCH, not a bulk route, so the bulk surface above is unaffected.

This phase patches the S17 spec and follows the repo gate: spec MR, plan MR, implementation. Part of &22341.

Workstream status (2026-08-20)

The graph is a ledger of work in progress and work to be done: a step's node leaves the graph when its merge request merges, and the Merge request status table below keeps the full step-to-MR record, merged rows included. Reading the colors, green nodes have an open merge request and link to it, amber nodes are being implemented but their merge requests have not opened yet, and grey nodes are planned. Edges are the plan's dependency graph among the remaining nodes, so every edge shown is an unsatisfied dependency. Blocking follow-ups join the map when they are filed and carry no plan edges. A follow-up that has no merge request yet stays grey and links to its tracking issue.

Dependency graph

graph TD
    S38["Step 38: S22 accounting emit (!1754)"]
    FU764["Follow-up: blob_sha256 delete-probe indexes (#764)"]
    click S38 "https://gitlab.com/gitlab-org/ops/artifact-registry/-/merge_requests/1754"
    click FU764 "https://gitlab.com/gitlab-org/ops/artifact-registry/-/work_items/764"
    classDef stOpen fill:#c8e6c9,stroke:#2e7d32,color:#1b5e20
    classDef stInBuild fill:#ffecb3,stroke:#ff8f00,color:#ff6f00
    classDef stPlanned fill:#f5f5f5,stroke:#9e9e9e,color:#424242
    class S38 stOpen
    class FU764 stPlanned

Merge request status

Step Reviewer Status Merge request
1 vespian_gl, dmeshcharakou Merged feat(managementapi): declare the artifact delet... (!1445 - merged) • Hayley Swimelar • 19.3
2 vespian_gl, dmeshcharakou Merged feat(managementapi): declare the container tag ... (!1458 - merged) • Hayley Swimelar • 19.3
3 dmeshcharakou Merged feat(managementapi): declare the container bulk... (!1460 - merged) • Hayley Swimelar • 19.3
4 jdrpereira, dmeshcharakou, suleimiahmed Merged feat(managementapi): declare the packages bulk-... (!1457 - merged) • Hayley Swimelar • 19.3
5 dmeshcharakou Merged chore(datastore): add artifact tombstone marker... (!1454 - merged) • Hayley Swimelar • 19.3
6 dmeshcharakou Merged chore(datastore): gate container image reads on... (!1466 - merged) • Hayley Swimelar • 19.3
7 arpitgogia, jdrpereira Merged chore(datastore): swap the image name unique in... (!1506 - merged) • Hayley Swimelar • 19.3
8 jdrpereira, suleimiahmed Merged chore(managementapi): scaffold the artifact wri... (!1452 - merged) • Hayley Swimelar • 19.3
9 vespian_gl, dmeshcharakou Merged chore(managementapi): shared write helpers (S17... (!1447 - merged) • Hayley Swimelar • 19.3
10 dmeshcharakou, sylviashen Merged chore(datastore): count every table that refere... (!1450 - merged) • Hayley Swimelar • 19.3
11 radbatnag Merged into !1450 (merged) chore(datastore): compose the id-keyed npm pack... (!1459 - merged) • Hayley Swimelar • 19.3
12 vespian_gl, dmeshcharakou Merged chore(datastore): compose the id-keyed npm vers... (!1462 - merged) • Hayley Swimelar • 19.3
13 dmeshcharakou, mkhalifa3 Merged chore(datastore): compose the npm file and dist... (!1461 - merged) • Hayley Swimelar • 19.3
14 dmeshcharakou, mkhalifa3 Merged chore(datastore): add the maven package and ver... (!1443 - merged) • Hayley Swimelar • 19.3
15 suleimiahmed Merged into !1450 (merged) chore(datastore): remove a Maven file and its a... (!1463 - merged) • Hayley Swimelar • 19.3
16 arpitgogia Merged feat(managementapi): serve the container image ... (!1541 - merged) • Hayley Swimelar • 19.3
17 arpitgogia Merged feat(managementapi): serve the container manife... (!1536 - merged) • Hayley Swimelar • 19.3
18 dmeshcharakou Merged feat(managementapi): untag a container image tag (!1545 - merged) • Hayley Swimelar • 19.3
19 vespian_gl Merged feat(managementapi): serve the container tag PU... (!1530 - merged) • Hayley Swimelar • 19.3
20 mkhalifa3 Merged feat(managementapi): serve the maven arm of the... (!1540 - merged) • Hayley Swimelar • 19.3
21 dmeshcharakou Merged feat(managementapi): serve the maven arm of the... (!1531 - merged) • Hayley Swimelar • 19.3
22 jdrpereira, radbatnag Merged feat(managementapi): serve the maven arm of the... (!1539 - merged) • Hayley Swimelar • 19.3
23 radbatnag Merged feat(managementapi): serve the npm package DELETE (!1532 - merged) • Hayley Swimelar • 19.3
24 vespian_gl Merged feat(managementapi): serve the npm arm of the v... (!1535 - merged) • Hayley Swimelar • 19.3
25 vespian_gl Merged feat(managementapi): serve the npm arm of the f... (!1543 - merged) • Hayley Swimelar • 19.3
26 radbatnag Merged feat(managementapi): serve the npm dist-tag delete (!1542 - merged) • Hayley Swimelar • 19.3
27 dmeshcharakou, suleimiahmed Merged chore(managementapi): add the bulk delete selec... (!1444 - merged) • Hayley Swimelar • 19.3
28 radbatnag Merged chore(managementapi): bulk-delete enqueue seam ... (!1446 - merged) • Hayley Swimelar • 19.3
29 dmeshcharakou Merged chore(managementapi): add bulk-delete job args ... (!1448 - merged) • Hayley Swimelar • 19.3
30 arpitgogia, jdrpereira Merged chore(managementapi): apply container bulk dele... (!1555 - merged) • Hayley Swimelar • 19.3
31 mkhalifa3 Merged chore(managementapi): apply container bulk mani... (!1583 - merged) • Hayley Swimelar • 19.4
32 arpitgogia Merged feat(managementapi): serve the container bulk d... (!1627 - merged) • Hayley Swimelar • 19.4
33 mkhalifa3 Merged chore(managementapi): apply maven bulk deletes ... (!1537 - merged) • Hayley Swimelar • 19.3
34 radbatnag Merged feat(managementapi): serve the maven arms of th... (!1626 - merged) • Hayley Swimelar • 19.4
35 mkhalifa3 Merged chore(managementapi): apply npm bulk deletes fo... (!1550 - merged) • Hayley Swimelar • 19.3
36 mkhalifa3 Merged chore(managementapi): apply npm bulk deletes fo... (!1623 - merged) • Hayley Swimelar • 19.4
37 dmeshcharakou Merged feat(managementapi): serve the npm bulk-delete ... (!1631 - merged) • Hayley Swimelar • 19.4
38 vespian_gl Round-9 triaged, counter-emitter nil-guard table rows added from the non-blocking note, auto-merge re-armed feat(managementapi): emit s22 accounting deltas... (!1754 - merged) • Hayley Swimelar • 19.4
Follow-up jdrpereira, radbatnag Merged docs(specs): correct four S17 claims the merged... (!1453 - merged) • Hayley Swimelar • 19.3
Follow-up jdrpereira, radbatnag Merged docs(plans): fill the wave-one status rows and ... (!1467 - merged) • Hayley Swimelar • 19.3
Follow-up dmeshcharakou Merged docs(plans): record the open step MRs in the st... (!1546 - merged) • Hayley Swimelar • 19.3
Follow-up jdrpereira, arpitgogia Merged docs: correct stale claims across the S17 phase... (!1560 - merged) • Hayley Swimelar • 19.3
Follow-up mkhalifa3 Merged docs(plans): record the reviewer-accepted step ... (!1622 - merged) • Hayley Swimelar • 19.4
Follow-up dmeshcharakou Merged docs(plans): record the open step MRs in the st... (!1624 - merged) • Hayley Swimelar • 19.4
Follow-up vespian_gl Merged fix(managementapi): reset tags_count in the npm... (!1630 - merged) • Hayley Swimelar • 19.4
Follow-up dmeshcharakou Merged docs(plans): record the open step MRs in the st... (!1633 - merged) • Hayley Swimelar • 19.4
Follow-up radbatnag Merged docs(specs): correct six S17 claims the merged ... (!1728 - merged) • Hayley Swimelar • 19.4

👋 Triage note: This issue has been reviewed by the automated triage assistant and classified as type::feature — it describes new API endpoints (artifact write/delete operations) being added to the Artifact Registry management API, which is new functionality rather than a bug fix or maintenance task.

The following labels are confirmed present:

  • type::feature
  • Category:Artifact Registry
  • devops::package
  • group::package registry

If this classification doesn't look right to you, please feel free to update the labels and leave a comment explaining the change. Thanks! 🙏

Edited by Hayley Swimelar