From claude-code-fitness-hermit
Detects upward cardiac-drift trends across recent steady-state activity notes. Runs weekly via scheduled checks and outputs findings for coaching pattern analysis.
How this skill is triggered — by the user, by Claude, or both
Slash command
/claude-code-fitness-hermit:weekly-coaching-patternsThis skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
Scheduled-check skill: reads the last 4 `compiled/activity-*.md` artifacts for steady sessions and detects whether cardiac drift is trending upward over time. Returns a fixed findings block for `reflect --scheduled-checks` to classify and route.
Scheduled-check skill: reads the last 4 compiled/activity-*.md artifacts for steady sessions and detects whether cardiac drift is trending upward over time. Returns a fixed findings block for reflect --scheduled-checks to classify and route.
Contract: idempotent, read-only, no self-scheduling, short-running. Returns findings or silence — never creates proposals itself.
Run the trend check. Issue a single Bash call:
bun ${CLAUDE_PLUGIN_ROOT}/scripts/fitness-lab.ts weekly-patterns
The script does the whole deterministic pass — filesystem only, no Strava token: globs .claude-code-hermit/compiled/activity-*.md, keeps entries whose frontmatter has type: activity-note AND session_kind: steady, takes the 4 most recent by created, extracts the signed integer from each body's Cardiac drift: line (missing line → excluded; a negative value compares as smaller than any positive — the sign is never stripped), and evaluates a strict oldest-to-newest monotonic rise across all 3 adjacent pairs. It emits:
{"steady_sessions_found": <int>, "series": [{"file": "…", "date": "…", "drift": <signed int>}], "trend": "upward" | "none" | "insufficient-data"}
series is ordered oldest-to-newest. trend: "upward" means the 4-value bpm series is strictly increasing (the deliberately strict v1 bar — avoids false positives from noisy week-to-week variation). "none" = 4 values but not monotonic; "insufficient-data" = fewer than 4 drift values (expected on interval/strength-heavy weeks — not an error).
Anti-duplication guard: emit a finding ONLY on trend: "upward" (the quantitative numeric rise). Do NOT emit on label recurrence alone.
Output the findings block. Always output a plain-text findings block to stdout, regardless of outcome. reflect --scheduled-checks classifies the result from this block.
trend: "upward":
weekly-coaching-patterns findings — <YYYY-MM-DD>
Coaching patterns: 1
- Coaching pattern detected [cardiac-drift-high]: cardiac drift rising across 4 consecutive steady sessions (<V1>→<V2>→<V3>→<V4> bpm) — check pacing strategy and hydration; consider an easy recovery run next session
Replace <V1>…<V4> with the four series[].drift values in order (oldest-to-newest, each rendered with its sign, e.g. +6), and <YYYY-MM-DD> with today's date.
trend: "none" or "insufficient-data":
weekly-coaching-patterns findings — <YYYY-MM-DD>
No actionable findings.
The [cardiac-drift-high] label reuses the seed vocabulary from activity-deep-dive step 7b — no new label is introduced.
Four steady sessions, oldest-to-newest, with drift lines +4, +7, +9, +13:
weekly-coaching-patterns findings — 2026-05-31
Coaching patterns: 1
- Coaching pattern detected [cardiac-drift-high]: cardiac drift rising across 4 consecutive steady sessions (+4→+7→+9→+13 bpm) — check pacing strategy and hydration; consider an easy recovery run next session
The same four sessions with values +4, +7, +6, +13 do not hold (the +7→+6 pair falls), so the output is the No actionable findings. block. A series of -3, +1, +5, +9 does hold (every pair rises; the leading negative compares as smallest).
The following metrics follow the same steady-session pattern and would add items to the Coaching patterns list. NOT implemented in v1 — cardiac drift alone proves the mechanism end-to-end.
Pace/HR efficiency: X.XX min·km⁻¹·bpm⁻¹ from each artifact; detect a strictly declining trend across the 4 steady sessions. Label: efficiency-regression.Recovery: N/5 from each artifact (applies to both steady and interval sessions); detect a strictly hardening trend across the 4 sessions. Label: recovery-insufficient.reflect --scheduled-checks to classify and route. Runtime state (last_run, consecutive_empty, etc.) is written by reflect --scheduled-checks to state/reflection-state.json → scheduled_checks.weekly-coaching-patterns — not by this skill./claude-code-fitness-hermit:hatch step 8c via a scheduled_checks config entry (interval_days: 7). The core daily scheduled-checks routine fires reflect --scheduled-checks, which picks it up once 7+ days have elapsed since last_run.[cardiac-drift-high] label has two upstream producers. activity-deep-dive step 7b writes single-session observations (graduated to proposals via reflect's current-session path); this skill emits on a multi-session trend. Both flow into proposal-triage, which dedups — so a triage DUPLICATE verdict here is expected behavior, not a bug.npx claudepluginhub p/gtapps-claude-code-fitness-hermit-plugins-claude-code-fitness-hermitAnalyzes Strava activities with per-activity coaching metrics: session kind (interval/steady), terrain (road/trail), HR zones, recovery estimate, and coaching narrative. Useful post-workout or for retro-analysis.
Analyzes fitness data to identify trends, track progress, evaluate habits, and generate personalized training recommendations. Supports correlation analysis with chronic disease data.
Guides training load decisions using daily HRV measurements compared to a 7-day rolling average, with evidence-based thresholds for adjusting intensity and volume.