Skip to content

Next dev - #454

Open
ps2 wants to merge 208 commits into
devfrom
next-dev
Open

ps2 wants to merge 208 commits into
devfrom
next-dev

Conversation

@ps2

@ps2 ps2 commented Jun 4, 2026

Copy link
Copy Markdown
Contributor

This branch is a holding ground for the next major set of features to land in dev.

It includes the Tidepool Sync (#450) and OmnipodKit, and new Libre 3 integration.

loopkitdev and others added 30 commits March 12, 2026 15:50
- Point all 18 submodule URLs to https://github.com/loopkitdev/* forks
- Minizip and TrueTime.swift retain LoopKit origin (no forks)
- Add docs/tidepool-sync-2026-03-10.md (Tidepool sync documentation)
…ce docs

- Update all 17 submodule commit pointers to reflect rewritten history
  (filter-branch changed SHAs when fixing author to LoopKit Developer)
- Add Loop build fix commit (LoopDataManager init ordering)
- Add LOOPKIT_SYNC_PROCESS.md, SYNC_PROGRESS.md, sync-docs/
Catches the superproject up to all submodule work that has accumulated
on tidepool-sync/2026-03-10 since the initial sync commit, including:

- Loop: restore manual dose entry "+" button on insulin delivery screen
- LoopKit, NightscoutService, TidepoolService, LibreTransmitter:
  string catalog updates from Xcode build
- OmniKit: fix reentrant lock crash in isSignalLost
- Various submodules: merge upstream/{dev,main} into tidepool-sync branch
Parallel fix to OmniKit 924f10d — OmniBLE had the identical bug where
isSignalLost() read state.lastPumpDataReportDate from inside a
lockedState.mutate closure, causing recursive lock acquisition.
Tier 1
- LoopKit: bd30c463 (409 commits from tidepool/dev; 18 source conflicts + 19
  pbxproj regions resolved; DIY divergence preserved at BasalRateScheduleEditor)
- Loop: 76b6b1e3 (14 commits from tidepool/dev; 3 pbxproj regions)

Tier 3 - CGM drivers
- CGMBLEKit: 69562e7
- G7SensorKit: d024513
- dexcom-share-client-swift: 541de2f
- NightscoutRemoteCGM: b1ea9ee
- LibreTransmitter: c99daf1

Tier 3 - Pump drivers
- RileyLinkKit: 19f5ae8
- OmniKit: b3b6080 (preserves reentrant lock fix; adopts mutateState)
- OmniBLE: 645e0fc (preserves reentrant lock fix and Pod Keep Alive suspend
  special case; adopts mutateState)
- MinimedKit: f994d6e (preserves CAGE/IAGE tracking)

Tier 3 - Services
- TidepoolService: 5f6a064 (incl. DoseEntry dedupe follow-up)
- NightscoutService: 1b5cded (preserves APNS response feature)
- AmplitudeService: 77dae3e
- LogglyService: 8e18081
- MixpanelService: unchanged (already up to date with tidepool)

Tier 3 - Support/Onboarding
- LoopSupport: a312dfb
- LoopOnboarding: fd7e410

Package.resolved
- LoopAlgorithm: tidepool-org/LoopAlgorithm bd1a879 (4 test-only commits)
docs/tidepool-sync-2026-05-11.md describes the merge, conflicts, and
divergences. SYNC_PROGRESS.md updated to reflect the new branch and the
divergences carried forward.
Pulls in 3 small origin/dev updates that landed after this sync started:
- Loop: PR #2410 Live activity plot fixes (manual merge to preserve our
  post-Tidepool-sync API: kept async/await sample fetch + LoopUnit
  signature, adopted upstream's presetStart<=presetEnd guard and the
  adjustedChartStart/End helpers)
- CGMBLEKit: PR #211 handle inactive CGM sensor sessions (clean merge)
- OmniBLE: Lokalise translation update (clean merge)
Pulls in the new loopkitdev/LibreLoop repo (initial scaffold at 55b65d6),
registers its xcodeproj in the workspace, and adds LibreLoopPlugin to the
LoopWorkspace scheme so copy-plugins.sh embeds the .loopplugin bundle into
Loop.app/Frameworks. With this in place Loop's CGM picker surfaces a
"FreeStyle Libre 3" entry and runs the plugin's onboarding flow.

No changes to Loop or LoopKit are required — discovery is purely via
PluginManager's Info.plist scan.
Bumps the LibreLoop submodule pointer to the head of main, covering:
- onboarding restructure (Apply -> Scan)
- LibreCRKit SwiftPM dep + vendored phone_cert_162b
- candidate Phase 5 handshake
- BLE PIN persisted before BLE auth
- in-session glucose streaming + monitor
- redesigned status screen, lifecycle bar, last-N readings table
- always-retrying reconnect + per-attempt scan timeout
- post-pair backfill via PatchControlCommand
- adopted upstream Libre3GlucoseQualityAssessment API
- Pair-new-sensor flow, persisted latestSample
- BLE state restoration via shared scanner + retrievePeripherals
marionbarker and others added 30 commits July 29, 2026 15:54
* Merge pull request #461 from daghaian-loop-org/add-build-autotrigger

feat: create new build_loop_auto file to prevent disabling by GitHub

* improve clarity: when  build is skipped, run is canceled no green check mark is shown (#472)

* update to fastlane 2.236.1

* update fastlane to 2.237.0

---------

Co-authored-by: David Aghaian <16483722+daghaian@users.noreply.github.com>
… wording (#6)

Expired Libre 3 sensors now show 'Expired' (not 'Sensor failed'), surface a
prominent Pair New Sensor button, and the expiry alerts set the warmup-gap
expectation instead of implying a gap can be avoided by replacing early.
Carb screen and favorite-food insights now compute carb absorption with the same
mid-absorption ISF model as the algorithm, so their COB agrees with the home
screen (fixes the carb-screen-vs-home discrepancy under an ISF-changing override).
Advances OmnipodKit next-dev d3a55a4 -> 4b84508. Headline is #123, which stops a
stale fresh-discovery fallback timer from cancelling a live connection and spinning
a connect -> cancel -> "reconnecting after drop" loop. Also pulls the other
OmnipodKit next-dev commits since our last pin: heartbeat stale-target fix, MIT
license, README updates.
…ix (#601)

Regenerated golden fixtures to match LoopAlgorithm's continuousDeliveryInsulinOnBoard
midpoint-integration change; values-only, time grid unchanged. Clears the next-dev
CI failure introduced with the LoopAlgorithm bump.
Third and final InsulinMathTests fixture affected by the LoopAlgorithm basal-ripple
IOB change; full InsulinMathTests suite passes. Completes the next-dev CI fix.
… Glass (#2464)

Advances Loop next-dev 48f8a921 -> c4d89c03.
The workspace build consumes LibreCRKit via the local 'group:LibreCRKit' package
override (not LibreLoop's remote pin), so bumping the submodule gitlink is what
lands the change in next-dev builds. a86b92f reworks the system NFC scan prompt to
'Hold the TOP of your iPhone very close to the Sensor' (+ a CustomStringConvertible
addition in bbfa2f1).
Fixes a re-entrant managerQueue deadlock when surfacing a pod alert from an advert.
Picks up the display-only forward throttle (#7, e5c159f). With the
experimental "Send every reading" toggle off, display-only samples --
a new sensor's warmup readings, for instance -- bypassed the ~5 minute
throttle and streamed to Loop at about one per minute, against what the
toggle promises. The fix drops the isActionable requirement from the
throttle guard and advances the throttle clock on every forward.
OmnipodKit  4763ce6 -> 366380d  eager connect watchdog (#133)
LoopKit     c4a8f64 -> 011a3db  persistent store (#606), override loop (#608)
G7SensorKit 468eefc -> fb87aa9  suspected session end grace (#63)
Loop        c4d89c0 -> 3ab37d5  CarbMath preconditionFailure (#2489)
LibreTransmitter a38975d -> c192a2f  device manufacturer field (#41),
            configurable glucose smoothing

LOOP_MARKETING_VERSION 3.15.1 -> 3.15.2. CURRENT_PROJECT_VERSION left at
58.
Picks up "Xcode 27 Fix" (#605): isDurationPickerExpanded in
CreatePresetNameAndScheduledEdit is declared without an inline initial
value, which Xcode 27 requires here.
Building with Xcode 27 (27A5237l) failed before reaching any of our
code:

  TrueTime.xcodeproj: error: The iOS deployment target
  'IPHONEOS_DEPLOYMENT_TARGET' is set to 12.0, but the range of
  supported deployment target versions is 15.0 to 27.0.x.
  (in target 'TrueTime-iOS')

Upstream fixed this in "bump deployment (#3)", which raises the target
from 12.0 to 15.0 and changes nothing else. Testers already building
with Xcode 27 are on that commit.

Xcode 26 was unaffected, which is why this went unnoticed.
Picks up #609: LoopKitTests now declares its dependency on LoopKitUI.
Test-target wiring only, 15 lines of project file, no source or product
change.
OmnipodKit       366380d -> d58b11f  InPlay connection strings (#140)
LibreTransmitter c192a2f -> 6058dd2  glucose smoothing and every-minute
                                     reading strings (#50)

Both were added by earlier work but never had the regenerated catalog
committed, so the strings had not reached translation. Raised by
@marionbarker in review. Catalog content only, no source change.
LibreLoop e4a4642 -> 9e5c3fc  18 new keys plus a one-time serialiser
                              normalisation (#10)
Loop      3ab37d5 -> bc4d79ff two removed pre-meal strings marked stale
                              (#2500)

Completes the catalog cleanup @marionbarker raised. All four submodules
now regenerate clean: a rebuild after these bumps leaves no catalog
dirty.
Picks up #16: shouldConnect(to:) and connectingCount read
autoConnectIDs from the main thread while centralQueue mutates it, which
tore the Set and crashed with "unrecognized selector sent to instance
0x8000000000000000" when a RileyLink switch was toggled repeatedly
(LoopKit/Loop#2462). The property is now backed by a lock.

Affects MinimedKit, OmniKit and OmnipodKit with Omnipod Classic, which
share the provider.
Pod Keep Alive mode switch bug fix and cleanup (#138)
Improved dose handling on faults for more consistent state (#139)
Always display updated informational text at start of Omnipod 5 Setup (#136)

Pump manager and setup UI only; the Bluetooth layer is untouched, so the
eager connect work in this bump is unaffected. The string catalog stays
clean after a rebuild.
Bump submodules and version to 3.15.2
Scan help now says to hold the TOP of the phone against the sensor, not
the back. The NFC antenna is at the top, so the old instruction did not
work, and it contradicted the sibling screen which already said "top"
(#11, reported by Mike Plante).

Also enables Swift string extraction on the LibreLoop and LibreLoopUI
targets, matching MinimedKit and OmnipodKit. LibreLoop already declared
LocalizedString as an extractable macro and preferred string catalogs
but never switched extraction on, so new strings did not reach the
catalog. The first build after enabling it harvested 15 strings that had
never been available for translation, from the stream debug view and the
chart labels.
OmnipodKit 6106c1c -> d9b5966

  Don't fail commands on background disconnect (#147). enterBackground()
  cancelled the peripheral connection with no notion of whether a command
  exchange was in flight, so backgrounding mid-command killed the pending
  write and reported a failure for work the pod had already done -- the
  ACK is written only after the response is received and parsed. Seen in
  the field as "Unable To Clear Alert / Message IO Exception ...
  PeripheralManagerError.timeout" seconds before a reconnect advertised
  the alert already cleared. Pod comms errors also now read in plain
  English rather than as raw type names.

  Stale pairing connect teardown and BLE heartbeat for direct-BLE DASH
  pods (#155). Removes the zombie-connect heuristic, which could not tell
  an abandoned connect from one issued moments earlier and so cancelled
  in-flight pairing connects on any phone where the eager-connect watchdog
  does not arm, looping pairing at the advert interval without completing.
  Also fixes setBLEHeartbeatRequest branching on mayUseRileyLink, which is
  true for DASH as well as Eros: a DASH pod on direct BLE with Pod Keep
  Alive off took the RileyLink branch and never had provideHeartbeat set,
  leaving no background wake source when the CGM cannot supply one.

Loop bc4d79f -> e22334d

  Replace icon with liquid glass variant (#2434).

LibreLoop 1eeb710 -> 415b799

  Capture sensor firmware version and surface it in device info (#12).

  Retract alerts when the CGM is deleted (#13). Delete CGM went straight
  to notifyDelegateOfDeletion and never reached the manager's delete, so
  scheduled expiry alerts stayed in Loop's AlertStore and launch-time
  playback re-presented them on every launch -- a user who had switched
  back to a G7 still got "sensor about to expire" a week later. Same
  change also removes the stuck-value detector, since the realtime frame
  log already carries the raw fields, and renames the plugin to
  "FreeStyle Libre 3 / 3+" in the Add CGM picker and settings row.

LibreCRKit a86b92f -> c562170

  Add the Libre by Abbott account-ID receiver derivation (#5), and
  localize user-facing NFC and Bluetooth strings into de, es, fr, it, ja,
  nl, pl, ru and zh-Hans (#4).
Bump OmnipodKit, Loop, LibreLoop and LibreCRKit
Loop e22334d -> 35f992f0

  Normalize the tab bar icon assets (#2510). ActionTabBar scales each icon
  to a common 28pt height, but scaledToFit works on the asset canvas, and
  the canvases padded their artwork by very different amounts -- bolus and
  settings rendered about 30% larger than carbs and presets beside them.
  Takes the normalized 40x40 artwork from #2504 for the three assets this
  bar uses, which brings all four into line with no code change.

  Allow querying for the Dexcom G7, ONE+ and Stelo app URL schemes (#2512).

  Show bolus progress for automatic boluses, and offer an issue report when
  one is stopped (#2511). The progress reporter was created only for manual
  boluses, so an automatic bolus displayed nothing on the status row -- and
  since that row is also the stop target, there was no way to stop an
  automatic bolus from the status screen at all. The canceled row now also
  carries an info button explaining why Loop bolused, offering to open the
  issue report screen.

G7SensorKit fb87aa9 -> 8862288

  Merge main into next-dev (#68), a clean fast-forward from the pin. Two
  code changes: the sensor lifecycle progress now shows remaining lifetime
  from 48 hours rather than 24, warning only inside the last 24 (#58); and
  CBManagerState.poweredOn stringified as "poweredOff", which made device
  logs misreport the radio as off whenever it was on.

  The rest is translation catalog updates, the ko/ce/hi language list
  change, and the MIT license file.
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.

5 participants