docs(specs): align S20-A's emit sites with what leaves the recompute
Why this is stacked and not folded into !1331 (merged)
What
Five places where S20-A and S22 disagree about which counter an operation moves. Every one resolves the same way, against a rule S22 states in !1350 (merged): the recompute defines the counter and the fast path caches it, so an emit site is legitimate exactly where the operation changes what its counter's recompute returns.
| Site | S20-A said | Corrected to |
|---|---|---|
| OCI tag delete | emits Δartifacts |
emits nothing — container_tags is in none of the four recomputes |
Δsize/Δcomponents |
"the purger", flatly | purger for npm and Maven, whose recomputes include tombstoned rows; the handler for OCI, which removes its rows outright |
| Deleter rule's reason | "fires twice for every artifact a repository purge walks" | the structural reason S22 kept — three callers, three delta sets |
| S22's criterion 9 | "marked (GA)" |
a closed-beta criterion, which this spec's own tombstone writers are what made it |
BumpRepoCounters |
"frozen signature" | nothing freezes it; the second site is a scoping choice |
One addition rather than a correction
The purge chunk emits from what it removed, not from what it found. S22's caller contract
names this spec's purger as bound by it; nothing here said so, and the purge acceptance asserted
the deltas without saying where the count comes from. A client delete and a purge can reach the
same artifact — exactly one DELETE removes it — so a purge emitting from its discovery
inventory decrements components_count twice for one row, and reconciliation confirms neither
value. Stated beside criterion 25's verification half, with an acceptance case for both
interleavings.
Verification of the one claim about the tree
BumpRepoCounters is declared on an in-repo interface (internal/format/maven/upload.go:44),
its only implementations are the no-op datastore stub (internal/datastore/maven_repositories.go:317)
and mavenStoreAdapter's pass-through (cmd/artifact-registry/wire_maven.go:291), and it has no
consumer outside internal/format/maven.
Testing
Documentation only. markdownlint-cli2, vale and lychee pass.
Related to #533 (closed)