Weekly review
Skill kaustin923/agent-fitness-coach/.claude/skills/weekly-review
Compute and write the weekly training and nutrition review for the last completed Monday–Sunday week, with grounded numbers, a per-run grade table, the weight trend, and up to three plan-adjustment suggestions. Use when it's Monday, the athlete asks "how did my week go", or a full week of data has just been synced.From its SKILL.md
npx -y skills add kaustin923/agent-fitness-coach --skill weekly-reviewAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 0 stars0 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
9.1 KB, ~2.1k tokens by cl100k_base, as published. Nobody here has run it
Weekly review
The weekly review is where coaching honesty lives. Its one non-negotiable discipline: compute every number first, then write prose around the frozen numbers. Language models fudge arithmetic and hallucinate weekdays; a review whose narrative disagrees with its own table destroys trust faster than any missed workout.
When to run
- Monday morning (or the athlete's preferred review day, from
athlete/profile.md), covering the last completed Monday–Sunday. - On demand, any time the athlete asks how their week went.
- As a scheduled Monday routine (see
guides/07-going-further.md).
Inputs
Files read:
athlete/plan.jsonandathlete/log.json— planned vs actual for the week; fitness block for the 4-week trend.athlete/macros.mdand theathlete/food-log/YYYY-MM.mdfile(s) covering the week.athlete/weight-log.csv— the week plus the prior week for trend.athlete/health/daily.csvandathlete/health/workouts.csv— if present, for energy balance, the weekly activity trend (steps, active kcal), and unplanned training.athlete/profile.md,athlete/goals.md,athlete/state/sent-markers.json.
Template: templates/weekly-review.md — the review file follows its structure exactly.
MCP tools: none directly; run strava-sync first if log.json's fitness.syncedDate predates the reviewed Sunday.
Ask the user: nothing. The review is computed from files. If a skipped session has no recorded reason, you may ask about it after presenting the review, not before.
Procedure
-
Date ritual and week boundary. Run
date +%F, build the weekday↔date table for this week and next with python. Then compute the reviewed week: the last completed Monday–Sunday. Convention (matches the shipped app): when today is Sunday, the reviewed week ends today. In python, withwd = today.isoweekday()(Mon=1 … Sun=7):monday = today - timedelta(days=6)ifwd == 7, elsemonday = today - timedelta(days=wd - 1 + 7);sunday = monday + timedelta(days=6). Print both boundary dates with their weekday names. -
Freshen data. If the sync is stale, run
strava-sync(andhealthkit-importif that's the athlete's source) before computing anything. -
Compute the numbers — all of them, in one python pass, before writing a single sentence:
- Completion: actionable days in the week (exclude Rest and pure recovery placeholders per
reference/tracking.md,## Completion stats), completed count, completion %, and the list of skipped/missed days with any recorded reasons. Full-week denominator, never week-to-date. - Mileage: planned miles vs actual miles, using the credit rule — a done day counts its matched activity distance, a done day without a match counts planned distance, an un-done day counts zero (
## Completion stats). Report the delta. - Per-run grade table: one row per run day — weekday+date, session, planned miles, actual miles, average pace, grade. Use the grades sync already wrote into
plan.jsonactual.grade; if any run is ungraded, grade it now with the blended-expected-pace formula inreference/tracking.md(## Run grading) — never by eyeball. - Macro adherence: days within the bands in
reference/formulas.md(## Macro adherence bands), servings-scaled totals, counted over logged days only; also days logged and average daily calories/protein across logged days. - Energy balance: when health data exists, average net balance vs TDEE and its band (
reference/formulas.md,## Energy balance bands). - Weight trend: per
reference/formulas.md(## Weight trend math), this week vs prior week. - Streaks: both, clearly named, per
reference/tracking.md(## Adherence and streaks) — the training streak (consecutive planned training days completed) and the logging streak (consecutive days with food logged). - Activity trend: when
health/daily.csvcovers both weeks, this week's steps and active kcal vs the prior week's — the >10% week-over-week move feeds step 8's celebration. - 4-week volume trend: the weekly buckets from
log.json's fitness block, with the trend label thresholds from## Current fitness(ramping at ≥110% of baseline, backing off at ≤80%). - Next week preview: focus, planned miles, and the 2–3 key sessions from
plan.json. Run mid-week (allowed), the reviewed week is still the last completed one, so "next week" is already partially elapsed: label the section "The week ahead", preview only days ≥ today, and never "preview" a session that's already completed.
- Completion: actionable days in the week (exclude Rest and pure recovery placeholders per
-
Apply the plan-free-but-trained guard. If there is no active plan (or the week had zero actionable planned days) but
health/workouts.csvor the activity log shows real training, credit that training explicitly and skip completion % entirely. Never let a review say "0/0 — you didn't train" to someone who trained off-plan. -
Derive adjustment suggestions (max 3) per
reference/training-rules.md(## Plan adjustment rules): completion below 60% → suggest reducing weekly frequency; the same weekday skipped 2+ times → suggest moving that day's session; skips citing fatigue → suggest reducing volume; completion at or above 80% → no suggestions, full stop. Each suggestion carries a reason and a specific, offered action ("Want me to move Thursday's tempo to Saturday?"), not a vague "consider adjusting". Suggestions are offers about the plan, never verdicts about the athlete — the athlete decides, and a choice they already made and recorded (plan.jsonmeta.methodology, the profile's athlete-choices notes) isn't re-litigated unless this week's data raises a new, specific concern. -
Write the review file to
athlete/reviews/YYYY-Www.md, named by the ISO week of the reviewed Monday (python:f"{y}-W{w:02d}"frommonday.isocalendar()). Filltemplates/weekly-review.md— Training (the computed stats block, the grade table, plan-vs-actual), Nutrition (macro adherence and days logged, with the energy-balance band from step 3 recorded as an "Energy balance:" line inside## Nutrition), Weight (the trend line from step 3), Goals (progress againstathlete/goals.md), and Next week — plus 2–4 highlights, 0–3 concerns (an empty concerns section is a fine outcome), a 4–6 sentence narrative, and the suggestions. Re-running for the same week overwrites the same file — one review per week, always current. -
Update goal progress. Refresh
currentvalues inathlete/goals.mdthat these computations already produced (logging streak, training streak, macro-adherence days, workout count, distance, weight) — the row format and lifecycle live inreference/tracking.md,## Goals. -
Narrate in chat. A short summary built strictly around the frozen numbers: headline (sessions completed, completion %, miles actual vs planned), one grade highlight, one nutrition line, the weight trend, and the suggestion count. If it's Monday and weekly activity (steps or active kcal) moved more than 10% week-over-week, celebrate it once — record the marker in
athlete/state/sent-markers.jsonso it never repeats (reference/insight-rules.md,## Celebrations). -
Offer follow-through. If suggestions exist, offer to apply them via
plan-adjust. Either way, offer to regenerate thedashboard. Ifplan.jsonhasmeta.race_datewithin 21 days, offer (or run) therace-prepskill.
Rules
- Numbers first, prose second. If a sentence disagrees with a computed value, the sentence is wrong — fix the sentence, never the number.
- Weekday names come from the date table verbatim. A review that says "Thursday, July 3" when July 3 was a Friday is the kind of error athletes remember.
- Tone: encouraging but honest. Reference specific data points. Acknowledge skips gently — ask what happened, offer a path — and never guilt the athlete. Proactive-messaging etiquette is in
reference/insight-rules.md. - A great week needs no fixing. At ≥80% completion, say so and stop; do not invent improvements to sound useful.
- Never present zeros as failures: unlogged food days mean "no fuel data this week", not "you ate nothing"; a week with no weigh-ins means "no weight data this week", not a problem to fix. Adaptive-engagement rules apply here exactly as in chat.
- All distances, paces, and weights in the athlete's declared units.
- Never claim the review file is written unless the write happened this turn.
Output
The chat summary from step 8, plus the path to the review file. Suppress suggestions if you ended by asking about a skipped session; otherwise close with 2–3 next actions, such as:
- "Want me to apply the Thursday-to-Saturday move? I'll run plan-adjust."
- "I can regenerate your dashboard with this week baked in."
- "Fancy a small goal for next week — say, 4 of 5 sessions?"
What ships with it
Read from the repository
Just SKILL.md. No reference files, no scripts.