Intent Spec — auto.book_ev_charger_install
FULL ID: auto.book_ev_charger_install
VERSION: v1.0.0
STATUS: draft
LAST UPDATED: 2026-05-12
DOMAIN: auto
PRIMARY AGENT: AutoServicesAgent
TTBS WEIGHTS: time=0.20 taste=0.15 budget=0.25 safety=0.40
User books home / office EV charger fitment. Covers site assessment, electrical work (wiring, breaker, RCBO), charger mounting, OEM commissioning, certificate of installation. Highest safety weight in the auto domain after breakdown_assist because mis-installation causes electrical fires and voids the EV warranty.
Partner exemplars: Tata Power EZ Charge, Statiq, Charge+Zone, ChargeGrid, OEM-authorised installers (Tata.ev, Mahindra Electric, MG, BYD), licensed electricians under EV brand contract.
SECTION 1 — INTENT IDENTITY
User wants a permanent EV charger fitted at a fixed location. Distinct from:
auto.book_ev_with_charge_planning— rental / ride intent with EV awareness (mobility domain)auto.book_general_service— periodic vehicle serviceauto.book_breakdown_assist— emergency- Home wiring overhaul that doesn't include a charger → not in TOMO scope
Single intent per booking. AC home chargers (3.3kW / 7.4kW) and DC fast chargers (≥15kW) are both in scope.
SECTION 2 — NATURAL LANGUAGE COVERAGE
CLASSIFIES IN
- "Install home charger for my Tata Nexon EV"
- "EV charger fitment at apartment parking"
- "DC fast charger setup at my office"
- "Wall-mount charger for Mahindra XUV400"
- "Need someone to do the electrical work + install charger"
- "OEM-authorised charger installation"
- "Site survey for EV charger"
- "Type-2 charger for MG ZS EV"
- "Set up charging at home for my new EV"
- "Apartment society needs shared charger"
CLASSIFIES OUT — BORDERLINE NO
- "Where's the nearest public charger?" → not a booking intent
- "Charge my car please" → not in scope
- "Buy an EV" → not in scope (v2)
- "Fix my car's onboard charger" →
auto.book_major_service
MULTI-INTENT TRIGGERS
- "Install charger + rewire my parking" →
auto.book_ev_charger_install+ (future) home electrical intent
SECTION 3 — INPUT (TOMO → PROVIDER)
{
"intent": "auto.book_ev_charger_install",
"request_id": "req_01J9Z...",
"user_location": { "lat": 17.4475, "lng": 78.3563, "max_radius_km": 30, "city": "Hyderabad" },
"premises": {
"type": "apartment", // STRICT ENUM §6
"ownership": "owner", // STRICT ENUM §6
"society_noc_obtained": false,
"parking_type": "covered_personal", // STRICT ENUM §6
"electrical_phase": "single_phase", // STRICT ENUM §6
"distance_to_meter_meters": 12
},
"vehicle": {
"type": "car",
"make": "Tata Motors",
"model": "Nexon EV",
"variant": "Max XZ+",
"ev_battery_kwh": 40.5,
"connector_type": "type_2", // STRICT ENUM §6
"year_of_manufacture": 2024
},
"charger_preferences": {
"charger_class": "ac_7_4_kw", // STRICT ENUM §6
"brand_preference": "oem_authorised", // STRICT ENUM §6
"smart_features_required": true,
"ocpp_compliance_required": true,
"outdoor_rated": false
},
"service_preferences": {
"preferred_window": {
"earliest_site_survey": "2026-05-15T10:00:00+05:30",
"latest_completion": "2026-05-30T18:00:00+05:30"
},
"max_acceptable_cost_inr": 60000,
"subsidy_assistance_required": true
},
"ttbs_user_band": {
"time": "flexible",
"taste": "balanced",
"budget": "good",
"safety": "great"
},
"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_ev_charger_install |
premises.type |
enum | REQUIRED, STRICT ENUM §6 | Apartment / villa / commercial |
premises.ownership |
enum | REQUIRED, STRICT ENUM §6 | Owner consent or society NOC needed |
premises.electrical_phase |
enum | REQUIRED, STRICT ENUM §6 | Single / three phase |
premises.distance_to_meter_meters |
int | REQUIRED, 0-100 | Drives cable run cost |
vehicle.ev_battery_kwh |
float | REQUIRED, 5-200 | Drives charger sizing |
vehicle.connector_type |
enum | REQUIRED, STRICT ENUM §6 | Type-2 most common in India |
charger_preferences.charger_class |
enum | REQUIRED, STRICT ENUM §6 | |
charger_preferences.ocpp_compliance_required |
bool | REQUIRED | OCPP 1.6J / 2.0.1 for shared chargers |
service_preferences.subsidy_assistance_required |
bool | REQUIRED | Partner helps with state EV subsidy filing |
Anti-fabrication preamble: Provider may not claim OEM authorisation without uploaded current-year certification. Smart-feature claims must match product spec sheet exactly.
SECTION 4 — PROVIDER TOOLS
Tool 1: search_charger_installers
PURPOSE: Up to 12 installers matching electrical phase + charger class + premises
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: book_site_survey
PURPOSE: Schedule mandatory site survey before any quote
SLA: p50 ≤ 1000ms, p95 ≤ 3000ms
RATE LIMIT: 30 req/min
IDEMPOTENCY: request_id
RETRY: No retry
Tool 3: get_install_quote
PURPOSE: Post-survey quote with site-specific cost (cable run, breaker, RCBO)
SLA: p50 ≤ 600ms, p95 ≤ 1800ms
RATE LIMIT: 60 req/min
RETRY: 1 on 5xx
Tool 4: confirm_install_booking
PURPOSE: User approved quote → book installation slot
SLA: p50 ≤ 1500ms, p95 ≤ 4000ms
RATE LIMIT: 30 req/min
IDEMPOTENCY: request_id
RETRY: No retry
Tool 5: cancel_install_booking
SLA: p50 ≤ 700ms, p95 ≤ 2000ms
RATE LIMIT: 30 req/min
RETRY: 1 on 5xx
SECTION 5 — RESPONSE SHAPE
ChargerInstaller
ChargerInstaller:
installer_id: { type: string, constraint: REQUIRED }
name: { type: string, constraint: REQUIRED }
installer_type:
type: enum
constraint: REQUIRED, STRICT ENUM §6
values: [oem_authorised, charger_brand_authorised, multi_brand_certified, independent_licensed]
authorised_charger_brands:
type: array<enum>
constraint: REQUIRED, may be empty
values: [tata_power_ez, statiq, charge_zone, exicom, delta, abb, schneider, oem_native]
authorised_vehicle_oems:
type: array<enum>
constraint: REQUIRED, may be empty
values: [tata_ev, mahindra_electric, mg, byd, hyundai_ev, kia_ev, bmw_i]
electrician_license_number: { type: string, constraint: REQUIRED, semantics: "state-issued electrician license # for liability" }
refrigerant_handling_certified: { type: boolean, constraint: NOT APPLICABLE_OMITTED } # placeholder — none for EV install
service_areas:
type: array<string>
constraint: REQUIRED, ≥1
semantics: pincodes installer covers
charger_catalog:
type: array<Charger>
constraint: REQUIRED, ≥1
shape:
sku: { type: string, constraint: REQUIRED }
brand: { type: enum, constraint: REQUIRED, STRICT ENUM §6 }
model: { type: string, constraint: REQUIRED }
charger_class: { type: enum, constraint: REQUIRED, STRICT ENUM §6 }
kw_rating: { type: float, constraint: REQUIRED, 3-180 }
connector_type: { type: enum, constraint: REQUIRED, STRICT ENUM §6 }
smart_app_supported: { type: boolean, constraint: REQUIRED }
ocpp_version: { type: string, constraint: REQUIRED nullable, semantics: "e.g. '1.6J' or '2.0.1'; null for non-OCPP" }
ip_rating: { type: string, constraint: REQUIRED, semantics: "IP55 / IP65 for outdoor" }
warranty_months: { type: int, constraint: REQUIRED, 12-60 }
price_inr: { type: int, constraint: REQUIRED, INR_INTEGER }
installation_capabilities:
handles_single_phase: { type: boolean, constraint: REQUIRED }
handles_three_phase: { type: boolean, constraint: REQUIRED }
handles_apartment_complexes: { type: boolean, constraint: REQUIRED }
society_noc_assistance: { type: boolean, constraint: REQUIRED }
subsidy_filing_assistance: { type: boolean, constraint: REQUIRED }
earliest_site_survey_slot: { type: string, constraint: REQUIRED, ISO_DATETIME }
typical_survey_to_install_days: { type: int, constraint: REQUIRED, 1-21 }
warranty:
charger_warranty_months: { type: int, constraint: REQUIRED, 12-60 }
installation_warranty_months: { type: int, constraint: REQUIRED, 6-24 }
cabling_warranty_months: { type: int, constraint: REQUIRED, 12-36 }
warranty_terms_url: { type: string, constraint: REQUIRED, HTTPS URL }
estimated_cost_range_inr:
low: { type: int, constraint: REQUIRED, INR_INTEGER, ≥0 }
high: { type: int, constraint: REQUIRED, INR_INTEGER, ≥0 }
semantics: { type: string, constraint: REQUIRED, semantics: "site-dependent; finalised post-survey" }
ratings:
avg_rating: { type: float, constraint: REQUIRED, 0-5 }
review_count: { type: int, constraint: REQUIRED, ≥0 }
post_install_fault_rate_pct_last_90d: { type: int, constraint: REQUIRED, 0-100, semantics: "% installs that needed call-back" }
partner_reference:
source: { type: string, constraint: REQUIRED }
deeplink: { type: string, constraint: REQUIRED, HTTPS URL }
SiteSurveyBooking
SiteSurveyBooking:
survey_id: { type: string, constraint: REQUIRED, immutable }
installer_id: { type: string, constraint: REQUIRED }
scheduled_at: { type: string, constraint: REQUIRED, ISO_DATETIME }
survey_fee_inr: { type: int, constraint: REQUIRED, INR_INTEGER, ≥0 }
fee_waived_if_install_proceeds: { type: boolean, constraint: REQUIRED }
surveyor_name: { type: string, constraint: REQUIRED }
surveyor_phone: { type: string, constraint: REQUIRED, E.164 }
estimated_survey_duration_minutes: { type: int, constraint: REQUIRED, 30-180 }
InstallQuote
InstallQuote:
quote_id: { type: string, constraint: REQUIRED }
survey_id: { type: string, constraint: REQUIRED }
validity_until: { type: string, constraint: REQUIRED, ISO_DATETIME, ≥7d }
site_findings:
type: array<Finding>
constraint: REQUIRED, ≥1
shape:
component: { type: string, constraint: REQUIRED }
condition: { type: enum, constraint: REQUIRED, STRICT ENUM §6, values: [ok, upgrade_needed, replacement_needed] }
photo_url: { type: string, constraint: REQUIRED, HTTPS URL }
note: { type: string, constraint: REQUIRED, ≤300 chars }
charger_recommended_sku: { type: string, constraint: REQUIRED }
line_items:
type: array<LineItem>
constraint: REQUIRED, ≥3
shape:
sku: { type: string, constraint: REQUIRED }
description: { type: string, constraint: REQUIRED }
category: { type: enum, constraint: REQUIRED, STRICT ENUM §6 }
total_inr: { type: int, constraint: REQUIRED, INR_INTEGER }
necessity: { type: enum, constraint: REQUIRED, STRICT ENUM §6, values: [mandatory_for_safety, mandatory_for_warranty, recommended, optional] }
subsidy_applicable:
eligible: { type: boolean, constraint: REQUIRED }
estimated_subsidy_inr: { type: int, constraint: REQUIRED, INR_INTEGER, ≥0 }
scheme_name: { type: string, constraint: REQUIRED nullable }
totals:
pre_subsidy_inr: { type: int, constraint: REQUIRED, INR_INTEGER }
estimated_subsidy_inr: { type: int, constraint: REQUIRED, INR_INTEGER, ≥0 }
net_payable_inr: { type: int, constraint: REQUIRED, INR_INTEGER }
gst_inr: { type: int, constraint: REQUIRED, INR_INTEGER, ≥0 }
total_inr: { type: int, constraint: REQUIRED, INR_INTEGER }
InstallBooking
InstallBooking:
install_id: { type: string, constraint: REQUIRED, immutable }
quote_id: { type: string, constraint: REQUIRED }
scheduled_install_date: { type: string, constraint: REQUIRED, ISO_DATETIME }
estimated_completion: { type: string, constraint: REQUIRED, ISO_DATETIME }
install_team_lead_name: { type: string, constraint: REQUIRED }
install_team_lead_phone: { type: string, constraint: REQUIRED, E.164 }
install_team_license_numbers: { type: array<string>, constraint: REQUIRED, ≥1 }
payment_due_at: { type: enum, constraint: REQUIRED, STRICT ENUM §6, values: [30_percent_advance_balance_on_completion, on_completion, invoice_30_days] }
CancellationResult
CancellationResult:
cancelled_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_amountartificial_urgency_textai_generated_photofor surveyor / install / charger imagerycommission_padded_priceunlicensed_electrician_acceptable— partners MUST use state-licensed electricians
SECTION 6 — CONTROLLED VOCABULARIES
premises.type:
values:
apartment: "Apartment in society"
independent_villa: "Standalone villa / bungalow"
commercial: "Office / commercial premises"
society_common: "Shared society parking"
premises.ownership: { values: { owner, tenant_with_consent, society_committee } }
premises.parking_type:
values:
covered_personal: "Covered, dedicated to user"
open_personal: "Open-air, dedicated"
covered_shared: "Covered, society shared"
open_shared: "Open, society shared"
outdoor_exposed: "Fully exposed (driveway, kerbside)"
premises.electrical_phase: { values: { single_phase, three_phase } }
vehicle.connector_type:
values:
type_2: "Type-2 (Mennekes; AC India standard)"
ccs2: "CCS2 (DC fast)"
chademo: "CHAdeMO (DC fast, legacy)"
bharat_ac: "Bharat AC-001 (Indian standard, older)"
charger_class:
values:
ac_3_3_kw: "AC 3.3 kW (slow home)"
ac_7_4_kw: "AC 7.4 kW (standard home)"
ac_11_kw: "AC 11 kW (three-phase home)"
ac_22_kw: "AC 22 kW (three-phase commercial)"
dc_15_kw: "DC 15 kW (community fast)"
dc_30_kw: "DC 30 kW (fast)"
dc_60_kw_plus: "DC 60+ kW (rapid)"
charger_brand_preference:
values:
oem_authorised: "Vehicle OEM's recommended charger"
charger_brand: "Standalone charger brand"
multi_brand: "Any certified brand"
installer_type:
values:
oem_authorised: "Vehicle OEM's installer network"
charger_brand_authorised: "Charger brand's installer"
multi_brand_certified: "Certified by multiple OEMs"
independent_licensed: "Independent state-licensed electrician trained for EV"
line_item.category:
values: { charger_unit, cable_run, breaker_rcbo, civil_work, mounting_bracket, commissioning, labour, certificate_fee }
line_item.necessity:
values: { mandatory_for_safety, mandatory_for_warranty, recommended, optional }
site_findings.condition: { values: { ok, upgrade_needed, replacement_needed } }
payment_due_at:
values: { 30_percent_advance_balance_on_completion, on_completion, invoice_30_days }
SECTION 7 — TTBS DIMENSIONS
TIME (weight = 0.20):
signals_used: [earliest_site_survey_slot, typical_survey_to_install_days]
weighting: { survey_speed: 0.5, install_speed: 0.5 }
TASTE (weight = 0.15):
signals_used:
- installer_type matching brand_preference
- authorised_vehicle_oems contains user's vehicle.make
weighting: { type: 0.45, oem_match: 0.55 }
BUDGET (weight = 0.25):
signals_used:
- estimated_cost_range_inr
- installation_capabilities.subsidy_filing_assistance (bonus)
weighting: { cost: 0.75, subsidy_bonus: 0.25 }
SAFETY (weight = 0.40):
signals_used:
- electrician_license_number (mandatory floor; null = filtered out)
- warranty.installation_warranty_months
- warranty.cabling_warranty_months
- ratings.post_install_fault_rate_pct_last_90d (LOWER = better)
- installer_type=oem_authorised or charger_brand_authorised (bonus)
weighting:
license: 0.20 # binary floor
install_warranty: 0.25
cabling_warranty: 0.20
fault_rate: 0.25
auth_bonus: 0.10
user_band_handling:
fast: relax fault_rate threshold
balanced: standard
flexible: prefer 0% fault_rate installers + 24m install warranty
SECTION 8 — COMPLETION CONTRACT
POST /api/v1/cpc/mcp_provider/<your_partner_id>
Body:
{
"intent": "auto.book_ev_charger_install",
"external_id": "<install_id>",
"request_id": "<request_id>",
"amount_inr": 28000, // NET (charger margin + labour + cabling supplier-kept)
"gst_inr": 5040,
"tips_inr": 0,
"pass_through_inr": 4000, // subsidy advance / govt fees partner doesn't keep
"closed_at": "2026-05-28T17:00:00+05:30",
"status": "completed",
"charger_brand": "tata_power_ez",
"charger_class": "ac_7_4_kw",
"subsidy_applied_inr": 4000,
"installation_certificate_url": "https://partner.example.com/certs/abc123.pdf",
"warranty_card_issued": true
}
HMAC, 5-min replay, NET-only commission.
SECTION 9 — WIDGET
EvChargerWidget (planned). Interim: enhanced ListingsWidget.
Field mapping:
- ChargerInstaller.name → header
- installer_type + authorised brands → cert badges row
- charger_catalog ranked by user preference → expandable picker
- estimated_cost_range_inr → range pill
- warranty.installation_warranty_months → "Install warranty Xm" pill
- subsidy_filing_assistance=true → green subsidy badge
- ratings.post_install_fault_rate_pct_last_90d → "X% callback rate" pill (color-coded green/red)
SECTION 10 — CACHING POLICY
| Call | TTL |
|---|---|
| search_charger_installers | 120s |
| book_site_survey | NO CACHE |
| get_install_quote | 5min |
| confirm_install_booking | NO CACHE |
| cancel_install_booking | NO CACHE |
| Charger catalog metadata | 24h |
| Installer static (license, warranties) | 6h |
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_INSTALLERS_IN_AREA |
200 (empty) | Valid, no service in pincode | n/a |
VEHICLE_NOT_SUPPORTED |
422 | EV not in installer catalog | No |
PHASE_MISMATCH |
422 | premises phase incompatible with requested charger_class | No |
SOCIETY_NOC_REQUIRED |
422 | Apartment install needs NOC; survey blocked until obtained | No |
SUBSIDY_NOT_APPLICABLE |
422 (advisory) | Subsidy scheme doesn't apply to this premises/charger combo | n/a (informational) |
SURVEY_SLOT_GONE |
409 (book_survey) | Slot taken | No |
QUOTE_EXPIRED |
410 (confirm) | quote.validity_until passed | No |
INSTALL_SLOT_GONE |
409 (confirm) | Install slot taken | No |
LICENSE_VERIFICATION_FAILED |
422 | electrician_license_number couldn't be verified | No |
CANCELLATION_FEE_DUE |
200 (cancel) | Non-zero fee | n/a |
SECTION 12 — SANDBOX → PRODUCTION CHECKLIST
[ ] All five tools implemented
[ ] At least 2 installers covering common pincodes
[ ] electrician_license_number verifiable via state electrician registry
[ ] At least 3 chargers in catalog (different classes: ac_3_3 / ac_7_4 / ac_22)
[ ] All controlled vocabularies respected
[ ] HMAC signing verified
[ ] amount_inr is NET; pass_through_inr correctly captures subsidies + govt fees
[ ] subsidy_applied_inr in CPC reflects actual subsidy claimed
[ ] installation_certificate_url returns valid certificate
[ ] No forbidden fields
[ ] SLA p95 met
[ ] Site survey workflow tested: survey → quote → confirm cycle
[ ] OCPP compliance verifiable for chargers claiming it
[ ] Compliance docs: GSTIN, shop license, electrician license, EV-OEM authorisations if claimed, privacy policy URL
SECTION 13 — ANTI-FABRICATION RULES
RULE 1: No paid_placement / ad / kickback. Rejects response.
RULE 2: electrician_license_number MUST be real, current, and verifiable
through the issuing state electricity board. Mock / expired / borrowed
licenses = immediate suspension. Customer safety / fire liability.
RULE 3: authorised_charger_brands and authorised_vehicle_oems require uploaded
current-year authorisation letters. False claims = suspension + brand
relationship review.
RULE 4: OCPP compliance version (1.6J / 2.0.1) must match charger firmware.
TOMO field-tests via OCPP probe on commissioning. Mismatch = warranty
risk + suspension trigger.
RULE 5: warranty.installation_warranty_months must be honoured. Declining a
warranty callback within window = suspension after 2 incidents.
RULE 6: ratings.post_install_fault_rate_pct_last_90d computed from real
callback events. TOMO maintains its own callback ledger from CPC
re-booking events flagged as warranty.
RULE 7: site_findings.condition and line_item.necessity must be honest.
Marking optional upgrades as mandatory_for_safety = suspension.
TOMO samples user-uploaded site photos vs partner's findings.
RULE 8: subsidy_applicable.eligible claims must match actual state scheme.
Promising subsidy that user can't claim = customer harm = suspension.
RULE 9: AI-generated install / survey photos forbidden. Real on-site
photography only. TOMO reverse-image-search-audits.
RULE 10: charger_catalog.kw_rating, warranty_months, ip_rating must MATCH
manufacturer spec sheets. Inflated specs = brand relationship breach
+ suspension.
RULE 11: No "Top Pick" / "TOMO Recommended" badges. Source-blind TTBS only.
RULE 12: Partners using unlicensed labour for the install (even if the
contracted lead is licensed) = immediate suspension. License number
in CPC payload (`install_team_license_numbers`) is required.
VERSION HISTORY
v1.0.0 — 2026-05-12 — Initial spec. NET commission base. Safety-dominant
(0.40) — mis-install causes electrical fires + voids
EV warranty. Subsidy + license verification first-class.