Commit Graph

14 Commits

Author SHA1 Message Date
c51befb497 docs: 30K race-morning prep timeline (gun at 09:00)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-12 12:53:16 -04:00
875a54f0db docs: Mamba chew cadence in 30K plan — eat on every 15-min buzz
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-12 09:53:46 -04:00
2547f3a601 docs: fructose sources reference in RaceLogistics
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-12 09:48:31 -04:00
5b21f4d4bc docs: split RaceLogistics.md (fueling science, products, plans) from NatesNotes
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-12 09:45:37 -04:00
1b6ad40897 web: surface personal training findings — cadence, fueling
- NatesNotes.md restructured into the personal-findings doc (cadence 170
  target / 161 natural, 80 g carb/h, 3/2 breathing, gait cues, injury log)
- load_activities exposes avg_cadence_spm (summaryDTO.averageRunCadence,
  falling back to Takeout's avgDoubleCadence — full coverage, 342/342 runs)
- load_fit_records: FIT running cadence is single-leg rev/min; now returns
  true steps/min ((cadence + fractional_cadence) * 2)
- Dashboard: cadence trend chart (per-run avg, 28-day mean, 170/161 lines)
  + Cad column in recent activities
- Activity Detail: per-second cadence trace with %time >= 170
- Race Plan: fueling section (carb g/h x est. finish time per race)
- one-time migration: 18 epoch-ms-as-text timestamps -> ISO (P2 item;
  backup at data/backups/garmin-20260612-082025.db)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-12 08:35:01 -04:00
87f73ad36b web: port Sync page login + sync to garminconnect backend
garminconnect_backend gains web-friendly auth: resume() (token restore with
API validation), begin_login()/complete_mfa() (two-step MFA handshake via
return_on_mfa), user_label(), and patch_garth() split out of activate().

5_Sync.py drops the garth login flow (Cloudflare-blocked) for the new
backend; the authenticated client is cached in st.session_state. Verified
headlessly with streamlit AppTest: token restore, sync-button click, full
incremental sync, no exceptions.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-12 07:38:50 -04:00
dd2b8ef1bd P1: garminconnect auth backend — live sync working again
garth's SSO login is Cloudflare-rate-limited (429) and garth is now
deprecated upstream. New openrun.ingest.garminconnect_backend authenticates
via python-garminconnect 0.3.5 DI Bearer tokens and shims garth's client
surface (connectapi/download/username), so the existing sync pipeline runs
unchanged. openrun-sync gains --backend {auto,garth,garminconnect}; auto
prefers garminconnect when .secrets/garmin_tokens.json exists.

Login: uv run python -m openrun.ingest.garminconnect_backend

Synced: 7 activities (-> 2026-06-02) + splits + FITs, wellness through
2026-06-12, time-in-zone recomputed (364 activities).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-12 07:22:33 -04:00
9bb4b98491 CI: swap GitLab CI for Gitea Actions (remote is Gitea)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-12 06:30:18 -04:00
dbae49dce2 added sync and backup 2026-06-12 06:25:45 -04:00
6df25bcd8f P0: untrack Takeout dump + scratch DBs, add CI and DB backup script
- .gitignore now excludes the Garmin Takeout dump (0debd9f2-*/, personal
  health data), ruvector.db / agentdb.rvf scratch files, data/fit/ and
  data/backups/; untracked 23,673 files (kept on disk)
- .gitlab-ci.yml runs pytest via uv on every push
- scripts/backup_db.sh snapshots data/garmin.db (keeps last 14)
- canonical DB is garmin/data/garmin.db; the stray vault-root copy
  (Takeout ingest run from wrong cwd on 2026-06-08) is preserved at
  data/backups/vault-root-takeout-ingest-2026-06-08.db

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-12 06:14:53 -04:00
64a5ab4b7f saving 2026-06-12 05:48:30 -04:00
9d91ac8ebc 1.x updates 2026-05-19 08:34:22 -04:00
3f3fce62d3 Continuing P0-1 2026-05-18 19:17:14 -04:00
c7f6f68c40 first commit 2026-05-18 12:53:24 -04:00