Release 0.7.0: changelogs, version bump, and two record-keeping fixes - #644
Open
bburda wants to merge 7 commits into
Open
Release 0.7.0: changelogs, version bump, and two record-keeping fixes#644bburda wants to merge 7 commits into
bburda wants to merge 7 commits into
Conversation
Fill the 0.7.0 section of every package changelog from the 459 commits since 0.6.0. Thirteen packages had no entry at all; four carried a Forthcoming section whose bullets are kept and moved under the released heading. ros2_medkit_graph_watchdog gains its first changelog and the include that puts it in the aggregated docs page, so all nineteen packages are now covered there. ros2_medkit_fault_detection dated its initial release 0.6.0, a release it was never part of. The section moves to 0.7.0. Three entries are operator-visible and called out as breaking: the default rosbag storage format is mcap again, so recordings land as .mcap and the bulk-data download filename changes with them; the x-medkit-graph health model is at schema_version 2.0.0 with three error_reason values gone; and the lifecycle status operationId values were pluralized, which renames the matching methods in a generated client. The graph watchdog package description listed seven silent-fault classes. Five detectors are registered - qos_mismatch, orphan, node_death, param_drift and lifecycle_expectation - and the description now names those. GRAPH_TF_STALE and GRAPH_LATENCY_BUDGET keep their reserved codes and are described as undelivered in the changelog, as the package README already described them. Running the verification generator flips seven Scripts requirements to verified, matching the tests that already carry their @verifies tags.
release.sh matched docs/conf.py with a double-quoted pattern while the file uses single quotes, so bump silently left it behind and verify reported the file as 'unknown' on every run. Both legs now accept either quote style. Checked by reverting conf.py to 0.6.0 and re-running bump: the patched script rewrites it, the previous one reports 'unknown -> 0.7.0' and leaves the file at 0.6.0. The 0.6.0 changelog of ros2_medkit_fault_manager gains the entry it never got: that release moved the default rosbag storage format back from mcap to sqlite3. The 0.4.0 entries in the gateway and fault_manager changelogs are accurate for the release they sit under - the default was mcap in 0.4.0 and 0.5.0 - and are left alone. All 19 package.xml, version.hpp, docs/conf.py, docs/pyproject.toml, docs/Doxyfile, QUALITY_DECLARATION.md and the REST examples read 0.7.0; 'release.sh verify 0.7.0' reports all versions consistent.
Five lenses read the changelogs against the code. What they found: The lifecycle operationId entry stated the migration backwards. #497 moved generation from the plural collection name to the singular entity name, so a client gets getAppStatus, not getAppsStatus. This was the one entry marked breaking, which is the one a client maintainer reads. The graph watchdog entry named a fault code that does not exist. node_death is the detector id; the code on the wire is GRAPH_NODE_DISAPPEARED. The GRAPH_ namespace is a frozen external contract, so a filter written from the release notes would have matched nothing. The same entry documented one code for lifecycle_expectation, which raises three - GRAPH_NODE_UNREADABLE and GRAPH_NODE_NOT_MANAGED cover the cases where the state could not be read at all, and a consumer filtering on GRAPH_NODE_INACTIVE sees neither. The orphan entry described a detector that would fire on nearly every graph. One-sidedness only admits a topic; the fault needs a complementary near-miss counterpart, which is what makes it the signature of a name typo. Freeze-frame is scoped to plugin-backed entities and needs a loaded plugin; the entry claimed it unconditionally. Three packages claimed their tests take a DDS domain when those tests are opted out of allocation entirely. Four operator-visible features had no entry at all: the fault-trigger threshold engine and its three routes, aggregation.peer_auth_header with the redaction that keeps it out of the configurations API, the secure field profile, and auto_cleared_codes on the SSE wire. Attribution: the Humble fallback warning belongs to #622, not #636. Four entries cited the issue that asked for the work rather than the pull request that delivered it. Two graph_provider entries duplicated two others. release.sh: the conf.py version pattern was unanchored, so 0.7.0-dev and 0.7.0.1 both read as 0.7.0 and passed verify, and release was rewritten but never checked. Both are now read through one helper that anchors the value to its closing quote and accepts any spacing, bump confirms its own rewrite instead of trusting sed's exit code, and verify compares release against version. Checked against 0.7.0-dev, 0.7.0.1 and a release that disagrees with version: all three now report a mismatch.
The routes exist on Apps only - there is no component path - and the engine is gated on a loaded plugin as well as on fault_triggers.enabled, so the default of true is necessary rather than sufficient. The poll interval is floored at 50 ms and a lower value is reported.
On a forward it is the fallback: with forward_auth enabled and a caller credential present, the caller's token wins, so the peer keeps being told the end user. The entry claimed the gateway credential unconditionally.
They have since 0.3.0, and the README already tells the reader to apt install the gateway. The page now leads with the apt path and names the three packages that genuinely are not in the index: opcua, graph_watchdog and fault_detection.
The release branch was cut before that work merged, so the largest change in 0.7.0 had no entry at all. Two items are breaking for a caller. An action execution now belongs to the entity it was started on, so an execution id no longer works as a global handle and reaching one through another entity answers 404. And GET on a scoped docs path is readable by viewer rather than admin, because the permission table is now derived from the route registrations rather than kept as a literal beside them. The rest is what the derivation buys and what changed on the wire beside it: corrected statuses on four paths, a Location that is sent and dereferenceable, new advertised URIs on entity detail, two added operation ids with none renamed and no route added or removed, and a status recorder whose sweep is driven from the served document rather than a list. The fault manager accepts the fault_code length it advertises, and a long code keeps its recording instead of losing it to a filename limit. Deliberately not claimed: that the document now matches everything the gateway honours. Over-declaration is not falsified by a run, request bodies are validated against no declared schema, and statuses answered before routing are invisible to the recorder. The stranded-body case from the issue is signalled with a header, not fixed.
bburda
marked this pull request as ready for review
August 31, 2026 16:28
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.
Pull Request
Summary
Prepares the 0.7.0 release: every package changelog gains its
0.7.0section, the version isbumped across the tree, and two record-keeping defects found while writing it are fixed.
Changelogs. The
0.7.0 (2026-08-27)section is filled for all 19 packages from the 459commits since
bdcc4ed0(the 0.6.0 release commit). Thirteen packages had no entry at all. Fourcarried a
Forthcomingsection; those bullets are kept and moved under the released heading.ros2_medkit_graph_watchdoggains its first changelog and theincludethat puts it on theaggregated docs page, so all 19 packages are covered there rather than 18. Its
package.xmldescription listed seven silent-fault classes; five detectors are registered (
qos_mismatch,orphan,node_death,param_drift,lifecycle_expectation) and the description now namesthose.
GRAPH_TF_STALEandGRAPH_LATENCY_BUDGETkeep their reserved codes and are described asundelivered, matching what the package README already said.
ros2_medkit_fault_detectiondated its initial release0.6.0— a release it was not partof, as the 16 packages released at
0.6.0-1confirm. The section moves to0.7.0.release.shmatcheddocs/conf.pywith a double-quoted pattern while the file uses singlequotes, so
bumpsilently skipped it andverifyreported the file asunknownon every run.Both legs now accept either quote style.
The 0.6.0 changelog of
ros2_medkit_fault_managergains the entry it never got: that releasemoved the default rosbag storage format back from
mcaptosqlite3. The0.4.0entries areaccurate for the release they sit under — the default was
mcapin 0.4.0 and 0.5.0 — and areleft alone.
Breaking changes called out in the 0.7.0 notes
mcapagain. Recordings land as.mcapinstead of.db3, and the bulk-data download filename changes with them.snapshots.rosbag.format: sqlite3keeps the previous on-disk format.x-medkit-graphis atschema_version"2.0.0". Theerror_reasonvaluesnode_offline,topic_staleandno_data_sourceare gone;metrics_staleis the only reachable value.works as a global handle, and reaching one through another entity answers
404.GET <entity-path>/docsis readable byviewerrather thanadmin, because the permissiontable is now derived from the route registrations instead of a hand-maintained literal.
operationIdvalues were singularized -getAppStatusandputAppStatusRestartrather than the plural collection forms they were built from before -which renames the matching methods in a generated client.
Review
Five lenses (three Codex, two Claude) read the changelogs against the code before this was
marked ready. They found the lifecycle
operationIdentry stating its migration backwards, afault code in the graph watchdog entry that exists nowhere in the tree, a detector described so
broadly it would appear to fire on every graph, three packages claiming a DDS domain their tests
are opted out of, four operator-visible features with no entry at all, one misattributed pull
request, four entries citing the issue rather than the pull request that delivered the work, and
two unanchored version patterns in
release.sh. All are fixed in the second commit; thefindings and their evidence are in the commit message.
Issue
Type
Testing
sphinx-build -W --keep-going -b html docsis clean. The only remaining warnings aredoxygenclass/doxygenstructreporting a missingdocs/_build/doxygen/xml/index.xml, whichis generated by the
Generate Doxygen XMLstep indocs.ymlbefore Sphinx runs.0.7.0section, noForthcomingsection remains, anddocs/changelog.rsthas 19include::directives for 19 packages../scripts/release.sh verify 0.7.0reports all versions consistent.conf.pyfix is checked by reverting that file to0.6.0and re-runningbump: thepatched script rewrites it, while the previous one reports
unknown -> 0.7.0and leaves thefile at
0.6.0.scripts/generate_verification.pyflips seven Scripts requirements toverified, matchingtests that already carry their
@verifiestags.Checklist