lifestyle.book_spa_treatment — Full Intent Specification
INTENT NAMESPACE: lifestyle
INTENT NAME: book_spa_treatment
FULL ID: lifestyle.book_spa_treatment
VERSION: v1.0.0
STATUS: draft
LAST UPDATED: 2026-05-10
TTBS WEIGHTS: time 0.20 · taste 0.40 · budget 0.30 · safety 0.10
Spa treatment is a wellness/relaxation service at a spa: massage, body treatments, hydrotherapy, ayurveda, aromatherapy. Inherits from lifestyle.book_salon: every salon-shape field is REQUIRED with spa-domain adaptations. Distinct: (a) spa_kind enum (day_spa, hotel_spa, ayurveda_specialty, aromatherapy_specialty, hydrotherapy); (b) treatment_catalog replaces salon services (massages, body wraps, scrubs, abhyanga, shirodhara); (c) therapist replaces stylist (with massage-specific cert); (d) couples_treatment_supported flag; (e) hygiene + sterilization stricter than salon (oil reuse, linen change, single-use disposables).
Inheritance contract: every field in lifestyle.book_salon §2/§4/§5 is REQUIRED here, adapted to the spa domain.
1. NATURAL LANGUAGE COVERAGE
Classifies IN
- "spa for stress relief"
- "couples massage tomorrow"
- "Ayurveda Abhyanga treatment"
- "Thai massage near me"
- "deep tissue massage"
- "aromatherapy spa session"
- "hot stone massage"
- "Shirodhara head therapy"
- "spa for back pain"
Classifies OUT — borderline NO
- "salon for haircut" →
lifestyle.book_salon - "yoga + meditation" →
lifestyle.book_yoga_class - "massage at home" →
lifestyle.book_at_home_service(massage variant) - "wellness retreat 3-day" →
lifestyle.book_wellness_retreat - "physiotherapy" → typically
lifestyle.book_at_home_service
MULTI-INTENT TRIGGERS
- "spa and dinner reservation" →
lifestyle.book_spa_treatment+food.book_dine_in - "spa and a cab home" →
lifestyle.book_spa_treatment+mobility.book_intracity_ride - "Ayurveda spa and ayurveda meal plan" →
lifestyle.book_spa_treatment+food.subscribe_tiffin
2. INPUT — TOMO → PROVIDER (DELTA)
All fields from lifestyle.book_salon §2 are REQUIRED, adapted:
- REPLACE
services_wanted[].service_kindwithtreatments_wanted[].treatment_kind - ADD
spa_intentblock
{
"intent": "lifestyle.book_spa_treatment",
"intent_version": "v1.0.0",
"request_id": "req_spa_8h2k_2026-05-10T08:00:00Z",
"search_area": { ... },
"scheduled_for_iso": "2026-05-12T17:00:00+05:30",
"duration_minutes_estimated": 90,
"user_profile": {
"gender": "female",
"age_band": "26-35",
"skin_kind": "combination",
"body_kind": "average",
"stress_level": "high",
"medical_conditions": ["mild_back_pain"],
"pregnant_or_postpartum": "none",
"preferred_pressure": "medium"
},
"treatments_wanted": [
{
"treatment_kind": "deep_tissue_massage",
"duration_minutes": 60,
"preferred_therapist_skill_min": 4,
"specific_focus_area": "back_and_shoulders"
},
{
"treatment_kind": "facial_premium",
"duration_minutes": 30,
"preferred_therapist_skill_min": 3,
"specific_focus_area": "face"
}
],
"spa_intent": {
"couples_treatment": false,
"private_room_required": true,
"music_kind_acceptable": ["soft_instrumental", "nature_sounds", "silence"],
"lighting_kind_acceptable": ["dim", "candle"],
"aromatherapy_oils_required": ["lavender", "eucalyptus"],
"hot_towel_application_required": true
},
"preferences": {
"spa_kind_acceptable": ["day_spa", "hotel_spa", "ayurveda_specialty"],
"spa_kind_preferred": "day_spa",
"therapist_gender_preference": "female",
"therapist_min_experience_years": 3,
"therapist_certifications_required": true,
"therapist_kyc_required": true,
"products_kind_preferred": ["forest_essentials", "kama_ayurveda", "tomo_partner_brand"],
"ayurveda_authentic_required": false,
"vegan_products_only": false,
"halal_products_required": false,
"budget_band": "great",
"budget_max_inr_total": 8500,
"lounge_amenity_required": ["air_conditioning", "refreshments_complimentary"],
"atmosphere_kind": "luxe_calm",
"max_wait_minutes_at_spa": 10,
"online_payment_required": true
},
"context": { ... }
}
| Field | Type | Constraint | Notes |
|---|---|---|---|
intent |
string | REQUIRED, equals "lifestyle.book_spa_treatment" |
|
user_profile.body_kind |
enum | REQUIRED, see §5 | |
user_profile.stress_level |
enum | REQUIRED, see §5 | |
user_profile.medical_conditions |
array |
REQUIRED, may be empty | see §5 |
user_profile.pregnant_or_postpartum |
enum | REQUIRED | same as yoga §5 |
user_profile.preferred_pressure |
enum | REQUIRED, STRICT light | medium | firm | deep |
|
treatments_wanted[].treatment_kind |
enum | REQUIRED, see §5 | |
treatments_wanted[].specific_focus_area |
enum | REQUIRED, see §5 | |
spa_intent.couples_treatment |
bool | REQUIRED | |
spa_intent.private_room_required |
bool | REQUIRED | |
spa_intent.music_kind_acceptable |
array |
REQUIRED, ≥1 | see §5 |
spa_intent.lighting_kind_acceptable |
array |
REQUIRED, ≥1 | see §5 |
spa_intent.aromatherapy_oils_required |
array |
REQUIRED, may be empty | see §5 |
spa_intent.hot_towel_application_required |
bool | REQUIRED | |
preferences.spa_kind_acceptable |
array |
REQUIRED, ≥1 | see §5 |
preferences.ayurveda_authentic_required |
bool | REQUIRED | drives certification HARD FILTER |
REMOVED from salon:
user_profile.hair_kind,hair_length,current_color(cosmetic salon-specific)
Anti-fabrication preamble (universal): no paid placement, no urgency text, no commission-influenced fields.
3. PROVIDER TOOLS
8 tools from lifestyle.book_salon REQUIRED with SalonOption replaced by SpaTreatmentOption. Adapted: stylist→therapist, services→treatments.
ADD:
Tool 9: validate_treatment_compatibility
PURPOSE: partner confirms treatment is safe given user's medical_conditions/pregnancy
INPUT: { spa_id, therapist_id, treatments_wanted, user_profile, request_id }
OUTPUT: { compatibility_status, contra_indications[], modifications_suggested }
SLA: p95 < 800ms
All 9 REQUIRED.
4. RESPONSE SHAPE (DELTA)
SpaTreatmentOption
All from SalonOption REQUIRED, REPLACE salon with spa, services_offered with treatment_catalog, stylists with therapists. ADD spa-specific blocks.
spa:
id: string, REQUIRED
merchant_id: string, REQUIRED
name: string, REQUIRED
brand: string, REQUIRED
spa_kind: STRICT ENUM, REQUIRED # see §5
partner_account_age_days: int, REQUIRED, ≥0
total_treatments_30day: int, REQUIRED, ≥0
founded_year: int, REQUIRED
address: { ... } # same shape
distance_from_user_km: float, REQUIRED
ratings: # same shape, includes:
overall_score: float, REQUIRED, 0-5
overall_count: int, REQUIRED, ≥0
recent_30day_score: float, REQUIRED, 0-5
cleanliness_score: float, REQUIRED, 0-5
therapist_skill_score: float, REQUIRED, 0-5
ambience_score: float, REQUIRED, 0-5
private_room_quality_score: float, REQUIRED, 0-5
on_time_30day_pct: float, REQUIRED, 0-1
operating_hours: { ... }
amenities: # spa-specific
air_conditioning: boolean, REQUIRED
private_treatment_rooms: int, REQUIRED, ≥0
couples_treatment_room: boolean, REQUIRED
showers_count: int, REQUIRED, ≥0
showers_with_hot_water: boolean, REQUIRED
lockers_count: int, REQUIRED, ≥0
locker_secure_lock: boolean, REQUIRED
changing_rooms_count: int, REQUIRED, ≥0
parking_available: boolean, REQUIRED
parking_kind: STRICT ENUM, REQUIRED
refreshments_complimentary: boolean, REQUIRED
herbal_tea_available: boolean, REQUIRED
quiet_zone_strict: boolean, REQUIRED
sauna_available: boolean, REQUIRED
steam_room_available: boolean, REQUIRED
plunge_pool_available: boolean, REQUIRED
relaxation_lounge: boolean, REQUIRED
aromatherapy_diffusion: boolean, REQUIRED
music_zone_isolation: boolean, REQUIRED # rooms acoustically separated
cctv_in_premises: boolean, REQUIRED # public areas only
panic_button_in_treatment_room: boolean, REQUIRED
wheelchair_accessible: boolean, REQUIRED
female_only_floor_available: boolean, REQUIRED
trust:
municipal_license_number: string, REQUIRED
municipal_license_valid_until: ISO_DATE, REQUIRED
hygiene_audit_iso: ISO_DATETIME, REQUIRED
hygiene_audit_score: int, REQUIRED, 0-100
sterilization_certified: boolean, REQUIRED
single_use_disposables: boolean, REQUIRED
linen_change_per_customer: boolean, REQUIRED
oil_reuse_protocol: STRICT ENUM, REQUIRED # see §5
employee_kyc_pct: int, REQUIRED, 0-100
insurance_coverage_inr: INR_INTEGER, REQUIRED
public_liability_coverage: boolean, REQUIRED
aed_defibrillator_present: boolean, REQUIRED
first_aid_kit_present: boolean, REQUIRED
fire_safety_compliant: boolean, REQUIRED
ayurveda_authentic_certified: boolean, REQUIRED
ayurveda_certification_authority: STRICT ENUM, REQUIRED
tomo_field_team_audited: boolean, REQUIRED
photos: { ... } # standard
treatment_catalog: array<TreatmentItem>, REQUIRED, ≥3
available_slots: array<SpaSlotOption>, REQUIRED, ≥1
therapists: array<TherapistProfile>, REQUIRED, ≥1
products_used:
preferred_brands: array<STRICT ENUM>, REQUIRED, ≥1
ayurveda_authentic: boolean, REQUIRED
organic_products_only: boolean, REQUIRED
vegan_products: boolean, REQUIRED
halal_certified_products: boolean, REQUIRED
cruelty_free: boolean, REQUIRED
# (all other standard fields - fare, cancellation, freshness, _provider - REQUIRED)
TreatmentItem
treatment_id: string, REQUIRED
treatment_kind: STRICT ENUM, REQUIRED # see §5
treatment_name: string, REQUIRED
description: string, REQUIRED # ≥80 chars
duration_minutes: int, REQUIRED, ≥30
price_inr: INR_INTEGER, REQUIRED
mrp_inr: INR_INTEGER, REQUIRED
discount_pct: float, REQUIRED, 0-1
gender_for: STRICT ENUM, REQUIRED
includes: array<string>, REQUIRED, may be empty
products_used: array<string>, REQUIRED, ≥1
photo_url: URL, REQUIRED
photo_ai_generated: boolean, REQUIRED # MUST be false
skill_level_min: int, REQUIRED, 1-5
contra_indications: array<STRICT ENUM>, REQUIRED, may be empty # see §5
pregnancy_safe: STRICT ENUM, REQUIRED # see §5
recovery_minutes: int, REQUIRED, ≥0
allergen_disclosure: array<STRICT ENUM>, REQUIRED, may be empty
ayurveda_classification: STRICT ENUM, REQUIRED # see §5; "not_ayurveda" if not
TherapistProfile
(Subset of StylistProfile + spa-specific. All fields REQUIRED.)
therapist_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
specializations: array<STRICT ENUM>, REQUIRED, ≥1 # see §5
certifications: array<STRICT ENUM>, REQUIRED, may be empty
certifying_authorities: array<STRICT ENUM>, REQUIRED, may be empty
ayurveda_certified: boolean, REQUIRED
trained_in_lineage: STRICT ENUM, REQUIRED # see §5; "modern_western" if not ayurveda
languages_spoken: array<RFC_3066_LOCALE>, REQUIRED, ≥1
ratings:
rating_avg: float, REQUIRED, 0-5
rating_count: int, REQUIRED, ≥0
treatments_completed_total: int, REQUIRED, ≥0
treatments_completed_30day: int, REQUIRED, ≥0
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
SpaSlotOption
(Same shape as SalonSlotOption. Treatment-room assigned. All fields REQUIRED.)
Forbidden fields
paid_placement_score | sponsored_rank | promotion_priority |
fake_recent_treatment_text | auto_inflate_treatments_completed |
ai_generated_photos (must equal false) | hidden_treatment_fee |
fake_certifications | undisclosed_oil_reuse | fake_ayurveda_authentic |
fake_partner_completion_rate_30d
5. CONTROLLED VOCABULARIES
spa_kind
day_spa | hotel_spa | resort_spa | ayurveda_specialty |
aromatherapy_specialty | hydrotherapy | thai_specialty |
budget_chain | premium_independent | celebrity_brand |
medical_spa | dermatology_spa
user_profile.body_kind
slim | average | athletic | curvy | plus_size
user_profile.stress_level
low | medium | high | extreme
user_profile.medical_conditions[]
hypertension | diabetes | heart_condition | back_pain | mild_back_pain |
neck_pain | shoulder_problem | knee_problem | hernia | varicose_veins |
recent_surgery | recent_injury | skin_condition | allergies |
medication_dependent | other | none
user_profile.preferred_pressure
light | medium | firm | deep
treatments_wanted[].treatment_kind and TreatmentItem.treatment_kind
swedish_massage | deep_tissue_massage | thai_massage | hot_stone_massage |
aromatherapy_massage | sports_massage | reflexology | shiatsu |
lymphatic_drainage | trigger_point_therapy |
abhyanga | shirodhara | udvartana | choornaswedan | nasya |
kati_basti | greeva_basti | janu_basti |
body_scrub | body_polish | body_wrap | body_mask | mud_therapy |
hydrotherapy | turkish_bath | onsen_soak | float_tank |
facial_basic | facial_premium | facial_hydra | facial_oxygen |
facial_anti_aging | facial_brightening |
manicure_basic | manicure_french | manicure_gel |
pedicure_basic | pedicure_premium | pedicure_paraffin |
eyebrow_threading | facial_threading | waxing_full_arms |
prenatal_massage | postnatal_massage | senior_massage |
couples_package | bridal_package | groom_package
treatments_wanted[].specific_focus_area
full_body | back_and_shoulders | neck_and_shoulders | feet | scalp |
face | hands | abdomen | legs | head | full_back | upper_back | lower_back
TreatmentItem.gender_for
female | male | unisex | couples
TreatmentItem.contra_indications[]
hypertension | pregnancy | recent_surgery | open_wounds |
deep_vein_thrombosis | severe_varicose_veins | acute_inflammation |
cancer_active_treatment | severe_skin_condition | none
TreatmentItem.pregnancy_safe
not_safe | safe_t1 | safe_t2 | safe_t3 | safe_all_trimesters |
postpartum_safe | not_applicable
TreatmentItem.allergen_disclosure[]
nut_oils | dairy_extracts | egg_extracts | sulphates | parabens |
synthetic_fragrance | latex | beeswax | seaweed | none
TreatmentItem.ayurveda_classification
not_ayurveda | classical_ayurveda_panchakarma | classical_ayurveda_external |
modern_ayurveda_inspired | herbal_treatment | tribal_traditional
spa.trust.oil_reuse_protocol
single_use_only | hot_recycle_filtered | no_oil_treatment | pour_to_disposable
spa.trust.ayurveda_certification_authority
none | traditional_ayurveda_council | rashtriya_ayurveda_vidyapeeth |
nimsme | partner_internal | family_lineage_certificate
spa_intent.music_kind_acceptable[]
silence | soft_instrumental | nature_sounds | tibetan_bowls |
classical | bowls_and_chimes | mantra | partner_curated
spa_intent.lighting_kind_acceptable[]
candle | dim | warm | natural_with_curtains | mood_lighting
spa_intent.aromatherapy_oils_required[]
lavender | eucalyptus | tea_tree | peppermint | rosemary |
chamomile | sandalwood | jasmine | rose | bergamot | lemon |
ylang_ylang | frankincense | none
TherapistProfile.specializations[]
swedish_massage | deep_tissue | thai_massage | hot_stone |
aromatherapy | reflexology | shiatsu | lymphatic_drainage |
ayurveda_panchakarma | abhyanga_specialist | shirodhara_specialist |
prenatal_massage | postnatal_massage | sports_therapy |
facial_specialist | body_treatments | manicure_pedicure |
hydrotherapy
TherapistProfile.certifications[]
imt_certified | itec_certified | cidesco_certified |
ayurveda_panchakarma_diploma | ayurveda_diploma_traditional |
swedish_massage_certified | thai_massage_certified |
shiatsu_certified | reflexology_certified |
state_council_certified | partner_internal_cert
TherapistProfile.certifying_authorities[]
imt | itec | cidesco | iyengar_authority | yoga_alliance |
indian_state_council | ayurveda_council | foreign_school |
partner_internal
TherapistProfile.trained_in_lineage
modern_western | swedish_lineage | thai_lineage | chinese_tcm |
ayurveda_traditional | ayurveda_modern | family_lineage_indian | mixed
TherapistProfile.gender, age_band, employed_kind
Same as lifestyle.book_salon §5.
cancel_appointment.reason
Same as base + medical_contraindication_arose.
merchant_id resolution order
1. Google Place ID
2. Municipal license number
3. partner_id + ":" + spa_id
6. TTBS DIMENSIONS (DELTA)
Per-domain weights
lifestyle (book_spa_treatment): { time: 0.20, taste: 0.40, budget: 0.30, safety: 0.10 }
TASTE (override)
SIGNALS USED:
- spa.ratings.therapist_skill_score weight 0.25
- spa.ratings.recent_30day_score weight 0.15
- spa.ratings.private_room_quality_score (if private requested) weight 0.15
- therapist specializations match treatment_kind weight 0.20
- amenities match preferences weight 0.15
- spa.products_used.preferred_brands overlap user weight 0.10
HARD FILTERS:
- couples_treatment AND couples_treatment_room=false → drop
- private_room_required AND private_treatment_rooms=0 → drop
- ayurveda_authentic_required AND ayurveda_authentic_certified=false → drop
- therapist_certifications_required AND certifications=empty → drop
SAFETY
SIGNALS USED:
- spa.trust.sterilization_certified HARD FILTER
- spa.trust.single_use_disposables HARD FILTER
- spa.trust.linen_change_per_customer HARD FILTER
- spa.trust.fire_safety_compliant HARD FILTER
- spa.trust.aed_defibrillator_present weight 0.20
- spa.trust.first_aid_kit_present HARD FILTER
- spa.trust.public_liability_coverage weight 0.15
- therapist.kyc.background_check_passed HARD FILTER
- spa.amenities.panic_button_in_treatment_room HARD FILTER (when alone in room)
- validate_treatment_compatibility for medical conditions HARD FILTER
- pregnancy_safe matches user.pregnant_or_postpartum HARD FILTER
- spa.trust.oil_reuse_protocol=single_use_only OR hot_recycle_filtered HARD FILTER
HARD FILTERS:
- therapist_kyc_required AND any KYC=false → drop
- female user requesting female therapist → drop male
- user has contra_indication for treatment → drop
- pregnant AND treatment not pregnancy_safe → drop
TIME, BUDGET, Hidden ranking factor
Same as lifestyle.book_salon §6.
7. COMPLETION CONTRACT
POST /api/v1/cpc/mcp_provider/{tomo_partner_id}
{
"intent": "lifestyle.book_spa_treatment",
"intent_version": "v1.0.0",
"external_id": "SPA-XYZ",
"amount_inr": 7500,
"closed_at": "2026-05-12T18:30:00+05:30",
"request_id": "req_spa_8h2k_...",
"status": "completed",
"appointment_ref": "SPA-XYZ",
"spa_id": "spa_8423",
"therapist_id": "therapist_xyz",
"checked_in_at": "2026-05-12T16:55:00+05:30",
"treatment_started_at": "2026-05-12T17:08:00+05:30",
"treatment_completed_at": "2026-05-12T18:25:00+05:30",
"duration_actual_minutes": 77,
"treatments_performed": ["deep_tissue_massage", "facial_premium"],
"any_safety_incident": false,
"products_used_inr": 850,
"currency": "INR",
"fare_breakdown_total_inr": 7500,
"rider_tip_inr": 800,
"ratings_pending": true,
"notes": ""
}
Status enum: completed | cancelled_by_user | cancelled_by_spa | no_show | failed | partial_completion_user_left_early | medical_event_treatment_halted
8. WIDGET / 9. CACHING / 10. ERROR CODES / 11. CHECKLIST
(Inherit from lifestyle.book_salon §8-11 with spa-specific adaptations. Widget type: spa_treatment_options.)
12. ANTI-FABRICATION RULES
All from lifestyle.book_salon §12 REQUIRED. ADD:
RULE 17 — Oil reuse protocol honest.
oil_reuse_protocol claim must reflect actual practice. Reusing oil across
customers when single_use claimed = severe hygiene + cross-infection breach.
RULE 18 — Single-use disposables real.
Single-use claim verifiable. Reusing towels/brushes = breach.
RULE 19 — Linen change per customer enforced.
Stained or reused linen = breach.
RULE 20 — Ayurveda authentic claim verifiable.
ayurveda_authentic_certified=true requires authority cert. Marketing-as-
ayurveda without lineage = breach + cultural misrepresentation.
RULE 21 — Pregnancy-safe enforced.
Treatments with contra-indications for pregnancy must HARD FILTER.
Performing prohibited treatment on pregnant user = severe breach + safety
hazard + criminal exposure.
RULE 22 — Contra-indication validation real.
validate_treatment_compatibility must check the user's disclosed conditions.
Approving treatment that's contraindicated = breach + medical safety hazard.
RULE 23 — Panic button in treatment room functional.
When user is alone with therapist, panic button must reach partner ground
team within 60s. Decorative button = severe safety breach.
RULE 24 — No silent therapist swap.
Booked therapist = arriving therapist. If unavailable, replacement requires
user accept.
RULE 25 — Female therapist for female user honored.
If user requested female + alone + private room, partner cannot send male
therapist. Severe safety breach.
VERSION HISTORY
v1.0.0 — 2026-05-10 — Initial spec (delta over lifestyle.book_salon, spa adaptation)