Skip to content

fix(release): the four corrections 2.5.0 could not be tagged without - #222

Merged
Harol-Reina merged 2 commits into
mainfrom
fix/pre-tag-2.5.0-corrections
Aug 25, 2026
Merged

fix(release): the four corrections 2.5.0 could not be tagged without#222
Harol-Reina merged 2 commits into
mainfrom
fix/pre-tag-2.5.0-corrections

Conversation

@Harol-Reina

Copy link
Copy Markdown
Contributor

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. 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 obsoletion

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. 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 DiagnosticId invalidates any existing CS0618 suppression. No downstream consumer pays it — the alias is new in this release, so nobody has one yet. Exactly one tree did: DeepgramVoicesTests pins the alias on purpose, and the build caught it. Its pragma moves with it.

2 & 3 — Two telemetry breaks shipped without a BREAKING heading

  • voiceai.sessions.failed stops counting cancelled sessions
  • 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. 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.02.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-24 heading 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 create runs after dotnet 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 -m needs 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=true0 warnings, 0 errors
  • dotnet pack29 packages at 2.5.0, ApiCompat resolved the 2.4.0 baseline, no CP****
  • Verbara.Sdk.VoiceAi.Tts.Tests149/149
  • The notes gate's own awk against the new heading — 1467 lines extracted, size guard warns at 93%

Still outside any commit

  • A tag ruleset on v* — the actual boundary, since the workflow that runs on a tag push comes from the tagged commit itself
  • A publish-liveness gate (Sdk.Pro release.yml:56-86) — 2.5.0 was bumped in fe666f66 and never tagged, which produces not a failing run but no run at all

🤖 Generated with Claude Code

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.
@Harol-Reina
Harol-Reina added this pull request to the merge queue Aug 25, 2026
Merged via the queue into main with commit 6275647 Aug 25, 2026
15 checks passed
@Harol-Reina
Harol-Reina deleted the fix/pre-tag-2.5.0-corrections branch August 25, 2026 01:03
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