Skip to content

Next dev - #454

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

Next dev#454
ps2 wants to merge 204 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
ps2 and others added 30 commits July 27, 2026 15:38
LoopKit GlucoseStore now skips corrupt CachedGlucoseObject rows (NULL startDate)
instead of trapping in Date._unconditionallyBridgeFromObjectiveC.
The fix assumed the trapping non-optional Date read was CachedGlucoseObject.startDate,
which is inferred but not proven (the LoopKit crash frames were not symbolicated).
Back it out until we can confirm the actual object/attribute from a reproduced,
fully-symbolicated crash.
Fixes the intermittent watchOS crash where a freshly-inserted CachedGlucoseObject
read a nil startDate (Date._unconditionallyBridgeFromObjectiveC) — caused by
GlucoseStore (async context.perform) sharing one context with CarbStore
(performAndWait). Glucose now uses a dedicated Core Data stack.
feat: create new build_loop_auto file to prevent disabling by GitHub
* 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.
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