Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
800 commits
Select commit Hold shift + click to select a range
b4a2b9c
extractor(antBackout): parse the new armSrc field (accel|ml|-)
tim2000s Jul 20, 2026
a96c39c
backtest(v1-acceleration): V1's early accel bolus is fizzle-safe — re…
tim2000s Jul 20, 2026
3aa9a4d
feat(boost/v6): V1-acceleration early primer — LIVE dosing into the m…
tim2000s Jul 20, 2026
5c17220
fix(boost/v6): auto-config never wrote PrimerCapU — primer was a no-op
tim2000s Jul 20, 2026
1cac48b
backtest(founding-flow): restoring "seed→trigger-UAM→firm-up" into V6…
tim2000s Jul 20, 2026
6c439c8
feat(boost/v6): primer confirm-net — credit accumulated fizzle IOB ag…
tim2000s Jul 21, 2026
843d856
backtest(primer-clustering): cap + taper REJECTED, confirm-net justified
tim2000s Jul 21, 2026
12b589d
fix(boost/hr-activity): stop adding insulin during elevated-HR exerci…
tim2000s Jul 21, 2026
45f17cc
fix(boost/hr-activity): stop adding insulin during elevated-HR exerci…
tim2000s Jul 21, 2026
51e7663
fix(boost/postrescue): compose rebound scale over T7/T8 — close the c…
tim2000s Jul 23, 2026
0eb4a65
fix(boost/postrescue): compose rebound scale over T7/T8 — close the c…
tim2000s Jul 23, 2026
d721e9b
docs(register): composed post-rescue rebound guard entry
tim2000s Jul 23, 2026
e413a1a
docs(register): composed post-rescue rebound guard entry
tim2000s Jul 23, 2026
bbe2caa
feat(boost/plateau-shadow): widen SHADOW logging band to 145-250
tim2000s Jul 25, 2026
4c776cb
fix(boost/v7-shadow): decay-aware undosed projection — repair pLow90 …
tim2000s Jul 27, 2026
d992be3
docs(review): fully-closed-loop critical review — good/bad/ugly, coho…
tim2000s Jul 27, 2026
bf335bc
study(efficacy-signal): NEGATIVE — no true efficacy signal in our tel…
tim2000s Jul 27, 2026
0e23dd9
docs(register): true efficacy-signal probe — NEGATIVE (discarded)
tim2000s Jul 27, 2026
00ab37a
correct(efficacy-signal): Twin-Ra was under-AGED not under-covered — …
tim2000s Jul 27, 2026
eede077
study(postmeal-exercise): mechanism is carb-counterweight failure, NO…
tim2000s Jul 27, 2026
d02a46b
study(performance-segmentation): re-cut review by post-meal exercise …
tim2000s Jul 27, 2026
894f223
study(anticipation): per-user beats cross-user for EXERCISE (0.78 vs …
tim2000s Jul 27, 2026
80c76b9
spec(anticipation): full per-user anticipation architecture (SPECULAT…
tim2000s Jul 27, 2026
5ea788a
feat(boost/anticip): per-user anticipation SHADOW (Phase 1+2) — both …
tim2000s Jul 27, 2026
6856972
docs(anticip): mark spec Phases 1+2 BUILT (commit 5ea788a911)
tim2000s Jul 27, 2026
9662ae8
feat(boost/anticip): per-user anticipation SHADOW (Phase 1+2) — both …
tim2000s Jul 27, 2026
adb934d
report(postmeal-exercise): meals with vs without exercise — 1500w + 4…
tim2000s Jul 28, 2026
e76e053
docs(boost): update README, simulator, analyser & tuning guide for Ju…
tim2000s Jul 28, 2026
9f325bf
docs(boost): restructure README into slim landing + detail pages; fro…
tim2000s Jul 28, 2026
0e9e666
docs(boost): re-review polish — HypoCaution floor clarity + drop inte…
tim2000s Jul 28, 2026
7655c42
docs(boost): clarify Sensitivity lever, flag speculative early-confir…
tim2000s Jul 28, 2026
da6b9bd
feat(boost): make Boost V6 the default APS engine + reframe onboardin…
tim2000s Jul 28, 2026
3d195d0
docs(boost): reduce bold to bullet lead-ins only — strip inline/prose…
tim2000s Jul 28, 2026
e40ff31
feat(boost/v6): V1-acceleration early primer — LIVE dosing into the m…
tim2000s Jul 20, 2026
d0801db
fix(boost/v6): auto-config never wrote PrimerCapU — primer was a no-op
tim2000s Jul 20, 2026
abe27db
feat(boost/v6): primer confirm-net — credit accumulated fizzle IOB ag…
tim2000s Jul 21, 2026
37061cc
docs(boost): document the acceleration primer in advanced settings
tim2000s Jul 28, 2026
cd5b6fc
article(fcl): public draft — fully closed loop read from its own data
tim2000s Jul 28, 2026
a023b76
backtest(insilico): fidelity test — simglucose cannot reproduce our t…
tim2000s Jul 28, 2026
e42a248
backtest(insilico): reproducible simulator-fidelity suite (real vs UV…
tim2000s Jul 28, 2026
da674d2
backtest(insilico): grow fidelity suite to 10 signatures (2 PASS / 5 …
tim2000s Jul 29, 2026
da1cf9f
backtest(insilico): multi-cohort fidelity — UVA/Padova vs 4 real AID …
tim2000s Jul 29, 2026
8d0f81f
report(insilico): FDA-Padova vs real-world article — multi-cohort fid…
tim2000s Jul 29, 2026
ba65b8a
report(insilico): add explicit Method section to the multi-cohort com…
tim2000s Jul 29, 2026
abe146e
report(insilico): FDA-Padova preprint + short companion — "case for a…
tim2000s Jul 29, 2026
c5f79b5
backtest(insilico): measure the S2013 refinement directly (time-varyi…
tim2000s Jul 29, 2026
07559d8
backtest(insilico): add S2013 glucagon counter-regulation model + cor…
tim2000s Jul 29, 2026
705532c
report(insilico): measure S2013 glucagon counter-regulation — narrows…
tim2000s Jul 29, 2026
aaf32f3
report(insilico): rewrite preprint in a human voice; verify all numbe…
tim2000s Jul 29, 2026
2146be1
report(insilico): Stream 1 — correct AID-testing claim; present S2013…
tim2000s Jul 29, 2026
8ee0881
backtest(insilico): Stream 2 — realistic-simulator PoC with held-out …
tim2000s Jul 29, 2026
ec6f9e0
review(boost): status review to date — cohort outcomes, era null, ins…
tim2000s Jul 29, 2026
6ab2313
feat(boost/sleep): merge sleep-in lie-in INTO SleepStateDetector (sin…
tim2000s Jul 8, 2026
3f85943
fix(smoothing): harden UKF compression gate — exclude negative basal …
tim2000s Jul 16, 2026
4b06282
fix(boost/sleep): night-end learned-wake nudge is one-sided (later only)
tim2000s Jul 20, 2026
68ec1e2
fix(boost/sleep): PRE_SLEEP releases to AWAKE on clear activity (ApsB…
tim2000s Jul 20, 2026
2e5c224
feat(boost/shadow): bring the full shadow instrumentation suite to th…
tim2000s Jul 29, 2026
513c174
fix(boost/v6): primer trigger + sizing rework — absolute delta floor,…
tim2000s Jul 30, 2026
57b1919
feat(boost/v6): raise the primer ceiling range + self-scaling auto-co…
tim2000s Jul 30, 2026
0513fd0
fix(boost/v6): hypo-prone users get a provisioned primer, LOCKED to r…
tim2000s Jul 30, 2026
ec183a2
fix(boost/v6): revert the primer TBR lock — a user override must alwa…
tim2000s Jul 30, 2026
c57af18
feat(garmin): expose loop status + last-run time in the /sgv.json pay…
tim2000s Jul 16, 2026
87eac24
feat(garmin): add DynISF (variable sens) to the /sgv.json payload
tim2000s Jul 16, 2026
354f657
feat(extractor): parse AIMI-fork decisions as a first-class variant
tim2000s Jul 30, 2026
5fc7951
fix(boost): guard dynamic ISF against an implausible TDD — profile-IS…
tim2000s Jul 30, 2026
bb03fb8
feat(boost): detect an install-time history gap and ask NSClient for …
tim2000s Jul 30, 2026
6739238
fix(boost/histsync): confine the backfill to a new-install window
tim2000s Jul 30, 2026
19f339a
backtest(onemin): early-exit-on-deceleration does NOT work — the lead…
tim2000s Jul 30, 2026
9a7e8f3
backtest(onemin): what 1-min deltas actually are — coherent in sign, …
tim2000s Jul 30, 2026
bc177b6
backtest(onemin): the UKF compression gate is ~98% suppressed at 1-mi…
tim2000s Jul 30, 2026
0b1587f
fix(boost): make the compression baseline and the meal-state ages CAD…
tim2000s Jul 30, 2026
e97340d
report(onemin): preprint — where one-minute CGM helps a closed loop, …
tim2000s Jul 30, 2026
2d1ec77
report(onemin): signal-level preprint — one-minute CGM buys latency, …
tim2000s Jul 30, 2026
a996e5b
report(onemin): latency gain is symmetric in direction — rises match …
tim2000s Jul 30, 2026
2f0ef40
report(onemin): price the latency gain against episode rates and actu…
tim2000s Jul 30, 2026
b76abae
fix(onemin): 5-min grid was crippled by timestamp jitter — all cadenc…
tim2000s Jul 30, 2026
a0f4555
validate(onemin): simulated 5-min feed checked against the subject's …
tim2000s Jul 30, 2026
873a02a
report(onemin): rebuild the comparison on the two REAL eras — no deci…
tim2000s Jul 30, 2026
139f6e7
analysis(cgm-cadence): consolidated suite — real 5-min era vs real 1-…
tim2000s Jul 30, 2026
ce1ab98
report(cgm-cadence): rewrite to answer the question directly, in hous…
tim2000s Jul 30, 2026
07ebf7b
analysis(cgm-cadence): add point to point acceleration
tim2000s Jul 30, 2026
72089df
report(cgm-cadence): recast as a journal paper in the Breton/Kovatche…
tim2000s Jul 30, 2026
4ca8dcd
analysis(cgm-cadence): meal climb onset and peak prediction, both cad…
tim2000s Jul 30, 2026
003e667
analysis(anticipation): answer the three questions the cadence work d…
tim2000s Jul 31, 2026
e80e6a6
docs: framework for evaluating a closed-loop system in different cont…
tim2000s Jul 31, 2026
84d9497
fix(boost/activity): sleep-in and INACTIVE can no longer both be true
tim2000s Jul 31, 2026
37a79aa
fix(boost/activity): sleep-in and INACTIVE can no longer both be true
tim2000s Jul 31, 2026
4e984e9
fix(boost/activity): INACTIVE never fires overnight, whatever night m…
tim2000s Jul 31, 2026
483d2fe
fix(boost/activity): INACTIVE never fires overnight, whatever night m…
tim2000s Jul 31, 2026
696cd1c
fix(smoothing): make the UKF work at any sampling cadence, not only f…
tim2000s Aug 1, 2026
319617d
feat(1min): native-cadence glucose series, and route the smoother to it
tim2000s Aug 1, 2026
cac0959
feat(1min): complete the dosing path for one-minute sensors
tim2000s Aug 1, 2026
2a1ded4
fix(1min): regularise the native series instead of passing raw readings
tim2000s Aug 1, 2026
43a7bc7
sim(fidelity): behaviour and loop layers close five more signatures
tim2000s Aug 1, 2026
2378baf
feat(boost/postrescue): pre-registered tight-ramp trial — opt-in, ran…
tim2000s Aug 3, 2026
76110dc
tooling(extractor): parse the post-rescue trial tag into columns
tim2000s Aug 3, 2026
a260206
protocol(postrescue): v1.1 — A excluded, trial is single-subject
tim2000s Aug 3, 2026
7cd1cb1
feat(autoconfig): periodic re-derivation of ALL derived knobs — 7-day…
tim2000s Aug 3, 2026
16a6cf5
fix(autoconfig): re-derivation tracks the derivation's MOVEMENT, not …
tim2000s Aug 3, 2026
5a0efc5
fix(boost): take auto-config off the dose path, and close the plateau…
tim2000s Aug 3, 2026
59ff6d7
fix(boost): restore @Singleton on the engine — the loop has enacted n…
tim2000s Aug 4, 2026
67c38c9
docs(claude): record the @Singleton drift and the three diagnostic fa…
tim2000s Aug 4, 2026
6993f53
fix(boost): restore @Singleton on the engine + close the plateau floo…
tim2000s Aug 4, 2026
10b6fce
fix(boost/plateau): the minGuard floor failed OPEN on a negative forw…
tim2000s Aug 4, 2026
3fa3eef
fix(autoconfig): clear rev 1's dead last-run stamp so re-derivation i…
tim2000s Aug 4, 2026
6a01d08
docs(autoconfig): the first re-derivation CAN write — computed knobs …
tim2000s Aug 4, 2026
e2de876
docs(readme): name the three dials exactly as the app labels them, an…
tim2000s Aug 4, 2026
cf8a77a
fix(autoconfig): a clipped re-derivation step no longer discards its …
tim2000s Aug 4, 2026
c625390
merge: bring Boost-V7-shadow onto the one-minute line
tim2000s Aug 9, 2026
3732889
protocol(cadence): pre-register the one-minute trial, with the power …
tim2000s Aug 9, 2026
09a4a0d
protocol(cadence): pre-register the one-minute trial, with the power …
tim2000s Aug 9, 2026
3ec6499
protocol(cadence) v1.1: the baseline breach was the U200 to U100 change
tim2000s Aug 9, 2026
74082b5
protocol(cadence) v1.1: the baseline breach was the U200 to U100 change
tim2000s Aug 9, 2026
8316cc0
protocol(cadence) v1.2: withdraw the run-in; the comparator is the co…
tim2000s Aug 9, 2026
4553413
protocol(cadence) v1.2: withdraw the run-in; the comparator is the co…
tim2000s Aug 9, 2026
c0eaae1
feat(1min): let the loop run at the sensor's cadence, not once per bu…
tim2000s Aug 9, 2026
3bda4f2
protocol(cadence) v1.3: arms fixed, and the open item closed the othe…
tim2000s Aug 9, 2026
fc550e2
protocol(cadence) v1.3: arms fixed; open item closed (doc only, cherr…
tim2000s Aug 9, 2026
8fb9b23
protocol(cadence) v1.4: record the asymmetric-cadence follow-on as arm D
tim2000s Aug 9, 2026
a10a5ce
protocol(cadence) v1.4: record the asymmetric-cadence follow-on as ar…
tim2000s Aug 9, 2026
082b1df
protocol(cadence): rewrite as a single registration document
tim2000s Aug 9, 2026
8be4204
docs(claude): record the house style for written documents
tim2000s Aug 9, 2026
711ab99
protocol(cadence): rewrite as a single registration document
tim2000s Aug 9, 2026
e914b38
docs(claude): record the house style for written documents
tim2000s Aug 9, 2026
1cbfc4d
tooling(cohort): scripted refresh and status report for the Boost cohort
tim2000s Aug 9, 2026
99ecea1
tooling(cohort): scripted refresh and status report for the Boost cohort
tim2000s Aug 9, 2026
e2d2f8c
findings(cohort): V5/V6 outcomes and shadow layer results to 2026-08-09
tim2000s Aug 9, 2026
4c77822
findings(cohort): V5/V6 outcomes and shadow layer results to 2026-08-09
tim2000s Aug 9, 2026
b9105a1
build(instances): two further full-application flavours, and the dive…
tim2000s Aug 9, 2026
e9da572
docs(tools): cover the acceleration primer in the guide, analyser and…
tim2000s Aug 9, 2026
ef7b0ce
tooling(plateau): re-score historical triggers against the guards now…
tim2000s Aug 9, 2026
36ce009
build(instances): a fourth instance, and the divergence protocol corr…
tim2000s Aug 9, 2026
9ba8b25
article(diabettech): the cadence question, written for the blog
tim2000s Aug 9, 2026
01736b9
article(diabettech): withdraw the figures built on data that was not …
tim2000s Aug 9, 2026
bb13002
article(diabettech): restore the one minute findings, and add the buc…
tim2000s Aug 9, 2026
73e73f8
article(diabettech): rewrite in the expository register, and extend t…
tim2000s Aug 9, 2026
16a83b5
protocol(divergence) v1.2: arm A is a separate sensor on a second han…
tim2000s Aug 9, 2026
6315baa
protocol(divergence): pin that arm A runs throughout, and compute the…
tim2000s Aug 9, 2026
46fd6f3
protocol(divergence) v1.3: no daily reset, because the drift is bound…
tim2000s Aug 9, 2026
c331db4
protocol(divergence) v1.4: add predicted glucose across arms, scored …
tim2000s Aug 9, 2026
af1d7fb
protocol(divergence), article: present as a clean draft, and record t…
tim2000s Aug 9, 2026
ee5c4f7
fix(simulator): read the profile's units and its timezone, restoring …
tim2000s Aug 10, 2026
f44b6c1
feat(simulator): mmol/L display toggle, completing the port of PR #5
tim2000s Aug 10, 2026
d6960ba
fix(bucketing): the grid anchor was lost on every clone, so a fast se…
tim2000s Aug 11, 2026
fad9362
fix(cadence): hold the five-minute decision interval in the trigger, …
tim2000s Aug 11, 2026
c995222
perf(workflow): run the loop before the graph preparation it does not…
tim2000s Aug 12, 2026
5de6a88
tooling(cadence): the log parser that timed the workflow, and one ann…
tim2000s Aug 12, 2026
976e5e1
docs(extractor): generate the database schema from the database
tim2000s Aug 12, 2026
305b412
backtest(confirm): decaying acceleration does not predict the post-co…
tim2000s Aug 12, 2026
6d7a840
protocol(confirm-dose): pre-register the within-participant trial, on…
tim2000s Aug 12, 2026
fdcf744
protocol(cadence): registration fixed at 2026-08-13, against the buil…
tim2000s Aug 12, 2026
fbf7929
tooling(db): build the compressed hypertable copy, leaving the origin…
tim2000s Aug 13, 2026
f24692a
merge: supersede the grid-anchor fix, which was deployed and withdrawn
tim2000s Aug 13, 2026
9f7eb3b
research: begin the record of what was investigated and what it showed
tim2000s Aug 13, 2026
3ae5e36
research: the remaining nine papers and the index
tim2000s Aug 13, 2026
ba1aa4f
research: record that citations point to the private analysis repository
tim2000s Aug 13, 2026
883d8fd
research: three ML papers + a field audit of the two shipped models
tim2000s Aug 13, 2026
1693787
chore(assets): anonymise participant keys in hypo_risk_meta.json
tim2000s Aug 13, 2026
06e8679
chore(assets): anonymise participant keys in hypo_risk_meta.json
tim2000s Aug 13, 2026
373d7af
chore(assets): anonymise participant keys in hypo_risk_meta.json
tim2000s Aug 13, 2026
0cb4ebc
research: rewrite the Boost series for publication; correct the ML fi…
tim2000s Aug 13, 2026
690ee3b
backtest(ml-audit): locate the top-decile miscalibration in the ring-…
tim2000s Aug 13, 2026
d75ad92
backtest(postmeal-exercise): the inverted IOB contrast is a pooling a…
tim2000s Aug 13, 2026
22801dc
backtest(ml-audit): feature replay identifies stale ring-buffer history
tim2000s Aug 13, 2026
6a89c79
backtest(commit-timing): commit-to-peak interval predicts the low; de…
tim2000s Aug 13, 2026
54a1582
backtest(commit-timing): peak timing is anticipable, but the predicta…
tim2000s Aug 13, 2026
a81f122
backtest(commit-timing): the estimator cannot see it either, for a st…
tim2000s Aug 13, 2026
969e4f1
backtest(carb-signature): meals are detectable early, their size is n…
tim2000s Aug 13, 2026
16fc5c3
backtest(commit-dose): bound the registered reduction on the insulin …
tim2000s Aug 13, 2026
a70d3d9
backtest(commit-dose): price cost in glucose exposure, not insulin; t…
tim2000s Aug 13, 2026
516afb8
backtest(confirm-insilico): randomised in-silico confirm trial, self,…
tim2000s Aug 13, 2026
6fca82a
backtest(confirm-insilico): rebuild per event; withdraw the saturatio…
tim2000s Aug 13, 2026
a4410ed
backtest(confirm-insilico): randomised per-confirm trial, 3000 reps, …
tim2000s Aug 13, 2026
8f2cf5b
backtest(confirm-insilico): cohort run with the attribution control
tim2000s Aug 13, 2026
0ba3b87
backtest(confirm-insilico): re-run against the TING floor; the contro…
tim2000s Aug 13, 2026
75372be
register: record the confirm, carb-signature and counterfactual-metho…
tim2000s Aug 13, 2026
750be75
fix(boost-ml): expire the ML ring buffer by age, not only by length
tim2000s Aug 14, 2026
4c54935
Merge tag '3.4.2.6' into dev
tim2000s Aug 14, 2026
ea4440b
Merge tag '3.4.2.6' into Boost-V7-shadow
tim2000s Aug 14, 2026
9115251
fix(boost-ml): expire the ML ring buffer by age, not only by length
tim2000s Aug 14, 2026
0e627fe
Merge tag '3.4.2.6' into cadence-trial
tim2000s Aug 14, 2026
e18d412
fix(boost-ml): expire the ML ring buffer by age, not only by length
tim2000s Aug 14, 2026
7b45987
shadow(vwa-tdd): a volume-weighted dose blend, computed and logged, d…
tim2000s Aug 19, 2026
91ed3e7
fix(vwa-shadow): the shadow property belongs in the class body, not t…
tim2000s Aug 19, 2026
888d98f
shadow(vwa-tdd): five-minute buckets, the measured population curve, …
tim2000s Aug 19, 2026
4ca33cb
shadow(vwa-tdd): seed from the wider record, not this fork's cohort
tim2000s Aug 19, 2026
dc9a7ad
shadow(vwa-tdd): telemetry fields, and warm the curve from history th…
tim2000s Aug 19, 2026
b1517b1
test(vwa-shadow): the history warm-up folds, stops and produces a pla…
tim2000s Aug 19, 2026
269813c
extract(vwa): the shadow's telemetry, ready before the first cycle pr…
tim2000s Aug 19, 2026
52b9c17
smoothing(ukf): per-sample filter state is debug, not a warning
Aug 22, 2026
5475083
smoothing(ukf): per-sample filter state is debug, not a warning
Aug 22, 2026
e027be2
prereg(meal-size): re-open size readability on the 1.6M-meal studies …
tim2000s Aug 25, 2026
7ef5b7a
feat(meal-size): extraction, arms and heterogeneity scripts for the s…
tim2000s Aug 25, 2026
badccfa
backtest(meal-size): the trace adds +0.007 AUC over knowing the perso…
tim2000s Aug 25, 2026
af87259
backtest(meal-detection): 0.843 at ten minutes, and 0.873 not 0.975 a…
tim2000s Aug 25, 2026
89b013d
backtest(meal-detection): the ceiling, the feature set, and the opera…
tim2000s Aug 25, 2026
93e4822
backtest(meal-detection): the shadow is already near its ceiling; the…
tim2000s Aug 25, 2026
cc0453f
backtest(meal-detection): 0.843 on a curated set is 11% precision run…
tim2000s Aug 25, 2026
cf8ead8
docs(meal-detection): fix a malformed row and take the right branch o…
tim2000s Aug 25, 2026
a8b45fb
backtest(rise-consequence): the trace adds +0.014 at ten minutes over…
tim2000s Aug 25, 2026
3cfbf08
backtest(anticipation): the shadow is a more complicated way of telli…
tim2000s Aug 25, 2026
19064fc
backtest(consequence-prior): the loop does not already encode it, and…
tim2000s Aug 25, 2026
da61c57
backtest(lows): neither mechanism separates alone; only the two toget…
tim2000s Aug 25, 2026
d1e0838
merge: bring the one-minute cadence work into the V7 shadow line
tim2000s Aug 25, 2026
16e1759
shadow(consequence-prior): log whether this rise is going somewhere t…
tim2000s Aug 25, 2026
cf6cda5
tooling(autoconfig): take guard_window.py from the remote shadow line
tim2000s Aug 26, 2026
6e6824a
backtest(anticipation): the exercise arm is beaten more clearly than …
tim2000s Aug 26, 2026
11158f1
backtest(pre-meal window): a real edge, and wrong more than half the …
tim2000s Aug 26, 2026
9557fb3
results(meal-size): the JSON outputs behind yesterday and today
tim2000s Aug 26, 2026
bf07336
backtest(confirm): the trigger is not the problem, the dose behind it is
tim2000s Aug 27, 2026
1a7b1f0
backtest(confirm split): the confirm shot is fixed, the committed hol…
tim2000s Aug 27, 2026
5ab788e
backtest(confirm tranche): one cycle of waiting is worth more than th…
tim2000s Aug 27, 2026
20afcad
backtest(tranche rule): the release rule transfers between people; on…
tim2000s Aug 27, 2026
1162549
wip(tranche): controller and tests
tim2000s Aug 27, 2026
e8d5503
backtest(tranche): the releases that cannot land are the ones that sh…
tim2000s Aug 27, 2026
dec1256
wip(tranche): keys and wiring
tim2000s Aug 27, 2026
dad3f3a
feat(tranche): split the confirm commitment, live behind a toggle
tim2000s Aug 27, 2026
ac2aa3d
backtest(tranche fraction): the ratio cannot choose it, the absolute …
tim2000s Aug 27, 2026
73c5feb
fix(tranche): the hold boundary missed by half a second and deferred …
tim2000s Aug 27, 2026
6c761d3
wip(garmin): step clamp
tim2000s Aug 27, 2026
fe1f806
fix(garmin): bound the step windows a watch reports before they reach…
tim2000s Aug 27, 2026
c4fc055
fix(garmin): bound the step windows a watch reports before they reach…
tim2000s Aug 27, 2026
fcc4d37
report(meal signal): what is in the trace, and when it gets there
Aug 31, 2026
56b8ae7
tooling(reports): give the markdown to PDF converter a home in the re…
Aug 31, 2026
abd2e02
fix(boost/v6): primer trigger + sizing rework — absolute delta floor,…
tim2000s Jul 30, 2026
dd5e121
feat(boost/v6): raise the primer ceiling range + self-scaling auto-co…
tim2000s Jul 30, 2026
ac018ec
fix(boost/v6): hypo-prone users get a provisioned primer, LOCKED to r…
tim2000s Jul 30, 2026
ab0a105
fix(boost/v6): revert the primer TBR lock — a user override must alwa…
tim2000s Jul 30, 2026
8fb53f8
Merge the acceleration primer correction into dev
tim2000s Sep 1, 2026
96fd70a
docs(readme): restore the two dose caps to the settings section
tim2000s Sep 1, 2026
f5944f7
Merge the shadow line into dev
tim2000s Sep 1, 2026
06febe2
fix(keys): drop the ApsBoostAnticipHistory declaration the merge dupl…
tim2000s Sep 1, 2026
d0feb6b
report(meal signal): rewrite around what a reader needs to decide
tim2000s Sep 1, 2026
7582a39
report(meal signal): plainer register, shorter sentences
tim2000s Sep 1, 2026
b613001
report(meal signal): recast for a clinical and independent technical …
tim2000s Sep 1, 2026
f8d4d86
report(meal signal): state what an announced meal actually is
tim2000s Sep 1, 2026
af51c92
backtest(meal clock): when carbohydrate is announced, and how much
tim2000s Sep 1, 2026
f81166f
backtest(meal clock): the size distribution in every hour, not only i…
tim2000s Sep 1, 2026
831a15c
backtest(meal clock): the distribution of every reported carbohydrate…
tim2000s Sep 2, 2026
b6199a2
backtest(meal clock): size distributions in the three meal windows
tim2000s Sep 2, 2026
cf0a1f5
backtest(meal clock): split the window curves by study, and label the…
tim2000s Sep 2, 2026
746a2a4
backtest(meal clock): the same window analysis on the OpenAPS Data Co…
tim2000s Sep 2, 2026
909aba0
backtest(meal clock): repeated identical entries inside an hour, per …
tim2000s Sep 2, 2026
980b44f
backtest(meal clock): entries in proximity whatever their size, and w…
tim2000s Sep 2, 2026
1f5c4eb
backtest(meal size): re-run readability against a correctly counted meal
tim2000s Sep 2, 2026
74aa518
report(meal signal): correct what the extraction does to split entries
tim2000s Sep 2, 2026
d454b32
backtest(meal clock): synthesis of what the local scripts found
tim2000s Sep 2, 2026
6be41cb
Four investigations: timing, exercise protocols, the LGBM methods, an…
tim2000s Sep 2, 2026
99586d8
Correct what the documentation says about the ML models and the exerc…
tim2000s Sep 2, 2026
3da47dd
chore(deps): bump androidx.appcompat:appcompat from 1.7.1 to 1.8.0
dependabot[bot] Sep 3, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
2 changes: 1 addition & 1 deletion .github/workflows/cherry-pick-ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -374,4 +374,4 @@ jobs:
upload_to_gdrive "aaps-${VERSION}${VERSION_SUFFIX}.apk" "aaps-${VERSION}${VERSION_SUFFIX}_CP-${CHERRY_PICK_SAFE}.apk"
upload_to_gdrive "aaps-wear-${VERSION}${VERSION_SUFFIX}.apk" "aaps-wear-${VERSION}${VERSION_SUFFIX}_CP-${CHERRY_PICK_SAFE}.apk"

echo "🎉 APKs successfully uploaded to Google Drive!"
echo "🎉 APKs successfully uploaded to Google Drive!"
2 changes: 1 addition & 1 deletion .github/workflows/keystore-export.yml
Original file line number Diff line number Diff line change
Expand Up @@ -264,4 +264,4 @@ jobs:
# Upload the encrypted keystore zip file
upload_to_gdrive "$RUNNER_TEMP/keystore/keystore.zip" "keystore-$(date +%Y%m%d-%H%M%S).zip"

echo "🎉 Encrypted keystore successfully uploaded to Google Drive!"
echo "🎉 Encrypted keystore successfully uploaded to Google Drive!"
2 changes: 1 addition & 1 deletion .github/workflows/pr-ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -329,4 +329,4 @@ jobs:
upload_to_gdrive "aaps-${VERSION}${VERSION_SUFFIX}.apk" "aaps-${VERSION}${VERSION_SUFFIX}_pull-${PR_NUMBER}-${PR_REF_TYPE}.apk"
upload_to_gdrive "aaps-wear-${VERSION}${VERSION_SUFFIX}.apk" "aaps-wear-${VERSION}${VERSION_SUFFIX}_pull-${PR_NUMBER}-${PR_REF_TYPE}.apk"

echo "🎉 APKs successfully uploaded to Google Drive!"
echo "🎉 APKs successfully uploaded to Google Drive!"
10 changes: 10 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -33,3 +33,13 @@ wear/pumpcontrol/*
/buildSrc/.kotlin
.claude/settings.local.json
.claude/CLAUDE_COMMANDS.md
keystore.properties
backtesting/__pycache__/

# Local-only Claude operational notes (personal specifics — never commit)
CLAUDE.local.md

# Python bytecode from backtesting scripts
__pycache__/
*.pyc
backtesting/scripts/2026-09-meal-clock/out_merged/
9 changes: 9 additions & 0 deletions BOOST.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# Boost V6

The Boost V6 documentation — what's different, how it works, the settings, auto-configuration,
heart-rate / sleep night mode, and the backtesting / robustness method — now lives in the main
**[README](README.md)** so there is a single source of truth.

- **Boost V6 overview, how it works & settings** → [README.md](README.md)
- **Legacy V1 / V2 / v4.2 settings reference** → [docs/boost-v1-settings.md](docs/boost-v1-settings.md)
- **Backtesting & safe-update method** → [backtesting/README.md](backtesting/README.md)
Binary file added Boost-V6-WEAR-2026-06-25-Testing.apk.idsig
Binary file not shown.
176 changes: 176 additions & 0 deletions CLAUDE.md

Large diffs are not rendered by default.

234 changes: 234 additions & 0 deletions README-old2.md

Large diffs are not rendered by default.

161 changes: 148 additions & 13 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,18 +1,153 @@
# AAPS
* Check the wiki: https://wiki.aaps.app
* Everyone who’s been looping with AAPS needs to fill out the form after 3 days of looping https://docs.google.com/forms/d/14KcMjlINPMJHVt28MDRupa4sz4DDIooI4SrW0P3HSN8/viewform?c=0&w=1
# Boost V6 — experimental AndroidAPS fork

[![Support Server](https://img.shields.io/discord/629952586895851530.svg?label=Discord&logo=Discord&colorB=7289da&style=for-the-badge)](https://discord.gg/4fQUWHZ4Mw)
[![Support Server](https://img.shields.io/discord/629952586895851530.svg?label=Discord&logo=Discord&colorB=7289da&style=for-the-badge)](https://discord.gg/aUzQ8q5zQd)

[![CircleCI](https://circleci.com/gh/nightscout/AndroidAPS/tree/master.svg?style=svg)](https://circleci.com/gh/nightscout/AndroidAPS/tree/master)
[![Crowdin](https://d322cqt584bo4o.cloudfront.net/androidaps/localized.svg)](https://translations.aaps.app/project/androidaps)
[![Documentation Status](https://readthedocs.org/projects/androidaps/badge/?version=latest)](https://wiki.aaps.app/en/latest/?badge=latest)
[![codecov](https://codecov.io/gh/nightscout/AndroidAPS/branch/master/graph/badge.svg?token=EmklfIV6bH)](https://codecov.io/gh/nightscout/AndroidAPS)
> ⚠️ Experimental. Not medical advice. Not a released or approved product.
> This is a developer's research fork of AndroidAPS that changes the automated insulin-dosing
> decision. Do not run it on a pump unless you fully understand the code, accept the risk, and can
> self-manage the consequences. You are the safety system.

DEV:
[![CircleCI](https://circleci.com/gh/nightscout/AndroidAPS/tree/dev.svg?style=svg)](https://circleci.com/gh/nightscout/AndroidAPS/tree/dev)
[![codecov](https://codecov.io/gh/nightscout/AndroidAPS/branch/dev/graph/badge.svg?token=EmklfIV6bH)](https://codecov.io/gh/nightscout/AndroidAPS/tree/dev)
## What Boost V6 is

<img src="https://cdn.iconscout.com/icon/free/png-256/bitcoin-384-920569.png" srcset="https://cdn.iconscout.com/icon/free/png-512/bitcoin-384-920569.png 2x" alt="Bitcoin Icon" width="100">
Boost keeps the entire AndroidAPS engine — basal, dynamic ISF, glucose predictions and every
safety gate — and changes only one thing: the super-micro-bolus (SMB) decision. Stock
AndroidAPS sizes one isolated micro-bolus each cycle, from scratch. Boost V6 instead carries a
*meal hypothesis* across cycles and scales its dosing to how confident it is that a meal is under
way. Nothing else about how AndroidAPS runs your pump is touched.

3KawK8aQe48478s6fxJ8Ms6VTWkwjgr9f2
The result is a system that holds back before a meal is proven, then catches up firmly once it is —
and that you tune with just three dials (far fewer than before), most of which you never touch,
because Boost sets them from your own history on day one.

> *Naming:* the plugin is labelled "Boost V6", but its code and its settings keys still carry the
> earlier "V5" name (`ApsBoostV5…`) from its lineage — V1 → V2 → V3 → v4.4 → v4.4.2 → V6. If you
> read the source, "V5" and "V6" refer to the same current engine.

## How it works — in one glance

A meal-hypothesis state machine drives the SMB:

```
IDLE → OBSERVING → CONFIRMED → COMMITTED → RECOVERING → IDLE
```

It observes lightly while a rise builds, commits a firm catch-up shot once a meal is confirmed,
holds through the meal, then deliberately winds down as insulin takes hold. A layer of safety guards
and personal context (heart rate, sleep, activity) sits around it, and every stock AndroidAPS gate
still runs underneath.

→ Full detail: [How Boost V6 works](docs/v6-how-it-works.md) (the dosing core, the state machine,
the July-2026 safety guards, and the learners).

## Getting started

Boost V6 is the default APS engine in this fork, and you go straight to it — there is no need to
run an older engine first. On its first active cycle it seeds its three dials and its dose caps from
your own recent dosing history (the last 14 days), so it starts where your prior control left off
rather than on a stranger's numbers. That history is read from the AndroidAPS database, and it is
already there if you upgraded in place, restored your AndroidAPS database, or have
Nightscout sync (NSClient) enabled — which backfills up to ~100 days of your treatments and CGM
into the database on first load. It draws from whatever you were running before — standard
AndroidAPS/oref or an earlier Boost — because it only reads dosing history and glucose, not the
engine that produced them.

1. **Install the build.** On a fresh setup Boost V6 is already selected as the APS engine; on an
in-place upgrade your existing selection is kept, so switch the APS plugin to "Boost V6" if you
want it.
2. **Make sure your history is present** before you rely on the auto-tuning — enable Nightscout sync,
or restore your AndroidAPS database, so the last two weeks of dosing are in the app. With no
history at all, Boost waits and runs on conservative factory defaults until enough data
accumulates, tuning itself once it has.
3. **It tunes itself and tells you what it set.** You should rarely need to change anything; the three
dials below are the only ones you would normally touch.

Prefer to watch before you switch? You still can. Selecting the "Boost" plugin (instead of
"Boost V6") runs the same engine with the V6 layer in shadow — it logs what it *would* dose to
Nightscout without driving your pump — and the
[Analyser](https://tim2000s.github.io/Boost-in-AAPS_3.4/boost_analyser.html) compares V1 vs V6 on
your own data. That is optional now, not a required warm-up.

| APS plugin you select | What drives your pump |
|---|---|
| **"Boost V6"** *(default)* | active — the state machine drives the SMB |
| **"Boost"** | the same engine with the V6 override in shadow — logs what it *would* do, does not dose |
| (any other engine) | unchanged — Boost not involved |

> ⚠️ Going active means an experimental algorithm is dosing your pump. You are the safety system —
> watch it, understand it, and keep your own limits (max-IOB, max-bolus) sensible.

## The three levers

These are the only dials you would normally touch — and auto-config already sets each one from your
own dosing history, so most people leave them alone. Each scales *aggressiveness*; none can bypass
a safety limit.

| Setting (as named in the app) | Where | Range (default) | What it is | Turn it up → | Turn it down → |
|---|---|---|---|---|---|
| **Aggression** | Boost V6 | 0.7–1.6 (1.0) | How firm the one meal catch-up shot is (it scales the CONFIRMED commit only — routine holds are bounded by the caps, not this). | a bigger catch-up shot on confirmed meals — for people who peak high | a gentler meal response |
| **Hypo Caution** | Boost V6 | 1.0–2.0 (1.0) | How hard Boost backs off when its hypo-risk model is worried (it does nothing while risk is low). | more insulin trimmed on elevated risk = more hypo-defensive | 1.0 is the floor = least caution |
| **Meal-detection Sensitivity** | Boost V6 → Advanced Settings | 0.8–1.2 (1.0) | A single overall-strength dial for the whole engine — one number that scales *all* of Boost's dosing up or down. **The name is misleading in two ways:** it is not your insulin sensitivity / ISF (that lives in your profile), and despite "meal-detection" it does not change how meals are detected — it scales the per-cycle insulin (aggression) budget. Reach for it when Boost feels uniformly too strong or too weak for you. | firmer everywhere — if Boost runs too weak for you | gentler everywhere — if Boost runs too strong for you |

The **Where** column gives the exact path in the app, and the names above are the exact labels you
will see on those screens — so you can match documentation to settings without guessing.

**How to use them:** start from the auto-config values, change one at a time, and check the
caps and Max IOB first — if a cap or the IOB clamp is what's binding, more Aggression changes
nothing. The [Tuning Guide](https://tim2000s.github.io/Boost-in-AAPS_3.4/boost_tuning_guide.html)
shows each dial on a conservative→aggressive spectrum with worked scenarios.

### Two dose caps you will see referenced

These are not dials you tune day to day, but they are the two limits most often hit, so it helps to
know what they are when a dose looks smaller than you expected.

| Setting (as named in the app) | Where | Range (default) | What it does |
|---|---|---|---|
| **Boost Bolus Cap** | Boost V6 | 0.1–10 U (2.5) | The largest single bolus Boost will give outside the UAM basal-minutes limit below. Auto-config sets it from your own dosing history. With carbs on board Boost may exceed it, up to the greater of this cap or your carbs on board divided by your carb ratio. |
| **Max minutes of basal to limit SMB to for UAM** | Preferences → SMB settings | 15–120 min (15) | Sets the ceiling on a single microbolus as a number of minutes of your own basal: the limit is your current basal rate times these minutes, divided by 60. At a basal of 0.6 U/h, 15 minutes is a ceiling of 0.15 U. It applies when the loop is dosing on unannounced meals rather than carbs, so it is mostly an overnight limit and does not need to be large. |

The companion setting **Max Minutes of basal to limit SMB to**, on the same screen and with the same
default of 15 minutes, does the same job for microboluses given when Boost is not the active engine.

The cap is a size and not a rate: it limits any one bolus and says nothing about how often that
bolus may repeat. Raising it raises every dose the cap was holding down, so change it in small steps
and watch what follows.

Everything else — the cumulative cap, fast-carb confirm, the opt-in aggression levers, DynISF,
activity — is [advanced and set for you on install](docs/v6-advanced-settings.md). You
should rarely need to open that page except to understand a value auto-config chose.

## Interactive tools

Three self-contained HTML tools — no install, no data leaves your machine. A good order for a
newcomer is Tuning Guide → Simulator → Analyser:

- **[▶ Tuning Guide](https://tim2000s.github.io/Boost-in-AAPS_3.4/boost_tuning_guide.html)**
([source](boost_tuning_guide.html)) — *learn what each setting does.* Every knob on a
conservative→aggressive spectrum, with real-world tuning scenarios, for both V1 and V6.
- **[▶ Simulator](https://tim2000s.github.io/Boost-in-AAPS_3.4/boost_simulator.html)**
([source](boost_simulator.html)) — *play with the dosing maths.* Set BG, trend, IOB, TDD and the
settings (or pull a snapshot from Nightscout) and watch the ISF and SMB recompute, live, for both
the V1 tier ladder and the V6 state machine.
- **[▶ Analyser](https://tim2000s.github.io/Boost-in-AAPS_3.4/boost_analyser.html)**
([source](boost_analyser.html)) — *V1 vs V6 on your own data.* Enter your Nightscout URL + a
read token and it reads the shadow telemetry every Boost build logs, for a real paired comparison.
Runs entirely in your browser; the token goes only to your Nightscout.

> These tools validate decisions (what dose, which state, why) — not glucose outcomes. They model
> the algorithm, not a body.

## Learn more

- **[How Boost V6 works](docs/v6-how-it-works.md)** — the dosing core, state machine, safety guards, learners.
- **[Advanced settings](docs/v6-advanced-settings.md)** — everything auto-config sets on install, and how.
- **[Heart rate, steps & night mode](docs/v6-heart-rate-and-sleep.md)** — sleep detection and overnight dosing.
- **[Safety, "no training" & validation](docs/v6-safety-and-validation.md)** — why changing a live dosing algorithm is defensible.
- **[Backtesting method & shadow validation](backtesting/README.md)** — the data-analysis toolkit.
- **[Legacy V1 / V2 / v4.x settings](docs/boost-v1-settings.md)** — the earlier plugins' full reference.

---

*Boost is a research fork and an experimental dosing algorithm. Read the code, understand the
risk, and keep your own safety limits sensible. Shadow mode (the "Boost" plugin) is there if you want
to watch before you switch.*
65 changes: 65 additions & 0 deletions RELEASE_NOTES_3.4.2.1.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
# Release Notes — Boost 3.4.2.1

Based on upstream AndroidAPS 3.4.2.1 (Nightscout release).

## Algorithm Enhancements

### Graduated Fast-Carb Rebound Protection
Fast-carb protection is now proportional rather than binary. When a post-hypo rebound is detected, Tiers 3/5/6 scale their SMB output based on current BG instead of being fully blocked:
- BG below 120 mg/dL: 30% of tier output (strong suppression near target)
- BG 120-170 mg/dL: linear ramp from 30% to 100%
- BG above 170 mg/dL: no suppression
- **Velocity override**: delta > 15 mg/dL/5min with BG > target+20 releases protection immediately

### Spike Override Cap
When Tier 8 (regular oref1) fires during a confirmed spike (BG > 180, delta > 5, insulinReq > 3x the basal-derived cap), the SMB ceiling is raised from `maxBolus` to `boost_max`. This prevents rate-limiting during genuine spikes where the basal-derived cap is structurally too small.

### Delta Acceleration Floor
The `delta_accl` denominator is now floored at 2.0 mg/dL/5min, preventing artificial amplification when `shortAvgDelta` is near zero. Previously, BG flattening from -0.3 to 0.0 could produce delta_accl of 100%, triggering aggressive Tier 4 on flat BG.

### Auto-Cancel Recovery TempTarget on Hypo Rebound
When a hypo is detected (recentLowBG < 100) and BG is rising, any active ACTIVITY-reason TempTarget is automatically cancelled. This prevents the post-exercise recovery target from blocking Boost during a genuine hypo rebound.

### ISF Correction for Profile Switch
ISF now correctly scales inversely with profile switch percentage: 80% profile produces 125% ISF (less aggressive). Previously the scaling was in the wrong direction.

## Exercise Management

### 15-Minute Step Detection
A dedicated 15-minute step threshold (`ApsBoostActivitySteps15`, default 800) enables exercise detection within 15 minutes instead of waiting for the 30-minute window.

### 15-Minute Loop Suspension
A 15-minute option is now available in the loop suspension dialog alongside 1h/2h/3h/10h.

### Dedicated HR/Steps Graph
Heart rate and step count data are displayed on a separate third graph in the Boost Overview, independent of the IOB graph.

## User Interface

### Restructured Settings
The Boost and Boost V2 settings screens are reorganised into expandable sections:
- Default AAPS Settings
- Boost Controls
- Dynamic ISF Controls
- Exercise Settings (Step Count / Heart Rate / Post-Exercise Recovery)
- Night Mode
- Safety Settings
- Advanced Settings

### Reservoir Colour
The pump reservoir level in the Boost Overview now changes colour at warning/critical thresholds, matching the standard AAPS behaviour.

## Documentation

### Simulator & Tuning Guide Links
Links to the [Boost Tuning Guide](https://tim2000s.github.io/Boost-in-AAPS_3.4/boost_tuning_guide.html) and [Boost Simulator](https://tim2000s.github.io/Boost-in-AAPS_3.4/boost_simulator.html) are added to the README header and Settings section.

### Simulator Updates
The simulator now models graduated fast-carb protection (BG-proportional scaling) and the spike override cap.

## Upstream (AndroidAPS 3.4.2.1)
- Equil pump: fix activation wizard and progress dialog
- Medtrum: prevent re-use of wrong patch during activation
- Tidepool: fix session handling
- Omnipod Dash: BLE driver interface refactoring
- Romanian translations
Loading
Loading