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-focusedauto.book_major_service— major HVAC overhaul (full system replacement) classifies here only if user explicitly asks AC; major engine/transmission work goes to major_serviceauto.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_amountartificial_urgency_text(no "AC will fail before summer!" without measurement evidence)ai_generated_photofor shop / vehicle imagerycommission_padded_priceunnecessary_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.