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_pollution_check

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 certification
  • auto.book_rc_transfer — separate paperwork intent
  • auto.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_amount
  • artificial_urgency_text (PUC is naturally time-bound; partner cannot add urgency theatrics)
  • ai_generated_photo for centre / cert imagery
  • commission_padded_price — PUC pricing is state-capped; partners cannot inflate
  • fake_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.