docs(plans): correct the S32 Step 9 entry and record three Status rows

Corrections to the S32 plan. A step branch may not edit the plan file, so they land here.

Step 9 contradicts itself on the handshake-failure return shape

The Scope paragraph asks for a positional marker that probeErrorIsPositional admits, which needs a non-nil Go error. The Acceptance and Tests bullets ask for a remote.ProbeError outcome with a nil Go error. The implementation follows Scope.

The nil-error shape cannot work. decisionForProbe books the position failed and leaves the data-error mark unset, and only the positional arm sets that mark. A sibling's ProbeMiss would then answer the client a 404, against the fail-open the Scope paragraph exists to give.

The two bullets now state the non-nil shape, and record why, so a later reader does not restore the nil one. Two Tests bullets drew their contrast on nil versus non-nil; that contrast is now marked versus unmarked.

Step 9's Scope states the criterion the step falsifies

The Scope paragraph drew the data-error mark on a handshake that "never consulted the upstream". The step's own challenge-discovery leg issues a HEAD per request, and a container Probe that meets a 401 on a cached token re-exchanges once, so a refusal there fails a position it already contacted. The implementer reads Scope before the Files list, so this is the sentence the step's comments get written from. It now reads that the failed handshake establishes no absence.

Step 9's Files entry omits twenty paths

Re-derived with git diff --name-only origin/main...HEAD against the step branch, rather than written from the plan. The entry names 27 of the branch's 35 paths, against 7 on main, so twenty are newly named. The remaining eight are test files the entry covers by their siblings rather than by name. Two of the twenty are internal/remote/health.go and internal/remote/health.md, which the step branch reached in a later review round. Measured at the step branch 3a021f0f4.

Two of the nineteen decide a boundary: Step 9 books probe on oci_remote_upstream_responses_total and widens internal/metrics/cardinality.go, which the plan assigned to Step 17. The plan follows the code here — the Probe this step introduces is the emitter, and a booking site with no label value does not compile. Step 17 keeps the oci_remote_proxy half, which this step does not touch.

The rest are the configuration surface the budget's move reaches, the catalog rows, the maven and npm sidecars, and the S32 sentence this step falsifies.

Three entries also described edits the step does not make. All three credential markers are on main already, so neither sidecar gains one; the credential doc keeps its cause enumeration and gains the authorization leg. Two were short: resolve_budget.md takes three passages, and resolve_errors.md gains a section and a doc-block count.

Step 9's npm-sidecar bullet scopes the edit too narrowly

The entry names the sidecar's deadline paragraph and says the paragraph beside it is untouched. The step also edits the refused-credential section. Its marker list gains the third credential marker, and its "never asked its upstream" claim goes false for the reason above.

The S13 citations name the condition, not the tense

Three places asserted S13's corrected wording as though it had landed, at a time when main still carried the old criterion. Those sentences now name the condition and its event, so they read correctly on either side of !2724 (merged), which has since merged. ## Dependencies carries that amendment as a Step 9 gate with the reason it bound.

The Research Finding quoted S13's scope rule verbatim, and !2724 (merged) rewords that sentence. The quote becomes a statement of the rule instead, which the rewording does not falsify.

**No S13 spec amendment precedes this step.** read as covering the criterion as well as the probe budget. Its own body argues only the budget, so the headline is narrowed to it.

Step 9's second amendment gate is missing

## Dependencies recorded one amendment gate on Step 9, the S13 credential-failure criterion. Step 9 also books probe on oci_remote_upstream_responses_total and widens internal/metrics/cardinality.go's closed set, which needs S16's operation domain to declare the value — the gate !2738 (merged) closed. A reviewer counting Step 9's gates from this section found one.

Both amendments have now merged, so both bullets state that rather than the window they used to describe. The S16 bullet also says what does not gate here: the oci_remote_proxy half of the value is Step 17's, and Step 9 does not touch remote_wideevent.go.

Step 9's Files: entry pointed at the section rather than the MR, so a reader following it landed on the Metrics bullet marked "gating no step". It names !2738 (merged) now.

The worst-case probe ruling rests on a false premise

### The worst-case probe is 20s, not 30s, and merged S13 says 30s rules that no probe can pay a cold-token exchange and a 401 retry, because Reauthorize refuses a prior that is not a cache hit and RemoteTokenHit means no exchange ran.

Authorize bounds a whole acquisition, not the exchange alone, and acquire's UpstreamAuthUnknown arm runs challenge discovery inside that bound before any exchange. exchange hands the token cache's own outcome straight back, so a probe that paid a discovery leg still reports RemoteTokenHit and still earns the retry. The worst case is two acquisitions and two HEADs: 30s a probe, 60s a sweep.

Merged S13 and main's own TestVirtualRepositories_ResolveTimeoutClearsTheContainerProbeSweep already derived 60s. So the plan was the outlier, not the spec. The subsection, its heading, and the five passages citing it move together. No default and no ruling moves, since 90s clears 60s; the headroom it is stated against drops from 50s to 30s.

cardinality.go has three writers, and the plan named two

Step 9 takes the operation closed set, which Step 17's Files: entry still claimed, and two seam sentences called Step 17 the file's only other writer. Whoever implements Step 17 would be told Step 4 is the one other writer and never learn Step 9 had added the value.

Step 17's entry now keeps the oci_remote_proxy half alone, both seam sentences name Step 9, and Step 9's own entry states that it merges first.

The eligibility pass has five data-error writers

The sentence said six. Five sit in excludePosition; the sixth is in runPhase1, which this package places after the eligibility pass rather than in it.

Step 9's Files entry omits the S13 edit

The step edits docs/specs/S13-virtual-remote-foundation.md, and two sentences told the reviewer there was no S13 change to look for. S13 gains its own Files: bullet naming the three figures that move, and both sentences now say that no amendment precedes the step while the step does edit S13 — what moves is arithmetic, not a rule.

The guardrail-17 count is dropped

The resolve.go entry counted "four other comments". This MR adds three Files entries and a second correction scope, so the figure was already wrong and would break again on the next entry. It states no number now.

Status rows

Steps 2, 3 and 9 gain their MRs: !2277 (merged), !2682 (merged), !2744 (merged). Step 8's !2685 row is already on main and shows in the diff only as context. Step 3's MR was open when its row was recorded; the table records a row at MR-open time.

Related to #291 (closed)

Edited by Radamanthus Batnag

Merge request reports

Loading
Loading