docs(plans): add the monolith S07 virtual repository CRUD plan
What
Adds docs/plans/monolith/2026-09-14-repository-crud-virtual.md: the monolith plan for Phase 3 (virtual) of monolith/S07, the write half of virtual repository CRUD over the read half the S05 virtual detail plan builds. Fourteen monolith steps, EE-only and dark behind artifact_registry_ui:
- Repository id on the shared type
- Client dissociate method
- Dissociate mutation
- Client upstream list on create and update
- Upstream list argument on the create and update mutations
- Virtual create route and kind vocabulary
- Local write layer and the upstream-list eviction helper
- Upstream sources card and ordered table
- Upstream picker
- Land create and Save on the detail page for every kind
- Virtual create submission
- Edit form - upstream sources on Save
- Detail page - Add repository and Remove repository
- Connect the virtual write surfaces to the schema
Steps 1, 2, 6, 7, and 10 open at plan merge; Steps 4 and 5 open when api/openapi/v1.yaml declares upstream_repository_ids; Steps 11 to 13 run over the local Apollo layer in parallel with the schema track; Step 14 closes both.
Decisions the plan records (each taken with the engineer)
- Every upstream edit commits on Save as one desired ordered list, and AR reconciles it. The create and update mutations forward
upstreamRepositoryIdsin one client call; the monolith composes no association sequence and has no partial-failure state. This departs from the spec's shape (adds and removes at the control, reorder alone on Save through a set-order mutation, a two-request create), and the same MR amends the spec. - The contract change is AR's, filed as #1356 (closed) (
upstream_repository_idsonCreateRepositoryRequestandUpdateRepositoryRequest, reconciled atomically). Under S02's rule the client sends no undeclared parameter, so Steps 4 and 5 gate on the field's declaration, not its implementation. A create with no sources needs no gate. - Create and Save land on the repository's detail page, for every kind, following the design prototype driven live; Step 10 moves the shipped hosted and remote landings first.
- The Vue track builds over the local Apollo layer, with the layer as its own step, because the measured remote-plan overruns came from a component landing with its mock layer in one MR. The plan carries the eight measured predecessor MRs and forecasts each step against them.
- This plan depends on the S05 virtual detail plan and rebuilds none of its read half; its Step 1 has merged, the rest are named external predecessors.
- The create-menu entry lands with the connect step, so the virtual create is offered from the list only once its writes reach the server.
- Remove repository on the detail row confirms nothing, matching the shipped eviction affordances; the S05 sentence that made S07 own "the confirmation" is amended to own whether one exists.
- Seam interrogations recorded as keep-bundled on Steps 8, 9, and 12; Step 14's file count over the ceiling is recorded and accepted; Step 1's sub-target size is kept separate by decision.
Spec amendments
The same MR amends docs/specs/monolith/S07-repository-crud.md at the sites the plan's Dependencies section enumerates: the Mutations table and the composed-create paragraph, the Ordering section, the endpoint and gate tables, the Ruby client rows and paragraph, the picker bullet, the States and Error cases rows including the Submitting → success landing, the Apollo cache paragraph, criteria 18, 19, 20, 23 to 26 and the eviction criterion, the two bulk asks in Follow-ups (superseded by #1356 (closed)), and three Resolutions entries. One sentence in docs/specs/monolith/S05-repository-detail.md (### Upstream table) moves the remove confirmation to S07's discretion.
Four spec statements the tree contradicts are recorded in Research Findings rather than amended, because none is Phase 3 work; the first, delete_repository sending the cascading destructive=true against criterion 39, needs a ruling on which side moves.
Review
Two pr-review-toolkit passes ran on the staged files (general review plus a claims check against the monolith on master and this repository on main, with MR states through glab); every finding was folded in or ruled on with the engineer, including the rework from a monolith-side reconciler to the AR contract ask.
Monolith tracking issue for the step MRs: gitlab-org/gitlab#629072 (closed) (child of epic &22455). AR contract gate: #1356 (closed).
Related to gitlab-org/gitlab#629072 (closed)