Make the release guide and guards tell the truth before v0.15.0
The release surface carried nine catalogued defects under the standing rule "don't tag before fixing". This PR repairs the seven that live in the tree; the other two happen at tag time (# Unreleased → # v0.15.0 promotion with make bump; the version-specific release-body line). Doc + tooling only — no SDK behaviour. While it was in review, main moved by four merges (#804, #807, #809, #810); those are absorbed too.
What this fixes
-
Two post-tag entries re-filed out of
# v0.14.0into# Unreleased: the #662 absent-expiry changes and theTimelineEventDataretype (both landed in #703, after the tag —git show go/v0.14.0:MIGRATING.mdcontains neither heading). -
Five missing entries written (four from the original catalogue, one found by review):
- #773 (PR #779): the Documents/ScheduleEntry read paths —
Get/GetEntryand the composites built on them — return a transport failure verbatim instead of stamping it permanently malformed. - #737 (PR #754): four TS paginated methods now declare the
ListResultthey always returned. - #735 (PR #749): Swift public inits — recorded as not a break (verified: no existing initializer changed shape;
updateMyPreferenceswas uncallable outright,updateGaugeNeedlecallable only as the nil-payload{}bc3 400s). 1919e77f7(bare commit): maxPages enforced at runtime in TS/Ruby.- Ruby crash-to-
ApiErrorclass (bare commits2f21c9de7,328153020,478514642, surfaced by Codex):mailto:/hostless server-supplied URLs in Link headers, redirects, and the download hop used to crash with rawURI/ArgumentErrorexceptions; all three now refuse withApiError. One combined entry records the class and the rescue that stops matching.
- #773 (PR #779): the Documents/ScheduleEntry read paths —
-
#650 recount re-derived from both schemas (two of the seven new keys conditional, plus
position, which was already modeled). -
#604's Kotlin row now names
decodeFailureas the discriminator, matching the KDoc. -
Trailer rewritten: verification commit and the true in-flight set (now
fa15fc126; the event-feed stack and two drafts). -
make releaseguard gap closed, then hardened by review: the target originally grepped seven of the ten filesscripts/bump-version.shwrites. Now: root and TSpackage.jsonread viajqfield access; TS client constant exact;python/pyproject.tomlparsed from its[project]table (awk section-scoped); bothGemfile.lockrecords (PATH spec + CHECKSUMS) exact whole-line matched in both lockfiles; TSpackage-lock.jsonboth fields viajq. Every guard mutation-proven, including the literal bypasses (nested JSON"version"field; aversion =assignment in a foreign TOML table) demonstrated against the old checks and refused by the new ones. Restore by copy,diff -qclean, real exit codes captured. -
Release bodies state the notes' blind spot: generated notes are built from merged PRs and cannot see bare commits; MIGRATING.md records consumer-visible changes regardless of how they merged.
-
Main-merge absorption (#804/#807/#809/#810): #809/#810 wrote their own entries and carry
breaking; #807 is CI-internal; #804 was breaking-labeled with no entry — its entry is added (address-policed discovery hop 2, the variadicNewDiscoverercompile note, remedies in policy order).
Labels
breaking applied to: #703, #716, #723, #725, #726, #754, #779, #782, #796 (joining #772; #804/#809/#810 arrived already labeled). Declined in writing: #749 (not a break), #781, #727, #751 (rationales in the thread history).
Verification
LC_ALL=C make doc-constants-checkgreen (REAL_EXIT captured) after every MIGRATING edit.- Every
# Unreleasedentry cross-checked againstgit log go/v0.14.0..origin/main; #770/#771 ruled out as unentried breaks by inspection. - All guard proofs as above.
Not doing (declined in writing): a CHANGELOG — MIGRATING.md plus label-generated notes is the convention; a third surface is a third thing to drift.