Intent Spec — auto.book_pollution_check
FULL ID: auto.book_pollution_check
VERSION: v1.0.0
STATUS: draft
LAST UPDATED: 2026-05-12
DOMAIN: auto
PRIMARY AGENT: AutoServicesAgent
TTBS WEIGHTS: time=0.40 taste=0.10 budget=0.20 safety=0.30
User books a Pollution Under Control (PUC) certificate test. Mandatory in India under the Motor Vehicles Act, 1988 (§115). Quick service (~10-15 minutes). Time-dominant TTBS because users typically realise PUC is expired right before they're stopped at a check post or about to renew vehicle insurance/registration. Distinct from any maintenance work — this is regulatory compliance.
Partner exemplars: Government-authorised PUC test centres (every state RTO licenses these), fuel-station-attached PUC bays (IOC, BPCL, HPCL bays often house PUC operators), independent PUC centres, OEM workshops with PUC bays.
SECTION 1 — INTENT IDENTITY
User needs a valid PUC certificate for their vehicle. Distinct from:
auto.book_general_service— service may include emissions check but not PUC certificationauto.book_rc_transfer— separate paperwork intentauto.book_insurance_renewal— insurance renewal may need valid PUC but isn't this intent
Single intent per vehicle per check. Two-wheelers (any cc) and four-wheelers in scope. Vehicles older than 15 years need RTO-attached PUC bays (state-specific rules).
SECTION 2 — NATURAL LANGUAGE COVERAGE
CLASSIFIES IN
- "Need PUC certificate for my car"
- "Where can I get pollution check done"
- "PUC expired, renew it"
- "Emission test for my bike"
- "Pollution certificate near me — urgent"
- "PUC at fuel station"
- "Pollution test before insurance renewal"
- "PUC for my Activa"
- "Pollution under control certificate"
- "Emission compliance for traffic check"
CLASSIFIES OUT — BORDERLINE NO
- "Why is my car emitting smoke?" →
auto.book_major_service(diagnostic) - "Convert my car to CNG/LPG" → not in scope v1
- "BS6 compliance upgrade" → not a TOMO intent (manufacturer-level)
MULTI-INTENT TRIGGERS
- "PUC + insurance renewal" →
auto.book_pollution_check+auto.book_insurance_renewal - "Service + PUC" →
auto.book_general_service+auto.book_pollution_check - "PUC + RC transfer documentation" →
auto.book_pollution_check+auto.book_rc_transfer
SECTION 3 — INPUT (TOMO → PROVIDER)
{
"intent": "auto.book_pollution_check",
"request_id": "req_01J9Z...",
"user_location": { "lat": 17.4475, "lng": 78.3563, "max_radius_km": 8, "city": "Hyderabad" },
"vehicle": {
"type": "car", // STRICT ENUM §6: car | two_wheeler
"make": "Maruti Suzuki",
"model": "Swift",
"fuel_type": "petrol", // STRICT ENUM §6
"year_of_manufacture": 2021,
"registration_number_last4": "1234",
"registration_state": "TS", // STRICT ENUM §6
"rto_office": "TS09",
"bs_norm": "bs6", // STRICT ENUM §6
"previous_puc_expired_at": "2026-04-15", // ISO_DATE nullable
"is_commercial_vehicle": false
},
"service_preferences": {
"preferred_window": {
"start": "2026-05-13T10:00:00+05:30",
"end": "2026-05-13T19:00:00+05:30"
},
"max_wait_minutes": 30,
"drive_through_preferred": true
},
"ttbs_user_band": {
"time": "fast", // PUC is almost always urgent
"taste": "balanced",
"budget": "ok",
"safety": "balanced"
},
"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_pollution_check |
vehicle.type |
enum | REQUIRED, STRICT ENUM §6 | car |
vehicle.fuel_type |
enum | REQUIRED, STRICT ENUM §6 | Drives test equipment (petrol/diesel/CNG different) |
vehicle.bs_norm |
enum | REQUIRED, STRICT ENUM §6 | Drives applicable emission limits |
vehicle.previous_puc_expired_at |
string | REQUIRED nullable, ISO_DATE | Drives validity-tier price |
vehicle.is_commercial_vehicle |
bool | REQUIRED | Commercial vehicles have different testing intervals |
service_preferences.max_wait_minutes |
int | REQUIRED, 5-180 | |
service_preferences.drive_through_preferred |
bool | REQUIRED | Drive-through PUC bays exist at fuel stations |
Anti-fabrication preamble: Provider may not issue a passing PUC certificate when emissions exceed BS-norm thresholds. Certificate must be generated through state RTO's online portal (not pre-printed). Pass-without-test fraud is a criminal offence — TOMO will report to RTO.
SECTION 4 — PROVIDER TOOLS
Tool 1: search_puc_centres
PURPOSE: Up to 15 nearest PUC centres with wait time + price
SLA: p50 ≤ 400ms, p95 ≤ 1200ms, p99 ≤ 2500ms // tight — user often urgent
RATE LIMIT: 60 req/min
IDEMPOTENCY: request_id; 30s cache (wait times shift)
RETRY: 1 on 429 (1s backoff), 2 on 5xx (exp)
Tool 2: reserve_puc_slot
PURPOSE: Optional reservation (most centres are walk-in)
SLA: p50 ≤ 800ms, p95 ≤ 2500ms
RATE LIMIT: 30 req/min
IDEMPOTENCY: request_id
RETRY: No retry
Tool 3: issue_puc_certificate
PURPOSE: After successful test, partner submits to RTO portal + returns cert
SLA: p50 ≤ 1500ms, p95 ≤ 5000ms (RTO portal downstream)
RATE LIMIT: 30 req/min
IDEMPOTENCY: request_id; same id returns same cert
RETRY: No retry on issuance
Tool 4: cancel_puc_reservation
SLA: p50 ≤ 500ms, p95 ≤ 1500ms
RATE LIMIT: 30 req/min
RETRY: 1 on 5xx
SECTION 5 — RESPONSE SHAPE
PucCentre
PucCentre:
centre_id: { type: string, constraint: REQUIRED }
name: { type: string, constraint: REQUIRED }
centre_type:
type: enum
constraint: REQUIRED, STRICT ENUM §6
values: [rto_authorised_independent, fuel_station_attached, oem_workshop_bay, drive_through_kiosk]
rto_authorisation_number: { type: string, constraint: REQUIRED, semantics: "state-issued authorisation; verifiable on state transport dept site" }
authorised_state: { 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-25 }
vehicle_types_supported:
type: array<enum>
constraint: REQUIRED, ≥1
values: [car_petrol, car_diesel, car_cng, car_lpg, two_wheeler_petrol, commercial_diesel, commercial_petrol, ev]
semantics: "ev MUST appear when centre offers EV cert (some states require zero-emission certificate for EVs)"
current_wait_minutes: { type: int, constraint: REQUIRED, 0-180, semantics: "live queue depth" }
drive_through: { type: boolean, constraint: REQUIRED }
next_slot_available: { type: string, constraint: REQUIRED, ISO_DATETIME }
walk_in_supported: { type: boolean, constraint: REQUIRED }
operating_hours:
type: object
constraint: REQUIRED
shape:
mon_fri_open: { type: string, constraint: REQUIRED, semantics: "HH:MM 24h" }
mon_fri_close: { type: string, constraint: REQUIRED }
sat_open: { type: string, constraint: REQUIRED nullable }
sat_close: { type: string, constraint: REQUIRED nullable }
sun_open: { type: string, constraint: REQUIRED nullable }
sun_close: { type: string, constraint: REQUIRED nullable }
pricing:
petrol_two_wheeler_inr: { type: int, constraint: REQUIRED, INR_INTEGER, ≥0 }
petrol_car_inr: { type: int, constraint: REQUIRED, INR_INTEGER, ≥0 }
diesel_car_inr: { type: int, constraint: REQUIRED, INR_INTEGER, ≥0 }
cng_car_inr: { type: int, constraint: REQUIRED, INR_INTEGER, ≥0 }
commercial_inr: { type: int, constraint: REQUIRED, INR_INTEGER, ≥0 }
state_capped_price: { type: boolean, constraint: REQUIRED, semantics: "state has price cap; partner respects" }
gst_included: { type: boolean, constraint: REQUIRED }
certificate_format:
digital_certificate_url_provided: { type: boolean, constraint: REQUIRED }
physical_certificate_provided: { type: boolean, constraint: REQUIRED }
qr_code_on_cert: { type: boolean, constraint: REQUIRED }
rto_portal_uploaded: { type: boolean, constraint: REQUIRED, semantics: "MUST be true — cert without portal upload is invalid" }
validity_months_issued:
type: int
constraint: REQUIRED, 3-12
semantics: "new vehicles (≤1 year) get 12-month PUC; older vehicles get 6 months in most states; commercial often 3 months"
ratings:
avg_rating: { type: float, constraint: REQUIRED, 0-5 }
review_count: { type: int, constraint: REQUIRED, ≥0 }
fail_rate_pct_last_30d: { type: int, constraint: REQUIRED, 0-100, semantics: "% vehicles failing on first test — health signal not negative" }
partner_reference:
source: { type: string, constraint: REQUIRED }
deeplink: { type: string, constraint: REQUIRED, HTTPS URL }
PucReservation
PucReservation:
reservation_id: { type: string, constraint: REQUIRED }
centre_id: { type: string, constraint: REQUIRED }
reserved_for: { type: string, constraint: REQUIRED, ISO_DATETIME }
hold_minutes: { type: int, constraint: REQUIRED, 5-30, semantics: "user must arrive within window or reservation expires" }
expected_price_inr: { type: int, constraint: REQUIRED, INR_INTEGER }
contact_phone: { type: string, constraint: REQUIRED, E.164 }
IssuedPucCertificate
IssuedPucCertificate:
certificate_id: { type: string, constraint: REQUIRED, immutable, semantics: "RTO portal id" }
rto_certificate_number: { type: string, constraint: REQUIRED, semantics: "official RTO-issued number" }
vehicle_registration: { type: string, constraint: REQUIRED, semantics: "full plate from RTO record" }
test_passed: { type: boolean, constraint: REQUIRED }
test_readings:
type: object
constraint: REQUIRED
shape:
co_pct: { type: float, constraint: REQUIRED, 0-10 }
hc_ppm: { type: int, constraint: REQUIRED, 0-5000 }
co2_pct: { type: float, constraint: REQUIRED nullable, 0-20 }
smoke_density_hsu: { type: int, constraint: REQUIRED nullable, 0-100, semantics: "diesel only" }
lambda_value: { type: float, constraint: REQUIRED nullable, 0.5-2.0, semantics: "petrol only" }
bs_norm_limits:
type: object
constraint: REQUIRED
shape: { co_max_pct: float, hc_max_ppm: int, semantics: "limits matched to vehicle.bs_norm" }
issued_at: { type: string, constraint: REQUIRED, ISO_DATETIME }
valid_until: { type: string, constraint: REQUIRED, ISO_DATE }
certificate_pdf_url: { type: string, constraint: REQUIRED, HTTPS URL, semantics: "signed URL ≥30 days" }
qr_code_data: { type: string, constraint: REQUIRED, semantics: "QR payload that scans to RTO portal verification" }
total_paid_inr: { type: int, constraint: REQUIRED, INR_INTEGER }
CancellationResult
CancellationResult:
reservation_id: { type: string, constraint: REQUIRED }
cancelled_at: { type: string, constraint: REQUIRED, ISO_DATETIME }
refund_amount_inr: { type: int, constraint: REQUIRED, INR_INTEGER, ≥0, semantics: "usually 0 — reservations are free" }
FORBIDDEN FIELDS
paid_placement_score,ad_bid,sponsored_rank,promotion_priority,kickback_amountartificial_urgency_text(PUC is naturally time-bound; partner cannot add urgency theatrics)ai_generated_photofor centre / cert imagerycommission_padded_price— PUC pricing is state-capped; partners cannot inflatefake_test_pass(CRITICAL — fraudulent passes are criminal offences under MV Act §115)
SECTION 6 — CONTROLLED VOCABULARIES
vehicle.type: { values: { car, two_wheeler } }
vehicle.fuel_type: { values: { petrol, diesel, cng, lpg, electric, hybrid } }
vehicle.bs_norm:
values:
bs3: "BS-III (pre-2010 four-wheeler / pre-2017 two-wheeler)"
bs4: "BS-IV"
bs6: "BS-VI (post-2020)"
vehicle.registration_state: { values: ["AP","AR","AS","BR","CG","GA","GJ","HR","HP","JH","KA","KL","MP","MH","MN","ML","MZ","NL","OD","PB","RJ","SK","TN","TS","TR","UP","UK","WB","AN","CH","DN","DD","DL","JK","LA","LD","PY"] }
centre_type:
values:
rto_authorised_independent: "Independent state-authorised PUC centre"
fuel_station_attached: "Operating at IOC/BPCL/HPCL/Shell etc. fuel station"
oem_workshop_bay: "Inside a vehicle OEM workshop with PUC bay"
drive_through_kiosk: "Drive-through kiosk (typically inside fuel stations)"
vehicle_types_supported:
values: { car_petrol, car_diesel, car_cng, car_lpg, two_wheeler_petrol, commercial_diesel, commercial_petrol, ev }
SECTION 7 — TTBS DIMENSIONS
TIME (weight = 0.40):
signals_used:
- current_wait_minutes (LOWER better)
- distance_from_user_km
- drive_through (TRUE preferred)
- walk_in_supported (TRUE preferred — user often hasn't planned)
weighting:
wait: 0.40
distance: 0.30
drive_through: 0.15
walk_in: 0.15
user_band_handling:
fast: heavily favour current_wait_minutes < max_wait_minutes
balanced: standard
flexible: any in window
TASTE (weight = 0.10):
signals_used: [centre_type matching user DNA (some prefer OEM bays, some prefer fuel-station)]
weighting: { type_match: 1.0 }
BUDGET (weight = 0.20):
signals_used: [pricing per vehicle type]
weighting: { price: 1.0 }
user_band_handling:
ok: prefer cheapest
good: balance price vs wait
great: prefer state_capped_price=true (transparency signal)
SAFETY (weight = 0.30):
signals_used:
- rto_authorisation_number (mandatory floor; null = filtered out)
- rto_portal_uploaded (mandatory floor; FALSE = filtered out)
- certificate_format.qr_code_on_cert (TRUE preferred — verifiable)
- state_capped_price (TRUE preferred — transparency)
weighting:
authorisation: 0.40
portal_upload: 0.30
qr_code: 0.20
price_cap: 0.10
SECTION 8 — COMPLETION CONTRACT
POST /api/v1/cpc/mcp_provider/<your_partner_id>
Body:
{
"intent": "auto.book_pollution_check",
"external_id": "<certificate_id>",
"request_id": "<request_id>",
"amount_inr": 100, // NET (state-capped, typically ₹50-₹150)
"gst_inr": 18,
"tips_inr": 0,
"pass_through_inr": 0,
"closed_at": "2026-05-13T11:25:00+05:30",
"status": "completed", // STRICT ENUM: completed | failed_first_attempt | cancelled
"test_passed": true,
"valid_until": "2026-11-13",
"rto_certificate_number": "TS09-2026-PUC-1234567"
}
HMAC, 5-min replay, NET-only commission. PUC is typically the smallest-ticket auto intent — partner margin is thin and state-capped, so commission is correspondingly small.
SECTION 9 — WIDGET
PucCentreWidget (planned).
Field mapping:
- PucCentre.name → header
- centre_type + current_wait_minutes → giant wait pill (color-coded green ≤15 / amber 15-30 / red >30)
- distance_from_user_km → distance row
- pricing matching vehicle.type / fuel_type → price
- drive_through=true → green drive-through badge
- validity_months_issued → "Valid Xm" pill
SECTION 10 — CACHING POLICY
| Call | TTL | Rationale |
|---|---|---|
| search_puc_centres | 30s | Wait times degrade quickly during peak hours |
| reserve_puc_slot | NO CACHE | Idempotent by request_id |
| issue_puc_certificate | NO CACHE | — |
| cancel_puc_reservation | NO CACHE | — |
| Centre static (rto_authorisation, hours, fuel-types) | 6h | Static |
SECTION 11 — ERROR CODES
| Code | HTTP | Meaning | Retry |
|---|---|---|---|
INVALID_REQUEST |
400 | Malformed | No |
RATE_LIMITED |
429 | Throttle | 1, 1s (tight — emergency-adjacent) |
INTERNAL_ERROR |
500 | Partner failure | 2, exp |
SIGNATURE_INVALID |
401 (webhook) | HMAC fail | No |
NO_CENTRES_IN_AREA |
200 (empty) | Valid, no service | n/a (widen radius and re-query) |
VEHICLE_TYPE_NOT_SUPPORTED |
422 | Centre doesn't service this vehicle type | No |
CENTRE_CLOSED |
422 | Outside operating hours | No |
RTO_PORTAL_DOWN |
503 | State RTO portal unavailable; cert can't be issued now | 1 retry, 5s |
EMISSIONS_FAIL |
200 (cert with test_passed=false) | Vehicle failed emissions; UI prompts service | n/a |
RESERVATION_EXPIRED |
410 | User didn't arrive within hold_minutes | No |
STATE_PRICE_EXCEEDED |
422 | Partner trying to charge above state cap (TOMO ingest blocks) | No |
SECTION 12 — SANDBOX → PRODUCTION CHECKLIST
[ ] All four tools implemented
[ ] At least 5 centres across centre_types
[ ] rto_authorisation_number for each centre verifiable on state transport dept site
[ ] vehicle_types_supported correctly populated per centre
[ ] All controlled vocabularies respected
[ ] HMAC signing verified
[ ] amount_inr is NET and within state price cap
[ ] rto_portal_uploaded MUST be TRUE for all issued certs (no portal upload = invalid cert)
[ ] qr_code_data scans to actual RTO verification URL
[ ] certificate_pdf_url returns valid PDF with all test readings
[ ] No forbidden fields (especially fake_test_pass)
[ ] SLA p95 met (search ≤1200ms is tight; consider edge caching)
[ ] Idempotency tested
[ ] Compliance docs: GSTIN, state PUC authorisation letter, calibration certificate for emission analyser, privacy policy URL
[ ] Emission analyser calibration valid (NPL-traceable, calibrated within last 6 months)
SECTION 13 — ANTI-FABRICATION RULES
RULE 1: No paid_placement / ad / kickback. Single occurrence rejects response.
RULE 2: rto_authorisation_number MUST be the centre's actual current
state-issued authorisation. Mock / expired = immediate suspension +
report to state transport dept.
RULE 3: rto_portal_uploaded=true is non-negotiable. Certificates without
portal upload are legally invalid. Partners issuing offline certs
face immediate suspension + criminal reporting to RTO.
RULE 4: test_readings (co_pct, hc_ppm, smoke_density_hsu, lambda_value)
MUST come from the calibrated emission analyser, not pre-filled
defaults. Fake-pass fraud (passing a vehicle that failed) is a
criminal offence under MV Act §115 — TOMO will cooperate with
any state investigation.
RULE 5: pricing must respect state price caps. Most Indian states cap PUC
fees at ₹50-₹150 depending on fuel type. Charging above cap is
per-se invalid and rejected by ingest.
RULE 6: ratings.fail_rate_pct_last_30d should reflect real first-attempt
fail rate. A centre with 0% fail rate over high volume is suspicious
(suggests fake-passing); TOMO audits via VAHAN cross-reference.
RULE 7: validity_months_issued must match state regulations for that
vehicle's age + commercial status. Issuing 12-month cert when state
rules allow only 6 = suspension.
RULE 8: AI-generated centre / analyser / cert photos forbidden.
RULE 9: No artificial_urgency_text. PUC time-pressure is real; partner
cannot embellish ("Cops outside!" without basis).
RULE 10: No "Top Pick" / "TOMO Recommended" badges. TTBS source-blind.
RULE 11: certificate_format.qr_code_on_cert MUST scan to RTO verification
endpoint. QR pointing to partner's own URL (instead of RTO) is
deception = suspension.
RULE 12: Emission analyser must be calibrated to NPL-traceable standards
within last 6 months. Calibration certificate uploaded to TOMO
during onboarding and re-verified annually.
VERSION HISTORY
v1.0.0 — 2026-05-12 — Initial spec. NET commission base. Time-dominant
(0.40) — PUC is almost always an emergency-adjacent
errand. Criminal-fraud rules ensure no fake passes.