Build and adjust active programs for nutrition, strength, and running. Use when the task is to draft or refine a nutrition week, a strength block, or a running cycle, or to review the cross-domain picture. This is the only skill that writes to programs/.
The planning skill manages programs/ — active intentions.
programs/ holds what is planned. history/ holds what happened.
The skill reads both to close the gap between intention and reality.
This skill is always user-triggered. No automatic replan.
programs/nutrition/week-draft.yaml — the current nutrition weekprograms/strength/program.yaml — the current strength programprograms/running/program.yaml — the current running cycle/plan nutrition build-week — draft a new nutrition week/plan nutrition adjust — swap a meal or recalibrate the week/plan strength build-block — draft a new strength block/plan strength adjust — modify a session or recalibrate loads/plan running build-cycle — draft a new running cycle/plan running adjust — modify sessions or recalibrate pace targets/plan review — cross-domain overview (nutrition week + strength + running)/plan status — summarize the current state of all three programsThe model decides what to plan. Tools handle deterministic mechanics.
| Tool | Purpose |
|---|---|
nutrition.load_week(path) | Load programs/nutrition/week-draft.yaml |
nutrition.save_week(week, path) | Write the week atomically |
nutrition.swap_meal(...) | Atomic meal mutation — the engine behind /plan nutrition adjust |
nutrition.load_recipes() | Catalogue — available recipes |
nutrition.load_components() | Catalogue — available meal components |
nutrition.evaluate_rules(week, rules) | Deterministic rule check (macros, structure) |
nutrition.build_grocery(meals, recipes) | Grocery list from planned meals |
nutrition.build_ui_data(...) | Full UI payload for the frontend |
CLI: health-coach-swap-meal --date ... --meal-type ... --recipe-id ...
| Tool | Purpose |
|---|---|
strength.load_program(path) | Load programs/strength/program.yaml |
strength.save_program(program, path) | Persist the updated program |
strength.load_history(path) | Load raw Hevy data from history/strength/ |
strength.build_summary(program) | Compute volumes, trends, gaps |
strength.session_volume(session) | Per-session volume helper |
| Tool | Purpose |
|---|---|
running.load_program(path) | Load programs/running/program.yaml |
running.save_program(program, path) | Persist the updated program |
running.load_history(path) | Load raw Strava data from history/running/ |
running.build_summary(program) | Compute pace, distance, trend |
running.pace_sec_per_km(d, t) | Pace calculation helper |
running.infer_kind(activity) | Classify run type (easy, long, tempo, interval, race) |
| Tool | Purpose |
|---|---|
cross_domain.iso_week_dates(start) | 7-date list for a nutrition week |
cross_domain.build_training_projection(...) | Project strength + running sessions onto the nutrition week |
cross_domain.recent_unique_weekdays(records, count) | Detect training day patterns |
cross_domain.label_for_training_context(...) | Human-readable load label |
cross_domain.load_band_for_session_count(n) | rest / single / double |
| Tool | Purpose |
|---|---|
render.strength_plan(summary) | Markdown summary for /plan strength status |
render.running_plan(summary) | Markdown summary for /plan running status |
render.overview(nutrition, strength, running) | Cross-domain overview for /plan review |
CLI: health-coach-refresh — runs all three renders and the nutrition UI data build.
/plan nutrition build-weekPurpose: draft a new 7-day nutrition plan aligned with training load.
Steps:
/history review nutrition (see skills/history/SKILL.md) before drafting anything. This captures adherence feedback and ages the week into proxy history. Do not skip this step unless the user explicitly declines.USER.md for targets and cross-domain contextmemory/YYYY-MM-DD.md to read the adherence feedback just capturedhistory/strength/ and history/running/ via load toolsbuild_training_projection to map sessions onto the weekweek-draft.yaml with meals assigned to all 7 days — the draft must visibly react to the adherence signal (e.g., drop a rejected meal, repeat a loved one, simplify over-long cook times)objective.strategy and objective.rationalecalibration (calories, protein, macro stance)batch_cooks so the leftover pipeline is readablenutrition.save_week()Cross-domain signal: heavy training days (load_band = double) should have lower-friction dinners.
Adherence contract: the goal of step 1 is not to interrogate, it is to avoid drafting a week in a vacuum. Three minutes of feedback is enough. If the user has nothing to report, record "no adherence signal captured", age the week, and proceed.
/plan nutrition adjustPurpose: modify one or more meals in the current week.
Steps:
week-draft.yamlnutrition.swap_meal(...) for each changeUse nutrition.swap_meal for atomic single-meal changes.
For structural changes (multiple swaps, new week shape), load → modify dict → save.
/plan strength build-blockPurpose: draft or update a strength training block.
Steps:
USER.md for objectiveshistory/strength/ via strength.load_history()programs/strength/program.yaml via strength.load_program()strength.build_summary(program)sessions intact as observed historyblock and active_block)strength.save_program()Cross-domain: check history/running/ for fatigue signals before adding heavy sessions.
/plan strength adjustPurpose: modify a specific session or recalibrate loads.
Steps:
programs/strength/program.yamlstrength.save_program()/plan running build-cyclePurpose: draft or update a running cycle.
Steps:
USER.md for objectiveshistory/running/ via running.load_history()programs/running/program.yaml via running.load_program()running.build_summary(program)activities intact as observed historycycle and active_cycle)running.save_program()Cross-domain: check history/strength/ for load before stacking hard sessions.
/plan running adjustPurpose: modify a specific activity or recalibrate pace targets.
Steps:
programs/running/program.yamlrunning.save_program()/plan reviewPurpose: cross-domain overview covering all three domains.
Steps:
nutrition.build_ui_data() for the nutrition picturestrength.build_summary_from_file() for the strength picturerunning.build_summary() for the running picturerender.overview(nutrition, strength, running) to produce the markdown/plan statusPurpose: quick state of all three programs without full replanning.
Read:
programs/nutrition/week-draft.yaml — week status, open slots, rule failuresprograms/strength/program.yaml — latest session, volume trendprograms/running/program.yaml — latest activity, pace trendThis skill writes only to:
programs/nutrition/week-draft.yamlprograms/strength/program.yamlprograms/running/program.yamlprograms/strength.md, programs/running.md, programs/overview.md (render outputs)This skill never writes to:
history/ — that belongs to the history skillwiki/ — that belongs to the wiki skillmemory/ — that belongs to the runtime memory policyhistory/ before writing programs/.programs/ is modified only on explicit user request.history/ (what happened) and programs/ (what is intended) is the signal. Surface it on every review.