maxeskell
UserA personal, local-first AI coach for one triathlete/runner. Reads your AI Endurance (or intervals.icu) and Garmin data and *interprets* it — readiness, race-time models built on you, weather-aware sessions, deep session feedback — plus an MCP server to query it all from Claude. Your data never leaves your machine. MIT.
Categories
Indexed Skills (15)
endurance-coach-architecture-contract
The load-bearing architecture and invariants of the Endurance Coach app — load this when you need to understand how data flows, what must never break, or where something is assembled/enforced before you design or change a feature. Triggers: "how does data flow", "where is X assembled", "what are the invariants", "what must not break", "is this safe to change", "why is this null / a '—' field", designing or reviewing a feature that touches state assembly, sources (AI Endurance / Garmin), the write path, persistence, the dashboard HTML, the LLM coach layer, or the profile; onboarding to the codebase; wanting the contract behind `assemble.ts`, `Provenanced<T>`, `WriteGate`, `escapeHtml`, `StateStore`, the propose→confirm write gate, degrade-don't-crash, deterministic-vs-LLM split, or "no live numbers in the profile". Keywords: AthleteState, assembleState, Provenanced, WriteGate, allowWrite, escapeHtml, StateStore, atomic + locked write, prompt cache no-op, claude-opus-4-8. NOT for live triage of a broken symptom
endurance-coach-build-and-env
Load when standing up the Endurance Coach from a fresh clone, or when the local toolchain / accounts won't come up. Triggers: "set up from scratch", "fresh clone won't build", "how do I get this running", "npm install fails", Node / tsx / TypeScript / ESM / "Node16 module resolution" errors, "typecheck fails", "npm test fails on a clean checkout", "npm audit" / esbuild advisory, connecting AI Endurance (`npm run auth:aie`, OAuth, `localhost:8765/callback`, "token cache", "aie-tokens.json", "can't do OAuth headless / on a cloud box / in a sandbox / no browser"), enabling Garmin (`garmin-mcp-auth`, uvx, Python 3.12, the pinned `Taxuspt/garmin_mcp@d31de79` commit, "6-month token expired", "download_activity_file missing"), the Claude desktop-app MCP breaking after a Homebrew node upgrade (`No such file or directory`, pinned Cellar path), ANTHROPIC_API_KEY setup, and "just show me the app" (`npm run demo`, no account/key). Do NOT load for: running/serving/deploying the dashboard or `npm run ship` (use endurance-c
endurance-coach-change-control
Load this BEFORE making ANY code change to the Endurance Coach repo — it is the constitution for how work lands. Triggers: "can I commit this", "how do I ship", "is this gated", "what's the definition of done", "what are the rules here", "am I allowed to", classifying a change (display-only vs behavioural vs write-path vs schema vs config vs profile), before touching the write path / dashboard HTML / config (`config.ts`, `.env.example`) / `profile.local.yaml` / any AI Endurance write / the LLM coach flows / the wellbeing gate, "should this be behind a flag", "does this need a test", "which docs move with this code", "can I edit main directly", "my commits landed on main", worktree/branch hygiene, "should I hard-code a training rule", "can I override what AI Endurance says", "can I rebuild the load model". This skill OWNS the change-classification table, the definition of done, the four gates every change passes (green-before-commit, propose→confirm write gate, wellbeing gate, branch-then-ship), and the three
endurance-coach-config-and-flags
Load this for ANY question about the Endurance Coach app's environment variables / feature flags / config knobs — "what does COACH_X do", "what is the default for AIE_MCP_URL / GARMIN_MCP_ARGS / COACH_MCP_TOKEN", "how do I add a new env var / flag", "which flags are experimental or dangerous", "why is medical data hidden on the MCP server", "how do I turn on LAN / phone access", "how do I expose the MCP server to Claude Cowork", "why won't the HTTP MCP server start (token too short)", "is COACH_DEPLOY_BRANCH dead code", "audit config drift / is a var undocumented", configuring weather (COACH_WEATHER_LAT/LON, COACH_SWIM_MIN_WATER_C), Garmin (GARMIN_ENABLED + the uvx pin), the intent router (COACH_INTENT_ROUTER / COACH_LOCAL_INTENT), MCP auth (COACH_MCP_AUTH / READONLY / PROFILE_WRITE / FILE_ACCESS / EXPOSE_MEDICAL), pricing overrides (COACH_PRICE_*), timeouts, or where config.ts parses each var. Also: "which file reads this env var", "why is config.ts not the only parser". Don't load for HOW to run/serve/ship
endurance-coach-debugging-playbook
Load this to TRIAGE a live symptom in the Endurance Coach app (local-first single-athlete TypeScript coaching app at /Users/maxeskell/dev/personal-training-app). Use when something is broken or wrong RIGHT NOW and you need to find the cause fast: "dashboard won't load" / "page is blank" / "port 3000 already in use" / "EADDRINUSE"; "no data" / "fields show —" / "readiness/state is empty"; OAuth / 401 / "re-auth needed" / "AI Endurance unreachable" / token expired; "structured output 400" / "maxItems is not permitted" / an LLM structured call throws; "my commits landed on main" / HEAD hijacked / wrong branch; Garmin returns null / "FTP looks too low" / lactate-threshold pace is ~10× off / Garmin token stale; "a correlation looks too good" / "is this signal real"; ".FIT won't parse" / no splits / no power curve; "coach flow errored" / "ANTHROPIC_API_KEY is not set"; "tests fail" / suite red; "which runner is live" / launchd vs npm start fight. Keywords: doctor, probe, verify:reads, state:today, degrade, Provenan
endurance-coach-docs-and-writing
Load when writing, updating, or reviewing any prose/documentation in the Endurance Coach repo, or deciding WHICH doc a change belongs in. Triggers: "update the docs", "which doc owns this", "code and docs move together", "did I update the right doc", writing or editing README.md / HANDOVER.md / CLAUDE.md / CONTRIBUTING.md / SETUP.md / docs/PRODUCT.md / docs/commands.md / docs/data-sources.md / docs/insight-engine.md / docs/mcp-server.md / docs/profile.md / a docs/specs/* spec / a docs/specs/improvements/* fix write-up; "house style", "how do we phrase this", labelling something a MODEL/estimate, showing missing data as "—", formatting a duration as h:mm, spelling out an acronym on first use, a critical-warning blockquote; adding or editing a profile question (which regenerates docs/profile-questions.md — never hand-edit that file); writing a spec skeleton or a HANDOVER-style known-issue entry; making a coaching claim sound honest rather than oversold. Do NOT load for the definition-of-done gate mechanics or t
endurance-coach-external-positioning
Load this before writing or reviewing ANY outward-facing claim about the Endurance Coach project — a release note, blog post, README pitch, changelog, conference talk, paper abstract, tweet, "is this novel?" question, or a competitive comparison against AI Endurance (AIE), TrainingPeaks, Humango, intervals.icu, Strava, or Garmin. Triggers: "is this novel / original / state of the art", "can we claim X publicly", "how do we compare to <platform>", "what's our differentiator / edge / moat", "write the launch / release / marketing copy", "positioning", "one-pager", "elevator pitch", "what must be proven before we say this", "reproducibility statement", "is this overselling", or editing docs/PRODUCT.md, README's positioning/non-goals sections, or the "Principles" list. Also load it whenever a draft is about to state a performance-prediction claim, a "better than <competitor>" claim, or an "n=1 causal proof" claim — those three are the ones most likely to overreach. Do NOT load this for the open research problems
endurance-coach-failure-archaeology
The settled-history record for the Endurance Coach repo (single-athlete AI endurance-coaching app at /Users/maxeskell/dev/personal-training-app). Load this BEFORE re-attempting a fix, re-adding a removed feature, or re-litigating a past decision — when you are about to ask "has this been tried?", "why was X removed/reverted?", "is this a settled question or still open?", "can I re-enable autoupdate / re-add intervals.icu / rebuild the load model / restore change-point detection?", or "why does the code do this weird thing?". Covers every known chronicle entry: the autoupdate launchd job hijacking HEAD back to main mid-work (THE costliest failure — settled, do not repeat), the structured-output 400 from maxItems, dashboard 0.0.0.0-no-auth and HTML/XSS injection, the FDR "double-dip" that turned out to be a false alarm, change-point detector cut for low rigor, non-atomic state writes and JSONL corruption, duplicate archive rows, the power-curve all-time collapse, intervals.icu removal (the $20/mo tier), Mac-fir
endurance-coach-n1-validation-campaign
The executable, decision-gated campaign for the project's hardest live problem — proving that an insight-engine finding is REAL for THIS one athlete on noisy, single-athlete (n=1) data, not "impressive-looking nonsense". Load this when you are about to add, change, or trust a detector in src/insights/ — especially monitoring.ts, correlations.ts, efficiency.ts, or the stats.ts primitives — or when someone asks "is this signal real?", "should this ship as confirmed or exploratory?", "validate this detector/insight", "prove the monitoring rule", "why did my correlation not surface?", "this correlation looks too good", "is this FDR-confirmed?", "the CI spans zero", "walk-forward / holdout / permutation null", "did I p-hack the lag?", "is the outcome independent of the predictor?", or when reviewing a finding tagged exploratory vs confirmed. It walks Phase 0 (pre-register the hypothesis) → Phase 1 (data-sufficiency gates) → Phase 2 (run the honest estimator) → Phase 3 (confirm/exploratory decision rule) → Phase 4
endurance-coach-proof-and-analysis-toolkit
Load when you need to PROVE a statistical method in this repo's insight engine is correct, not just invoke it — deriving or checking any estimator in src/insights/stats.ts, correlations.ts, monitoring.ts, metrics.ts, efficiency.ts, or powerCurve.ts. Triggers: "prove it don't just install it", "derive the CI", "why effective-N / effN", "why Fisher-z", "why Bonferroni-before-BH", "how does the permutation null work", "why circular-shift not plain shuffle", "is this estimator right", "is corrWithCi correct", "what's the variance-inflation factor / VIF", "why q=0.1", "why K=400", "why seed 0x9e3779b1", "why the mulberry32 PRNG", "derive CTL/ATL/TSB", "why τ=42/7 not 2/(τ+1)", "why EF~CTL+time not residualise-then-trend", "Frisch–Waugh–Lovell", "what does the power-curve collapse bug teach", "why mean-max power", reviewing a PR that changes a formula, or reproducing a correlation/monitoring/economy number by hand. This is the MATH home: it gives each estimator's derivation, exact code location, a worked example, a
endurance-coach-research-frontier
Load this when the task is FORWARD-LOOKING research ideation for the Endurance Coach project — "where could this advance the state of the art", "what are the open research problems", "what could we publish / write a paper on", "what's the next big bet", "where is this genuinely novel", "can we do real causal inference on one athlete", "n=1 causal identification", "per-athlete intervention design", "close the dose-cycle loop", "prove which training change actually works for this athlete", "change-point detection tied to interventions", "separate heat/collinearity confounds from durability or economy", or any brainstorm about advancing beyond current features. This is the map of OPEN candidate frontiers (all labelled open/candidate, nothing achieved) with, per frontier, why current SOTA fails, the specific repo asset that makes it tractable here, the first three concrete steps naming exact files, and a falsifiable "you have a result when…" milestone. Do NOT load this to make public/marketing claims (use enduran
endurance-coach-research-methodology
Load this when turning a hunch or observation into an accepted result in the Endurance Coach repo: "how do we turn a hunch into a claim", "what is the evidence bar here", "should this ship as confirmed or exploratory", "pre-register this", "run an adversarial review", "assign a skeptic", "is this a real signal or noise", "idea lifecycle", "how do we promote an experiment", "how do we retire a feature we cut", "should this go behind a flag", "priors vs this athlete's data", "why did we cut the change-point detector", or any decision about whether a finding, prior, detector, or coaching rule has earned adoption. This skill owns the DISCIPLINE (the evidence bar, the pre-registration rule, the idea-lifecycle state machine, where good ideas come from, the priors-yield-to-n=1 doctrine). It does NOT own the statistical derivations (see endurance-coach-proof-and-analysis-toolkit), the step-by-step campaign to validate one detector (see endurance-coach-n1-validation-campaign), the open research problems (see endurance
endurance-coach-run-and-operate
Load this to RUN, SERVE, DEPLOY, or OPERATE the Endurance Coach app — not to change its code. Triggers: "run the app", "start the dashboard", "serve the site", "deploy", "ship it", "npm run ship", "how do I deploy", "which runner is active", "is the dashboard running", "port 3000 in use / who's on 3000", "install the service", "serve:install", "launchd", "pm2", "cron", "scheduled jobs", "the morning ping", "fit-sync watch", "autoupdate", "auto-update hijacked my branch / commits landed on main", "where do outputs land", "what's in data/", "which files do I back up", "restart the dashboard", "the site is down", "run it on Linux", "the MCP server for Cowork", "kickstart the agent", or any question about the CLI command catalog (what does `npm run <x>` do), the ship flow's safety guards, the launchd/pm2/cron service table, or the data/ artifact map. Don't load this for: the change gate / definition-of-done / branch-then- ship RULES (use endurance-coach-change-control); the env-var catalog and flag meanings (use
endurance-coach-validation-and-qa
Load this when the question is "is this good enough to ship?" for the Endurance Coach repo — what counts as evidence, how to test a change, whether the suite is green, and where coverage is thin. Triggers: "how do I test this", "add a test", "write a unit test", "is the suite green", "npm test failing", "what counts as done / evidence", "acceptance threshold", "is this finding confirmed or exploratory", "should this insight ship", "coverage is thin here", "what's the CI contract", "does this need a test before I commit", "golden / invariant / certified set", "node:test", "tsx --test", "fixture", "faked client", "test inversion", "profileQuestions test", "dashboard script-parse test", "writegate propose/confirm test", "statvalidity", "monitoring validated vs exploratory". Also load before merging any behavioural change to decide if it carries the test its Definition-of-Done requires. DON'T load this for: the derivations of the statistics themselves (use endurance-coach-proof-and-analysis-toolkit), the go/no-go
endurance-domain-reference
The endurance-physiology knowledge pack for this repo — load it whenever you meet an endurance metric, term, or threshold and need to know what it MEANS, HOW it is computed here, and WHAT VALUES are normal. Triggers: CTL / ATL / TSB (fitness / fatigue / form / "training stress balance"), ESS / TSS ("external stress score"), EF / efficiency factor, aerobic decoupling / durability / DFA-α1 / "alpha1", FTP / functional threshold power, CSS / critical swim speed / "400/200 test", threshold pace, LTHR, zones / Z1-Z6 / TID / "time in zone" / "intensity distribution" / polarized / pyramidal, HRV / rMSSD / RHR / resting heart rate, monotony / strain / Foster, taper / peaking / periodisation / "two stacked peaks" / A-race / B-race, carb fuelling / "g/h" / glucose:fructose / gut training, dose-cycle / GLP-1 / days_since_dose / in_gi_trough / gi_trough, wellbeing / RED-S / under-fuelling / "race weight", W/kg, VO2max, ACWR. Also load it when interpreting a `readiness` / `weekly` / `deep_dive` / `splits` / insight-engine
Bio shown is the top-scored skill's repo description as a fallback — real GitHub bios land in a future update.