Skip to content

ci: let the push decide the publish, not a poll that cannot know - #71

Merged
Blind-Striker merged 1 commit into
masterfrom
ci/publish-verification-rethink
Sep 8, 2026
Merged

Blind-Striker merged 1 commit into
masterfrom
ci/publish-verification-rethink

Conversation

@Blind-Striker

Copy link
Copy Markdown
Collaborator

The first real release proved the verification step I added earlier today wrong. It polled the flat container for ten minutes and failed the run, while the push had in fact succeeded.

Measured on run 34279340414:

Push to NuGet.org 21:24:04 → 21:24:07, success
Verify NuGet.org publication 21:24:07 → 21:34:17, failed
Packages restorable shortly after the poll gave up

Both OpenCodeAI.Sdk and OpenCodeAI.Sdk.Extensions 0.8.0-preview.1 are live and owned by OpenCode.NET. The red run was a false alarm.

The bound was not the mistake — the design was

Nothing anonymous reflects an accepted package before validation finishes. Measured while the run was still polling:

Endpoint While validating
flat container 404
registration 404
search index 0 hits
package page 404

Only the signed-in owner sees it, marked Validating, and nuget.org's own guidance allows up to an hour. So a poll cannot separate "accepted, validating" from "refused" within any budget worth spending a runner on — which is the one distinction it existed to make. Raising the bound to an hour would hold a runner for an hour per release and still not make the signal sound.

The defect it was built for is closed where it happens

Dropping --skip-duplicate makes a 409 fail the push itself, immediately, carrying the gallery's own message — including the ID prefix reservation that once passed as success across two dispatches. The cost is that retrying a dispatch after a partial push aborts on the package that already landed; that is a decision for whoever dispatched it, not something to swallow.

What remains is a report, not a gate: it says whether each package is restorable yet, and says plainly that validation can take an hour when it is not.

The GitHub Packages lane keeps the flag, where a duplicate is benign and the registry has no reserved namespaces.

The first real release proved the verification step wrong. It polled the flat container for ten
minutes and failed the run, while the push had in fact succeeded: nuget.org accepted both packages
at 21:24 and made them restorable shortly after the poll gave up at 21:34.

The bound was not the mistake — the idea was. Nothing anonymous reflects an accepted package
before validation finishes: not the flat container, the registration, the search index, or the
package page. Only the signed-in owner sees it, marked "Validating", and nuget.org's own guidance
allows up to an hour. A poll therefore cannot separate "accepted, validating" from "refused" inside
any budget worth a runner, which is the single distinction it existed to draw. Nor is post-push
verification a practice this ecosystem follows.

The defect it was built for is closed where it happens instead. Dropping --skip-duplicate makes a
409 fail the push itself, immediately, carrying the gallery's own message — including the ID prefix
reservation that once passed as success across two dispatches. Retrying a dispatch after a partial
push now aborts on the package that already landed, which is a decision for whoever dispatched it
rather than something to swallow.

The GitHub Packages lane keeps the flag: a duplicate there is benign, that registry has no reserved
namespaces, and its versions can be deleted.
@Blind-Striker
Blind-Striker force-pushed the ci/publish-verification-rethink branch from 613c55c to fa659b1 Compare September 8, 2026 21:45
@Blind-Striker
Blind-Striker merged commit 921cfbd into master Sep 8, 2026
9 checks passed
@Blind-Striker
Blind-Striker deleted the ci/publish-verification-rethink branch September 14, 2026 12:55
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant