Intent Spec — auto.book_detailing
FULL ID: auto.book_detailing
VERSION: v1.0.0
STATUS: draft
LAST UPDATED: 2026-05-12
DOMAIN: auto
PRIMARY AGENT: AutoServicesAgent
TTBS WEIGHTS: time=0.15 taste=0.30 budget=0.30 safety=0.25
User books professional auto detailing — deeper than a wash, broader than paint repair. Covers ceramic coating, paint correction, interior deep clean, leather treatment, headlight restoration, engine bay detail, undercarriage protection. Higher TASTE weight than car_wash because partner brand/quality matters disproportionately to outcomes.
Partner exemplars: 3M Car Care, Detailing Devils, Autoglym authorised, Ceramic Pro outlets, Meguiar's authorised, local high-end detailing studios.
SECTION 1 — INTENT IDENTITY
User wants premium cosmetic + protection work on their vehicle. Distinct from:
auto.book_car_wash— wash is surface clean (foam, vacuum, polish); detailing is deeper (correction, coating, treatment)auto.book_paint_job— actual paint application / repaint for damage; detailing protects existing paintauto.book_general_service— mechanical / fluids, not cosmeticauto.book_major_service— mechanical repair
Single intent per booking. Multi-day stays are normal (full ceramic + interior can take 2-3 days).
SECTION 2 — NATURAL LANGUAGE COVERAGE
CLASSIFIES IN
- "Full detailing for my car"
- "Ceramic coating quote for Innova"
- "Paint correction + polish"
- "Interior deep clean and leather treatment"
- "Headlight restoration"
- "Pre-resale detailing"
- "PPF (paint protection film) installation"
- "Engine bay detail"
- "Make my car look new again"
- "3M-authorised detailing near me"
CLASSIFIES OUT — BORDERLINE NO
- "Just a wash" →
auto.book_car_wash - "Bumper got scratched, repaint" →
auto.book_paint_job - "Service my car" →
auto.book_general_service
MULTI-INTENT TRIGGERS
- "Detailing + paint touch-up" →
auto.book_detailing+auto.book_paint_job - "Full detail before selling + RC transfer prep" →
auto.book_detailing+auto.book_rc_transfer
SECTION 3 — INPUT (TOMO → PROVIDER)
{
"intent": "auto.book_detailing",
"request_id": "req_01J9Z...",
"user_location": { "lat": 17.4475, "lng": 78.3563, "max_radius_km": 25, "city": "Hyderabad" },
"vehicle": {
"type": "car",
"size_class": "sedan", // STRICT ENUM §6
"make": "Toyota",
"model": "Innova Crysta",
"variant": "GX",
"fuel_type": "diesel",
"year_of_manufacture": 2019,
"registration_number_last4": "1234",
"paint_condition": "fair", // STRICT ENUM §6: excellent | good | fair | poor
"current_protection": "none" // STRICT ENUM §6: none | wax | sealant | ceramic_old | ppf_old
},
"detailing_scope": {
"categories": ["paint_correction", "ceramic_coating", "interior_deep"], // STRICT ENUM §6, ≥1
"duration_class": "premium", // STRICT ENUM §6: express | standard | premium | flagship
"coating_tier_preference": "5_year", // STRICT ENUM §6 when ceramic_coating in scope
"ppf_required": false
},
"service_preferences": {
"preferred_window": {
"earliest_drop_off": "2026-05-18T09:00:00+05:30",
"latest_pickup": "2026-05-22T18:00:00+05:30"
},
"max_acceptable_cost_inr": 75000,
"loaner_vehicle_required": true,
"indoor_studio_only": true
},
"ttbs_user_band": {
"time": "flexible",
"taste": "great",
"budget": "good",
"safety": "good"
},
"session_context": { "tomo_session_id": "ses_01J9Z...", "user_dna_hash": "dna_v3_a7c9..." }
}
| Field | Type | Constraint | Notes |
|---|---|---|---|
intent |
string | REQUIRED, STRICT ENUM | Always auto.book_detailing |
vehicle.size_class |
enum | REQUIRED, STRICT ENUM §6 | Drives pricing tier |
vehicle.paint_condition |
enum | REQUIRED, STRICT ENUM §6 | Steers paint_correction scope |
vehicle.current_protection |
enum | REQUIRED, STRICT ENUM §6 | Drives prep requirements |
detailing_scope.categories |
array |
REQUIRED, ≥1, STRICT ENUM §6 | Multi-select |
detailing_scope.duration_class |
enum | REQUIRED, STRICT ENUM §6 | |
detailing_scope.coating_tier_preference |
enum | REQUIRED when ceramic_coating in categories, STRICT ENUM §6 | |
service_preferences.indoor_studio_only |
bool | REQUIRED | Filter for climate-controlled bays |
Anti-fabrication preamble: Provider may not claim coating durability beyond manufacturer-published warranty. Before/after photos must be real, not stock.
SECTION 4 — PROVIDER TOOLS
Tool 1: search_detailing_studios
PURPOSE: Return up to 12 studios capable of declared scope
SLA: p50 ≤ 800ms, p95 ≤ 2000ms, p99 ≤ 4000ms
RATE LIMIT: 60 req/min
IDEMPOTENCY: request_id; 120s cache
RETRY: 1 on 429, 2 on 5xx
Tool 2: get_detailing_quote
PURPOSE: Itemised quote for chosen studio + scope
SLA: p50 ≤ 800ms, p95 ≤ 2000ms
RATE LIMIT: 60 req/min
RETRY: 1 on 5xx
Tool 3: create_detailing_booking
PURPOSE: Confirm slot + scope + price
SLA: p50 ≤ 1500ms, p95 ≤ 4000ms
RATE LIMIT: 30 req/min
IDEMPOTENCY: request_id
RETRY: No retry
Tool 4: cancel_detailing_booking
SLA: p50 ≤ 600ms, p95 ≤ 2000ms
RATE LIMIT: 30 req/min
RETRY: 1 on 5xx
SECTION 5 — RESPONSE SHAPE
DetailingStudio
DetailingStudio:
studio_id: { type: string, constraint: REQUIRED }
name: { type: string, constraint: REQUIRED }
studio_type:
type: enum
constraint: REQUIRED, STRICT ENUM §6
values: [brand_authorised, multi_brand_premium, independent_studio, mobile_detail]
authorised_brands:
type: array<enum>
constraint: REQUIRED, may be empty
values: [ceramic_pro, opti_coat, gtechniq, 3m, autoglym, meguiars, gyeon]
address: { type: string, constraint: REQUIRED }
location: { type: object, shape: { lat, lng }, constraint: REQUIRED }
distance_from_user_km: { type: float, constraint: REQUIRED, 0-50 }
indoor_studio: { type: boolean, constraint: REQUIRED, semantics: "climate-controlled bay" }
bays_available: { type: int, constraint: REQUIRED, 1-20 }
earliest_slot: { type: string, constraint: REQUIRED, ISO_DATETIME }
typical_turnaround_days:
type: object
constraint: REQUIRED
shape:
express: { type: int, constraint: REQUIRED, 1-3 }
premium: { type: int, constraint: REQUIRED, 1-7 }
flagship: { type: int, constraint: REQUIRED, 2-14 }
capabilities:
type: array<enum>
constraint: REQUIRED, ≥1
values: [paint_correction_1_step, paint_correction_multi_step, ceramic_3yr, ceramic_5yr, ceramic_7yr, ceramic_10yr, ppf_install, headlight_restoration, leather_treatment, engine_bay, undercarriage]
estimated_cost_range:
low_inr: { type: int, constraint: REQUIRED, INR_INTEGER, ≥0 }
high_inr: { type: int, constraint: REQUIRED, INR_INTEGER, ≥0 }
semantics: { type: string, constraint: REQUIRED }
warranty:
coating_warranty_years: { type: int, constraint: REQUIRED nullable, 0-10, semantics: "manufacturer-backed; null if no coating in scope" }
labour_warranty_months: { type: int, constraint: REQUIRED, 0-12 }
warranty_terms_url: { type: string, constraint: REQUIRED, HTTPS URL }
before_after_gallery_url: { type: string, constraint: REQUIRED, HTTPS URL, semantics: "real photo gallery, AI-generated forbidden" }
loaner_vehicle_available: { type: boolean, constraint: REQUIRED }
loaner_per_day_inr: { type: int, constraint: REQUIRED, INR_INTEGER, ≥0 }
ratings:
avg_rating: { type: float, constraint: REQUIRED, 0-5 }
review_count: { type: int, constraint: REQUIRED, ≥0 }
repeat_customer_pct: { type: int, constraint: REQUIRED, 0-100 }
partner_reference:
source: { type: string, constraint: REQUIRED }
deeplink: { type: string, constraint: REQUIRED, HTTPS URL }
DetailingQuote
DetailingQuote:
quote_id: { type: string, constraint: REQUIRED }
studio_id: { type: string, constraint: REQUIRED }
validity_until: { type: string, constraint: REQUIRED, ISO_DATETIME, ≥48h }
line_items:
type: array<LineItem>
constraint: REQUIRED, ≥1
shape:
sku: { type: string, constraint: REQUIRED }
description: { type: string, constraint: REQUIRED }
category: { type: enum, constraint: REQUIRED, STRICT ENUM §6 }
unit_price_inr: { type: int, constraint: REQUIRED, INR_INTEGER }
total_inr: { type: int, constraint: REQUIRED, INR_INTEGER }
totals:
subtotal_inr: { type: int, constraint: REQUIRED, INR_INTEGER }
discount_inr: { type: int, constraint: REQUIRED, INR_INTEGER, ≥0 }
gst_inr: { type: int, constraint: REQUIRED, INR_INTEGER, ≥0 }
total_inr: { type: int, constraint: REQUIRED, INR_INTEGER }
DetailingBooking
DetailingBooking:
booking_id: { type: string, constraint: REQUIRED, immutable }
studio_id: { type: string, constraint: REQUIRED }
quote_id: { type: string, constraint: REQUIRED }
drop_off_at: { type: string, constraint: REQUIRED, ISO_DATETIME }
estimated_pickup: { type: string, constraint: REQUIRED, ISO_DATETIME }
loaner_arranged: { type: boolean, constraint: REQUIRED }
total_inr: { type: int, constraint: REQUIRED, INR_INTEGER }
service_advisor_phone: { type: string, constraint: REQUIRED, E.164 }
payment_due_at: { type: enum, constraint: REQUIRED, STRICT ENUM §6, values: [50_percent_now_balance_on_pickup, on_pickup, on_completion] }
CancellationResult
CancellationResult:
booking_id: { type: string, constraint: REQUIRED }
cancelled_at: { type: string, constraint: REQUIRED, ISO_DATETIME }
cancellation_fee_inr: { type: int, constraint: REQUIRED, INR_INTEGER, ≥0 }
refund_amount_inr: { type: int, constraint: REQUIRED, INR_INTEGER, ≥0 }
refund_eta_days: { type: int, constraint: REQUIRED, 0-21 }
FORBIDDEN FIELDS
paid_placement_score,ad_bid,sponsored_rank,promotion_priority,kickback_amountartificial_urgency_textai_generated_photo(CRITICAL — before/after must be real)commission_padded_pricecoating_warranty_inflated(warranty claims beyond manufacturer's published terms)
SECTION 6 — CONTROLLED VOCABULARIES
vehicle.size_class: { values: { hatchback, sedan, suv, luv, mpv } }
vehicle.paint_condition:
values:
excellent: "Showroom condition, no defects"
good: "Minor swirls, faded clearcoat OK"
fair: "Visible swirls, scratches, fading"
poor: "Heavy oxidation, deep scratches, chipping"
vehicle.current_protection:
values:
none: "No protection"
wax: "Waxed within last 6 months"
sealant: "Synthetic sealant"
ceramic_old: "Ceramic coating past warranty / degraded"
ppf_old: "PPF past warranty / damaged"
detailing_scope.categories:
values:
paint_correction: "Polish out swirls/scratches"
ceramic_coating: "Ceramic protection coating"
ppf: "Paint protection film"
interior_basic: "Basic interior vacuum + wipe"
interior_deep: "Deep clean — seats, carpets, headliner, leather"
leather_treatment: "Leather condition + protect"
headlight_restore: "Headlight clearcoat restore"
engine_bay: "Engine bay detail"
undercarriage: "Underbody clean + rust protection"
detailing_scope.duration_class:
values:
express: "Same-day, single category"
standard: "1-2 day, 2-3 categories"
premium: "2-4 day, multiple categories + coating"
flagship: "5+ day, full restoration + premium coating"
detailing_scope.coating_tier_preference:
values:
3_year: "3-year manufacturer warranty"
5_year: "5-year"
7_year: "7-year"
10_year: "10-year (flagship)"
studio_type:
values:
brand_authorised: "Authorised by a coating/film brand (Ceramic Pro, 3M, etc.)"
multi_brand_premium: "Premium independent with multiple brand certs"
independent_studio: "Independent specialist"
mobile_detail: "Mobile detailer (limited scope; no coating)"
line_item.category:
values: { paint, ceramic, ppf, interior, leather, headlight, engine, undercarriage, labour }
payment_due_at:
values: { 50_percent_now_balance_on_pickup, on_pickup, on_completion }
SECTION 7 — TTBS DIMENSIONS
TIME (weight = 0.15):
signals_used: [distance, earliest_slot, typical_turnaround_days]
weighting: { distance: 0.2, slot_fit: 0.4, turnaround: 0.4 }
TASTE (weight = 0.30):
signals_used:
- studio_type (brand_authorised weighted higher)
- authorised_brands matching user DNA preferences
- capabilities matching declared categories exactly
weighting:
type: 0.30
brand_match: 0.35
capability_match: 0.35
user_band_handling:
fast: relax brand_match
balanced: standard
flexible: prefer brand_authorised at premium tiers (Ceramic Pro / Opti-Coat)
BUDGET (weight = 0.30):
signals_used: [estimated_cost_range, loaner_per_day_inr]
weighting: { cost: 0.85, loaner: 0.15 }
user_band_handling:
ok: prefer express duration_class, multi_brand_premium
good: balance cost vs warranty length
great: prefer flagship duration + 10_year coating + brand_authorised
SAFETY (weight = 0.25):
signals_used:
- warranty.coating_warranty_years
- indoor_studio (mandatory floor for coating work)
- ratings.repeat_customer_pct
- before_after_gallery_url (must be real, verified by TOMO sample audit)
weighting:
coating_warranty: 0.30
indoor: 0.25
repeat: 0.25
gallery_real: 0.20
SECTION 8 — COMPLETION CONTRACT
POST /api/v1/cpc/mcp_provider/<your_partner_id>
Body:
{
"intent": "auto.book_detailing",
"external_id": "<booking_id>",
"request_id": "<request_id>",
"amount_inr": 42000, // NET (supplier-kept labour + materials margin)
"gst_inr": 7560,
"tips_inr": 0,
"pass_through_inr": 0,
"closed_at": "2026-05-22T16:30:00+05:30",
"status": "completed",
"categories_performed": ["paint_correction", "ceramic_coating", "interior_deep"],
"coating_tier_applied": "5_year",
"warranty_card_issued": true
}
HMAC, 5-min replay, NET-only commission.
SECTION 9 — WIDGET
DetailingStudioWidget (planned). Interim: gallery-enabled ListingsWidget.
Field mapping:
- DetailingStudio.name → header
- studio_type + authorised_brands → subline 1 (cert badges visible)
- distance + typical_turnaround_days[duration_class] → subline 2
- estimated_cost_range → price range pill
- before_after_gallery_url → tappable gallery thumbnail
- warranty.coating_warranty_years → "X-year warranty" pill
- indoor_studio=true → indoor cert badge
SECTION 10 — CACHING POLICY
| Call | TTL |
|---|---|
| search_detailing_studios | 120s |
| get_detailing_quote | 5min |
| create_detailing_booking | NO CACHE |
| cancel_detailing_booking | NO CACHE |
| Studio static (certifications, gallery, capabilities) | 24h |
SECTION 11 — ERROR CODES
| Code | HTTP | Meaning | Retry |
|---|---|---|---|
INVALID_REQUEST |
400 | Malformed | No |
RATE_LIMITED |
429 | Throttle | 1, 2s |
INTERNAL_ERROR |
500 | Partner failure | 2, exp |
SIGNATURE_INVALID |
401 (webhook) | HMAC fail | No |
NO_SLOTS_IN_WINDOW |
200 (empty) | Valid, no matches | n/a |
SCOPE_NOT_SUPPORTED |
422 | Studio can't perform declared categories | No |
BAY_UNAVAILABLE |
409 (create) | Indoor bay needed but full | No |
QUOTE_EXPIRED |
410 (create) | quote.validity_until passed | No; UI re-quotes |
COATING_TIER_UNAVAILABLE |
422 | Requested tier not stocked | No (UI re-prompts) |
LOANER_UNAVAILABLE |
422 | Loaner required but not available that date | No |
CANCELLATION_FEE_DUE |
200 (cancel) | Non-zero fee | n/a |
SECTION 12 — SANDBOX → PRODUCTION CHECKLIST
[ ] All four tools implemented
[ ] At least 3 studios + 8 slots in 7-day window
[ ] indoor_studio claims verifiable via on-site photo upload
[ ] authorised_brands claims backed by uploaded brand authorisation certs
[ ] before_after_gallery_url returns ≥10 real customer photos (no stock)
[ ] All controlled vocabularies respected
[ ] HMAC signing verified
[ ] amount_inr is NET in CPC
[ ] coating_warranty_years matches manufacturer spec exactly
[ ] No forbidden fields
[ ] SLA p95 met
[ ] Compliance docs: GSTIN, shop license, brand authorisation certs, privacy policy URL
SECTION 13 — ANTI-FABRICATION RULES
RULE 1: No paid_placement / ad / kickback. Rejects response.
RULE 2: authorised_brands claims require uploaded current-year authorisation
certs from the brand. Sustained mis-use of brand names triggers
immediate suspension + brand-relationship review.
RULE 3: coating_warranty_years MUST match the coating brand's published
warranty spec. Inflating warranty is grounds for suspension.
RULE 4: before_after_gallery_url MUST contain real customer photos. AI-
generated, stock, or photoshopped before/afters are immediate
suspension. TOMO field-tests via reverse image search.
RULE 5: estimated_cost_range must reflect real bounds. Padding the high end
to make the low end look competitive is forbidden.
RULE 6: capabilities claims (e.g. ceramic_10yr) must be verifiable by
installation records + brand authorisation. False claims = suspension.
RULE 7: indoor_studio=true requires climate-controlled bay. Coating cure
in uncontrolled environment voids manufacturer warranty.
RULE 8: ratings.repeat_customer_pct computed from real return visits.
RULE 9: No artificial_urgency. Detailing is planned spend, not emergency.
RULE 10: No "Top Pick" / "TOMO Recommended" badges. TTBS source-blind.
RULE 11: line_item.category=ceramic must include the brand SKU code so TOMO
can verify against the brand's product catalog.
VERSION HISTORY
v1.0.0 — 2026-05-12 — Initial spec. NET commission base. TASTE-weighted
(0.30) — brand & quality dominate decision.