Repository navigation
ci/docs: release-tag-only publishing, key collisions, source-generation metadata (9.0.0) - #31
Merged
Merged
Conversation
A manual non-dry run of the release workflow from a branch would have published: the tag-versus-version check and the GitHub release (the SBOMs' permanent home) both run for tag refs only. The `nuget` environment's deployment policy (v* tags) already refuses such a run, and a ruleset makes v* tags immutable, but both are repository settings the YAML cannot show. The publish job's condition now requires a v* tag ref too, the comments describe the settings instead of contradicting them, and the --skip-duplicate note says to retry with "Re-run failed jobs" (same verified artifact) rather than a fresh, rebuilding run. ReleaseWiringConventionTests.ThePublishJob_RunsOnlyForAReleaseTag reads the job-level condition; the previous condition fails it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Two behaviours an independent release review asked about, measured and
now documented and pinned:
- Keys canonicalize, so two spellings of one key ("[1,5]", "[1,6)")
collide. System.Text.Json treats that as any duplicate key: the later
value silently wins by default, and .NET 10's
AllowDuplicateProperties = false refuses it because it checks the
parsed key. docs/serialization.md recommends the latter for keyed data
where a dropped entry matters; JsonDictionaryKeyTests pins both.
- A source-generated context must list a value set's element type. Left
out, it is a NotSupportedException naming the element, in both
directions, even for a family with its own element converter.
SetSourceGenerationTests pins the documented context and the
omission. The NativeAOT smoke consumer now also runs the documented
context for a primitive set and a range through object. The docs note
that default-options serialization is unavailable under AOT for every
type (System.Text.Json policy).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
4 of 5 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Release-readiness items for 9.0.0 that came out of an independent review. Each point was checked against the code or measured before anything changed. Nothing in the packages' code changes: one CI guard, docs, and tests.
Publish only from a release tag (
release.yml)Before this change, a manual run of the release workflow from a branch with
dry_run: falsewould have published. Two steps run only for tag refs, so that run would skip both:Two repository settings already prevent this:
nugetenvironment only accepts deployments fromv*tagsv*tagBut the YAML can't show either setting, and its own comment said the opposite.
What changed:
publishnow requires av*tag ref as well.--skip-duplicatenote now says to retry with "Re-run failed jobs". That pushes the same verified artifact again, whereas a fresh run rebuilds the packages, and with a floating SDK they need not match the ones already pushed.ReleaseWiringConventionTests.ThePublishJob_RunsOnlyForAReleaseTagreads the job-level condition. Restoring the previous condition makes it fail with the expected message.Dictionary keys: two spellings of one key collide
Keys canonicalize, so
{"[1,5]":"a","[1,6)":"b"}names the key[1,5]twice.Dictionary,IReadOnlyDictionary,ImmutableDictionary, variant keys andRangeSetkeys.AllowDuplicateProperties = false: the collision is rejected with aJsonException, because the duplicate check runs on the parsed key.docs/serialization.md#dictionary-keysnow describes this and recommends that setting for keyed data where a dropped entry matters.JsonDictionaryKeyTestspins both behaviours.Source-generation metadata for value sets
A source-generated context must list a value set's element type as well as the set.
NotSupportedExceptionnaming the element type, in both directions. That includes families that bring their own element converter.SetSourceGenerationTests: the documented context working, and the missing-element error.object.Test plan
dotnet test: all passing, including the integration tests against a live PostgreSQL./test/consumer-smoke-test.sh: passes, including both new AOT cases and no trim or AOT warningsThe new dictionary and source-generation tests pin existing behaviour; there's no source fix to revert for them. The workflow test was checked by restoring the old condition.
🤖 Generated with Claude Code