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 byservice_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)