docs: 1.16.0 release notes, and publish notes as the GitHub release body - #99
Merged
Merged
Conversation
Follows the pattern established in dp-grpc. release.yml now reads doc/release-notes/rel-<version>.md and publishes it as the release body via body_path, and a Verify release notes exist step fails the job when the file is not on the tagged commit. The check runs immediately after the version is extracted from the tag rather than late in the job. action-gh-release would catch a missing body_path on its own, but only after the three sibling-repo JARs have been downloaded and the tarball assembled -- this repo's expensive work is all upstream of the publish step, so checking first turns a minutes-late failure into a seconds-late one. doc/developer/release.md gains the ordering rule this creates: the notes must be merged to main before the rel-* tag is pushed, because the tag is what the workflow builds from. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01K3UkbTq4rFgMhYPsi3VgaT
These are the master notes for the release. The MLDP ships as five repos tagged in lockstep, so the notes are organized by feature rather than by repo: the two headline APIs this release (sample status, and the DataSet/Annotation modernization) each span all four child repos, and a per-repo structure would scatter them. Each section links to the child notes that carry the detail. Six features are covered: the Sample Status API, the DataSet and Annotation API modernization, query performance, the new metrics framework, the schema migration mechanism, and the desktop app's new deployment mode. The last two are not new API surface but are the reason this upgrade is not a drop-in binary replacement, so they get their own sections rather than being folded into another feature. A "correctness fixes worth knowing" section collects the defects that returned wrong answers silently rather than erroring -- querySamples omitting PVs on large pages, the desktop app destroying stored Calculations on an unrelated edit. Operators may need to re-examine results from earlier releases, which is hard to notice if the fixes are scattered across six feature sections. The upgrade checklist leads the document because a partial service stop during the migration produces silent wrong answers rather than an error. README.md gains the release-notes table and a v1.16 milestone entry. The v1.16 road map block becomes v1.17: two of its Python items did not ship (ingestion API, bucket query) and are retargeted to 1.17 on the project board, so they carry forward rather than disappearing. The FY27 data-subscription bullet is dropped as a duplicate of the 1.17 one. Also fixes four anchors that were already broken: a TOC link missing the heading's MLDP prefix, and three v1.0/v1.1/v1.3 milestone links to a "Data Platform API" section that no longer exists -- retargeted to its successor, "gRPC API", with the link text updated to match. Cross-repo links are absolute and pinned to rel-1.16.0 per #98: GitHub does not resolve relative links in a release body, and body_path publishes this file verbatim. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01K3UkbTq4rFgMhYPsi3VgaT
The release-notes wiring added in bd62b7b could only be exercised by cutting a real release, which is the failure mode CLAUDE.md warns about: an untested publish step whose first run is the one that matters. release.yml gains the workflow_dispatch rehearsal path already used in dp-desktop-app -- a version input, a dry_run input defaulting to true, and a job-level DRY_RUN env gating the one step that writes. Everything upstream of the publish step is read-only, so a rehearsal exercises the sibling-JAR downloads, the tarball assembly, the checksum, and the notes check, and stops before publishing. Two details carried over from the dp-desktop-app implementation. The version now comes from an input on a dispatch run, since GITHUB_REF_NAME is the branch rather than the tag; the notes path is therefore derived from VERSION instead of GITHUB_REF_NAME, which would otherwise look for doc/release-notes/main.md. And a missing notes file warns rather than fails under dry_run, so the build can be rehearsed before the notes are written. release.md regains the tag-ordering constraint dropped in the rewrite. It matters more here than in the sibling repos, not less: this repo's job downloads the three sibling JARs from their published releases, so tagging it before those releases exist fails the download step. The master notes also link to the child repos at blob/rel-<version>/, which resolve only once each child tag exists. The old doc's race-condition warning is folded into the same section. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01K3UkbTq4rFgMhYPsi3VgaT
…path Fixes found by checking the master notes against the four child repos' rel-1.16.0 notes. Two attribution errors. The metrics section was labeled "data-platform #212" against a dp-service issue URL; data-platform#212 does not exist, and #212 is dp-service's metrics issue. The query performance header listed #257, which is not a change in this release -- it is the "option 0" workaround ticket that this release makes obsolete -- while omitting #275, which the body cites. #257 is now described in the body as the retired workaround it is, and #275 is in the header. The upgrade checklist gained the parts the child notes carry and the compression dropped: - Step 3 had no fallback for a site that cannot stop everything at once, which is the most likely real-world deviation on a 24/7 archive. dp-service gives a specific safe ordering: upgrade ingestion first, but stop or upgrade query and annotation before it migrates. The write-side reason for stopping ingestion (a 1.15.0 process writing after v5 seeds pvStats produces buckets queries silently miss) is now stated alongside the read-side one. - Step 10 stated "an empty criteria list now matches all" as a blanket rule. ConfigurationSelector is the documented exception and goes the other way -- an empty one is rejected. dp-grpc wrote that section specifically so the rule would not be learned backwards, so the exception is now called out. - Step 4 gave only a range for the migration window. dp-service's instruction is to budget it from a read-only measurement of the archive; the SLAC runbook has the query. - A new step 7 covers the Python grpcio floor (>=1.84.0), which raises at import rather than at call time and is invisible to a fresh install. - Step 1 now names DP_TELEMETRY_PROMETHEUS_HOST and DP_TELEMETRY_ENABLED=false at the point an operator hitting a port conflict will look. Also: CalculationsDataFrame carries its frame under a `frame` submessage, which a client fixing compile errors needs and the previous wording omitted; the retired index shapes are named (beta-1.6.0 and 1.15.0, plus anything added by hand) with the runbook that lists them; the migration-disable flag and the no-marker classification rule are stated; and three smaller omissions are restored -- the 12-hours-at-10-Hz data point, the Annotation Builder tags and attributes bug, and Explore -> Data Events among the views disabled in deployment mode. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01K3UkbTq4rFgMhYPsi3VgaT
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.
Prepares the 1.16.0 release: adds the master release notes, wires the release workflow to publish them, and brings the README up to date.
Publishing the notes (
ci:commit)Follows the pattern established in dp-grpc.
release.ymlreadsdoc/release-notes/rel-<version>.mdand publishes it as the release body viabody_path, and aVerify release notes existstep fails the job when the file is not on the tagged commit.The check runs immediately after the version is extracted from the tag rather than late in the job.
action-gh-releasewould catch a missingbody_pathon its own, but only after the three sibling-repo JARs have been downloaded and the tarball assembled — this repo's expensive work is all upstream of the publish step, so checking first turns a minutes-late failure into a seconds-late one.doc/developer/release.mdgains the ordering rule this creates: the notes must be merged tomainbefore therel-*tag is pushed, because the tag is what the workflow builds from.The notes themselves (
docs:commit)Organized by feature rather than by repo. The two headline APIs — sample status, and the DataSet/Annotation modernization — each span all four child repos, so a per-repo structure would scatter them. Each section links to the child notes that carry the detail.
Six features covered: Sample Status API, DataSet and Annotation API modernization, query performance, the new metrics framework, the schema migration mechanism, and the desktop app's deployment mode. The last two are not new API surface, but they are why this upgrade is not a drop-in binary replacement, so they get their own sections.
Two structural choices worth a look during review:
querySamplesomitting PVs on large pages, the desktop app destroying stored Calculations on an unrelated edit. Operators may need to re-examine results from earlier releases, which is easy to miss if these are scattered across six feature sections.README
Adds the release-notes table and a v1.16 milestone entry in the existing house style.
The v1.16 road map block becomes v1.17: two of its Python items did not ship (ingestion API interface, bucket-oriented query interface) and are already retargeted to 1.17 on the project board, so they carry forward rather than disappearing. The FY27 data-subscription bullet is dropped as a duplicate of the 1.17 one.
Also fixes four anchors that were already broken on
main— a TOC link missing the heading'smldp-prefix, and three v1.0/v1.1/v1.3 milestone links to a "Data Platform API" section that no longer exists, retargeted to its successor "gRPC API" with the link text updated to match.Review follow-ups (commits 3 and 4)
Applied after a fact-check of the master notes against all four child repos'
rel-1.16.0notes.Every cross-repo link and anchor was re-validated after the edits; all resolve.
Attribution errors. The metrics section was labeled
data-platform #212against a dp-serviceissue URL —
data-platform#212does not exist. The query performance header listed #257, whichis not a change in this release: it is the "option 0" workaround ticket that this release makes
obsolete, and it is now described in the body as retired. #275 was cited in the body but
missing from the header, and is now listed.
Upgrade checklist gaps. The checklist is the operationally risky part of the document, and
compression had dropped four things the child notes carry:
on a 24/7 archive. dp-service gives a specific safe ordering (ingestion first, but stop or
upgrade query and annotation before it migrates), now in step 3, along with the write-side
reason for stopping ingestion.
ConfigurationSelectoris thedocumented exception and rejects an empty list. dp-grpc wrote that section specifically so the
rule would not be learned backwards.
read-only measurement of the archive; the SLAC runbook has the query.
grpciofloor was missing (new step 7). It raises at import, not call time,and a fresh install never sees it — so it surfaces first in a pinned environment.
Smaller:
CalculationsDataFrame'sframesubmessage (needed by anyone fixing compile errors),the retired index shapes named with the runbook that lists them, the migration-disable flag, and
three restored omissions.
The dry-run rehearsal path is now in this repo too. The
body_pathwiring added here couldpreviously only be exercised by cutting a real release — the exact failure mode CLAUDE.md warns
about.
release.ymlgains theworkflow_dispatch+dry_runpattern fromdp-desktop-app.I rehearsed it: run 35156190426
— all three sibling JARs downloaded, tarball built and checksummed, notes verified and
NOTES_PATHresolved to the real document, and onlyPublish GitHub Releaseskipped. Norelease was created.
release.mdalso regains the tag-ordering constraint dropped in the rewrite. It matters morehere than in the sibling repos: this job downloads their JARs, so tagging this repo before their
releases exist fails the download.
Notes for the reviewer
rel-1.16.0, per Release notes: enforce absolute, tag-pinned cross-links across all five repos #98. My first draft used a relative link toCLAUDE.md; Release notes: enforce absolute, tag-pinned cross-links across all five repos #98 explains why that 404s in a release body, and it is fixed here. All ~30 cross-repo deep links were validated against the actual headings in the child notes — zero broken.rel-1.16.0until dp-service's release is published. Its tag exists but CI was still running at the time of writing, and the tarball job downloadsdp-service-1.16.0.jarfrom that release.rel-1.16.0.mdfiles and the 1.16 items on project board 2. Emphasis and feature framing are worth a careful read — that is the part a validator cannot check.🤖 Generated with Claude Code
https://claude.ai/code/session_01K3UkbTq4rFgMhYPsi3VgaT