Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
209 commits
Select commit Hold shift + click to select a range
a6fc0f0
docs: design spec for Oura live API import (one-time backfill lane)
vishk23 Jun 28, 2026
9ea5a7d
docs: implementation plan 1/3 — Oura import foundation (parsers + raw…
vishk23 Jun 28, 2026
0efa46a
docs: reconcile Oura spec + plan-1 to v8.5.2
vishk23 Jul 9, 2026
f06688a
feat(store): ouraRaw lossless payload archive (migration v24) + OuraR…
vishk23 Jul 9, 2026
79eee33
feat(import): OuraHypnogram decoder (sleep_phase + movement, distinct…
vishk23 Jul 9, 2026
a9bc159
feat(import): OuraApiParser.parseSleep — sessions with hypnogram, mov…
vishk23 Jul 9, 2026
623d642
fix(import): range-guard OuraApiParser.sampleSeries + fold respRateBp…
vishk23 Jul 9, 2026
4d8ba29
feat(import): OuraApiParser.parseDaily — summary endpoints, scores ke…
vishk23 Jul 9, 2026
05bd69e
feat(import): OuraApiParser workouts + heartrate time-series parsing
vishk23 Jul 9, 2026
d6814ba
chore(store): correct OuraRawStore MARK comment v19->v24 (final-revie…
vishk23 Jul 9, 2026
eff93c4
docs: implementation plan 2/3 — Oura network + auth (app target)
vishk23 Jul 10, 2026
78e3250
feat(oura): OuraError + OuraTokenStore (Keychain token storage)
vishk23 Jul 10, 2026
2320ad1
fix(build): StrandTests TEST_HOST -> 'NOOP Staging' (macOS xcodebuild…
vishk23 Jul 10, 2026
ff7013d
feat(oura): OuraCredentials (Info.plist) + AuthProvider seam
vishk23 Jul 10, 2026
f9d55db
feat(oura): OAuth2 authorization-code flow (pure builders + OuraOAuth…
vishk23 Jul 10, 2026
257060f
fix(oura): guard token save on refresh + cover expires_in default (Ta…
vishk23 Jul 10, 2026
135ff8b
feat(oura): OuraAPIClient — next_token paging, 429 backoff, 401 refre…
vishk23 Jul 10, 2026
dc44bfd
fix(oura): real force-refresh on 401 + 401/429 tests (Task 4 review)
vishk23 Jul 10, 2026
8cc4c16
chore(oura): wire OAuth redirect scheme + BYO-app credentials xcconfig
vishk23 Jul 10, 2026
536a6d1
fix(oura): form-encode token-request body (escape + / = ; was corrupt…
vishk23 Jul 10, 2026
066fbb2
docs: implementation plan 3/3 — Oura orchestration + writer + Connect UI
vishk23 Jul 10, 2026
a5a8e77
feat(oura): OuraSyncWriter — persist backfill to WhoopStore as .cloud…
vishk23 Jul 10, 2026
d4bce9f
fix(oura): register cloud source .paired not .active (single-active i…
vishk23 Jul 10, 2026
272303a
feat(oura): OuraSyncCoordinator — one-time backfill across all endpoi…
vishk23 Jul 10, 2026
b10ba89
fix(oura): assert endpoint date-param wiring + drop tautological clau…
vishk23 Jul 10, 2026
1f13ec5
feat(store): deleteOuraRaw(deviceId:) for full Oura cloud-source disc…
vishk23 Jul 10, 2026
5bb7bbd
feat(oura): Connect Oura & Import Everything card + presentation-anch…
vishk23 Jul 10, 2026
cbc009b
fix(oura): NoopButtonStyle + localized strings on Oura card; honest d…
vishk23 Jul 10, 2026
8ae3e2e
chore(oura): score cloud-import days + document the second opt-in net…
vishk23 Jul 10, 2026
4670864
fix(oura): guard make-active for import sources; archive registry row…
vishk23 Jul 10, 2026
b467305
Merge upstream v8.6.1 (ryanbr/noop): renumber Oura raw-archive migrat…
vishk23 Jul 10, 2026
c47ea6b
docs: design spec for noop-cloud — personal biometrics MCP server on …
vishk23 Jul 10, 2026
e950122
iOS: write sleep stages, 1-min heart rate, and workouts back to Apple…
vishk23 Jul 11, 2026
1f58099
fix(oura): request both spo2 scope spellings + skip failing endpoints…
vishk23 Jul 11, 2026
2b20af9
fix(oura): omit the OAuth scope param — Oura grants all app-configure…
vishk23 Jul 11, 2026
c020fea
Predictive low-battery alert: warn at ~24h of estimated runtime left
vishk23 Jul 11, 2026
5ea9066
fix(oura): window heartrate backfill into 30-day ISO-Z chunks (endpoi…
vishk23 Jul 11, 2026
7850db1
feat(oura): import resilience — keep screen awake, windowed HR progre…
vishk23 Jul 11, 2026
c3c9286
fix(oura): persist heart-rate per window — interrupted imports keep c…
vishk23 Jul 11, 2026
34f7c70
Merge remote-tracking branch 'upstream/main'
vishk23 Jul 11, 2026
85993fe
docs: noop-cloud Phase-1 MVP implementation plan (12 tasks, TDD)
vishk23 Jul 11, 2026
72f73df
docs(noop-cloud plan): pin better-sqlite3 12.11.1 (Node 26 ABI verified)
vishk23 Jul 11, 2026
467bbcd
Merge remote-tracking branch 'upstream/main'
vishk23 Jul 11, 2026
1d9e181
Fix CI: tracked OuraConfig.xcconfig wrapper for the optional Oura sec…
vishk23 Jul 11, 2026
4b8c892
Merge remote-tracking branch 'upstream/main'
vishk23 Jul 11, 2026
61dd7b5
Merge remote-tracking branch 'upstream/main'
vishk23 Jul 12, 2026
b340fba
docs(noop-cloud plan): service-level health check (review finding)
vishk23 Jul 12, 2026
0b18815
fix(android/i18n): German strings for the compact widget
vishk23 Jul 12, 2026
c244b55
docs(noop-cloud plan): report script max_tokens + stop_reason guard (…
vishk23 Jul 12, 2026
8eba15e
Merge remote-tracking branch 'upstream/main'
vishk23 Jul 12, 2026
091ebc5
docs: noop-cloud Phase-2 plan — gated writes + append-only edit journ…
vishk23 Jul 12, 2026
de8e337
docs: noop-cloud Phase-2b plan — granular reads (hr_series, sleep_det…
vishk23 Jul 12, 2026
59e873a
docs(plan): durationS override after spread (final-review finding bac…
vishk23 Jul 12, 2026
f4bdc31
docs: noop-cloud Phase-3 plan — phone sync-back + Apple Health re-exp…
vishk23 Jul 12, 2026
1d47014
feat(store): cloudTombstone (v26) + resurrection guards + cloud delet…
vishk23 Jul 12, 2026
99afb13
fix(store): tombstones survive device-data wipes + guard LabMarker re…
vishk23 Jul 12, 2026
dc08f77
feat(cloudsync): gated client + keychain settings (fork lane)
vishk23 Jul 12, 2026
0629a5f
feat(cloudsync): CloudEditApplier — recompute-safe journal application
vishk23 Jul 12, 2026
9a20e78
fix(cloudsync): SleepEditGuard on cloud bounds + destructive-last ord…
vishk23 Jul 13, 2026
47a00ee
feat(cloudsync): coordinator + Data Sources card + Apple Health re-ex…
vishk23 Jul 13, 2026
03afea8
docs(cloudsync): document the optional CLOUD_SYNC compilation flag in…
vishk23 Jul 13, 2026
f5d3a39
feat(cloudsync): zero-touch — bundle credentials, in-app upload, on-l…
vishk23 Jul 13, 2026
8dc6aaf
fix(cloudsync): cross-instance sync gate, persisted auto-sync status,…
vishk23 Jul 13, 2026
b9f531a
fix(cloudsync): refuse empty-store uploads, no auto-sync under XCTest…
vishk23 Jul 13, 2026
1637b52
fix(oura): stop storing the readiness resting_heart_rate SCORE as bpm…
vishk23 Jul 13, 2026
3383dda
fix(oura): export importer — stop storing the readiness resting_heart…
vishk23 Jul 13, 2026
bd94abd
Merge remote-tracking branch 'upstream/main'
vishk23 Jul 13, 2026
d47525e
feat(apple): hourly step import (v27) — per-hour iPhone steps with 90…
vishk23 Jul 13, 2026
a7c47ac
fix(oura): android export importer — stop storing the readiness resti…
vishk23 Jul 13, 2026
b07e4e5
fix(apple): hourly backfill flag only after a successful collection —…
vishk23 Jul 13, 2026
e3f6246
Merge remote-tracking branch 'upstream/main'
vishk23 Jul 13, 2026
0944560
Merge remote-tracking branch 'upstream/main'
vishk23 Jul 13, 2026
492adac
docs(sleep): design spec for #364 night-stitch (present a wake-split …
vishk23 Jul 13, 2026
d991861
docs(sleep): implementation plan for #364 night-stitch
vishk23 Jul 13, 2026
7a7e813
feat(sleep): bridgedNightGroups — the #561 bridge over EVERY night, w…
vishk23 Jul 13, 2026
5eabf28
feat(sleep): kotlin bridgedNightGroups twin (#364)
vishk23 Jul 13, 2026
bdd2c86
feat(sleep): mergedSleepPlan — one write-back entry per bridged night…
vishk23 Jul 13, 2026
bf1a141
fix(health): export a wake-split night as ONE Apple Health entry with…
vishk23 Jul 13, 2026
2c9e10c
feat(sleep): night-relative fragment rebase + wake seams in the hero …
vishk23 Jul 13, 2026
d86cf28
fix(health): android — one Health Connect session per bridged night, …
vishk23 Jul 13, 2026
e0e3fa2
feat(sleep): android — wake seams in the full-night hypnogram timelin…
vishk23 Jul 13, 2026
16390dc
Merge branch 'feat/sleep-night-stitch-364'
vishk23 Jul 13, 2026
0d240ad
Merge remote-tracking branch 'upstream/main'
vishk23 Jul 13, 2026
d1435f6
fix(import): select Oura's main sleep session for the daily rollup
vishk23 Jul 13, 2026
9d867e4
fix(import): store Oura efficiency as a 0-1 fraction, matching the na…
vishk23 Jul 13, 2026
f1b0623
fix(import): normalize WHOOP CSV efficiency to the native fraction too
vishk23 Jul 13, 2026
03f2e46
fix(import): skip Oura 'deleted' sleep periods in the API parser
vishk23 Jul 13, 2026
400af05
Merge remote-tracking branch 'upstream/main'
vishk23 Jul 13, 2026
44c53ba
Merge branch 'oura-daily-main-session'
vishk23 Jul 13, 2026
bf2e90d
Merge oura-efficiency-fraction: efficiency unit normalization + v26-e…
vishk23 Jul 13, 2026
445ad7c
Merge remote-tracking branch 'upstream/main'
vishk23 Jul 13, 2026
d85c386
fix(cloudsync): recompute daily rollups after cloud edits apply
vishk23 Jul 13, 2026
1cdaf6a
chore: remove personal signing remap accidentally committed in bf2e90d4
vishk23 Jul 13, 2026
1ee1892
fix(cloudsync): stage-lock cloud stage edits against selfHealEditedSt…
vishk23 Jul 13, 2026
05e2b9e
fix(cloudsync): pull-first upload-last ordering + skip unchanged uploads
vishk23 Jul 13, 2026
785021e
feat(cloudsync): background refresh via BGAppRefreshTask (iOS)
vishk23 Jul 13, 2026
6a4abe0
feat(cloudsync): APNs silent-push client (code-complete, no credentia…
vishk23 Jul 13, 2026
e1c59d2
fix(cloudsync): gate APNs registration on effective credentials, not …
vishk23 Jul 13, 2026
3e24164
fix(cloudsync): push registration at didFinishLaunching; ungated push…
vishk23 Jul 13, 2026
0279c48
feat(scoring): wire real sleep regularity + population-anchored need …
vishk23 Jul 14, 2026
cc9d01e
fix(scoring): z-score readiness HRV in the log domain (Wave 0 · RD1, …
vishk23 Jul 14, 2026
9212609
feat(scoring): readiness read carries a baseline-density confidence (…
vishk23 Jul 14, 2026
daf8268
feat(tz): record phone timezone per local day + ship it on every upload
vishk23 Jul 14, 2026
e8b4b7f
fix(sleep): headline "Asleep" reflects the whole bridged night, not j…
vishk23 Jul 14, 2026
2466aa3
fix(sleep): motion-corroborated wake — stop calling WAKE on elevated-…
vishk23 Jul 14, 2026
491fd62
Merge remote-tracking branch 'upstream/main'
vishk23 Jul 14, 2026
f9e7387
Merge branch 'tz-upload'
vishk23 Jul 14, 2026
5ec0aca
Merge branch 'fix/night-headline'
vishk23 Jul 14, 2026
b1f651e
Merge branch 'fix/motion-corroborated-wake'
vishk23 Jul 14, 2026
7e7145a
Merge remote-tracking branch 'origin/main'
vishk23 Jul 14, 2026
85e1c63
fix(scoring): parasympathetic-saturation guard eases the Charge low-H…
vishk23 Jul 14, 2026
3ba14af
docs: sleep-staging motion corroboration, headline onset floor, phone…
vishk23 Jul 14, 2026
fe3fb93
feat(stress): add baseline-relative daytime-stress mode + high-stress…
vishk23 Jul 14, 2026
f85f058
fix(stress): calibrate baseline-relative HIGH threshold to validated …
vishk23 Jul 14, 2026
cab176d
feat(stress): fold personal daytime baselines + score StressView's ti…
vishk23 Jul 14, 2026
3e0280a
chore(stress): gate daytime-RMSSD out of live scoring pending validation
vishk23 Jul 14, 2026
cce804b
feat(sleep): recency-weighted, capped, asymmetric sleep-debt ledger
vishk23 Jul 14, 2026
2bbac22
Fix Sleep tab bedtime skipping a real first-sleep fragment on compute…
vishk23 Jul 14, 2026
e6ce8db
feat(stress): motion-gate the intraday timeline — mask exertion, don'…
vishk23 Jul 14, 2026
624014e
feat(readiness): fold HRV/RHR baselines through the spine in a window…
vishk23 Jul 14, 2026
793b4f5
feat(analytics): DailyStressEngine — dual-baseline, coupled, log-doma…
vishk23 Jul 15, 2026
e68527c
feat(stress): wire the daily Stress score to DailyStressEngine (visib…
vishk23 Jul 15, 2026
5c55a0a
Merge remote-tracking branch 'upstream/main' into phase-c/cross-devic…
vishk23 Jul 15, 2026
93e6abc
Persist whole-night SDNN alongside RMSSD; fix HealthKit SDNN export m…
vishk23 Jul 15, 2026
2d409cd
Add CrossDeviceHRVTrend: stitch Aura→WHOOP HRV history into one conti…
vishk23 Jul 15, 2026
cbce2e8
Add Cross-Device HRV screen: the stitched Aura→WHOOP long-term trend
vishk23 Jul 15, 2026
c405f9a
Compute the 5-min SDNN index (not whole-night SD) for avgSdnn
vishk23 Jul 15, 2026
8ba98bc
Show both HRV metrics labeled + an Apple SDNN cross-check (Latest Night)
vishk23 Jul 15, 2026
d63f8c6
Merge upstream/main (v9.0.0, 26 commits) into fork main
vishk23 Jul 15, 2026
277e9ad
Make the cross-device charts readable: smooth the trend, break at non…
vishk23 Jul 15, 2026
396413f
docs: capture the 2026-07-15 strap-death bug sweep (17 evidence-backe…
vishk23 Jul 15, 2026
7f80154
README: add fork preamble describing my upstream contributions
vishk23 Jul 15, 2026
7942f66
Offload: stop archiving v20/v21 as "undecodable" — they decode, and i…
vishk23 Jul 15, 2026
2b968d2
Backfill: stop capping a healthy recovery at 6 continues, and stop pa…
vishk23 Jul 15, 2026
2189f25
Revert force-enabled deep-buffer capture that should never have been …
vishk23 Jul 15, 2026
86d414a
Revert "Offload: stop archiving v20/v21 as undecodable" — it silently…
vishk23 Jul 15, 2026
d2ec5dc
Backfill: cut the idle watchdog 60s -> 15s; keep the auto-continue ca…
vishk23 Jul 15, 2026
33c0da6
CloudSync: ship the deep-buffer archive to object storage (fork-only)
vishk23 Jul 15, 2026
9251ae2
Liquid Today: carry Charge like Rest, honest state pill, battery-ring…
vishk23 Jul 16, 2026
dedecde
Baselines: fix the .stale/usable comment contradiction (F1) + Kotlin …
vishk23 Jul 16, 2026
a7c3a8f
Backfill: pin the multi-pass stop as catch-up, not a cap cut-off (tes…
vishk23 Jul 16, 2026
aed4782
docs(bug-sweep): 2026-07-15 — mark B3 Charge-carry FIXED
vishk23 Jul 16, 2026
910adcc
fix(sleep): Rest hero tracks the navigated night, not the latest
vishk23 Jul 16, 2026
7770324
Liquid Today: surface the "N of 4 nights" calibration count
vishk23 Jul 16, 2026
e5a0366
Merge pull request #3 from vishk23/fix/liquid-today-calibration-count
vishk23 Jul 16, 2026
44cc6d6
Update README.md
vishk23 Jul 16, 2026
b38c1d4
BLE: recover a stalled link, retry the battery read, stop the UI lyin…
vishk23 Jul 15, 2026
801d0c0
Backfill: show how far behind the strap is, and stop lying about char…
vishk23 Jul 26, 2026
09e0ac4
docs(bug-sweep): 2026-07-15 — record the BLE link-recovery port (A1/A…
vishk23 Jul 27, 2026
3c4a837
fix(i18n): localize the backfill-progress row's three strings
vishk23 Jul 27, 2026
06184fe
fix(liquid-today): carry SpO2 + skin-temp per-field like classic
vishk23 Jul 16, 2026
4f731e4
Merge pull request #4 from vishk23/ble-link-recovery-port
vishk23 Jul 27, 2026
0963206
docs(A6): the 5/MG charge bit IS wrong (confirmed) — and StrapChargeI…
vishk23 Jul 27, 2026
19a90f3
Merge pull request #6 from vishk23/docs/charge-inference-threshold
vishk23 Jul 27, 2026
f63a91c
fix(ios): derive BGTask identifiers from the bundle id so a remap can…
vishk23 Jul 27, 2026
89fc4ec
Merge upstream/main (260 commits, through #886) into fork main
vishk23 Jul 27, 2026
9e1716e
feat(store): opt-in WalCheckpointing so an external replicator can ow…
vishk23 Jul 27, 2026
b23931d
feat(store): bound WAL growth under .external with an in-write-path s…
vishk23 Jul 27, 2026
907fe05
feat(cloudsync): local per-push telemetry for the page-replication de…
vishk23 Jul 27, 2026
c4ced6f
feat(store): make external WAL checkpointing a process-wide policy, n…
vishk23 Jul 27, 2026
2e093f8
feat(cloudsync): the page-replication trial switch, and record every …
vishk23 Jul 27, 2026
94ad31f
build(liters): pin the liters git dependency and build it against sys…
vishk23 Jul 27, 2026
e8dfa65
harden(store): stop the integrity probe from being able to checkpoint…
vishk23 Jul 27, 2026
9ba50d1
Merge branch 'liters/stage1' into liters/ios-integration
vishk23 Jul 27, 2026
08533fd
Merge upstream/main (6 commits, through #899) into fork main
vishk23 Jul 27, 2026
c7f777f
test(schema): teach the shared oracle the fork's iOS-only tables and …
vishk23 Jul 27, 2026
8e40146
build(liters): link the xcframework, import the bindings, and give th…
vishk23 Jul 27, 2026
eb700b2
docs(liters): say what the pin contains, and what it does not
vishk23 Jul 27, 2026
d3cc8cb
fix(liters): close the #if the generated bindings are wrapped in
vishk23 Jul 27, 2026
0a445be
test(liters): split the round trip at the line system SQLite actually…
vishk23 Jul 27, 2026
cc9d153
fix(liters): regenerate the bindings from the corrected script
vishk23 Jul 27, 2026
2dd8489
Merge remote-tracking branch 'origin/main' into liters/e2e-push
vishk23 Jul 28, 2026
4140d73
feat(cloudsync): push pages through liters when the trial is on, /ing…
vishk23 Jul 28, 2026
d69ffbb
fix(liters): stop a failing push from being indistinguishable from on…
vishk23 Jul 28, 2026
75f4f52
Merge remote-tracking branch 'upstream/main' into land/quiet-motion
vishk23 Jul 28, 2026
5ad764c
perf(motion): make Low Power Mode mean "stop everything decorative" (…
vishk23 Jul 28, 2026
457c2e1
Merge remote-tracking branch 'origin/main' into fix/liters-ingest-tru…
vishk23 Jul 28, 2026
6aa61c6
Make the R22 deep-data unlock actually reversible (#174)
vishk23 Jul 28, 2026
bd6dc6a
fix(cloudsync): stop the /ingest fallback costing the replicator a fu…
vishk23 Jul 28, 2026
b53418f
Stop HrBroadcaster stacking a live-HR subscription on every screen visit
vishk23 Jul 28, 2026
89fa3d3
Say on the v18AuxSample migration that its unread reader is by design
vishk23 Jul 28, 2026
583bf6d
Merge remote-tracking branch 'upstream/main' into land-main
vishk23 Jul 28, 2026
19ed9fc
Merge branch 'feat/whoop5-r22-disable-sequence' into land-main
vishk23 Jul 28, 2026
9df2ebf
Merge branch 'fix/small-candidates' into land-main
vishk23 Jul 28, 2026
0503da6
Merge branch 'fix/liters-ingest-truncate': page replication ships del…
vishk23 Jul 28, 2026
f10550f
Merge remote-tracking branch 'origin/main' into land-main
vishk23 Jul 28, 2026
529261a
Measure the REM-latency guard in minutes since onset, not as a fracti…
vishk23 Jul 28, 2026
97e7bd7
SleepBench measures stage-fraction calibration and first-REM latency,…
vishk23 Jul 28, 2026
af44563
Stop SleepBench's calibration set scoring V2 against V2's own output
vishk23 Jul 29, 2026
b9802ff
Show the illness early-warning banner on the default (Liquid) Today
vishk23 Jul 29, 2026
31c6a56
fix(sleep): forbid wake -> deep/REM transitions — the one part of #34…
vishk23 Jul 30, 2026
842ebda
Tools/SleepPSG: a PSG-labelled validation instrument for SleepStagerV…
vishk23 Jul 30, 2026
a066b8f
lint(hygiene): scope the doc-comment gate out of code-generator output
vishk23 Jul 30, 2026
f46153f
SleepPSG: say which denominator every stage fraction uses
vishk23 Jul 30, 2026
1820d78
Merge remote-tracking branch 'upstream/main'
vishk23 Aug 3, 2026
5b2650d
CloudSync: make /ingest a counted escalation, not a reflex, when lite…
vishk23 Aug 4, 2026
6b6e345
Raw history archive: keep unmapped-layout frames, and stop empties ev…
vishk23 Aug 5, 2026
3ed3978
Retain WHOOP 5/MG SpO2 forever instead of losing it after 7 days
vishk23 Aug 5, 2026
1ccddae
Don't publish an unvalidated SpO2 into the system health record
vishk23 Aug 5, 2026
2fda2f7
Merge branch 'ecg-archive-harden' into spo2-ecg-integration
vishk23 Aug 6, 2026
1b8c0aa
Android twins: durable SpO2 (Room 26) and raw-history archive hardening
vishk23 Aug 6, 2026
4dfc197
MG ECG: offer the untried restart control value (124 arg 2)
vishk23 Aug 6, 2026
5f61328
MG ECG: stop discarding candidate frames, and census what arrives
vishk23 Aug 6, 2026
13bea4c
Pin real WHOOP MG ECG flash records against Whoop5Ecg
vishk23 Aug 6, 2026
6fb9a05
MG ECG: read the leads-off block as fixed-size, not packed
vishk23 Aug 6, 2026
2b6b046
MG ECG: read the sample region as fixed-size, not packed
vishk23 Aug 6, 2026
ee029a8
Sleep: HR-first detection (experimental) — rescue restless nights, br…
vishk23 Aug 24, 2026
56443e1
Sleep: withdraw the HR rescue after a real-data replay; keep the wake…
vishk23 Aug 24, 2026
24ce658
Sleep: correct the withdrawn-rescue history note after the decode inv…
vishk23 Aug 25, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,8 @@ android/app/release/
# ── Misc / secrets (never commit) ───────────────────────────────
*.log
.env
# Oura BYO-app OAuth credentials (never committed)
Strand/Oura/OuraSecrets.xcconfig
# Deployment credentials (PAT / signing / endpoints) — never commit. `.env` above
# won't match `deploy.env`, so list it (and any `deploy.env.<stage>`) explicitly.
deploy.env
Expand All @@ -92,6 +94,12 @@ export.zip
__pycache__/
*.pyc

# ── Rust (liters dependency) ────────────────────────────────────
# Build output only. Rust/Cargo.lock IS tracked: it pins the exact liters
# commit this tree builds against, which a branch-tracking git dependency
# otherwise leaves floating.
Rust/target/

# Local release artifacts (zips/ipas built for upload; never tracked)
dist/
err.txt
Expand All @@ -102,6 +110,12 @@ Strand/Oura/OuraSecrets.xcconfig
# Personal bundle id prefix (BYO; never committed)
Config/BundleIdSecrets.xcconfig

# liters linkage, written by Rust/build-ios.sh from the xcframework it just produced. Untracked
# because it names slice directories under Rust/target/, which is itself untracked — committing it
# would point every other checkout at an archive that is not there. Config/Liters.xcconfig is the
# tracked wrapper that optionally includes it.
Config/LitersLocal.xcconfig

# (#979) The linux-capture workbench moved from `tools/` to `Tools/` when the two case-colliding
# trees were merged. On a case-SENSITIVE filesystem any capture a contributor already had stays
# behind at the old path, where that tool's own .gitignore no longer reaches it — and those files
Expand Down
7 changes: 7 additions & 0 deletions Config/BundleId.xcconfig
Original file line number Diff line number Diff line change
Expand Up @@ -16,3 +16,10 @@ BUNDLE_ID_PREFIX = com.noopapp
// to stop Xcode from asking you to reselect a team after every `xcodegen generate`.
DEVELOPMENT_TEAM =
#include? "BundleIdSecrets.xcconfig"

// The liters (page-replication) linkage seam. Tracked, and inert until Rust/build-ios.sh has been
// run: it defines LITERS_LIB_DIR / LITERS_HEADER_DIR / LITERS_LDFLAGS as empty and then optionally
// includes the untracked Config/LitersLocal.xcconfig that build-ios.sh writes. Included from HERE
// rather than from a target xcconfig because project.yml applies this file project-wide, which is
// the only level every target (macOS Strand, StrandTests, NOOPiOS) already shares.
#include "Liters.xcconfig"
37 changes: 37 additions & 0 deletions Config/Liters.xcconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
// Tracked wrapper for the liters (page-replication) linkage, so a clean checkout that has never run
// Rust/build-ios.sh still generates and builds. Included from Config/BundleId.xcconfig, which
// project.yml applies project-wide, so every target inherits these.
//
// Liters.xcframework is a BUILD ARTIFACT, not a tracked file: the device slice alone is ~83 MB, and
// three slices plus a macOS slice is far past what belongs in git. It is produced by
// `Rust/build-ios.sh`, which ALSO writes the untracked Config/LitersLocal.xcconfig included at the
// bottom of this file. That is deliberate — the search paths below name specific xcframework slice
// directories, and having the build script emit them from the layout `xcodebuild -create-xcframework`
// actually produced is the only way they cannot drift from it.
//
// The three variables default to EMPTY here. project.yml appends them unconditionally
// (LIBRARY_SEARCH_PATHS / SWIFT_INCLUDE_PATHS / OTHER_LDFLAGS), so with no local file the appends
// expand to nothing: no -l flag, no search path, and a default build links exactly what it links
// today. Absence of the xcframework is therefore not a build error for anyone who does not want it.
//
// LITERS_LDFLAGS is what actually pulls the archive in. It is kept separate from the search path so
// that "the paths are configured" and "the library is linked" stay two decisions: a build with the
// paths set but LITERS_LDFLAGS empty compiles the generated bindings' module import and fails at
// link, which is a clearer error than a missing module.
LITERS_LIB_DIR =
LITERS_HEADER_DIR =
LITERS_LDFLAGS =

// Set by build-ios.sh alongside the paths above. Gates every line of Swift that touches liters
// (Strand/CloudSync/Generated/, and the round-trip tests), so a checkout without the xcframework
// compiles none of it rather than failing to resolve `import liters_ffiFFI`:
//
// OTHER_SWIFT_FLAGS = $(inherited) -D LITERS
//
// NOT SWIFT_ACTIVE_COMPILATION_CONDITIONS, even though that is the idiomatic setting and what
// OuraSecrets.xcconfig uses for OURA_CLOUD_IMPORT / CLOUD_SYNC. Those work because OuraConfig.xcconfig
// is a TARGET-level xcconfig, which outranks the project build settings; this file is included from
// the PROJECT-level xcconfig, which xcodegen's own `SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG`
// (written into the project's Debug config, with no $(inherited)) sits above and silently overwrites.
// Verified with `xcodebuild -showBuildSettings`: the LITERS entry vanishes, DEBUG survives.
#include? "LitersLocal.xcconfig"
Original file line number Diff line number Diff line change
Expand Up @@ -333,6 +333,11 @@ public final class ReadonlyNoopStore {
"hrSample", "rrInterval", "event", "battery", "spo2Sample",
"skinTempSample", "respSample", "gravitySample", "ppgHrSample", "stepSample",
"sleepStateSample", "ppgWaveformSample", "rawImuSample", "v18AuxSample",
// v34: durable `@82` SpO2 percentages. Small (~100k rows/year) but UNBOUNDED — it is the
// one table here deliberately exempt from every prune — so it belongs in the readout for
// exactly the reason the comment above gives: growth that nothing prunes still has to be
// growth somebody can see.
"spo2PctSample",
]
var decodedRows = 0
for table in decodedTables where tableNames.contains(table) {
Expand Down
Loading