lifestyle.book_personal_trainer — Full Intent Specification
INTENT NAMESPACE: lifestyle
INTENT NAME: book_personal_trainer
FULL ID: lifestyle.book_personal_trainer
VERSION: v1.0.0
STATUS: draft
LAST UPDATED: 2026-05-10
TTBS WEIGHTS: time 0.30 · taste 0.40 · budget 0.20 · safety 0.10
Personal trainer is a 1-on-1 fitness session with a certified trainer, either at a gym, at the user's home, or at a public outdoor space. Inherits from lifestyle.book_gym_session for the gym-side shape and from lifestyle.book_at_home_service for at-home logistics. Adds: (a) session_location_kind enum (at_gym / at_home / outdoor / hybrid_session_pack); (b) training_program block (single session, multi-session pack, custom plan); (c) progress_tracking (body composition, lift PRs, performance metrics over multi-session pack); (d) nutrition_consultation_included flag.
Inheritance contract: every field in lifestyle.book_gym_session (when at_gym) or lifestyle.book_at_home_service (when at_home) is REQUIRED, adapted for 1-on-1 PT shape.
1. NATURAL LANGUAGE COVERAGE
Classifies IN
- "personal trainer for fitness goals"
- "1-on-1 PT session today"
- "weight loss trainer 12 sessions"
- "bodybuilding coach near me"
- "personal trainer at home"
- "PT for marathon training"
- "calisthenics coach"
- "strength coach for powerlifting"
- "postnatal fitness trainer"
Classifies OUT — borderline NO
- "gym session" (no trainer) →
lifestyle.book_gym_session - "yoga class" →
lifestyle.book_yoga_class - "physiotherapist" →
lifestyle.book_at_home_service(physio variant) - "wellness retreat" →
lifestyle.book_wellness_retreat - "monthly gym membership" →
lifestyle.book_gym_membership
MULTI-INTENT TRIGGERS
- "PT session and meal plan" →
lifestyle.book_personal_trainer+food.subscribe_tiffin - "PT 12 sessions and protein supplements" →
lifestyle.book_personal_trainer+grocery.order_delivery
2. INPUT — TOMO → PROVIDER (DELTA)
{
"intent": "lifestyle.book_personal_trainer",
"intent_version": "v1.0.0",
"request_id": "req_pt_8h2k_2026-05-10T08:00:00Z",
"session_location_kind": "at_gym",
"service_address": { ... }, // if at_home
"search_area": { ... }, // if at_gym or outdoor
"scheduled_for_iso": "2026-05-12T07:00:00+05:30",
"duration_minutes": 60,
"session_kind": "single_session",
"user_fitness_profile": { ... }, // same as gym_session
"training_program": {
"program_kind": "weight_loss_focused",
"session_count_required": 1,
"session_pack_kind": "single_session",
"preferred_session_frequency_per_week": 0,
"include_nutrition_consultation": false,
"include_progress_tracking": true,
"fitness_goal_target": "lose_5kg_in_3_months",
"current_baseline_inputs": "weight 65kg, body fat 28%, can do 5 pushups"
},
"preferences": {
"trainer_gender_preference": "any",
"trainer_min_experience_years": 3,
"trainer_certifications_required": true,
"trainer_certification_authority_acceptable": ["acsm", "nasm", "issa", "icb_l1"],
"trainer_specializations_required": ["strength_coach", "postnatal_specialist"],
"trainer_kyc_required": true,
"trainer_speak_locales": ["en-IN", "hi-IN"],
"session_at_partner_gym_required": true,
"session_outdoor_acceptable": false,
"budget_band": "good",
"budget_max_inr_total": 2500,
"online_payment_required": true
},
"context": { ... }
}
| Field | Type | Constraint | Notes |
|---|---|---|---|
intent |
string | REQUIRED, equals "lifestyle.book_personal_trainer" |
|
session_location_kind |
enum | REQUIRED, see §5 | drives at-home logistics requirement |
service_address |
object | REQUIRED if session_location_kind=at_home | |
search_area |
object | REQUIRED if session_location_kind=at_gym OR outdoor | |
session_kind |
enum | REQUIRED, see §5 | |
training_program.program_kind |
enum | REQUIRED, see §5 | |
training_program.session_count_required |
int | REQUIRED, ≥1 | |
training_program.session_pack_kind |
enum | REQUIRED, see §5 | |
training_program.preferred_session_frequency_per_week |
int | REQUIRED, ≥0 | 0 if single |
training_program.include_nutrition_consultation |
bool | REQUIRED | |
training_program.include_progress_tracking |
bool | REQUIRED | |
training_program.fitness_goal_target |
string | REQUIRED, may be empty | free text for context |
training_program.current_baseline_inputs |
string | REQUIRED, may be empty | free text |
preferences.trainer_specializations_required |
array |
REQUIRED, may be empty | see §5 |
preferences.session_at_partner_gym_required |
bool | REQUIRED | for at_gym kind |
preferences.session_outdoor_acceptable |
bool | REQUIRED |
Anti-fabrication preamble (universal): no paid placement, no urgency text, no commission-influenced fields.
3. PROVIDER TOOLS
8 tools from base intents REQUIRED (search, detail, slots, book, modify, cancel, confirm_arrival, rate). ADD:
Tool 9: validate_training_program
PURPOSE: partner confirms feasibility of multi-session program with chosen trainer
INPUT: { trainer_id, program_payload, request_id }
OUTPUT: { feasibility_status, fare_estimate_inr_total, fare_per_session_inr, sessions_schedulable, modifications_suggested }
SLA: p95 < 1000ms
Tool 10: track_session_attendance
PURPOSE: partner confirms session attended (no-show or active)
INPUT: { booking_ref, session_index, status, observed_iso, request_id }
OUTPUT: { acknowledged: true }
SLA: p95 < 800ms
Tool 11: submit_progress_log
PURPOSE: trainer submits progress data after each session
INPUT: { booking_ref, session_index, metrics, notes, photos[], request_id }
OUTPUT: { acknowledged: true, log_iso }
SLA: p95 < 1500ms
All 11 REQUIRED.
4. RESPONSE SHAPE (DELTA)
PersonalTrainerOption
All fields from gym_session OR at_home_service (depending on session_location_kind) REQUIRED. ADD:
session_location_kind: STRICT ENUM, REQUIRED # see §5
trainer: # superset of gym_session.trainer + PT-specific fields
trainer_id: string, REQUIRED
display_name: string, REQUIRED
photo_url: URL, REQUIRED
photo_ai_generated: boolean, REQUIRED # MUST be false
gender: STRICT ENUM, REQUIRED
age_band: STRICT ENUM, REQUIRED
experience_years: int, REQUIRED, ≥0
pt_sessions_completed_total: int, REQUIRED, ≥0
pt_clients_active_30day: int, REQUIRED, ≥0
specializations: array<STRICT ENUM>, REQUIRED, ≥1
certifications: array<STRICT ENUM>, REQUIRED, may be empty
certifying_authorities: array<STRICT ENUM>, REQUIRED, may be empty
nutrition_consult_certified: boolean, REQUIRED
postnatal_certified: boolean, REQUIRED
rehab_certified: boolean, REQUIRED
competitive_athlete_background: boolean, REQUIRED # has competed
competition_kinds: array<STRICT ENUM>, REQUIRED, may be empty
languages_spoken: array<RFC_3066_LOCALE>, REQUIRED, ≥1
rating_avg: float, REQUIRED, 0-5
rating_count: int, REQUIRED, ≥0
client_retention_rate_30day: float, REQUIRED, 0-1 # past clients still paying
before_after_results_count: int, REQUIRED, ≥0 # documented transformations
kyc:
aadhaar_verified: boolean, REQUIRED
pan_verified: boolean, REQUIRED
background_check_passed: boolean, REQUIRED
background_check_iso: ISO_DATETIME, REQUIRED
employed_kind: STRICT ENUM, REQUIRED
base_pt_session_inr: INR_INTEGER, REQUIRED # 1-on-1 standard rate
pack_discount_pct: float, REQUIRED, 0-1 # for multi-session
training_program_match:
program_kind: STRICT ENUM, REQUIRED
feasibility_score: int, REQUIRED, 0-100
trainer_specialization_match: boolean, REQUIRED
goal_alignment_score: int, REQUIRED, 0-100
recommended_session_count: int, REQUIRED, ≥1
recommended_session_frequency: STRICT ENUM, REQUIRED # see §5
estimated_total_duration_weeks: int, REQUIRED, ≥1
nutrition_consultation_included: boolean, REQUIRED
progress_tracking_kind: STRICT ENUM, REQUIRED # see §5
before_after_photo_consent_required: boolean, REQUIRED
session_pricing:
per_session_inr: INR_INTEGER, REQUIRED
pack_total_inr: INR_INTEGER, REQUIRED # 0 if single session
pack_discount_inr: INR_INTEGER, REQUIRED
fare_includes: array<STRICT ENUM>, REQUIRED # see §5
# (all other fields from gym_session/at_home_service - fare, cancellation, freshness, _provider - REQUIRED)
PersonalTrainingTrack
booking_ref: string, REQUIRED
status: STRICT ENUM, REQUIRED # see §5
status_updated_iso: ISO_DATETIME, REQUIRED
session_index_current: int, REQUIRED, ≥0
total_sessions_in_pack: int, REQUIRED
sessions_completed: int, REQUIRED
sessions_skipped: int, REQUIRED
sessions_no_show: int, REQUIRED
next_session_iso: ISO_DATETIME, REQUIRED # may equal future iso
next_session_location: STRICT ENUM, REQUIRED
trainer_arrived_iso: ISO_DATETIME, REQUIRED # may equal future
session_in_progress: boolean, REQUIRED
progress_log_count: int, REQUIRED, ≥0
support_phone: string, REQUIRED
support_email: string, REQUIRED
Forbidden fields
paid_placement_score | sponsored_rank | promotion_priority |
fake_recent_session_text | auto_inflate_pt_sessions_completed |
ai_generated_photos (must equal false) | hidden_pack_fee |
fake_certifications | fake_before_after_photos | fake_client_retention_rate
5. CONTROLLED VOCABULARIES
session_location_kind
at_gym | at_home | outdoor_park | outdoor_track | hybrid_session_pack
session_kind
single_session | multi_session_pack | trial_first_session |
custom_plan_kickoff | follow_up_progress_review
training_program.program_kind
weight_loss_focused | weight_gain_focused | muscle_building |
strength_powerlifting | endurance_marathon | postnatal_recovery |
post_injury_rehab | sport_specific_cricket | sport_specific_tennis |
sport_specific_running | calisthenics_progression | functional_fitness |
seniors_fitness | youth_athletic_dev | general_fitness | toning_body
training_program.session_pack_kind
single_session | trial_first_session | 4_session_pack | 8_session_pack |
12_session_pack | 24_session_pack | quarterly_program | annual_program |
custom
training_program_match.recommended_session_frequency
once_per_week | twice_per_week | three_per_week | four_per_week |
five_per_week | flexible
training_program_match.progress_tracking_kind
none | weekly_check_in | bi_weekly_assessment | monthly_body_comp |
session_by_session_log | photo_documentation | apple_health_sync |
fitbit_sync
trainer.specializations[]
strength_coach | functional_trainer | bodybuilding_coach |
powerlifting_coach | crossfit_l1 | crossfit_l2 | crossfit_l3 |
nutrition_consultant | postnatal_specialist | rehab_specialist |
sport_coach | weight_loss_specialist | senior_fitness | youth_coach |
calisthenics_coach | running_coach | endurance_coach
trainer.certifications[]
acsm_certified | nasm_certified | issa_certified | aceit_certified |
icb_l1 | icb_l2 | icb_l3 | nesta_certified | acefit_certified |
nutrition_certified_iaa | nutrition_certified_isa | yoga_alliance_200 |
postnatal_certified | rehab_certified | partner_internal_cert
trainer.certifying_authorities[]
acsm | nasm | issa | acefit | crossfit_inc | icb_kindred |
nesta | iaa | isa | yoga_alliance | partner_internal
trainer.competition_kinds[]
none | bodybuilding | powerlifting | crossfit | marathon |
calisthenics | sport_specific | other
trainer.gender, age_band, employed_kind
Same as lifestyle.book_gym_session §5.
session_pricing.fare_includes[]
session_attendance | gym_pass_for_session | trainer_fee |
nutrition_plan | progress_tracking | before_after_photos |
custom_workout_program | follow_up_session_30day_post |
whatsapp_support | apple_health_integration
PersonalTrainingTrack.status
booked | first_session_pending | program_in_progress |
session_in_progress | between_sessions | program_complete |
cancelled_by_user | cancelled_by_trainer | trainer_replaced |
program_paused | session_no_show | failed
PersonalTrainingTrack.next_session_location
Same as session_location_kind.
cancel_appointment.reason
Same as lifestyle.book_salon §5 + ADD program_unsuitable_after_trial.
merchant_id resolution order
1. partner_id + ":" + trainer_id
2. Google Place ID (if at_gym fixed gym)
6. TTBS DIMENSIONS (DELTA)
Per-domain weights
lifestyle (book_personal_trainer): { time: 0.30, taste: 0.40, budget: 0.20, safety: 0.10 }
TASTE (override)
SIGNALS USED:
- trainer.rating_avg weight 0.20
- trainer.client_retention_rate_30day weight 0.20
- training_program_match.feasibility_score weight 0.20
- training_program_match.trainer_specialization_match HARD FILTER if mismatch
- trainer.specializations match user.fitness_goals weight 0.20
- trainer.before_after_results_count weight 0.10
- trainer.competitive_athlete_background (if relevant) weight 0.10
HARD FILTERS:
- trainer_certifications_required AND trainer.certifications=empty → drop
- trainer.certifying_authorities ⊂ trainer_certification_authority_acceptable
- trainer_specializations_required ⊂ trainer.specializations
- postnatal_specialist needed AND trainer.postnatal_certified=false → drop
- rehab needed AND trainer.rehab_certified=false → drop
SAFETY
(Inherits from gym_session for at_gym, from at_home_service for at_home. KYC HARD FILTER critical for at_home PT.)
Hidden ranking factor
information_completeness_score weight 0.10.
7. COMPLETION CONTRACT
POST /api/v1/cpc/mcp_provider/{tomo_partner_id}
{
"intent": "lifestyle.book_personal_trainer",
"intent_version": "v1.0.0",
"external_id": "PT-XYZ",
"amount_inr": 18000,
"closed_at": "2026-08-12T19:00:00+05:30",
"request_id": "req_pt_8h2k_...",
"status": "completed",
"booking_ref": "PT-XYZ",
"trainer_id": "trainer_xyz",
"session_location_kind": "at_gym",
"program_started_at": "2026-05-12T07:00:00+05:30",
"program_ended_at": "2026-08-12T19:00:00+05:30",
"sessions_attended": 10,
"sessions_skipped": 2,
"sessions_failed_by_trainer": 0,
"before_after_consent": true,
"any_safety_incident": false,
"currency": "INR",
"fare_breakdown_total_inr": 18000,
"rider_tip_inr": 1500,
"ratings_pending": true,
"notes": ""
}
Status enum: completed | cancelled_by_user | cancelled_by_trainer | failed | trainer_replaced_completed | partial_completion_user_dropped
8. WIDGET / 9. CACHING / 10. ERROR CODES / 11. CHECKLIST
(Inherit from lifestyle.book_gym_session and lifestyle.book_at_home_service. Widget type: personal_trainer_options.)
12. ANTI-FABRICATION RULES
All from lifestyle.book_salon + lifestyle.book_gym_session + (if at_home) lifestyle.book_at_home_service REQUIRED. ADD:
RULE 17 — Trainer certifications real and current.
Cert lapsed > 12 months without renewal = breach.
RULE 18 — Before/after photos consent + real.
before_after_results_count claim must be backed by real client photos with
signed consent. Stock photos = breach.
RULE 19 — Client retention rate honest.
client_retention_rate_30day must come from CPC ledger of repeat bookings.
RULE 20 — Specialization claim verifiable.
postnatal_specialist with no postnatal cert = breach.
RULE 21 — No silent trainer swap mid-pack.
If trainer becomes unavailable, replacement requires user accept.
RULE 22 — Session attendance honest.
trainer cannot mark "session attended" if user no-shows. False attendance =
billing fraud.
RULE 23 — Progress logs real.
submit_progress_log must contain actual session metrics. Boilerplate fake
logs = breach.
RULE 24 — Pack discount honored.
pack_discount_pct must reflect actual price reduction. Hidden hike pre-discount
= breach.
RULE 25 — Nutrition consultation, when included, must be real.
Fake "1-page generic plan" called "personalized nutrition" = breach.
VERSION HISTORY
v1.0.0 — 2026-05-10 — Initial spec (delta over gym_session + at_home_service for PT)