Repository navigation
Release OpenGlucose 0.3.0 (sensor lane: Libre 2 capture, GS1 evidence, live GS1 driver) - #128
Open
shroominic wants to merge 11 commits into
Open
shroominic wants to merge 11 commits into
shroominic wants to merge 11 commits into
Conversation
Snapshot the local libre-protocol-capture worktree so contest cloud agents can branch from a shared remote: cgm_driver_registry, cgm_libre2, cgm_libre2_glucose, cgm_yuwell_anytime, debug protocol-capture harness, and Anytime 5P passive-capture runbook. No raw captures or health data.
Do not await the in-flight connect before the promotion gate releases, and type ControlledSession.disconnectError as Exception? for only_throw_errors.
Add a live Cbio/SIBIONICS GS1 session on top of the existing offline frame contract: discover the FF30 service, connect, enable FF31 notifications, and decode every received frame with parseCbioPlaintextFrame. The session stays fail-closed. The only write it can emit is the bounded `06 08 01 00 00 00 F1` read the protocol evidence supports, and only after a passive window with no notification. Activation (0x07), clock (0x03), reset, threshold, and calibration writes are never issued; calibration submission reports unsupported instead of attempting a write. Register the driver in the platform registry behind its own pure advertisement classifier so an FF30 candidate routes to the FF30 driver, and declare the package dependency plus the device-test dev dependencies the capture harness needs. Verified: packages/cgm_cbio `dart test` 24/24, `dart analyze` clean, openhealth driver registry/connection-flow tests green.
Add an integration_test entry point that drives the production FlutterBluePlusTransport through RecordingBleTransport and the unmodified CbioSensorDriver against the live sensor, without going through the Nearby sensors UI. Every phase is bounded, so a silent radio cannot hang the harness, and all evidence lands in the app-private trace sink that already backs the protocol capture lane. Discovery runs three ways: the driver's own FF30-filtered scan, an unfiltered transport scan, then a bounded raw-plugin acquisition loop that waits for an intermittent advertisement. The raw path also primes the platform's address type for the peripheral. An address recovered from advertisement evidence can be supplied at run time via --dart-define=CBIO_TARGET_DEVICE_ID so a capture is possible while the Dart scan surfacing defect is open. The harness asserts the safety contract from the trace itself: at most one write, and that write must be the allowed 0x08 read. It prints only redacted identifiers and never prints payload bytes. Pin the debug-only androidx.test espresso artifacts that the integration_test package's pinned 3.2.0 release makes ambiguous for AGP 8 namespace validation.
The platform registry now registers the Cbio driver alongside AiDEX, so the OG_DEMO selection test's expected driver set has to include it. Verified: openhealth `flutter test --exclude-tags integration` 473/473.
Android hands the app short-form UUIDs (FF30/FF31/FF32) while the driver declared the full 128-bit base form, so _locateCharacteristics never matched the FF30 service on a live link and every real session failed closed with missingNotifyCharacteristic. Canonicalise both sides onto the Bluetooth base UUID before comparing. Observed on the GS1 sensor: connect ok, service FF30 with FF31 (notify) and FF32 (write), and the previous code produced notify.enabled=[].
The first live FF31 packet is five bytes whose leading byte is the size a full frame would need, so disconnecting on the first packet could drop every later fragment. Linger for six seconds after the first packet.
FlutterBluePlusTransport.scan's stream can stay open when flutter_blue_plus stops the physical scan without emitting isScanning == false, so the discovery loop never returned and the Connect-a-sensor panel kept scanning forever. The registry now owns the scan deadline (_activeScanTimeout + _completeScanAtDeadline) so an overrun scan still ends for every consumer, bounds transport cancellation so a wedged cancel cannot hold the lifecycle open, and keeps an assert-gated, identity-free scan diagnostic for debug builds.
This was referenced Sep 17, 2026
Open
This branch has not been deployed
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.
Release aggregate: OpenGlucose 0.3.0 (sensor lane)
Aggregate only. This PR stays open and separate: it bundles child content for review and
does not merge anything. No child PR is closed, merged, or rebased by this branch.
mainrelease/v0.3.0atfcb751c(cut from the deepest stacked child tip)v0.1.6;v0.1.7(Release OpenGlucose 0.1.7 (sharp-rise walk nudge) #125) andv0.2.0(Release OpenGlucose 0.2.0 (metabolic context cockpit) #126) are open.The sensor lane is the next feature train, so
0.3.0follows the repo's existing minor scheme.Bundled child PRs
feature/libre-protocol-capturemainfeature/codex-cbio-gs1feature/libre-protocol-capturefeature/cbio-gs1-livefeature/codex-cbio-gs1Issue mapping: #116 -> #119, #117 -> #127 with #120 as the offline evidence/gates predecessor.
Open gaps (this aggregate is not ship-ready)
fix/nearby-sensor-scan-surfacing(worktreeworktrees/scan-surfacing)currently has no commits ahead of its base and no PR or issue filed. It must land as its own issue +
focused PR and be bundled here before
v0.3.0can be considered complete.feat(sensor): Libre 2 protocol capture and multi-sensor base #119 delivers protocol capture and the multi-sensor base.
encrypted. feat(sensor): add fail-closed live CBio/SIBIONICS GS1 driver #127 is fail-closed and carries an explicit no-mg/dL-validated non-claim; no live glucose
accuracy claim is made by this release.
blocker) is a sibling lane. Decision queued: fold into
v0.3.0or hold for a later sensor release.codex/libre-readiness, basefeature/libre-protocol-capture)is a draft context-preservation PR and is intentionally excluded.
main.mainis 6 commits ahead of this stack's merge base, and mergingmaininto the stack conflicts in
openhealth/test/scan_failure_test.dartandscripts/check-tooling.sh.Rebasing or merging the stack onto current
mainis an owner decision recorded here rather thanresolved on this aggregate.
Program rules honored
One focused PR per issue; every child PR remains open; nothing merges to
main; each release versionis a separate open aggregate PR.