Skip to content

docs: 1.16.0 release notes, and publish notes as the GitHub release body - #99

Merged
craigmcchesney merged 4 commits into
mainfrom
doc-1.16-release
Sep 16, 2026
Merged

craigmcchesney merged 4 commits into
mainfrom
doc-1.16-release

Conversation

@craigmcchesney

@craigmcchesney craigmcchesney commented Sep 16, 2026 •

Copy link
Copy Markdown
Collaborator

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

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:

  • 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 easy to miss if these 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

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

Review follow-ups (commits 3 and 4)

Applied after a fact-check of the master notes against all four child repos' rel-1.16.0 notes.
Every cross-repo link and anchor was re-validated after the edits; all resolve.

Attribution errors. The metrics section was labeled data-platform #212 against a dp-service
issue URL — data-platform#212 does not exist. 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, 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:

  • No fallback for a site that cannot stop everything at once — the most likely real deviation
    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.
  • Step 10 stated the empty-criteria rule as universal. ConfigurationSelector is the
    documented exception and rejects an empty list. dp-grpc wrote that section specifically so the
    rule would not be learned backwards.
  • Step 4 gave only a range for the migration window. dp-service says to budget it from a
    read-only measurement of the archive; the SLAC runbook has the query.
  • The Python grpcio floor 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's frame submessage (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_path wiring added here could
previously only be exercised by cutting a real release — the exact failure mode CLAUDE.md warns
about. release.yml gains the workflow_dispatch + dry_run pattern from dp-desktop-app.

I rehearsed it: run 35156190426
— all three sibling JARs downloaded, tarball built and checksummed, notes verified and
NOTES_PATH resolved to the real document, and only Publish GitHub Release skipped. No
release was created.

release.md also regains the tag-ordering constraint dropped in the rewrite. It matters more
here 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

🤖 Generated with Claude Code

https://claude.ai/code/session_01K3UkbTq4rFgMhYPsi3VgaT

craigmcchesney and others added 4 commits September 16, 2026 15:52
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
@craigmcchesney
craigmcchesney merged commit 5fb73a7 into main Sep 16, 2026
1 check passed
@craigmcchesney
craigmcchesney deleted the doc-1.16-release branch September 16, 2026 22:23
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