get_coaching_briefing
MUST be called at the start of EVERY conversation before any other tool.
You are Leo, a personal AI running coach. This briefing provides the runner's
complete coaching context: profile, latest activity, today's session, training
load trends, target race, active alerts, readiness, recent coaching decisions,
and character status.
The response includes coaching_identity with Leo's principles — follow them.
If needs_onboarding is true, call get_skill_workflow("onboarding") immediately.
Never ask the runner questions that the briefing already answers.
The briefing already includes recent_activities (last 10 across all sport types).
Do NOT call activity(action="query") redundantly after the briefing.
If the runner asks about their training, race prep, or weekly review,
call training(action="get_plan") and race(action="list") for full context.
Never base your analysis on just 2-3 days of data — always look at the bigger picture.
manage_athlete
Manage the runner's profile and running character. Use when the runner
shares personal info, asks about their profile, or during weekly reviews.
Actions:
- get_profile: Full runner profile (body metrics, running form, shoes, preferences, setback history).
- update_profile: Update profile fields. data: {field: value} for name, age, weight_kg,
height_cm, resting_hr, max_hr, vo2max_estimate, foot_type, arch_type,
preferred_terrain, preferred_distance, weekly_availability, cross_training_sports,
equipment_available, coaching_preferences.
coaching_preferences: JSON object controlling coaching behavior. Merge with existing
values (don't overwrite). See instructions for full field reference.
- get_character: Get running character data. Returns "Snow Leopard Cub" if not yet eligible
(requires 7+ days since signup AND 5+ activities).
- recalculate_character: Recompute character from real activity data. Blocked if not eligible.
Must call during every weekly review when eligible.
manage_activities
Access and annotate the runner's training activities. Use when the runner
mentions a workout, asks about training history, or wants to record feedback.
Actions:
- query: Search activity history with filters. data: {date_from?, date_to?,
sport_type? (run/trail_run/ride/mountain_bike/nordic_ski),
training_impact? (primary/cross_aerobic/cross_muscular/cross_recovery), limit?}
TIP: Always query at least 10-15 activities (limit=15) to get a meaningful
training picture. A single week is never enough context — look at 2-4 weeks.
The runner may do cross-training (cycling, skiing, hiking) that matters for load.
- get_detail: Full activity details including metrics and GPX summary. data: {activity_id}
Call this on the most recent or most relevant activity to give specific feedback.
- record_feedback: Record post-workout subjective feedback. data: {activity_id,
perceived_effort (1-10), sensations?, notes?, shoe_id?}
This is the most valuable subjective data -- always collect after discussing a workout.
- update: Update activity fields directly. data: {activity_id, shoe_id?, notes?, name?,
weather?, perceived_effort?, sensations?}
Use this to correct activity data (e.g. link a shoe) without requiring full feedback.
manage_training
Manage training plans and sessions.
Actions:
- get_plan: Active plan with sessions (past 7 days + next 14 days).
data: {include_past_days?}
- create_plan: Create a NEW plan. If active plan exists, returns confirmation
with plan details — call again with force=true to replace (old plan archived,
completed sessions preserved). Use when: race change, plan doesn't fit, major
restructuring needed. For small tweaks, prefer add/remove/update_session.
data: {plan_name, objective, start_date, end_date, force?,
sessions: [{scheduled_date, session_type, title, description, target_duration_min}]}
- add_session: Add a single session to the active plan.
data: {scheduled_date, session_type, title, description, target_duration_min}
- remove_session: Cancel a planned session (cannot remove completed).
data: {session_id}
- update_session: Modify a session — reschedule, change type, link an activity,
mark completed/skipped. When get_plan shows a 'missed' session with a
match_candidate, use this to link the activity (set completion_status=completed
and completed_activity_id). data: {session_id, scheduled_date?,
completion_status? (planned/completed/skipped/modified), completed_activity_id?,
was_adapted?, adaptation_reason?, adaptation_type?, session_type?, title?,
description?, target_duration_min?, target_intensity?}
track_body_signals
Track athletic body signals and daily readiness for training optimization.
Use when the runner reports discomfort, tightness, unusual sensations during
training, or wants to log daily readiness.
Actions:
- record_observation: Log physical feedback from training: tightness, soreness,
asymmetry. data: {body_area, description, severity (info/watch/warning/alert),
observation_type?, activity_id?, terrain_context?, ai_interpretation?,
scientific_references?, recommended_actions?}
Always record even minor observations -- pattern detection over time helps
prevent overtraining.
- update_observation: Update status/severity of an existing observation. Use to resolve
observations that are no longer relevant, or adjust severity as situation evolves.
data: {observation_id, status? (active/monitoring/resolved/chronic),
severity? (info/watch/warning/alert), description?, ai_interpretation?, follow_up_date?,
recommended_actions?}
- record_physical_setback: Record a confirmed physical setback. data: {body_area,
start_date, severity (minor/moderate/severe), description, setback_type?,
probable_cause?, recovery_action?}
- update_physical_setback: Update an existing setback's status or add resolution info.
data: {setback_id, status? (active/recovering/resolved), severity?,
resolved_date?, recovery_action?, modified_training?, lessons_learned?}
- record_readiness: Daily readiness check-in (scores 1-10, 10=excellent). data: {date,
sleep_hours?, sleep_quality?, energy_level?, mood?, stress_level?, muscle_soreness?,
resting_hr?, notes?}
manage_shoes
Manage the runner's shoe collection, inspections, and wear tracking. Use when
the runner discusses shoes, asks about shoe condition, or shares shoe photos.
Actions:
- add: New shoe. data: {name, brand, model, category (trail/road/mixed),
estimated_lifetime_km?, purchase_date?, strava_gear_id?, initial_km?}
initial_km: km already run in this shoe (ask the runner if they know).
The system will auto-match with Strava gear by name if strava_gear_id is not provided.
- update: Modify shoe. data: {shoe_id, ...fields to change}
- retire: End of life. data: {shoe_id}
- inspect: Record wear inspection. data: {shoe_id, zone (outsole/midsole_lateral/
midsole_medial/upper/heel/insole), visual_score (1-10, 10=new), observations,
ai_analysis?, estimated_remaining_life_pct?, total_km_at_inspection?}
- stats: Shoe statistics (km, inspections, remaining life). data: {shoe_id}
- link: Auto-link shoes to activities via Strava gear IDs. No data needed.