Intent Spec — entertainment.book_party_hall
FULL ID: entertainment.book_party_hall
VERSION: v1.0.0
STATUS: draft
LAST UPDATED: 2026-05-12
DOMAIN: entertainment
PRIMARY AGENT: EntertainmentAgent
TTBS WEIGHTS: time=0.15 taste=0.35 budget=0.20 safety=0.30
User books a banquet hall, party venue, or celebration space for a private occasion — weddings, birthdays, anniversaries, engagements, baby showers, kitty parties. Distinct from entertainment.book_event_venue (corporate / artistic events) because vendor ecosystem, pricing model, and decor-heavy expectations differ significantly. Hotel banquets, kalyana mandapams (wedding halls), farmhouses, lawns.
Partner exemplars: VenueLook, WedMeGood, Shaadi.com venues, hotel banquet teams, independent kalyana mandapams, farmhouse listings (FarmHouseInn, etc.).
SECTION 1 — INTENT IDENTITY
User wants a venue for a private celebration. Distinct from:
entertainment.book_event_venue— corporate / artistic events; different facility/catering mixfood.book_catering_event— catering only (no venue)food.book_chef_at_home— chef-at-home for small gatherings (no venue rental)
Single intent per booking. Mehendi + Sangeet + Wedding + Reception combos for the same family classify as multi-intent (one party_hall per function) OR as a single multi-day booking — partner decides based on contract pattern.
SECTION 2 — NATURAL LANGUAGE COVERAGE
CLASSIFIES IN
- "Wedding hall for 300 guests"
- "Birthday party venue for 50 kids"
- "Anniversary celebration banquet"
- "Engagement party venue in Madhapur"
- "Reception hall with parking"
- "Kalyana mandapam available on 22 June"
- "Farmhouse for a 2-day function"
- "Mehendi function venue Friday morning"
- "Baby shower at a banquet"
- "House warming function venue"
CLASSIFIES OUT — BORDERLINE NO
- "Conference / product launch / corporate offsite" →
entertainment.book_event_venue - "Wedding photographer / decorator only" → out of scope v1 (potential v1.1+
lifestyle.book_event_vendor) - "Catering only, host at home" →
food.book_catering_event
MULTI-INTENT TRIGGERS
- "Wedding venue + catering + photographer" →
entertainment.book_party_hall+food.book_catering_event+ v1.1+ event_vendor - "Birthday venue + cake order" →
entertainment.book_party_hall+food.order_cake_or_special
SECTION 3 — INPUT (TOMO → PROVIDER)
{
"intent": "entertainment.book_party_hall",
"request_id": "req_01J9Z...",
"user_location": { "lat": 17.4475, "lng": 78.3563, "max_radius_km": 30, "city": "Hyderabad" },
"occasion": {
"occasion_type": "wedding", // STRICT ENUM §6
"expected_headcount": 250,
"headcount_min": 200,
"headcount_max": 320,
"event_dates": ["2026-12-15"], // array<ISO_DATE> for multi-day functions
"time_slot": "evening", // STRICT ENUM §6
"religious_format": "hindu_telugu", // STRICT ENUM §6 nullable
"muhurtam_window_required": false // some Hindu weddings have a strict 1-hour muhurtam window
},
"venue_preferences": {
"venue_categories": ["kalyana_mandapam", "banquet_hall", "lawn"], // STRICT ENUM §6
"indoor_outdoor": "either",
"ac_required": true,
"in_house_catering_required": true,
"alcohol_serving_required": false,
"decor_outside_allowed": true,
"parking_for_vehicles_min": 80,
"max_acceptable_cost_inr": 800000
},
"ttbs_user_band": { "time": "flexible", "taste": "great", "budget": "great", "safety": "great" },
"session_context": { "tomo_session_id": "ses_01J9Z...", "user_dna_hash": "dna_v3_a7c9..." }
}
| Field | Type | Constraint | Notes |
|---|---|---|---|
intent |
string | REQUIRED, STRICT ENUM | Always entertainment.book_party_hall |
occasion.occasion_type |
enum | REQUIRED, STRICT ENUM §6 | |
occasion.expected_headcount |
int | REQUIRED, 10-5000 | |
occasion.event_dates |
array |
REQUIRED, ≥1, ISO_DATE | Multi-day weddings common |
occasion.time_slot |
enum | REQUIRED, STRICT ENUM §6 | |
occasion.religious_format |
enum | null | REQUIRED nullable | Drives ritual-space requirements (homa kund, mandap, etc.) |
venue_preferences.venue_categories |
array |
REQUIRED, ≥1, STRICT ENUM §6 | |
venue_preferences.in_house_catering_required |
bool | REQUIRED | Hindi/Tamil weddings often prefer in-house |
venue_preferences.parking_for_vehicles_min |
int | REQUIRED, 0-1000 | Critical signal for venue choice |
Anti-fabrication preamble: Capacity claims must match fire-NOC. Catering quality claims must match observable kitchen output. No fake "available on date" — venues book months ahead.
SECTION 4 — PROVIDER TOOLS
(4-tool pattern: search_party_halls / book_site_visit / confirm_hall_booking / cancel_hall_booking. Confirmation often manual at partner side; allow p99 up to 10s.)
SECTION 5 — RESPONSE SHAPE
PartyHall
PartyHall:
hall_id: { type: string, constraint: REQUIRED }
name: { type: string, constraint: REQUIRED }
category: { type: enum, constraint: REQUIRED, STRICT ENUM §6 }
address: { type: string, constraint: REQUIRED }
location: { type: object, shape: { lat, lng }, constraint: REQUIRED }
distance_from_user_km: { type: float, constraint: REQUIRED, 0-50 }
capacity:
seated: { type: int, constraint: REQUIRED, 10-5000 }
standing: { type: int, constraint: REQUIRED, 10-10000 }
fire_safety_cleared: { type: int, constraint: REQUIRED, 10-10000 }
facilities:
ac: { type: boolean, constraint: REQUIRED }
stage: { type: boolean, constraint: REQUIRED }
dance_floor: { type: boolean, constraint: REQUIRED }
mandap_space: { type: boolean, constraint: REQUIRED }
homa_kund_allowed: { type: boolean, constraint: REQUIRED }
bridal_room: { type: boolean, constraint: REQUIRED }
parking_capacity: { type: int, constraint: REQUIRED, 0-1000 }
valet_service: { type: boolean, constraint: REQUIRED }
elevator: { type: boolean, constraint: REQUIRED }
generator_backup: { type: boolean, constraint: REQUIRED }
catering:
in_house_catering: { type: boolean, constraint: REQUIRED }
cuisines_supported:
type: array<enum>
constraint: REQUIRED, may be empty
values: [hyderabadi, andhra_telangana, south_indian, north_indian, punjabi, gujarati, marwari, bengali, jain, chinese, continental, mughlai, biryani, pure_veg]
per_plate_inr_range_veg:
low: { type: int, constraint: REQUIRED nullable, INR_INTEGER }
high: { type: int, constraint: REQUIRED nullable, INR_INTEGER }
per_plate_inr_range_nonveg:
low: { type: int, constraint: REQUIRED nullable, INR_INTEGER }
high: { type: int, constraint: REQUIRED nullable, INR_INTEGER }
external_caterer_allowed: { type: boolean, constraint: REQUIRED }
external_caterer_fee_inr: { type: int, constraint: REQUIRED, INR_INTEGER, ≥0 }
alcohol:
alcohol_allowed: { type: boolean, constraint: REQUIRED }
in_house_bar: { type: boolean, constraint: REQUIRED }
bar_license_on_file: { type: boolean, constraint: REQUIRED }
byob_allowed: { type: boolean, constraint: REQUIRED }
decor:
decor_outside_allowed: { type: boolean, constraint: REQUIRED }
preferred_decorator_partners: { type: array<string>, constraint: REQUIRED, may be empty }
flower_decor_per_plate_inr: { type: int, constraint: REQUIRED nullable, INR_INTEGER, ≥0 }
pricing:
base_rental_inr_per_session: { type: int, constraint: REQUIRED, INR_INTEGER, ≥0 }
session_definition_hours: { type: int, constraint: REQUIRED, 4-12 }
additional_hour_inr: { type: int, constraint: REQUIRED, INR_INTEGER, ≥0 }
peak_season_premium_pct: { type: int, constraint: REQUIRED, 0-100 }
estimated_total_inr_for_dates: { type: int, constraint: REQUIRED, INR_INTEGER }
advance_payment_pct: { type: int, constraint: REQUIRED, 0-100 }
gst_inr: { type: int, constraint: REQUIRED, INR_INTEGER, ≥0 }
availability:
available_on_dates: { type: boolean, constraint: REQUIRED }
blocked_dates_in_window: { type: array<string>, constraint: REQUIRED, ISO_DATE }
next_available_date: { type: string, constraint: REQUIRED nullable, ISO_DATE }
accessibility:
wheelchair_accessible: { type: boolean, constraint: REQUIRED }
accessible_restrooms: { type: boolean, constraint: REQUIRED }
elderly_friendly: { type: boolean, constraint: REQUIRED, semantics: "seating, AC, no-stairs path" }
ratings:
avg_rating: { type: float, constraint: REQUIRED, 0-5 }
review_count: { type: int, constraint: REQUIRED, ≥0 }
customer_complaint_rate_pct: { type: int, constraint: REQUIRED, 0-100, semantics: "post-event complaints last 12 months" }
policies:
cancellation_cutoff_days: { type: int, constraint: REQUIRED, ≥0 }
cancellation_refund_pct: { type: int, constraint: REQUIRED, 0-100 }
fire_noc_url: { type: string, constraint: REQUIRED, HTTPS URL }
gallery_url: { type: string, constraint: REQUIRED, HTTPS URL }
partner_reference:
source: { type: string, constraint: REQUIRED }
deeplink: { type: string, constraint: REQUIRED, HTTPS URL }
SiteVisitBooking, HallBooking, CancellationResult — straightforward.
FORBIDDEN FIELDS
Standard set + fake_availability (claiming dates available when they aren't) + fake_fire_noc + inflated_capacity + padded_per_plate_pricing (in-house catering charges that exceed visible kitchen output).
SECTION 6 — CONTROLLED VOCABULARIES
occasion.occasion_type:
values: { wedding, reception, engagement, sangeet, mehendi, haldi, baby_shower, naming_ceremony, birthday, milestone_birthday, anniversary, retirement_party, house_warming, kitty_party, religious_function }
occasion.time_slot: { values: { morning, afternoon, evening, full_day, multi_day } }
occasion.religious_format:
values: { hindu_telugu, hindu_tamil, hindu_marwari, hindu_punjabi, hindu_marathi, hindu_bengali, muslim_nikah, sikh_anand_karaj, christian_catholic, christian_protestant, buddhist, jain, secular, regional_other }
venue_preferences.venue_categories / category:
values: { kalyana_mandapam, banquet_hall, hotel_banquet, lawn, farmhouse, club, garden_venue, rooftop, heritage_haveli, beach_venue }
catering.cuisines_supported:
values: { hyderabadi, andhra_telangana, south_indian, north_indian, punjabi, gujarati, marwari, bengali, jain, chinese, continental, mughlai, biryani, pure_veg }
indoor_outdoor: { values: { indoor, outdoor, either } }
SECTION 7 — TTBS DIMENSIONS
TIME (weight = 0.15):
signals_used: [distance, available_on_dates]
TASTE (weight = 0.35):
signals_used:
- category match (kalyana_mandapam vs hotel_banquet are tribally different audiences)
- religious_format support (mandap_space + homa_kund_allowed for Hindu)
- catering.cuisines_supported matching cultural fit
- DNA history
weighting:
category: 0.35
religious_fit: 0.30
cuisine_fit: 0.25
dna: 0.10
BUDGET (weight = 0.20):
signals_used:
- pricing.estimated_total_inr_for_dates within max_acceptable_cost_inr
- per_plate_inr for chosen veg/nonveg mix
SAFETY (weight = 0.30):
signals_used:
- fire_safety_cleared ≥ headcount (MANDATORY floor)
- fire_noc_url present
- accessibility.elderly_friendly (weddings have many elderly attendees)
- parking_capacity ≥ user min (chaos prevention)
- ratings.customer_complaint_rate_pct (lower = better)
- bar_license_on_file (when alcohol_serving_required=true)
weighting:
fire: 0.30
accessibility_elderly: 0.20
parking: 0.20
complaint_rate: 0.15
bar_license: 0.15
SECTION 8 — COMPLETION CONTRACT
POST /api/v1/cpc/mcp_provider/<your_partner_id>
Body:
{
"intent": "entertainment.book_party_hall",
"external_id": "<booking_id>",
"request_id": "<request_id>",
"amount_inr": 420000,
"gst_inr": 75600,
"tips_inr": 0,
"pass_through_inr": 12000, // govt licence renewals / alcohol licence fees
"closed_at": "2026-12-15T23:00:00+05:30",
"status": "completed",
"occasion_type": "wedding",
"actual_headcount": 268,
"category": "kalyana_mandapam"
}
HMAC, 5-min replay, NET-only commission.
SECTION 9 — WIDGET
PartyHallWidget (planned). Field mapping: name + category → header; capacity vs declared headcount + parking_capacity → "Fits X · Parks Y" badge; pricing.estimated_total → big price; cuisines chips; religious_format-fit indicator (e.g. green "Telugu Hindu mandap-ready" pill when match); gallery.
SECTION 10 — CACHING POLICY
| Call | TTL |
|---|---|
| search_party_halls | 5min |
| book_site_visit | NO CACHE |
| confirm_hall_booking | NO CACHE |
| cancel_hall_booking | NO CACHE |
| Hall static | 12h |
SECTION 11 — ERROR CODES
(Standard + DATE_UNAVAILABLE, CAPACITY_EXCEEDED, MUHURTAM_WINDOW_CONFLICT when muhurtam_window_required + slot unavailable.)
SECTION 12 — SANDBOX → PRODUCTION CHECKLIST
[ ] All four tools implemented
[ ] fire_noc_url valid; capacity within NOC
[ ] gallery_url contains real wedding/event photos
[ ] per_plate ranges honest (sample audit against past catering output)
[ ] HMAC + amount_inr=NET; alcohol licence pass-through correct
[ ] Compliance: GSTIN, venue trade license, fire NOC, alcohol licence when applicable, food licence (FSSAI) for in-house catering, privacy policy
SECTION 13 — ANTI-FABRICATION RULES
RULE 1: No paid_placement / ad / kickback.
RULE 2: fire_safety_cleared MUST match NOC. Crowd safety is non-negotiable.
RULE 3: in_house_catering claims with per_plate_inr_range must match actual
kitchen output. Padding plate prices to inflate commission = customer
harm + suspension.
RULE 4: religious_format support (mandap, homa_kund_allowed) must be physically
present. Misclaiming = wedding ruined = suspension + ratings collapse.
RULE 5: available_on_dates must reflect REAL availability. Saying "available"
and revealing conflicts at site visit = customer harm = suspension.
RULE 6: AI-generated wedding photography forbidden. Real customer event photos
only (with attendee permission for gallery use).
RULE 7: alcohol_allowed=true with bar_license_on_file=false is misleading.
Legal exposure for both partner and venue.
RULE 8: customer_complaint_rate_pct must be honest. TOMO will independently
track via post-event surveys.
RULE 9: No "Top Pick" / "TOMO Recommended" badges.
RULE 10: peak_season_premium_pct must be disclosed at quote time, not surprise.
RULE 11: amount_inr in CPC is NET; pass alcohol licence + govt fees through
pass_through_inr.
RULE 12: muhurtam_window_required=true bookings must guarantee venue access
in the stated 1-hour window. Late venue handover during muhurtam =
religious harm + suspension trigger.
VERSION HISTORY
v1.0.0 — 2026-05-12 — Initial spec. NET commission base. Safety-floor on fire
capacity + religious_format integrity + muhurtam window.
Wedding-stakes anti-fabrication rules.