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_at_home_service

lifestyle.book_at_home_service — Full Intent Specification

INTENT NAMESPACE: lifestyle
INTENT NAME:      book_at_home_service
FULL ID:          lifestyle.book_at_home_service
VERSION:          v1.0.0
STATUS:           draft
LAST UPDATED:     2026-05-10
TTBS WEIGHTS:     time 0.30 · taste 0.30 · budget 0.20 · safety 0.20

At-home service is salon/grooming/wellness service performed at the user's home. Inherits from lifestyle.book_salon: every salon-side field (services_offered, stylist credentials, KYC, hygiene-cert) is REQUIRED. Adds the at-home delta: (a) service_address replaces salon; (b) at_home_kit block (what the professional brings); (c) home_environment_required (lighting, water access, table); (d) arrival_window is critical (no chair for the user to wait in if late); (e) safety up to 0.20 (stranger entering home → strict KYC + verified-by-partner protocol).

Inheritance contract: every field in lifestyle.book_salon §2/§4/§5 except those tied to the physical salon (amenities, address, etc.) is REQUIRED. Partners that implement this intent should either also implement lifestyle.book_salon OR specifically opt into at-home-only mode.


1. NATURAL LANGUAGE COVERAGE

Classifies IN

  • "salon at home for haircut"
  • "beautician at home for facial"
  • "at-home pedicure"
  • "barber to home for shave"
  • "massage at home for back pain"
  • "groomer at home for kids haircut"
  • "bridal hair styling at home"
  • "at-home waxing service"
  • "Urban Company beautician at home"

Classifies OUT — borderline NO

  • "go to salon" → lifestyle.book_salon
  • "spa at spa" → lifestyle.book_spa_treatment (default at-spa)
  • "yoga class" → lifestyle.book_yoga_class
  • "personal trainer at home" → lifestyle.book_personal_trainer (with at-home variant)

MULTI-INTENT TRIGGERS

  • "salon at home and book a cab home for evening" → lifestyle.book_at_home_service + mobility.book_intracity_ride (rare; usually no cab needed)
  • "at-home haircut and birthday cake" → lifestyle.book_at_home_service + food.order_cake_or_special

2. INPUT — TOMO → PROVIDER (DELTA over lifestyle.book_salon)

All fields from lifestyle.book_salon §2 are REQUIRED. REPLACE search_area with service_address. ADD at_home_setup block. REMOVE salon-specific preferences (lounge_amenity_required, online_payment_supported_required becomes required for all at-home).

{
  "intent":          "lifestyle.book_at_home_service",
  "intent_version":  "v1.0.0",
  "request_id":      "req_ahs_8h2k_2026-05-10T08:00:00Z",

  "service_address": {
    "lat":            17.4504,
    "lng":            78.3811,
    "line_1":         "Flat 502, SriHomes Apartment",
    "line_2":         "Hitech City Main Road",
    "neighborhood":   "Madhapur",
    "city":           "Hyderabad",
    "state":          "Telangana",
    "pincode":        "500081",
    "country_code":   "IN",
    "place_kind":     "home",
    "access_notes":   "Lift to 5th floor, Flat B"
  },

  "at_home_setup": {
    "private_room_available":       true,
    "bathroom_access":              true,
    "water_supply_potable":         true,
    "lighting_quality":             "natural_plus_artificial",
    "power_socket_count_available": 3,
    "table_or_chair_available":     true,
    "ac_or_fan_available":          true,
    "wifi_available":               true,
    "kids_or_pets_at_home":         false,
    "kids_or_pets_count":           0,
    "household_members_at_home":    2,
    "alone_or_chaperoned":          "alone_at_home"
  },

  "preferences_at_home": {
    "service_provider_kyc_required":     true,
    "service_provider_uniform_required": true,
    "real_time_tracking_required":       true,
    "panic_button_in_app_required":      true,
    "trip_share_with_emergency_contact_required": true,
    "single_visit_arrival_window_minutes": 15,
    "max_wait_after_window_minutes":      0,
    "auto_provider_replacement_within_minutes": 30
  },

  ... (all other base fields from lifestyle.book_salon §2, EXCLUDING search_area, lounge_amenity_required, max_wait_minutes_at_salon)
}
Field Type Constraint Notes
intent string REQUIRED, equals "lifestyle.book_at_home_service"
service_address.place_kind enum REQUIRED, see §5
service_address.access_notes string REQUIRED, may be empty
at_home_setup.private_room_available bool REQUIRED
at_home_setup.bathroom_access bool REQUIRED
at_home_setup.water_supply_potable bool REQUIRED
at_home_setup.lighting_quality enum REQUIRED, see §5
at_home_setup.power_socket_count_available int REQUIRED, ≥0
at_home_setup.table_or_chair_available bool REQUIRED
at_home_setup.ac_or_fan_available bool REQUIRED
at_home_setup.kids_or_pets_at_home bool REQUIRED drives behavior preferences
at_home_setup.alone_or_chaperoned enum REQUIRED, STRICT alone_at_home | chaperoned | family_at_home | friend_at_home safety signal
preferences_at_home.service_provider_kyc_required bool REQUIRED
preferences_at_home.service_provider_uniform_required bool REQUIRED
preferences_at_home.real_time_tracking_required bool REQUIRED
preferences_at_home.panic_button_in_app_required bool REQUIRED
preferences_at_home.trip_share_with_emergency_contact_required bool REQUIRED
preferences_at_home.single_visit_arrival_window_minutes int REQUIRED, ≥0
preferences_at_home.max_wait_after_window_minutes int REQUIRED, ≥0
preferences_at_home.auto_provider_replacement_within_minutes int REQUIRED, ≥0

REMOVED from lifestyle.book_salon §2:

  • search_area (replaced by service_address)
  • preferences.lounge_amenity_required (no salon lounge)
  • preferences.max_wait_minutes_at_salon (no salon to wait at)

Anti-fabrication preamble (universal): no paid placement, no urgency text, no commission-influenced fields.


3. PROVIDER TOOLS (DELTA)

8 of 9 tools from lifestyle.book_salon §3 are REQUIRED, with SalonOption replaced by AtHomeServiceOption. ADD:

Tool 10: track_provider_arrival

PURPOSE:        live tracking of professional en route
INPUT:          { appointment_ref, request_id }
OUTPUT:         AtHomeArrivalTrack (§4)
SLA:            p95 < 400ms
RATE LIMIT:     ≤ 1 every 30s

Tool 11: confirm_provider_at_door

PURPOSE:        partner records professional arrived at user's door
INPUT:          { appointment_ref, photo_at_door_url, request_id }
OUTPUT:         { acknowledged: true, user_otp_required }
SLA:            p95 < 1500ms

All 11 REQUIRED.


4. RESPONSE SHAPE (DELTA)

AtHomeServiceOption

All fields from SalonOption §4 are REQUIRED, EXCEPT salon.address, salon.amenities (replaced by partner_kitchen-equivalent below), salon.operating_hours (replaced by service_provider_hours).

REPLACE salon block with:

service_partner:
  id:                             string, REQUIRED
  brand:                          string, REQUIRED
  partner_kind:                   STRICT ENUM, REQUIRED         # see §5
  partner_account_age_days:       int, REQUIRED, ≥0
  partner_at_home_volume_30d:     int, REQUIRED, ≥0
  service_zones_covered:          array<string>, REQUIRED, ≥1   # pincodes
  service_provider_pool_size:     int, REQUIRED, ≥1
  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
    bbb_safety_certified:         boolean, REQUIRED
    employee_kyc_pct:             int, REQUIRED, 0-100
    insurance_coverage_inr:       INR_INTEGER, REQUIRED
    public_liability_coverage:    boolean, REQUIRED
    sos_response_team_at_partner: boolean, REQUIRED
    tomo_field_team_audited:      boolean, REQUIRED

at_home_logistics:
  arrival_eta_minutes:            int, REQUIRED                  # from booking_iso
  arrival_window_minutes:         int, REQUIRED                  # tolerance
  service_duration_at_home_minutes: int, REQUIRED
  setup_minutes_required:         int, REQUIRED                  # provider unpacks tools
  cleanup_minutes_required:       int, REQUIRED
  vehicle_kind_to_user:           STRICT ENUM, REQUIRED          # see §5
  panic_button_in_app:            boolean, REQUIRED
  trip_share_supported:           boolean, REQUIRED
  emergency_contact_alerts:       boolean, REQUIRED
  in_app_chat_with_provider:      boolean, REQUIRED
  in_app_call_with_provider:      boolean, REQUIRED
  user_otp_required_at_door:      boolean, REQUIRED
  service_provider_uniform_required: boolean, REQUIRED
  contingency_replacement_minutes: int, REQUIRED                  # SLA for sending replacement

at_home_kit:                       # what provider brings
  primary_tools_kit:              array<STRICT ENUM>, REQUIRED, ≥1   # see §5
  primary_products_kit:           array<STRICT ENUM>, REQUIRED, ≥1
  consumables_brought:            boolean, REQUIRED               # blades, gloves, towels
  single_use_blade:               boolean, REQUIRED               # for hygiene
  single_use_towels:              boolean, REQUIRED
  sterilization_kit_brought:      boolean, REQUIRED               # autoclave or alternative
  protective_floor_sheet:         boolean, REQUIRED
  garbage_disposal_kit:           boolean, REQUIRED
  user_provides_water:            boolean, REQUIRED
  user_provides_chair:            boolean, REQUIRED
  user_provides_mirror:           boolean, REQUIRED

home_environment_required:
  ac_or_fan_required:             boolean, REQUIRED
  bathroom_access_required:       boolean, REQUIRED
  power_sockets_required:         int, REQUIRED, ≥0
  lighting_quality_required:      STRICT ENUM, REQUIRED          # see §5
  flat_table_required:            boolean, REQUIRED
  privacy_required:               STRICT ENUM, REQUIRED          # see §5
  pet_free_zone_required:         boolean, REQUIRED               # for facial/color services

# (all other fields from SalonOption §4 — services_offered, stylists, products_used, ratings,
#  fare, packaging, cancellation, freshness, _provider — REQUIRED)

AtHomeArrivalTrack

appointment_ref:                  string, REQUIRED
status:                           STRICT ENUM, REQUIRED          # see §5
status_updated_iso:               ISO_DATETIME, REQUIRED
status_history:                   array, REQUIRED, ≥1

provider:
  provider_id:                    string, REQUIRED
  display_name:                   string, REQUIRED
  phone_masked:                   string, REQUIRED
  photo_url:                      URL, REQUIRED
  rating_avg:                     float, REQUIRED, 0-5
  in_app_chat_supported:          boolean, REQUIRED
  in_app_call_supported:          boolean, REQUIRED

vehicle:
  vehicle_kind:                   STRICT ENUM, REQUIRED
  plate_masked:                   string, REQUIRED

location:
  current_lat:                    float, REQUIRED
  current_lng:                    float, REQUIRED
  heading_degrees:                float, REQUIRED, 0-360
  speed_kmh:                      float, REQUIRED, ≥0
  location_updated_iso:           ISO_DATETIME, REQUIRED
  status:                         STRICT ENUM, REQUIRED          # see §5

eta:
  to_user_minutes:                int, REQUIRED
  arrival_window_open_iso:        ISO_DATETIME, REQUIRED
  arrival_window_close_iso:       ISO_DATETIME, REQUIRED

safety:
  panic_button_active:            boolean, REQUIRED
  trip_share_active:              boolean, REQUIRED
  trip_share_url:                 URL, REQUIRED
  emergency_contact_alerted:      boolean, REQUIRED               # if emergency triggered

support_phone:                    string, REQUIRED
support_email:                    string, REQUIRED

Forbidden fields (additions over lifestyle.book_salon)

fake_at_home_volume_30d | fake_employee_kyc_pct |
fake_insurance_coverage | hidden_at_home_premium_inr

5. CONTROLLED VOCABULARIES (DELTA)

All vocabularies from lifestyle.book_salon §5 REQUIRED.

service_address.place_kind

home | office | hotel | event_venue | other

at_home_setup.lighting_quality and home_environment_required.lighting_quality_required

poor | adequate | natural_plus_artificial | studio_lighting | salon_grade

at_home_setup.alone_or_chaperoned

alone_at_home | chaperoned | family_at_home | friend_at_home

service_partner.partner_kind

urban_company | youtropolis | jus_now_partner_brand | independent_at_home_chain |
hyperlocal_aggregator | celebrity_brand_at_home | franchise_at_home_chain

at_home_logistics.vehicle_kind_to_user

bike | scooter | car | branded_van | walking

at_home_kit.primary_tools_kit[]

hair_clippers | scissors | combs | hair_dryer_professional | curling_iron |
straightening_iron | facial_steamer | extractor_tools | wax_warmer |
manicure_pedicure_kit | massage_table_portable | electric_shaver |
brush_set | nail_kit_professional | sterilization_unit_portable

at_home_kit.primary_products_kit[]

shampoos_branded | conditioners_branded | hair_serums | colors_branded |
facial_kits | wax_kits | manicure_polishes_branded | massage_oils |
skin_care_branded | dust_powder | aftershave | sanitizers |
gloves | masks

home_environment_required.privacy_required

not_required | private_room_preferred | private_room_required | dedicated_space_no_traffic

AtHomeArrivalTrack.status

booked | provider_assigned | provider_loading_kit | provider_dispatched |
provider_en_route | provider_nearby | provider_at_door | provider_in_premises |
service_in_progress | service_complete | provider_departed | completed |
cancelled_by_user | cancelled_by_provider | provider_no_show | replacement_dispatched |
incident_open

AtHomeArrivalTrack.location.status

loading_kit | en_route | nearby | at_door | in_premises | service_in_progress | departing

cancel_appointment.reason (additions)

provider_no_show | safety_concern | provider_replacement_rejected |
... (all base reasons from lifestyle.book_salon)

6. TTBS DIMENSIONS (DELTA)

All from lifestyle.book_salon §6 REQUIRED with safety reweighted to 0.20.

Per-domain weights (override)

lifestyle (book_at_home_service): { time: 0.30, taste: 0.30, budget: 0.20, safety: 0.20 }

Time up (arrival window critical, no salon to wait in). Safety up (stranger entering home).

TIME (override)

SIGNALS USED:
  - at_home_logistics.arrival_eta_minutes ≤ scheduled HARD FILTER
  - at_home_logistics.arrival_window_minutes (tighter=better) weight 0.30
  - service_partner.ratings.on_time_30day_pct          weight 0.30
  - at_home_logistics.contingency_replacement_minutes ≤ 30 weight 0.20
  - at_home_logistics.setup_minutes_required (lower=better) weight 0.20

SAFETY (override)

SIGNALS USED:
  - service_partner.trust.employee_kyc_pct ≥ 90       HARD FILTER (at_home is stricter than salon)
  - stylist.kyc.background_check_passed               HARD FILTER
  - stylist.kyc.aadhaar_verified                      HARD FILTER
  - service_provider_kyc_required AND any KYC=false → drop  HARD FILTER
  - at_home_logistics.panic_button_in_app             HARD FILTER (if user requested)
  - at_home_logistics.trip_share_supported            HARD FILTER (if user requested)
  - at_home_logistics.emergency_contact_alerts        HARD FILTER (if user requested)
  - at_home_logistics.user_otp_required_at_door       weight 0.20
  - service_provider_uniform_required                 weight 0.10
  - service_partner.trust.public_liability_coverage   weight 0.20
  - service_partner.trust.insurance_coverage_inr ≥ 500K weight 0.20
  - service_partner.trust.sos_response_team_at_partner weight 0.15
  - female user + alone_at_home → female_provider_only HARD FILTER (if requested)

HARD FILTERS:
  - real_time_tracking_required AND tracking unavailable → drop
  - panic_button_required AND not supported → drop
  - alone_at_home AND service_provider_kyc fails → drop

TASTE (inherits)

Same as lifestyle.book_salon §6 TASTE. Weight drops slightly to 0.30 (in-home environment vs salon-grade).

BUDGET (inherits)

Same as lifestyle.book_salon §6 BUDGET. At-home premium typically 1.3-1.5x salon prices — built into base price comparison.

Hidden ranking factor

information_completeness_score weight 0.10.


7. COMPLETION CONTRACT (DELTA)

Same shape as lifestyle.book_salon §7. ADD fields:

POST /api/v1/cpc/mcp_provider/{tomo_partner_id}
{
  "intent":            "lifestyle.book_at_home_service",
  ... (all base fields from lifestyle.book_salon §7) ...

  "provider_arrived_at": "2026-05-12T10:54:00+05:30",
  "service_started_at_home_iso": "2026-05-12T11:08:00+05:30",
  "user_otp_verified":   true,
  "panic_button_triggered": false,
  "any_safety_incident": false,
  "consumables_used_inr": 250,
  "user_kit_disposal_done": true
}

Status enum (same): completed | cancelled_by_user | cancelled_by_provider | no_show | failed | partial_completion_user_left_early | terminated_with_safety_incident


8. WIDGET (DELTA)

WIDGET TYPE:        at_home_service_options
SOURCE:             src/widgets/types.ts
TYPE NAME:          AtHomeServiceOptionsPayload
RENDERED IN:        components/widgets/AtHomeServiceOptionsWidget.tsx

Default: 3 stacked rows showing partner brand, services-fitting-pill, arrival-eta pill, KYC + insurance + safety badge. Tap row → partner detail with full service catalog + provider profiles + reviews → "Book at home". Then AtHomeArrivalCard with live provider tracking + door OTP + panic button.


9. CACHING POLICY

Same as lifestyle.book_salon §9. ADD track_provider_arrival (TTL 0).


10. ERROR CODES (DELTA)

All codes from lifestyle.book_salon §10 REQUIRED. ADD:

Code HTTP Meaning TOMO behavior
OUT_OF_AT_HOME_SERVICE_ZONE 400 pincode not covered surface
PROVIDER_KYC_INVALID 403 provider KYC expired partner reassigns
ARRIVAL_WINDOW_EXPIRED 410 provider couldn't make window replacement dispatch
USER_OTP_FAILED_AT_DOOR 401 OTP mismatch at door partner cancels, refunds
HOME_ENVIRONMENT_INSUFFICIENT 400 home doesn't meet requirements surface
PROVIDER_REPLACEMENT_DECLINED 403 user rejects replacement refund flow
PANIC_BUTTON_TRIGGERED 503 safety incident; service halted partner SOS protocol

11. SANDBOX → PRODUCTION CHECKLIST (DELTA)

All from lifestyle.book_salon §11 REQUIRED. ADD:

[ ] service_provider_kyc_required end-to-end verified (Aadhaar + Background check)
[ ] panic_button_in_app tested with actual SOS dispatch
[ ] trip_share_with_emergency_contact tested
[ ] real_time_tracking accuracy validated (≤30s lag)
[ ] arrival_window enforcement tested (replacement dispatched on miss)
[ ] user_otp_required_at_door tested
[ ] sterilization_kit_brought verified by ride-along audit
[ ] insurance_coverage_inr policy uploaded (≥500K)
[ ] public_liability_coverage policy uploaded
[ ] Female-provider matching tested for alone-at-home female user
[ ] No paid placement / sponsored signals
[ ] customer_support_24x7 verified by TOMO call
[ ] All consumables single-use verified

12. ANTI-FABRICATION RULES (DELTA)

All rules from lifestyle.book_salon §12 REQUIRED. ADD:

RULE 17 — KYC at home is non-negotiable.
  service_provider_kyc_required=true means all KYC artifacts current within
  90 days. Sending unverified provider into a stranger's home = severe
  safety breach.

RULE 18 — Single-use blades absolute.
  single_use_blade=true means new blade per customer, in front of customer.
  Reusing = severe health/safety breach.

RULE 19 — Single-use towels claimed actually disposable.
  Claiming single-use then using cotton towels reused across customers =
  hygiene breach.

RULE 20 — Sterilization-kit-brought verifiable.
  If partner claims at-home sterilization, kit must be visible and
  functioning at user's home. Faking = breach.

RULE 21 — Insurance and liability coverage real.
  insurance_coverage_inr backed by IRDAI-registered policy. Public liability
  coverage backed by enforceable contract. Refusing legitimate claim = breach.

RULE 22 — Panic button hardware/software real.
  panic_button_in_app=true requires actual SOS protocol dispatching partner
  ground team within stated SLA. Fake = severe safety breach.

RULE 23 — Replacement provider in stated SLA.
  contingency_replacement_minutes is a partner SLA. Failing to dispatch
  replacement within window = breach + refund tier.

RULE 24 — No silent gender swap.
  If user requested female provider for at-home and male shows up = breach
  + automatic full refund + safety incident filed.

RULE 25 — Real-time tracking enforced.
  Tracking must be accurate and live. "Last known location" stale > 5min
  during active service = breach + automatic safety review.

RULE 26 — User OTP at door enforced.
  user_otp_required_at_door=true requires partner system to verify OTP
  before service begins. Bypassing for "convenience" = breach.

RULE 27 — Service provider uniform real.
  uniform claim must be observable. Casual clothes when uniform claimed =
  breach.

RULE 28 — Garbage disposal honored.
  garbage_disposal_kit=true means provider takes used products + biological
  waste away. Leaving in user's home = hygiene breach.

VERSION HISTORY

v1.0.0 — 2026-05-10 — Initial spec (delta over lifestyle.book_salon, at-home extension)