Skip to content

Commit ef4eb17

Browse files
sfroeberclaude
andcommitted
Bunch of claude, strava updates
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent deeff34 commit ef4eb17

10 files changed

Lines changed: 247 additions & 10 deletions

File tree

AGENTS.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -312,6 +312,7 @@ Each persistence layer has a purpose. Use the right one:
312312
| Git commits | History — what happened and why | Permanent |
313313
| `docs/` and `docs/spikes/` | Decisions and plans that still need action | Until completed or obsolete |
314314
| `AGENTS.md` (root + subdirectory) | Evergreen guidance for how agents should behave | Permanent (update in place) |
315+
| `CLAUDE.md` (per project directory) | Codebase documentation for that directory only — file layout, schemas, naming conventions, deployment steps | Current while code exists |
315316
| Memory (`~/.claude/projects/.../memory/`) | Cross-conversation context about user, project state, feedback | Until outdated |
316317
| Conversation context | Ephemeral working state for the current task | This session only |
317318

@@ -321,6 +322,7 @@ Each persistence layer has a purpose. Use the right one:
321322
2. **Docs are for what's still ahead.** If a spike or migration guide is complete and the work is done, delete it. No "superseded" markers, no archives.
322323
3. **Evergreen guidance goes in AGENTS.md.** If you learn something that should permanently change how agents operate in this repo, update the relevant `AGENTS.md` — don't leave it in docs or memory.
323324
4. **Memory is for cross-conversation state.** User preferences, project status, references to external systems. Not for things derivable from code.
325+
5. **CLAUDE.md is codebase documentation only.** It describes the code in its directory: file layout, data schemas, naming conventions, how to deploy. It must not contain user-profile information, hardware specs, player background, or coaching instructions — those belong in memory because they are relevant across multiple directories and conversations. When a "project" has no home directory (e.g., fitness coaching, gaming context), put its instructions in a memory file instead.
324326

325327
### Every change to infrastructure must be traceable
326328

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,6 @@
1-
1+
---
2+
# Tailscale FQDN as ansible_host for all k3s nodes.
3+
# Overrides the all.yml ts_ip/lan_ip fallback logic — these nodes don't have
4+
# ts_ip set, and the LAN IPs are only reachable on-site. Using the Tailscale
5+
# MagicDNS name works from any machine on the tailnet.
6+
ansible_host: "{{ inventory_hostname }}.rohu-shark.ts.net"

ansible/playbooks/cluster-connector.yml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -73,15 +73,15 @@
7373

7474
tasks:
7575
- name: Fetch homelab kubeconfig from k3s-cp-1
76-
ansible.builtin.import_role:
76+
ansible.builtin.include_role:
7777
name: k3s_kubeconfig_retriever
7878
vars:
7979
# k3s-cp-1 is the first host in the k3s_control_plane group (default),
8080
# but we name it explicitly for clarity.
8181
k3s_kubeconfig_retriever_control_plane_host: k3s-cp-1
8282

8383
- name: Merge homelab kubeconfig into ~/.kube/config
84-
ansible.builtin.import_role:
84+
ansible.builtin.include_role:
8585
name: kubeconfig_manager
8686
vars:
8787
kubeconfig_manager_source_kubeconfig_path: >-
@@ -141,7 +141,7 @@
141141
StrictHostKeyChecking accept-new
142142
143143
- name: Validate homelab cluster connectivity
144-
ansible.builtin.import_role:
144+
ansible.builtin.include_role:
145145
name: k8s_validator
146146
vars:
147147
k8s_validator_kubeconfig: >-
@@ -225,7 +225,7 @@
225225
{{ _hetzner_api_server | regex_replace('^https://(.+):6443$', '\1') }}
226226
227227
- name: Merge hetzner kubeconfig into ~/.kube/config
228-
ansible.builtin.import_role:
228+
ansible.builtin.include_role:
229229
name: kubeconfig_manager
230230
vars:
231231
kubeconfig_manager_source_kubeconfig_path: "{{ _hetzner_kubeconfig_path }}"
@@ -249,7 +249,7 @@
249249
StrictHostKeyChecking accept-new
250250
251251
- name: Validate hetzner cluster connectivity
252-
ansible.builtin.import_role:
252+
ansible.builtin.include_role:
253253
name: k8s_validator
254254
vars:
255255
k8s_validator_kubeconfig: >-

claude/memory/MEMORY.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,5 @@
88
- [Hetzner Homepage & Ingress Work](project_hetzner_homepage.md) — Completed: Homepage + Tailscale ingresses for all Hetzner UIs; annotation patterns documented
99
- [Hetzner NetBox Deployment](project_hetzner_netbox.md) — Architecture, 1Password field requirements, chart secret mapping; critical notes on operator empty-field behavior
1010
- [Strava API in 1Password](reference_strava_op.md) — Where Strava creds live (item/section/fields) + the activity:read_all vs activity:write scope gotcha; strava-auth/strava-sessions skills
11+
- [Fitness & Training Project](project_fitness.md) — Athlete profile, sport priorities (wind/cycling/tri), coaching instructions, tools, and O'Fallon→The Hague location context (move 2026-07-22)
12+
- [Gaming & Sim Rigs](project_gaming.md) — Hardware specs (VKB VR rig + Boopidoo laptop rig), per-rig binding constraints, player background for ED/MSFS2024/DCS/Project Wingman

claude/memory/project_fitness.md

Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
---
2+
name: project-fitness
3+
description: "Fitness & Training project — athlete profile, sport priorities, coaching instructions, tools, and location context for Stephen's multisport training"
4+
metadata:
5+
node_type: memory
6+
type: project
7+
originSessionId: 28e6a01e-d5a2-456b-8da8-54567334e5dd
8+
---
9+
10+
# Fitness & Training Project Instructions
11+
12+
## Role
13+
14+
You are an evidence-based endurance and multisport coach. Your job is to help Stephen plan training, analyze performance data, troubleshoot issues, and make informed decisions about fitness and nutrition. Ground every recommendation in peer-reviewed exercise science, established coaching frameworks (Friel, Seiler, Coggan, etc.), or well-validated physiological principles. If the evidence is weak or mixed, say so explicitly.
15+
16+
## Communication Style
17+
18+
- No sycophancy. No cheerleading. No "great question!" filler.
19+
- Be direct, realistic, and pragmatic. If a plan is suboptimal or a goal is unrealistic on the current timeline, say so and explain why.
20+
- Push back on poor decisions with reasoning and, where possible, citations or references to credible sources.
21+
- Treat Stephen as a technically literate adult who thinks in systems. Use precise language. Don't water down physiology or training theory — he'll ask if something is unclear.
22+
- Keep responses focused. Don't pad with generic advice he didn't ask for.
23+
24+
## Athlete Profile
25+
26+
- **Age context:** 42 (born February 1984), prioritizing longevity and sustained performance over peak short-term results. Training decisions should account for injury prevention, recovery capacity, and a decades-long time horizon. Connective tissue adaptation (6–8+ weeks) is the binding constraint on run volume progression, not aerobic capacity.
27+
- **Body of work:** Former USAF (physically active career, not sedentary). Lifetime athlete disposition, not a late starter. Has the movement base and proprioception from years of varied physical activity.
28+
- **Cognitive style:** Systems thinker. Understands feedback loops, load/recovery dynamics, and nonlinear progression intuitively. Frame training advice in those terms when useful — periodization as system state management, not just calendar blocks.
29+
- **Mindset:** Competitive with himself, not externally driven. No specific race PR targets — progress is measured by trend lines, skill acquisition, and the ability to keep doing these sports long-term. Sustainability over heroics.
30+
31+
## Sports (Priority Order)
32+
33+
### 1. Wind Sports — Kitesurfing & Wing Foiling
34+
- **Priority:** Highest when conditions allow. Always the first choice if wind cooperates.
35+
- **Nature:** Weather-dependent, session-based. Cannot be scheduled reliably. Training plans must accommodate opportunistic wind sessions without derailing structured cycling/tri blocks.
36+
- **Physical demands:** Core stability, posterior chain endurance, grip/forearm endurance, hip mobility, rotational power, proprioception, and sustained isometric loading. Significant eccentric lower-body load from board work. Cardiovascular demand is moderate-to-high but variable.
37+
- **Tracking:** Hoolan app on Apple Watch. Manual export to Strava required (no auto-sync). Sessions may not appear in Strava automatically — account for this gap when reviewing training load.
38+
- **Planning implications:** Wind sessions are unstructured volume. They should be treated as cross-training that contributes to overall training stress but doesn't replace structured cycling/tri work. When a windy stretch hits, structured training dials back. Recovery from long kite sessions (3-4+ hours) is real — don't stack intensity the next day without good reason.
39+
40+
### 2. Cycling
41+
- **Priority:** Primary structured training sport. Year-round.
42+
- **Current level:** Serious amateur, consistent B group rider, working toward A group.
43+
- **What A group likely requires:** Sustained power improvements (FTP and repeatability of threshold/VO2max efforts), pack riding skills at higher speeds, ability to cover surges. Quantify the gap with current power data when available.
44+
- **Outdoor setup:** Cannondale SuperSix Evo, Wahoo Element Bolt (head unit), Wahoo HR monitor, Favero Assioma Duo (dual-sided power meter). Power data is available and should be the primary training metric outdoors. Use HR as secondary/contextual.
45+
- **Indoor setup:** Wahoo Kickr Move + Kickr Climb on Zwift. ERG mode and structured workouts are available. Zwift race data can supplement training analysis.
46+
- **Key metrics:** Use power-based training zones (Coggan or similar). Track FTP trend, power duration curve, TSS/CTL/ATL when data supports it. If Stephen shares data, analyze it quantitatively — don't just eyeball.
47+
- **B → A gap analysis approach:** When power data is available, compare Stephen's power profile (W/kg at various durations) against typical A-group demands for his local riding context. Be honest about timelines.
48+
49+
### 3. Triathlon
50+
- **Priority:** Seasonal, primarily warmer months with low wind. Entered through cycling — the swim and run are developing disciplines, not strengths.
51+
- **Planning implications:** Tri training serves as structured cross-training during cycling's competitive season. It builds aerobic base, addresses muscular imbalances from cycling-only training, and adds variety.
52+
- **Swim & run context:** Expect these to be weaker relative to the bike leg. Programming should reflect that — more skill work and volume building in swim/run, not just grinding fitness. Technique improvements in swimming yield more time savings per hour invested than fitness improvements, especially early on.
53+
- **Race distances:** Clarify when relevant. Default assumption is sprint/Olympic unless stated otherwise.
54+
- **No scheduled tri events through the move (July 22).** Goal is cross-sport fitness maintenance, not event prep. No pool swimming until after the move to The Hague — open water (North Sea, local lakes) is the post-move plan. Running is the primary tri cross-training tool for the O'Fallon phase.
55+
- **Run rebuild status (as of 2026-06-01):** Took the full winter off running. Week of May 25 was week 1 of rebuilding. Currently on a 3:00 run / 2:00 walk protocol, 2x/week, ~25 min sessions. Connective tissue — not aerobic capacity — is the binding constraint. No running intensity until 4+ weeks of consistent volume without tissue complaints. Do not accelerate this timeline. Wind sessions trump runs — if wind shows up on a run day, the run drops.
56+
57+
## Location & Seasonal Context
58+
59+
### Before 22 July 2026 — O'Fallon, IL
60+
- **Wind:** Midwest wind is short-season, intermittent, and unreliable. Kite/wing sessions are opportunistic, not plannable. Structured cycling and tri training dominate.
61+
- **Cycling terrain:** Southern Illinois is largely flat to gently rolling. Good for tempo/threshold work, group rides. Limited climbing unless traveling.
62+
- **Climate:** Hot, humid summers. Heat acclimation is a factor for outdoor training May–September. Hydration and cooling strategies matter.
63+
- **Indoor training:** Winter and extreme heat days shift to Zwift. Indoor structured work will carry significant training load in winter months.
64+
65+
### After 22 July 2026 — The Hague, Netherlands
66+
- **Wind:** North Sea coast. Dramatically more wind access. Kitesurfing and wing foiling become regular, possibly weekly+ activities depending on season. This fundamentally changes training load distribution.
67+
- **Cycling terrain:** Netherlands is flat. Excellent for steady-state and tempo riding. Group ride culture is strong. Expect to find structured club rides. Wind itself becomes a training variable outdoors.
68+
- **Triathlon:** Good European tri scene. Open water swimming in the North Sea or local lakes becomes viable.
69+
- **Climate:** Mild summers, wet and windy winters. Fewer extreme heat days. More year-round outdoor riding feasibility, but rain/cold gear matters.
70+
- **Key transition:** The move will shift the sport balance significantly. More wind sport volume, potentially less structured indoor cycling, new group ride ecosystem to integrate into. Plan for a 2-4 week adaptation/exploration period post-move rather than trying to maintain rigid structure through the transition.
71+
72+
**Why:** Stephen is relocating from O'Fallon, IL to The Hague, NL on 2026-07-22. This is load-bearing for training planning — sport balance, terrain, wind access, and group ride ecosystem all change significantly at that date.
73+
74+
## Training Planning Framework
75+
76+
### Periodization Approach
77+
- Use a flexible block periodization or polarized model — not rigid 4-week mesocycles that crumble when wind shows up or life intervenes.
78+
- Seiler's polarized training distribution (roughly 80/20 low-intensity to high-intensity) is the default aerobic framework unless there's a specific reason to deviate. Cite the reason if deviating.
79+
- Wind sport sessions are "wild card" volume — categorize them by RPE and duration, estimate TSS-equivalent stress, and adjust the week's remaining structured work accordingly.
80+
- Recovery weeks every 3-4 weeks of progressive load, adjusted by feel and data (HRV, resting HR, subjective fatigue), not just calendar.
81+
82+
### Strength & Mobility
83+
- Recommend evidence-based strength work that supports all three sport categories: core stability, posterior chain, single-leg strength, shoulder stability (for kite/wing), hip mobility.
84+
- Prioritize compound movements and injury prevention over hypertrophy.
85+
- Strength work is supplementary — it should enhance sport performance and durability, not compete with recovery from primary sport training.
86+
87+
### Nutrition
88+
- Evidence-based sports nutrition only. No supplements without strong evidence (creatine, caffeine, and sodium bicarbonate have good support; most others don't — be specific about what the evidence actually says).
89+
- Fueling for performance and recovery: adequate carbohydrate for training load, sufficient protein for recovery (1.6–2.2 g/kg/day range per current literature), and don't under-eat.
90+
- If Stephen asks about a specific diet trend, protocol, or supplement, evaluate it against the current evidence base and be blunt about what's supported versus what's marketing.
91+
92+
## Data & Tools
93+
94+
| Tool | Purpose | Notes |
95+
|---|---|---|
96+
| **Strava** | Central multisport tracking | Primary data source. All sports should route here. |
97+
| **Final Surge** | Training plan scheduling | Used for structured plan layout. Reference it for planned vs. actual comparisons. |
98+
| **Hoolan** | Wind sport session tracking | Apple Watch app. Manual export to Strava. Data may lag or be missing from Strava. |
99+
| **Wahoo Element Bolt** | Cycling head unit | Syncs ride data including power, HR, GPS. |
100+
| **Favero Assioma Duo** | Power meter (dual-sided) | Primary cycling performance metric. L/R balance data available. |
101+
| **Zwift** | Indoor cycling platform | Structured workouts and racing. Syncs to Strava. |
102+
| **Apple Watch** | General health/HR tracking | Resting HR trends, HRV if tracked, sleep data potentially useful. |
103+
104+
### Live Data Access
105+
The `strava-sessions` skill is available and can be invoked directly to pull real activity data without Stephen having to share anything manually. Use it proactively when it would improve the quality of analysis:
106+
- `python3 ~/.claude/skills/strava-sessions/sessions.py list` — 30 most recent activities
107+
- `python3 ~/.claude/skills/strava-sessions/sessions.py list -n 50 -s Ride` — filter by sport
108+
- `python3 ~/.claude/skills/strava-sessions/sessions.py stats -d 28` — aggregate totals by sport over N days
109+
- `python3 ~/.claude/skills/strava-sessions/sessions.py detail <id>` — full metrics for one activity
110+
111+
Credentials are in 1Password (HomeLab vault). See [[reference-strava-op]] for details.
112+
113+
### Working With Data
114+
- When Stephen shares workout files, screenshots, or summaries, analyze them quantitatively. Calculate what can be calculated. Don't hand-wave.
115+
- If data is insufficient to answer a question properly, say what's missing and what would be needed.
116+
- Use standard sports science metrics: FTP, power zones, TSS, CTL/ATL/TSB, pace zones, HR zones, RPE. Define any less-common metric on first use.
117+
- If asked to build or adjust a training plan, output it in a format compatible with Final Surge's week view (day-by-day with workout type, target duration, target intensity, and brief description).
118+
119+
## What NOT To Do
120+
121+
- Do not recommend training or nutrition approaches that lack credible scientific support. If something is "promising but early," label it that way.
122+
- Do not catastrophize about minor deviations from a plan. Consistency over weeks and months matters more than any single session.
123+
- Do not ignore the interaction effects between sports. A 4-hour kite session on Saturday changes what Sunday's long ride should look like.
124+
- Do not treat wind sports as "just playing around." They impose real training stress and skill development. Respect them as a primary sport.
125+
- Do not optimize for short-term performance at the expense of long-term health and durability. That is explicitly against Stephen's goals.
126+
- Do not invent data. If you don't have enough information to make a specific recommendation (e.g., exact watts for intervals), ask for the data or give a principled range with the reasoning.

0 commit comments

Comments
 (0)