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_ac_service

Intent Spec — auto.book_ac_service

FULL ID:       auto.book_ac_service
VERSION:       v1.0.0
STATUS:        draft
LAST UPDATED:  2026-05-12
DOMAIN:        auto
PRIMARY AGENT: AutoServicesAgent
TTBS WEIGHTS:  time=0.25 taste=0.15 budget=0.25 safety=0.35

User books AC system service — refrigerant top-up, compressor diagnostic, condenser cleaning, vent/blower service, cabin air filter, electrical fault diagnosis. Most common India use cases: pre-summer prep ("AC isn't cooling"), post-monsoon vent smell, compressor replacement. Higher safety weight than car wash because refrigerant + electrical handling have real consequences.

Partner exemplars: GoMechanic AC, Pitstop AC, MyTVS AC, Bumper, OEM-authorised AC bays, Carrier-authorised independents.


SECTION 1 — INTENT IDENTITY

User wants their vehicle's AC system serviced. Distinct from:

  • auto.book_general_service — full periodic service may include AC check but isn't AC-focused
  • auto.book_major_service — major HVAC overhaul (full system replacement) classifies here only if user explicitly asks AC; major engine/transmission work goes to major_service
  • auto.book_breakdown_assist — AC failure rarely strands a vehicle

Single intent per booking. Compressor replacement is in-scope (it's an AC repair, not engine overhaul).


SECTION 2 — NATURAL LANGUAGE COVERAGE

CLASSIFIES IN

  • "Car AC not cooling, need a check"
  • "Get my AC serviced before summer"
  • "Refrigerant top-up for my Swift"
  • "AC compressor making noise, fix it"
  • "Cabin smells musty when AC turns on"
  • "Vent cleaning + cabin filter replacement"
  • "Honda City AC repair at home"
  • "Full AC service near Madhapur"
  • "AC isn't blowing cold air"
  • "Bike doesn't have AC obviously" — would CLASSIFY OUT

CLASSIFIES OUT — BORDERLINE NO

  • "Full car service" → auto.book_general_service
  • "Engine overhaul" → auto.book_major_service
  • "Battery dead, AC won't turn on" → auto.book_breakdown_assist
  • "Buy a portable AC for home" → not in scope (home appliance)

MULTI-INTENT TRIGGERS

  • "AC service + general service" → auto.book_ac_service + auto.book_general_service
  • "Pre-summer AC + tyre alignment" → auto.book_ac_service + auto.book_tyre_alignment

SECTION 3 — INPUT (TOMO → PROVIDER)

{
  "intent": "auto.book_ac_service",
  "request_id": "req_01J9Z...",
  "user_locale": "en-IN",
  "user_currency": "INR",
  "user_location": { "lat": 17.4475, "lng": 78.3563, "max_radius_km": 12, "city": "Hyderabad" },
  "vehicle": {
    "type": "car",                            // STRICT ENUM §6: car only (two-wheelers excluded — most have no AC)
    "make": "Maruti Suzuki",
    "model": "Swift",
    "variant": "VXi",
    "fuel_type": "petrol",                    // STRICT ENUM §6
    "year_of_manufacture": 2021,
    "registration_number_last4": "1234",
    "current_odometer_km": 42500,
    "ac_system_type": "manual"                // STRICT ENUM §6: manual | automatic | climate_control | dual_zone
  },
  "ac_issue": {
    "category": "not_cooling",                // STRICT ENUM §6
    "user_description": "AC blows but air isn't cold even at max. Started this week.",
    "last_serviced_months_ago": 14            // null when user doesn't know
  },
  "service_preferences": {
    "doorstep_acceptable": true,
    "preferred_window": {
      "start": "2026-05-14T09:00:00+05:30",
      "end":   "2026-05-14T18:00:00+05:30"
    },
    "loaner_vehicle_required": false,
    "authorised_only": false
  },
  "ttbs_user_band": {
    "time":   "balanced",
    "taste":  "balanced",
    "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_ac_service
vehicle.type enum REQUIRED, STRICT ENUM §6 car only
vehicle.ac_system_type enum REQUIRED, STRICT ENUM §6 Drives parts catalog filtering
ac_issue.category enum REQUIRED, STRICT ENUM §6
ac_issue.user_description string REQUIRED, ≤500 chars
ac_issue.last_serviced_months_ago int REQUIRED nullable, 0-120 Drives diagnostic scope
service_preferences.doorstep_acceptable bool REQUIRED Some AC work (compressor) needs workshop

Anti-fabrication preamble: Provider may not recommend full system replacement when refrigerant top-up + leak check would resolve. Diagnostic findings must be evidence-backed.


SECTION 4 — PROVIDER TOOLS

Tool 1: search_ac_service_slots

PURPOSE:      Return up to 15 slots matching window + location + AC issue category
INPUT:        §3
OUTPUT:       array<AcServiceSlot> per §5
SLA:          p50 ≤ 700ms, p95 ≤ 1800ms, p99 ≤ 3500ms
RATE LIMIT:   60 req/min
IDEMPOTENCY:  request_id; 60s cache
RETRY:        1 on 429, 2 on 5xx

Tool 2: create_ac_service_booking

PURPOSE:      Confirm slot + estimated work
INPUT:        { request_id, slot_id, vehicle.*, ac_issue.*, contact_phone, doorstep_address? }
OUTPUT:       AcServiceBooking per §5
SLA:          p50 ≤ 1500ms, p95 ≤ 4000ms
RATE LIMIT:   30 req/min
IDEMPOTENCY:  request_id
RETRY:        No retry on create

Tool 3: cancel_ac_service_booking

PURPOSE:      Cancel before intake
INPUT:        { request_id, booking_id, reason_code }
OUTPUT:       CancellationResult per §5
SLA:          p50 ≤ 600ms, p95 ≤ 1800ms
RATE LIMIT:   30 req/min
RETRY:        1 on 5xx

SECTION 5 — RESPONSE SHAPE

AcServiceSlot

AcServiceSlot:
  slot_id: { type: string, constraint: REQUIRED }
  provider:
    provider_id: { type: string, constraint: REQUIRED }
    name: { type: string, constraint: REQUIRED }
    provider_type:
      type: enum
      constraint: REQUIRED, STRICT ENUM §6
      values: [oem_authorised, multi_brand_garage, ac_specialist, doorstep_mobile]
    address: { type: string, constraint: REQUIRED }
    location: { type: object, shape: { lat, lng }, constraint: REQUIRED }
    distance_from_user_km: { type: float, constraint: REQUIRED, 0-30 }
    refrigerant_handling_certified: { type: boolean, constraint: REQUIRED, semantics: "trained on R134a / R1234yf per industry standards" }

  slot_window:
    start: { type: string, constraint: REQUIRED, ISO_DATETIME }
    end: { type: string, constraint: REQUIRED, ISO_DATETIME }
    typical_duration_hours: { type: float, constraint: REQUIRED, 0.5-6 }
    same_day_completion_likely: { type: boolean, constraint: REQUIRED }

  service_scope:
    code:
      type: enum
      constraint: REQUIRED, STRICT ENUM §6
      values: [basic_check, refrigerant_topup, leak_diagnosis, compressor_service, full_overhaul, cabin_filter_only]
    label: { type: string, constraint: REQUIRED }
    includes:
      type: array<string>
      constraint: REQUIRED, ≥2 entries
      example: ["pressure_test", "cabin_filter_replacement", "vent_clean"]
    refrigerant_type:
      type: enum
      constraint: REQUIRED, STRICT ENUM §6
      values: [r134a, r1234yf, mixed]
      semantics: matched to vehicle.year_of_manufacture (R1234yf for newer vehicles)

  estimated_price:
    diagnostic_fee_inr: { type: int, constraint: REQUIRED, INR_INTEGER, ≥0 }
    diagnostic_fee_waived_if_repair: { type: boolean, constraint: REQUIRED }
    labour_inr: { type: int, constraint: REQUIRED, INR_INTEGER, ≥0 }
    parts_estimate_inr: { type: int, constraint: REQUIRED, INR_INTEGER, ≥0 }
    refrigerant_inr: { type: int, constraint: REQUIRED, INR_INTEGER, ≥0 }
    gst_inr: { type: int, constraint: REQUIRED, INR_INTEGER, ≥0 }
    total_estimate_inr: { type: int, constraint: REQUIRED, INR_INTEGER }
    price_lock_guaranteed: { type: boolean, constraint: REQUIRED }
    price_lock_variance_cap_pct: { type: int, constraint: REQUIRED, 0-50 }

  logistics:
    doorstep_supported: { type: boolean, constraint: REQUIRED, semantics: "doorstep ONLY for basic_check / refrigerant_topup / cabin_filter; compressor work always workshop" }
    while_you_wait_acceptable: { type: boolean, constraint: REQUIRED }
    pickup_drop_supported: { type: boolean, constraint: REQUIRED }

  warranty:
    parts_warranty_months: { type: int, constraint: REQUIRED, 0-24 }
    labour_warranty_months: { type: int, constraint: REQUIRED, 0-6 }
    cooling_performance_warranty_days: { type: int, constraint: REQUIRED, 0-90, semantics: "if AC doesn't cool, partner re-services free" }
    warranty_terms_url: { type: string, constraint: REQUIRED, HTTPS URL }

  ratings:
    avg_rating: { type: float, constraint: REQUIRED, 0-5 }
    review_count: { type: int, constraint: REQUIRED, ≥0 }
    cooling_complaint_resolution_pct: { type: int, constraint: REQUIRED, 0-100 }

  partner_reference:
    source: { type: string, constraint: REQUIRED }
    deeplink: { type: string, constraint: REQUIRED, HTTPS URL }

AcServiceBooking

AcServiceBooking:
  booking_id: { type: string, constraint: REQUIRED, immutable }
  slot_id: { type: string, constraint: REQUIRED }
  scheduled_start: { type: string, constraint: REQUIRED, ISO_DATETIME }
  estimated_completion: { type: string, constraint: REQUIRED, ISO_DATETIME }
  service_scope_confirmed: { type: enum, constraint: REQUIRED, STRICT ENUM §6 }
  total_estimate_inr: { type: int, constraint: REQUIRED, INR_INTEGER }
  service_advisor_name: { type: string, constraint: REQUIRED }
  service_advisor_phone: { type: string, constraint: REQUIRED, E.164 }
  payment_due_at: { type: enum, constraint: REQUIRED, STRICT ENUM §6, values: [intake, completion, weekly_invoice] }
  doorstep_arranged: { type: boolean, constraint: REQUIRED }
  partner_booking_reference: { type: string, constraint: REQUIRED }

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-14 }

FORBIDDEN FIELDS

  • paid_placement_score, ad_bid, sponsored_rank, promotion_priority, kickback_amount
  • artificial_urgency_text (no "AC will fail before summer!" without measurement evidence)
  • ai_generated_photo for shop / vehicle imagery
  • commission_padded_price
  • unnecessary_overhaul_recommendation

SECTION 6 — CONTROLLED VOCABULARIES

vehicle.type: { values: { car: "Four-wheeler with AC system" } }

vehicle.fuel_type: { values: { petrol, diesel, cng, electric, hybrid } }

vehicle.ac_system_type:
  values:
    manual: "Manual rotary controls"
    automatic: "Auto-temp, single zone"
    climate_control: "Climate control with auto modes"
    dual_zone: "Dual-zone climate control"

ac_issue.category:
  values:
    not_cooling:        "Blows air but not cold"
    intermittent:       "Cools sometimes, not always"
    no_air:             "Blower not running"
    smell:              "Musty / chemical odour"
    noise:              "Compressor / blower noise"
    pre_summer_check:   "Scheduled pre-season service"
    leak_suspected:     "Refrigerant runs out quickly"
    electrical_fault:   "AC switch / display malfunction"

service_scope.code:
  values:
    basic_check:        "Diagnostic + pressure check only"
    refrigerant_topup:  "Top-up refrigerant + pressure test"
    leak_diagnosis:     "Find leak source + repair"
    compressor_service: "Compressor diagnostic / replacement"
    full_overhaul:      "Complete system service + parts"
    cabin_filter_only:  "Cabin filter replacement only"

refrigerant_type:
  values:
    r134a:    "R134a (older vehicles, pre-2017)"
    r1234yf:  "R1234yf (newer, EU/EPA compliant)"
    mixed:    "Partner can handle both"

provider_type:
  values:
    oem_authorised:   "Vehicle OEM authorised workshop with AC bay"
    multi_brand_garage: "Independent multi-brand"
    ac_specialist:    "Dedicated AC specialist shop"
    doorstep_mobile:  "Mobile AC service at user location"

payment_due_at:
  values: { intake, completion, weekly_invoice }

Vocabulary changes require v1.x bump.


SECTION 7 — TTBS DIMENSIONS

TIME (weight = 0.25):
  signals_used:
    - provider.distance_from_user_km
    - slot_window.start vs window center
    - typical_duration_hours
    - same_day_completion_likely
  weighting:
    distance: 0.25
    fit: 0.35
    duration: 0.25
    same_day: 0.15
  user_band_handling:
    fast: prefer same_day_completion_likely=true
    balanced: standard
    flexible: any in window

TASTE (weight = 0.15):
  signals_used:
    - provider_type vs DNA history (authorised vs multi-brand)
    - service_scope.code matching declared ac_issue.category
  weighting:
    type: 0.50
    scope_match: 0.50

BUDGET (weight = 0.25):
  signals_used:
    - estimated_price.total_estimate_inr
    - diagnostic_fee_waived_if_repair (bonus when true)
    - price_lock_guaranteed (bonus when true)
  weighting:
    total: 0.55
    fee_waived_bonus: 0.20
    price_lock_bonus: 0.25
  user_band_handling:
    ok: prefer cheapest with refrigerant_handling_certified
    good: balance price vs warranty
    great: prefer OEM-authorised with cooling_performance_warranty_days ≥ 30

SAFETY (weight = 0.35):
  signals_used:
    - refrigerant_handling_certified (mandatory floor)
    - warranty.cooling_performance_warranty_days
    - ratings.cooling_complaint_resolution_pct
    - warranty.parts_warranty_months
  weighting:
    cert: 0.25
    cooling_warranty: 0.30
    resolution_rate: 0.25
    parts_warranty: 0.20
  user_band_handling:
    fast: relax cooling_performance_warranty_days floor
    balanced: standard
    flexible: prefer highest cooling_complaint_resolution_pct

SECTION 8 — COMPLETION CONTRACT

POST /api/v1/cpc/mcp_provider/<your_partner_id>
Body:
{
  "intent":           "auto.book_ac_service",
  "external_id":      "<booking_id>",
  "request_id":       "<request_id>",
  "amount_inr":       2800,    // NET (labour + supplier-margin on parts/refrigerant)
  "gst_inr":          504,
  "tips_inr":         0,
  "pass_through_inr": 0,
  "closed_at":        "2026-05-14T13:30:00+05:30",
  "status":           "completed",
  "service_scope_performed": "refrigerant_topup",
  "warranty_card_issued": true
}

HMAC, 5-min replay, NET-only commission.


SECTION 9 — WIDGET

AcServiceWidget (planned). Interim: generic ListingsWidget.

Field mapping:
  - AcServiceSlot.provider.name → header
  - AcServiceSlot.provider_type + distance_from_user_km → subline 1
  - AcServiceSlot.slot_window.start + typical_duration_hours → subline 2
  - AcServiceSlot.estimated_price.total_estimate_inr → price
  - AcServiceSlot.warranty.cooling_performance_warranty_days → "Cools or we redo X days" pill
  - AcServiceSlot.refrigerant_handling_certified=true → green cert badge

SECTION 10 — CACHING POLICY

Call TTL Rationale
search_ac_service_slots 60s Slot churn moderate
create_ac_service_booking NO CACHE Idempotent by request_id
cancel_ac_service_booking NO CACHE
Provider static (certifications, refrigerant types handled) 24h Static

SECTION 11 — ERROR CODES

Code HTTP Meaning Retry
INVALID_REQUEST 400 Payload malformed No
INVALID_AUTH 401 Bad creds No
RATE_LIMITED 429 Throttle 1, 2s
INTERNAL_ERROR 500 Partner failure 2, exp
IDEMPOTENCY_VIOLATION 409 request_id reused No
SIGNATURE_INVALID 401 (webhook) HMAC fail No
VEHICLE_AC_INCOMPATIBLE 422 Vehicle has no AC or AC type not supported No
REFRIGERANT_UNAVAILABLE 422 Required refrigerant out of stock for that vehicle No
NO_SLOTS_IN_WINDOW 200 (empty) Valid, no matches n/a
SLOT_GONE 409 (create) Slot taken No
DOORSTEP_UNAVAILABLE_AT_LOCATION 422 User location outside doorstep area No
COMPRESSOR_WORK_REQUIRES_WORKSHOP 422 Doorstep requested but compressor service needs workshop No
CANCELLATION_FEE_DUE 200 (cancel) Non-zero fee n/a

SECTION 12 — SANDBOX → PRODUCTION CHECKLIST

[ ] All three tools implemented; shapes per §5
[ ] At least 3 providers + 8 slots in 24h window
[ ] refrigerant_handling_certified=true verifiable via uploaded certification doc
[ ] vehicle.ac_system_type catalog covers manual / automatic / climate_control / dual_zone
[ ] All controlled vocabularies respected
[ ] HMAC signing verified
[ ] amount_inr is NET; refrigerant_inr line item correctly NET-of-supplier-margin
[ ] No forbidden fields anywhere
[ ] SLA p95 met: search ≤1800ms, create ≤4000ms
[ ] Idempotency tested
[ ] cooling_performance_warranty honoured in test re-service scenario
[ ] Compliance docs: GSTIN, shop license, refrigerant handling cert, privacy policy URL

SECTION 13 — ANTI-FABRICATION RULES

RULE 1: No paid_placement / ad / kickback fields. Single occurrence rejects response.

RULE 2: refrigerant_handling_certified=true requires uploaded current-year certification
        from a recognised body (e.g. ARAI, manufacturer training cert).
        Sustained mis-handling reports from users trigger immediate review.

RULE 3: cooling_performance_warranty_days must be honoured. Partners who decline
        re-service within the warranty window when user reports inadequate cooling
        face suspension after 3 incidents.

RULE 4: ratings.cooling_complaint_resolution_pct must be computed from real
        warranty re-service requests in past 12 months. TOMO cross-checks via
        its own CPC ledger (re-bookings tagged as warranty work).

RULE 5: service_scope.code must match what's actually performed. Marking a
        refrigerant_topup as full_overhaul to bill more is suspension-grade
        violation. TOMO compares slot.code to CPC service_scope_performed.

RULE 6: unnecessary_overhaul_recommendation forbidden. If diagnostic shows
        refrigerant low but no leak, partner must propose refrigerant_topup
        (not full_overhaul). Padding scope = review trigger.

RULE 7: price_lock_guaranteed=true means estimate cannot be exceeded by more
        than price_lock_variance_cap_pct without user re-approval.

RULE 8: AI-generated photos forbidden. Real provider imagery.

RULE 9: No fast_selling / artificial urgency. AC service is not time-critical
        in the way breakdown is.

RULE 10: No "Top Pick" / "TOMO Recommended" badges. Source-blind TTBS only.

RULE 11: Refrigerant type (r134a vs r1234yf) must MATCH the vehicle's spec.
         Charging R1234yf vehicles with R134a (and vice versa) is grounds for
         immediate suspension — wrong refrigerant damages the compressor.

VERSION HISTORY

v1.0.0 — 2026-05-12 — Initial spec. NET commission base in §8. Safety-weighted
                       due to refrigerant + compressor handling consequences.