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.0auto.book_detailing

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 paint
  • auto.book_general_service — mechanical / fluids, not cosmetic
  • auto.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_amount
  • artificial_urgency_text
  • ai_generated_photo (CRITICAL — before/after must be real)
  • commission_padded_price
  • coating_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.