docs(plans): the collection absent-aggregate, and two stale basis claims

What this does

The collection-mode plan's half of the amendment S30 :108 gates the merge path on, plus two stale basis claims and Step 4's Status row.

Step 2's row five narrows

The no-contribution table sent an established absence to remote.ErrFileNotFoundOnUpstreams whatever else the set held. Row five's condition is now "an absence established at every consulted position", with no per-outcome carve-out, and row six widens to cover both shapes short of it: no absence at all, and the mixed case. The table keeps six arms.

So all three contributor-side failures flip, not just one: [PositionAbsent, PositionOmitted], [PositionAbsent, PositionSlow] and [PositionAbsent, PositionPanicked] each answer remote.ErrUpstreamUnavailable. Each of the three is a consulted position that established no absence, which is what leaves the set short of the quantifier. PositionDenied and PositionIneligible are not consulted positions, so they do not make a set mixed and nothing changes for them.

Every passage that stated the superseded reading moves with the table, because a single-site fix is how this reopens. Grepped and fixed together: the verdict-is-a-pure-function paragraph, which now separates the two mechanisms (a veto for an ineligibility or a data error, a quantifier for the three omissions); rows five and six themselves; the superseded-ruling paragraph under the table; the last row's own paragraph, which now carries two shapes; Step 2's Acceptance, whose both-directions pin moves from dropping the absence to dropping the failure; Step 5's record-versus-verdict argument, which now says "in the merged code today"; the Step 2 table amendment entry, both its lead (row five is a third reversal, and !2541 (merged) does not implement it) and its first reversal's quote; the absent-aggregate entry below; and the Testing Strategy bullet.

S30:554 is dropped as the support for the old reading. It answers 200 from the remaining contributors, and this set has none.

The absent-aggregate entry

## Dependencies gains the entry for "a collection's absence must be established at every consulted position, not at any one of them". It names !2699 (merged) as the authoring MR for S13, S31 and S30's own bookkeeping, and says !2699 (merged) merges before Step 4's MR.

The entry also books what the amendment leaves owed: a code correction against merged Step 2. CollectVerdict's flags.absent arm returns remote.ErrFileNotFoundOnUpstreams whenever a record is PositionAbsent, nothing contributed, and no position was ineligible or held an unserved presence: the flags.ineligible and flags.unservedPresence arms ahead of it take rows three and four out of the arm first. So all three mixed shapes above reach it and return the not-found.

What the correction lands against is the merged suite, not this plan. The plan states the amended reading throughout now; merged !2541 (merged) still pins the superseded one, and in more sites than that one test. The entry itemizes all of them, with line numbers read at 14524a872 because collect_verdict.go postdates the plan's basis: the narrowed arm and its own comment, which states the superseded rule verbatim and already disagrees with ErrFileNotFoundOnUpstreams's contract; the errNothingContributed return's comment, and its message; TestCollectVerdict_FailureArms's absence-beside-an-omission row; AnUnservedPresenceWithholdsTheNotFound's second half and its comment; and the named test's name, doc comment, assertion message and both halves of each subtest. The three subtests share a single require.NotErrorIs(..., remote.ErrUpstreamUnavailable) in the table-loop body, so there is one assertion to invert and not three.

Two points the entry settles rather than leaving to the correction's author. The FailureArms row keeps its place instead of folding into the no-absence row beside it, because [PositionAbsent, PositionOmitted] is the only row reaching the flags.absent arm with an absence beside a contributor-side failure, and so the only one that reddens a regression to the broad arm, with the PositionDenied row reddening an over-narrowing. And the named test's second half stays although the pairing collapses, because recordsOf(tc.failure) is the only set in the file holding a lone PositionSlow or a lone PositionPanicked.

The correction is filed as #1382 (closed), a type::bug with a priority::. #1247 (closed) is Step 4's own delivery issue and #1245 (closed), Step 2's, is closed, so neither is the home, and a type::feature step issue cannot carry a priority::. The entry gates it the way the neighbouring no-consumer window entry does: before this plan's own Step 6, and in any case before S31's Step 13 part 2. Nothing reaches the defect today, because no slice wires Collect.

The 404 that mixed case answers is forbidden by three specs, not two. S13 says so twice, in #### Collection mode and in the Error Cases row under it, and S13 is the strongest citation because CollectVerdict lives in internal/virtual.

The row-four entry is retired as settled

It booked a second S13 amendment, for an established absence beside a PositionDataError. Such a position establishes no absence, so under "every consulted position" S13 no longer sends that shape to the not-found. The two specs agree on it without a second amendment.

Four passages called that amendment owed, and all four now record it as closed: the entry's own merge order, the bolded row-four sentence inside it, Step 2's row-four reasoning, and ## Open Questions. ## Open Questions also books its third S13 item as !2699 (merged) rather than as owed, and its closing list of the remaining ## Dependencies entries gains the CollectVerdict correction above with its gate.

Two basis claims corrected

The preamble said "S30 and S31 are byte-identical at the basis and at main". They are not, by more than a hundred lines between them.

The citations themselves are correct and are left alone. Checked against the plan's own pinned basis with git show 07f4e8521:<path>: S30:549, S30:551, S31:1396, S31:1414-1415 and S31:1861-1863 each resolve to the text the plan attributes to it. The defect was the byte-identical sentence, which invites a reader to resolve those numbers against main, where they land on unrelated lines. The paragraph now says that every spec line number in the document is a basis line number, and gives the command that reads one.

Post-basis text is cited by section anchor instead, which is what the new mixed-case citations use.

The npm-taxonomy item's list of eight md count sites is a basis set in the same way, and main has since added a ninth to the same group. The item says so and asks for the set to be re-derived against the branch's own merge base rather than taken as closed.

Status table

Step 4's row records !2698 (merged). The plan has a single writer, which is why the row lands here and not in the step MR.

The stack

Order MR What it carries
1 !2699 (merged) the S13, S31 and S30 spec text
1 !2700 (merged) (this MR) the plan's reading and Step 4's Status row
2 !2698 (merged) Step 4, the collection entry point

!2699 (merged) and this MR are independent of each other and may merge in either order. Both merge before !2698 (merged).

Related to #1382 (closed)

Edited by Dzmitry (Dima) Meshcharakou

Merge request reports

Loading
Loading