fix(release): the four corrections 2.5.0 could not be tagged without - #222
Merged
Conversation
Four things stood between `main` and a `v2.5.0` tag. None is a code-behaviour change; all four are claims the release makes about itself that were untrue, unstated, or stale. **1. `DeepgramVoices.Helios` is the release's only new obsoletion, and the CHANGELOG mis-stated its cost.** The entry read "callers who kept the old name keep compiling". Under `TreatWarningsAsErrors` — which this repo requires of itself and many consumers run — `CS0618` is an error like any other, so they do not. The alias now carries `DiagnosticId = "VSDK0001"`, giving that build a surgical `<NoWarn>VSDK0001</NoWarn>` instead of silencing every obsoletion in its tree, and the entry says so. No downstream consumer pays a migration for the custom id: the alias is new in this release, so nobody has a `CS0618` suppression against it yet. The one tree that did is this one — `DeepgramVoicesTests` pins the alias on purpose, and its pragma moves with it. **2 & 3. Two telemetry breaks shipped without a BREAKING heading.** `voiceai.sessions.failed` stops counting cancelled sessions and `openai_realtime.sessions.failed` starts reading non-zero for connect failures that previously had no accounting at all. Both move a number a dashboard or an alert is built on, and the prose already called the first one "the same family of telemetry break" as the second. The headings now match the prose, and match the eleven entries in this release that already carry `BREAKING:`. **4. The package-validation baseline was three releases stale.** `2.1.0` → `2.4.0`. This is the check that would catch a binary-breaking change, so running it against the immediately-preceding release rather than a three-version-old one is the difference between the guard meaning something and meaning less. It passes: 29 packages pack at 2.5.0 with the 2.4.0 baseline resolved and no `CP****`. Two comments citing the old baseline by number now name the property instead, so the next bump does not strand them. Also adds the `## [2.5.0] - 2026-08-24` heading the release notes are cut from. Note the date is a forecast, not a record — if the tag slips, it moves.
The notes gate checked that the CHANGELOG section was not empty. It did not check that it fits. GitHub caps a release body at 125,000 characters and `gh release create` runs AFTER `dotnet nuget push`, so an oversized body would publish all 29 packages and then fail to announce them — the exact ordering the notes gate exists to prevent, reached by the other end. 2.5.0's own section is 117,443 bytes: 93% of the cap. It passes, with a warning that says the next release of this size will not. Measured in bytes rather than characters: `wc -m` needs a UTF-8 locale the runner does not guarantee, and for this file bytes over-count by 639, which errs toward blocking rather than toward a failed announcement.
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.
Four things stood between
mainand av2.5.0tag. None is a code-behaviour change; all four are claims the release makes about itself that were untrue, unstated, or stale. Plus one hole that the gate merged in #221 exposed on its first contact with a real CHANGELOG.1 —
DeepgramVoices.Helios: the CHANGELOG mis-stated the cost of the only new obsoletionThe entry read "callers who kept the old name keep compiling". Under
TreatWarningsAsErrors— which this repo requires of itself and many consumers run —CS0618is an error like any other, so they do not. This is the only new[Obsolete]in 2.5.0; the AMI ones all predate v2.4.0, so a consumer already living with those is unaffected.The alias now carries
DiagnosticId = "VSDK0001", giving that build a surgical<NoWarn>VSDK0001</NoWarn>instead of silencing every obsoletion in its tree — and the entry says so.The trade-off is named, not hidden: a custom
DiagnosticIdinvalidates any existingCS0618suppression. No downstream consumer pays it — the alias is new in this release, so nobody has one yet. Exactly one tree did:DeepgramVoicesTestspins the alias on purpose, and the build caught it. Its pragma moves with it.2 & 3 — Two telemetry breaks shipped without a
BREAKINGheadingvoiceai.sessions.failedstops counting cancelled sessionsopenai_realtime.sessions.failedstarts reading non-zero for connect failures that previously had no accounting at allBoth move a number a dashboard or an alert is built on. The prose already called the first "the same family of telemetry break" as the second — the headings now match the prose, and match the eleven entries in this release that already carry
BREAKING:.4 — The package-validation baseline was three releases stale
2.1.0→2.4.0. This is the check that would catch a binary-breaking change, so running it against a three-version-old surface is the difference between the guard meaning something and meaning less.It passes. 29 packages pack at 2.5.0 with the 2.4.0 baseline resolved and no
CP****— a third independent confirmation that 2.5.0 breaks no binary API, and the first against the immediately-preceding release. Two comments citing the old baseline by number now name the property instead, so the next bump does not strand them.Also adds the
## [2.5.0] - 2026-08-24heading the release notes are cut from. The date is a forecast, not a record — if the tag slips, it moves.5 — A hole the new gate exposed on first contact
The notes gate (#221) checked that the CHANGELOG section was not empty. It did not check that it fits. GitHub caps a release body at 125,000 characters and
gh release createruns afterdotnet nuget push, so an oversized body would publish all 29 packages and then fail to announce them — the exact ordering that gate exists to prevent, reached from the other end.2.5.0's own section is 117,443 bytes: 93% of the cap. It passes, with a warning that says the next release of this size will not. Measured in bytes rather than characters because
wc -mneeds a UTF-8 locale the runner does not guarantee, and for this file bytes over-count by 639 — erring toward blocking rather than toward a failed announcement.Verification
dotnet build -c Release -p:TreatWarningsAsErrors=true— 0 warnings, 0 errorsdotnet pack— 29 packages at 2.5.0, ApiCompat resolved the 2.4.0 baseline, noCP****Verbara.Sdk.VoiceAi.Tts.Tests— 149/149Still outside any commit
v*— the actual boundary, since the workflow that runs on a tag push comes from the tagged commit itselfrelease.yml:56-86) — 2.5.0 was bumped infe666f66and never tagged, which produces not a failing run but no run at all🤖 Generated with Claude Code