T
TOMO
Developer Docs
BETA These docs are under partner review. Some features described are roadmap items, not yet shipped. Verify against your sandbox before relying on any contract.
● DRAFTv1.0.0lifestyle.book_personal_trainer

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)