From f8bd2a0de6e715e16b89736134c4583b3204063c Mon Sep 17 00:00:00 2001 From: Pete Schwamb Date: Tue, 13 Oct 2026 11:34:08 -0500 Subject: [PATCH 1/2] Include algorithm experiments in dosing decision payloads Dosing decision data carry the decision's algorithm experiments in payload.algorithmExperiments: integralRetrospectiveCorrection, glucoseBasedApplicationFactor and applicationFactor when that is in effect. Controller and pump status data keep the plain payload. --- .../Extensions/StoredDosingDecision.swift | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/TidepoolServiceKit/Extensions/StoredDosingDecision.swift b/TidepoolServiceKit/Extensions/StoredDosingDecision.swift index 6c963d4..ee0000a 100644 --- a/TidepoolServiceKit/Extensions/StoredDosingDecision.swift +++ b/TidepoolServiceKit/Extensions/StoredDosingDecision.swift @@ -35,6 +35,7 @@ import TidepoolKit - manualBolusRequested Double? TDosingDecisionDatum.requestedBolus - warnings [Issue] TDosingDecisionDatum.warnings - errors [Issue] TDosingDecisionDatum.errors + - algorithmExperiments AlgorithmExperiments? TDosingDecisionDatum.payload["algorithmExperiments"] - syncIdentifier UUID .id, .origin, .payload["syncIdentifier"] Notes: @@ -82,7 +83,7 @@ extension StoredDosingDecision: IdentifiableDatum { timeZone: datumTimeZone, timeZoneOffset: datumTimeZoneOffset, associations: associations, - payload: datumPayload, + payload: datumDosingDecisionPayload, origin: origin) } @@ -276,6 +277,19 @@ extension StoredDosingDecision: IdentifiableDatum { dictionary["syncIdentifier"] = syncIdentifier.uuidString return dictionary } + + private var datumDosingDecisionPayload: TDictionary { + var dictionary = datumPayload + if let algorithmExperiments { + var experiments: [String: Any] = [ + "integralRetrospectiveCorrection": algorithmExperiments.integralRetrospectiveCorrection, + "glucoseBasedApplicationFactor": algorithmExperiments.glucoseBasedApplicationFactor + ] + experiments["applicationFactor"] = algorithmExperiments.applicationFactor + dictionary["algorithmExperiments"] = experiments + } + return dictionary + } } extension StoredDosingDecision.Settings: IdentifiableDatum { From 1d04d6abbef548393ca8d990bfffb2907011a8d7 Mon Sep 17 00:00:00 2001 From: Pete Schwamb Date: Tue, 13 Oct 2026 11:55:53 -0500 Subject: [PATCH 2/2] Upload algorithm experiments as identifier objects payload.algorithmExperiments is a list of {identifier, parameters?} objects. --- .../Extensions/StoredDosingDecision.swift | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/TidepoolServiceKit/Extensions/StoredDosingDecision.swift b/TidepoolServiceKit/Extensions/StoredDosingDecision.swift index ee0000a..142d979 100644 --- a/TidepoolServiceKit/Extensions/StoredDosingDecision.swift +++ b/TidepoolServiceKit/Extensions/StoredDosingDecision.swift @@ -35,7 +35,7 @@ import TidepoolKit - manualBolusRequested Double? TDosingDecisionDatum.requestedBolus - warnings [Issue] TDosingDecisionDatum.warnings - errors [Issue] TDosingDecisionDatum.errors - - algorithmExperiments AlgorithmExperiments? TDosingDecisionDatum.payload["algorithmExperiments"] + - algorithmExperiments [AlgorithmExperiment]? TDosingDecisionDatum.payload["algorithmExperiments"] - syncIdentifier UUID .id, .origin, .payload["syncIdentifier"] Notes: @@ -280,14 +280,7 @@ extension StoredDosingDecision: IdentifiableDatum { private var datumDosingDecisionPayload: TDictionary { var dictionary = datumPayload - if let algorithmExperiments { - var experiments: [String: Any] = [ - "integralRetrospectiveCorrection": algorithmExperiments.integralRetrospectiveCorrection, - "glucoseBasedApplicationFactor": algorithmExperiments.glucoseBasedApplicationFactor - ] - experiments["applicationFactor"] = algorithmExperiments.applicationFactor - dictionary["algorithmExperiments"] = experiments - } + dictionary["algorithmExperiments"] = algorithmExperiments?.map { $0.jsonObject } return dictionary } }