docs(plans): plan the monolith S05 and S07 remote surfaces
What this MR does and why
Adds two monolith plans for the remote repository kind, indexes both, and amends the S07 spec so it agrees with the design that reached review and with its S05 sibling.
The plans
- monolith/S07 Phase 2, repository CRUD:
the client extension, the typed
settingsread type and its health-status enum, the settings write path, the test-connection mutation, the Vue remote create and edit surfaces, and a client step closing AR's already-fireddestructivedelete gate. - monolith/S05, repository detail:
14 steps. The remote detail read and the
lastDownloadedAtelement field, the client cache-eviction writes and their mutations, and the Vue work that turns the shipped hosted detail page into one that also serves a remote repository.
Neither plan carries a Research findings section. Facts a step rests on are stated at that step.
Both plans describe work already under way
Sixteen of the 26 rows across the two Status tables carry an MR. That is unusual for a plan MR, and it is why neither plan reads as a sequence still ahead of the tree:
| Plan | Steps with MRs |
|---|---|
| S07 | 1 !252151, 2 !251942, 3 !252160, 4 !252519, 5 !251084, 6 !251533, 7 !251598, 8 and 9 share !252766 (all merged) |
| S05 | 1 !252683, 2 !252898, 3 !252723, 5 !251268, 6 !251515, 7 !252175, 8 !251598 (all merged) |
The merged branch names encode step numbers from an earlier revision of the S07 plan, so the plan keeps that numbering rather than renumbering under them. Nine rows stay empty and are unstarted. The tenth, S07 Step 10, records in its Status row that it closed as unnecessary, so the batch fill does not hunt for an MR that will never exist.
Two things the plans record that a reader would otherwise rediscover
Both AR remote write gates have cleared. CreateRepositoryRequest.kind accepts
remote and UpdateRepositoryRequest carries settings, which is why every Phase 2
criterion in the spec now reads No AR gate. No step in either plan waits on one.
The Vue surfaces were built over a local Apollo layer, and it is now fully removed.
S07 Step 10 existed to sweep what remained of it, but by the time this MR reached review
the rest was already gone: localRemoteSettings was removed by S05 Step 7 (!252175),
and !252766 took the rest with it, deleting update_remote_repository.mutation.graphql
and every Local-prefixed type and input from typedefs.graphql. Step 10 closes as
unnecessary rather than opening, and the plan records why. Each local field had carried
a local prefix, because a field added to an existing type by extension cannot reuse a
name the schema already owns.
S07 Step 11 leads the order, because its gate has already fired. AR's delete
requires a destructive parameter and answers 400 without it; the monolith client
sends none. So every monolith repository delete fails today, in every phase and
kind, held off users only by artifact_registry_ui being default_enabled: false - the
first organization the rollout enables meets it. Step 11 is remedial rather than
preparatory, and anyone sequencing that rollout should land it first. S07 Step 11a is
the other live defect behind the same flag: two of the spec's filter-list keys are not in
config.filter_parameters, so a mutation carrying upstream credentials can put a
plaintext credential into a request log or an error report. Step 11 leads because a
single delete reaches its 400; Step 11a follows, and both land before the flag is
enabled anywhere.
The spec amendments
The settings input is flat. It was specified as one type per format family, with the
resolver enforcing that exactly one arrives. Two facts retire that design: an update
carries the repository's name and not its format, so a resolver choosing a per-format
branch needs a second read to learn which one; and AR already refuses a field the format
does not define with a 400 that surfaces in the payload errors. Four sites move: the
Credential-writes paragraph, the acceptance criterion covering zero and several inputs,
the Error-cases row, and the Resolutions entry. The cost is stated rather than left to be
noticed: the schema no longer makes a Maven-only field on an npm repository
unrepresentable, and a round trip refuses it.
S07 no longer describes a toast on the detail page. The S05 amendment in this MR
withdraws it. A probe's result lands in the indicator it changed and nowhere else, and
that page renders neither passed nor http_status. Four S07 sites now match, including
the accepted cost that the upstream's HTTP status class never reaches the operator there.
The S07 edit form still renders the probe's own answer inline, because those fields have
somewhere useful to go while the user is configuring the upstream; the asymmetry is
deliberate and S07 now says why.
Review notes
- Both plans went through a
pr-review-toolkit:review-prpass; the S07 plan went through two, the second by operator override after the local-layer rework. - Duo's review is addressed: the index row's counts are deleted rather than re-derived, the S05 index row it found missing is restored, the phantom Step 15 is gone from the S05 plan, and the S07 and S05 texts agree on the withdrawn detail-page toast.
- Three S07 surfaces are named as out of scope rather than left implicit: the create-form probe (no AR endpoint contracts it), the detail-page connection display (an S05 dependency), and a credential clear action (a spec capability gap with no design behind it). Criterion 1's unmet field-error binding is named as a Phase 1 gap.
Size
2,075 added and 106 removed lines, all documentation, in five files:
| File group | LOC | What it is |
|---|---|---|
monolith/2026-08-20-repository-detail-remote.md |
+1,036 | new S05 remote plan |
monolith/2026-08-20-repository-crud-remote.md |
+914 | new S07 Phase 2 plan |
specs/monolith/S07-repository-crud.md |
+67 / -54 | flat settings input, the withdrawn toast, the fired destructive gate |
specs/monolith/S05-repository-detail.md |
+56 / -52 | the amendments the S05 plan rests on |
plans/README.md |
+2 | one index row per plan |
Past guardrail 20's 500-line threshold, and kept as one MR rather than three
deliberately. The two plans and the spec amendment are one review context: each plan's
Dependencies cites the S07 amendment this MR carries, the S05 amendment is what the S05
plan's steps rest on, and the two plans share the local Apollo layer, the connect steps
and the monolith/S05 dependency the S07 plan names. Split three ways, each MR cites
two it cannot be read without.
The 1,950 new lines are two documents that are read whole rather than diffed, and no part of them is code. The 106 removed lines and the 123 changed spec lines are the reviewable diff in the ordinary sense.
Related to gitlab-org/gitlab#618513 (closed)