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_breakdown_assist

Intent Spec — auto.book_breakdown_assist

FULL ID:       auto.book_breakdown_assist
VERSION:       v1.0.0
STATUS:        draft
LAST UPDATED:  2026-05-11
DOMAIN:        auto
PRIMARY AGENT: AutoServicesAgent
TTBS WEIGHTS:  time=0.50 taste=0.05 budget=0.15 safety=0.30

User's vehicle is currently non-functional — battery dead, tyre puncture, fuel empty, mechanical failure, accident, locked out. User needs immediate roadside assistance: jump-start, on-spot tyre change, towing to nearest workshop, fuel delivery, locksmith. This is an emergency intent with the highest TIME weight in the auto domain.

Partner exemplars: TVS Tow Truck, Allianz Roadside Assist, Bajaj Allianz RSA, ICICI Lombard RSA, Royal Sundaram RSA, AAA-style city services, GoMechanic SOS, Tow My Car.


SECTION 1 — INTENT IDENTITY

This intent fires when the vehicle is at-fault stationary or impaired and user needs help to either restore mobility on-spot or evacuate the vehicle. Distinct from:

  • auto.book_general_service — scheduled, planned, vehicle is functional
  • auto.book_battery_replacement — planned battery swap, not roadside
  • auto.book_tyre_alignment — scheduled alignment, not puncture
  • auto.book_major_service — workshop overhaul, not on-spot

Once towing is dispatched, the downstream auto.book_general_service or auto.book_major_service at the destination workshop is a separate intent if the user proceeds. Breakdown assist's contract terminates when the vehicle reaches the destination OR the on-spot fix succeeds OR user cancels.


SECTION 2 — NATURAL LANGUAGE COVERAGE

CLASSIFIES IN

  • "My car broke down"
  • "Need a tow truck right now"
  • "Battery dead, can someone come jump-start"
  • "Flat tyre on the highway"
  • "Ran out of fuel, send petrol"
  • "Locked out of my car"
  • "Engine wouldn't start, please help"
  • "Accident, need towing to nearest workshop"
  • "Bike won't start, mechanic needed at my location"
  • "SOS — car stuck on ORR"

CLASSIFIES OUT — BORDERLINE NO

  • "Service my car" → auto.book_general_service
  • "Schedule a battery replacement next week" → auto.book_battery_replacement
  • "Tyre alignment due" → auto.book_tyre_alignment
  • "Major engine repair needed at workshop" → auto.book_major_service (user planning, not stranded)
  • "Insurance claim for accident" → auto.book_insurance_renewal (v1.1+ separate intent for claims)

MULTI-INTENT TRIGGERS

  • "Car broke down, send help and book me a cab home" → auto.book_breakdown_assist + mobility.book_intracity_ride
  • "Stranded with my family, send tow and an Uber" → same as above; ride dispatched in parallel
  • "Battery dead, tow to nearest workshop and book service" → auto.book_breakdown_assist + auto.book_general_service (chained, breakdown destination = service start)

SECTION 3 — INPUT (TOMO → PROVIDER)

{
  "intent": "auto.book_breakdown_assist",
  "request_id": "req_01J9Z...",
  "user_locale": "en-IN",
  "user_currency": "INR",
  "user_location": {
    "lat": 17.4475,
    "lng": 78.3563,
    "max_radius_km": 30,                       // wider than other auto intents — partner may be far
    "city": "Hyderabad",
    "vehicle_position_description": "Shoulder of ORR near Gachibowli flyover, facing east"
  },
  "emergency_severity": "stranded",            // STRICT ENUM §6: critical | stranded | non_urgent
  "vehicle": {
    "type": "car",
    "make": "Maruti Suzuki",
    "model": "Swift",
    "fuel_type": "petrol",
    "year_of_manufacture": 2021,
    "registration_number_last4": "1234",
    "current_odometer_km": 42500
  },
  "issue": {
    "category": "battery_dead",                // STRICT ENUM §6
    "user_description": "Lights came on, then car wouldn't crank",
    "is_in_accident": false,
    "is_safe_location": true,                  // user-declared; partner may re-assess
    "passengers_with_user": 1,
    "minor_children_present": false
  },
  "preferred_outcome":
      "on_spot_fix",                            // STRICT ENUM §6: on_spot_fix | tow_to_workshop | tow_to_user_choice
  "destination_workshop_id": null,             // when preferred_outcome=tow_to_user_choice, user-picked workshop
  "contact_phone": "+91XXXXXXXXXX",
  "ttbs_user_band": {
    "time":   "fast",                           // typically fast — emergency
    "taste":  "balanced",
    "budget": "good",
    "safety": "great"                           // user prioritises safety in emergencies
  },
  "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_breakdown_assist
user_location.vehicle_position_description string REQUIRED, ≥10 chars Free-text from user; helps dispatcher locate
emergency_severity enum REQUIRED, STRICT ENUM §6 Drives priority routing
issue.category enum REQUIRED, STRICT ENUM §6
issue.user_description string REQUIRED, ≤500 chars
issue.is_in_accident bool REQUIRED Triggers safety / insurance path if true
issue.is_safe_location bool REQUIRED False = partner dispatches faster, sends safety briefing
issue.passengers_with_user int REQUIRED, 0-20 Capacity planning for evacuation ride
issue.minor_children_present bool REQUIRED Elevates priority
preferred_outcome enum REQUIRED, STRICT ENUM §6
destination_workshop_id string REQUIRED nullable Required when preferred_outcome=tow_to_user_choice
contact_phone string REQUIRED, E.164 Live phone for dispatcher

Anti-fabrication preamble: Provider may not delay dispatch based on commission rate, surge tier, or vehicle make/model bias. Severity-tagged requests must be routed at advertised SLA.


SECTION 4 — PROVIDER TOOLS

Tool 1: search_assist_providers

PURPOSE:      Return up to 10 providers who can reach user with ETA + scope
INPUT:        §3
OUTPUT:       array<AssistProvider> per §5
SLA:          p50 ≤ 400ms, p95 ≤ 1200ms, p99 ≤ 2500ms  // tightest SLA in auto domain
RATE LIMIT:   60 req/min
IDEMPOTENCY:  request_id; 30s cache (tight — situation may change)
RETRY:        1 on 429 (1s backoff) / 2 on 5xx (exp)

Tool 2: dispatch_assist

PURPOSE:      Confirm dispatch — partner sends crew/tow to user_location
INPUT:        { request_id, provider_id, contact_phone, issue.*, preferred_outcome, destination_workshop_id? }
OUTPUT:       AssistDispatch per §5
SLA:          p50 ≤ 1000ms, p95 ≤ 3000ms
RATE LIMIT:   30 req/min
IDEMPOTENCY:  request_id
RETRY:        TOMO does NOT retry dispatch (would cause double-crew)

Tool 3: track_assist

PURPOSE:      Live ETA / crew location update; called every 30-60s during active dispatch
INPUT:        { request_id, dispatch_id }
OUTPUT:       AssistStatus per §5
SLA:          p50 ≤ 300ms, p95 ≤ 800ms
RATE LIMIT:   240 req/min (polling-tolerant)
IDEMPOTENCY:  None — live data
RETRY:        2 on 5xx (1s, 2s)

Tool 4: cancel_assist

PURPOSE:      Cancel dispatch BEFORE crew arrives. After arrival, cancellation is partner-side workflow + may incur full fee.
INPUT:        { request_id, dispatch_id, reason_code }
OUTPUT:       CancellationResult per §5
SLA:          p50 ≤ 500ms, p95 ≤ 1500ms
RATE LIMIT:   30 req/min
RETRY:        1 on 5xx

SECTION 5 — RESPONSE SHAPE

AssistProvider

AssistProvider:
  provider_id: { type: string, constraint: REQUIRED }
  name: { type: string, constraint: REQUIRED }
  network_type:
    type: enum
    constraint: REQUIRED, STRICT ENUM §6
    values: [insurance_rsa, oem_rsa, independent_rsa, oem_authorised_workshop, app_aggregator]

  capabilities:
    can_jump_start: { type: boolean, constraint: REQUIRED }
    can_change_tyre: { type: boolean, constraint: REQUIRED }
    can_deliver_fuel: { type: boolean, constraint: REQUIRED }
    can_unlock_vehicle: { type: boolean, constraint: REQUIRED }
    can_tow_flatbed: { type: boolean, constraint: REQUIRED }
    can_tow_wheel_lift: { type: boolean, constraint: REQUIRED }
    can_handle_ev: { type: boolean, constraint: REQUIRED }
    can_handle_two_wheeler: { type: boolean, constraint: REQUIRED }
    max_tow_distance_km: { type: int, constraint: REQUIRED, ≥0 }

  current_dispatch:
    crew_location: { type: object, shape: { lat, lng }, constraint: REQUIRED }
    eta_minutes:
      type: int
      constraint: REQUIRED, 1-180
      semantics: live ETA from crew's current position to user_location
    crew_type:
      type: enum
      constraint: REQUIRED, STRICT ENUM §6
      values: [mobile_mechanic, tow_truck, both]
    has_capacity_now: { type: boolean, constraint: REQUIRED }

  estimated_cost:
    base_inr: { type: int, constraint: REQUIRED, INR_INTEGER, ≥0 }
    per_km_tow_inr: { type: int, constraint: REQUIRED nullable, INR_INTEGER, ≥0 }
    after_hours_surcharge_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 }
    covered_by_user_insurance: { type: boolean, constraint: REQUIRED }
    insurance_partner_name: { type: string, constraint: REQUIRED nullable, required when covered_by_user_insurance=true }

  safety_protocol:
    crew_id_verifiable: { type: boolean, constraint: REQUIRED, semantics: "user can see crew ID + photo before arrival" }
    background_checked: { type: boolean, constraint: REQUIRED }
    emergency_hotline_phone: { type: string, constraint: REQUIRED, E.164 }
    live_track_link_provided: { type: boolean, constraint: REQUIRED }

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

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

AssistDispatch

AssistDispatch:
  dispatch_id: { type: string, constraint: REQUIRED, immutable }
  provider_id: { type: string, constraint: REQUIRED }
  dispatched_at: { type: string, constraint: REQUIRED, ISO_DATETIME }
  initial_eta_minutes: { type: int, constraint: REQUIRED, 1-180 }
  crew:
    crew_id: { type: string, constraint: REQUIRED, opaque }
    crew_name: { type: string, constraint: REQUIRED }
    crew_phone: { type: string, constraint: REQUIRED, E.164 }
    crew_photo_url: { type: string, constraint: REQUIRED, HTTPS URL }
    crew_vehicle_plate_last4: { type: string, constraint: REQUIRED, length 4 }
  live_track_url: { type: string, constraint: REQUIRED, HTTPS URL, signed token, ≤30min validity }
  service_scope_confirmed:
    type: array<string>
    constraint: REQUIRED, ≥1 entry
    example: ["jump_start", "if_jump_fails_tow_to_workshop"]
  destination:
    type: object
    constraint: REQUIRED nullable, required when preferred_outcome=tow_to_*
    shape:
      workshop_name: { type: string, constraint: REQUIRED }
      address: { type: string, constraint: REQUIRED }
      location: { type: object, shape: { lat, lng }, constraint: REQUIRED }
      eta_after_pickup_minutes: { type: int, constraint: REQUIRED, ≥0 }

AssistStatus (live polling)

AssistStatus:
  dispatch_id: { type: string, constraint: REQUIRED }
  status:
    type: enum
    constraint: REQUIRED, STRICT ENUM §6
    values: [crew_en_route, crew_arrived, on_spot_work, towing, at_destination, completed, aborted_by_crew, aborted_by_user]
  crew_current_location: { type: object, shape: { lat, lng }, constraint: REQUIRED }
  updated_eta_minutes: { type: int, constraint: REQUIRED, ≥0 }
  status_message: { type: string, constraint: REQUIRED, ≤200 chars, locale-aware }
  next_update_in_seconds: { type: int, constraint: REQUIRED, 15-120 }

CancellationResult

CancellationResult:
  dispatch_id: { type: string, constraint: REQUIRED }
  cancelled_at: { type: string, constraint: REQUIRED, ISO_DATETIME }
  cancellation_fee_inr:
    type: int
    constraint: REQUIRED, INR_INTEGER, ≥0
    semantics: 0 if before crew dispatched; partner policy otherwise
  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, referral_fee_kickback, _partner_revenue_share
  • artificial_urgency_text (note: in this emergency intent, ALL urgency is legitimate; partner may not embellish further)
  • ai_generated_photo for crew imagery (real crew photos REQUIRED for safety)
  • commission_padded_price
  • surge_multiplier_hidden (any surge MUST be disclosed in estimated_cost.after_hours_surcharge_inr)

SECTION 6 — CONTROLLED VOCABULARIES

emergency_severity:
  values:
    critical: "Accident / safety risk / minor present / unsafe location"
    stranded: "Vehicle non-functional, user blocked but safe"
    non_urgent: "Vehicle non-functional, user has time (e.g. parked at home, won't start tomorrow)"

issue.category:
  values:
    battery_dead:       "Battery flat / won't crank"
    flat_tyre:          "Single tyre punctured / blown"
    multiple_tyres:     "Multiple tyres affected"
    fuel_empty:         "Out of fuel"
    locked_out:         "Keys locked inside vehicle"
    won_t_start_other:  "Won't start, cause unknown"
    overheating:        "Engine temperature warning / steam"
    transmission:       "Gear / clutch / transmission failure"
    brake_failure:      "Brake performance compromised"
    accident_minor:     "Accident — drivable but damaged"
    accident_major:     "Accident — non-drivable / injury"
    ev_battery_drained: "EV out of charge"
    other:              "Issue not in list (free-text in user_description)"

preferred_outcome:
  values:
    on_spot_fix:         "Try to fix at location (jump-start, tyre change, fuel delivery)"
    tow_to_workshop:     "Tow to nearest authorised workshop (partner picks)"
    tow_to_user_choice:  "Tow to a specific workshop (user provides destination_workshop_id)"

network_type:
  values:
    insurance_rsa:           "User's insurance company's RSA network"
    oem_rsa:                 "Vehicle manufacturer's roadside (e.g. Maruti On-Road Service)"
    independent_rsa:         "Third-party RSA (Allianz, etc.) under standalone subscription"
    oem_authorised_workshop: "Workshop offering tow service direct"
    app_aggregator:          "Aggregator network (GoMechanic SOS, TVS, etc.)"

crew_type:
  values:
    mobile_mechanic: "Crew with toolkit for on-spot repair"
    tow_truck:       "Flatbed or wheel-lift tow"
    both:            "Crew can attempt on-spot, tow if needed"

status:
  values:
    crew_en_route:      "Crew dispatched, moving toward user"
    crew_arrived:       "Crew at user_location"
    on_spot_work:       "Crew working on the vehicle"
    towing:             "Vehicle being towed"
    at_destination:     "Vehicle delivered to destination"
    completed:          "Service successfully closed"
    aborted_by_crew:    "Crew aborted (couldn't fix, vehicle un-towable, etc.)"
    aborted_by_user:    "User aborted (sorted themselves, friend showed up, etc.)"

SECTION 7 — TTBS DIMENSIONS

TIME (weight = 0.50):
  signals_used:
    - current_dispatch.eta_minutes
    - current_dispatch.has_capacity_now
    - ratings.on_time_arrival_pct_last_30d
  weighting:
    eta: 0.60      # lower ETA = much better
    capacity: 0.25
    on_time_history: 0.15
  user_band_handling:
    fast: maximize TIME weight even further; ignore minor cost differences
    balanced: standard
    flexible: not really applicable — emergency by definition; falls back to fast

TASTE (weight = 0.05):
  signals_used:
    - network_type vs user DNA (some users prefer their insurance RSA over third-party)
  weighting:
    network_match: 1.0
  user_band_handling: standard

BUDGET (weight = 0.15):
  signals_used:
    - estimated_cost.total_estimate_inr
    - estimated_cost.covered_by_user_insurance
  weighting:
    price: 0.50
    insurance_bonus: 0.50  # covered_by_user_insurance=true is a 50% rank boost
  user_band_handling:
    ok: prefer cheapest; insurance coverage matters more
    good: balance price vs ETA
    great: prefer best-rated crew even at premium

SAFETY (weight = 0.30):
  signals_used:
    - safety_protocol.crew_id_verifiable
    - safety_protocol.background_checked
    - safety_protocol.live_track_link_provided
    - ratings.avg_rating
    - issue.minor_children_present (boost safety weight even higher when true)
  weighting:
    crew_verifiable: 0.30
    background: 0.25
    live_track: 0.20
    rating: 0.25
  user_band_handling:
    fast: relax background_check threshold marginally
    balanced: standard
    flexible: prioritise safety even over ETA when minor_children_present=true

When emergency_severity=critical OR issue.minor_children_present=true, weights re-balance to time=0.40 safety=0.45 budget=0.10 taste=0.05 at runtime — safety becomes co-equal with time.


SECTION 8 — COMPLETION CONTRACT

POST /api/v1/cpc/mcp_provider/<your_partner_id>
Body:
{
  "intent":           "auto.book_breakdown_assist",
  "external_id":      "<dispatch_id>",
  "request_id":       "<request_id>",
  "amount_inr":       1200,       // NET (base + km-billing + after-hours, supplier-kept)
  "gst_inr":          216,        // government
  "tips_inr":         100,        // tip to crew, common in roadside
  "pass_through_inr": 0,          // any third-party (e.g. sub-contracted tow) NOT kept by partner
  "closed_at":        "2026-05-11T22:14:00+05:30",
  "status":           "completed",     // STRICT ENUM: completed | aborted_by_crew | aborted_by_user | no_charge
  "issue_resolved_on_spot":   false,
  "towed_to_destination":     true,
  "destination_workshop_id":  "ws_GoMechHydMadhapur",
  "actual_eta_minutes":       23,
  "promised_eta_minutes":     20    // for SLA tracking
}

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


SECTION 9 — WIDGET

AssistDispatchWidget (planned). Live-track UI is a first-class widget here — most info-dense in the auto domain because user is mid-emergency.

Source: src/widgets/types.ts → AssistDispatchPayload
Field mapping:
  - AssistProvider.name → header
  - AssistProvider.current_dispatch.eta_minutes → giant ETA pill (largest visual element)
  - AssistProvider.capabilities → checklist of "what they'll do"
  - AssistProvider.safety_protocol.crew_id_verifiable → green safety badge
  - AssistProvider.estimated_cost.total_estimate_inr + covered_by_user_insurance → price row with insurance badge
  - AssistProvider.ratings.on_time_arrival_pct_last_30d → "X% on-time" pill
  - Post-dispatch: AssistStatus.status maps to progress dots + status_message
  - Post-dispatch: live_track_url renders inline map (when provided)

L2/L3 partners can embed their live-track UI directly; L1 fallback opens partner app.


SECTION 10 — CACHING POLICY

Call TTL Rationale
search_assist_providers 30s Situation changes fast — ETAs degrade quickly
dispatch_assist NO CACHE Idempotent by request_id
track_assist NO CACHE Live by definition
cancel_assist NO CACHE
Provider static metadata (capabilities, safety_protocol baseline) 1h Less static than other intents — capabilities may change

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, 1s backoff (faster than other intents — time matters)
INTERNAL_ERROR 500 Partner failure 2, exp
IDEMPOTENCY_VIOLATION 409 request_id reused No
SIGNATURE_INVALID 401 (webhook) HMAC fail No
NO_CREW_AVAILABLE 200 (empty) Valid response, no crew in radius n/a; TOMO widens radius and re-queries
LOCATION_INACCESSIBLE 422 User location unreachable (e.g. closed road, off-road) No
VEHICLE_TOO_LARGE_FOR_TOW 422 size class exceeds capability No
EV_NOT_SUPPORTED 422 Partner can't handle electric vehicle issue No
DISPATCH_FAILED 503 (dispatch) Crew accepted then dropped — try next provider TOMO retries with next-ranked provider
CANCELLATION_AFTER_ARRIVAL 422 (cancel) Crew already on-site; cancellation has fee No (returns cancellation_fee_inr)
ACCIDENT_REQUIRES_POLICE 422 Major accident; partner refuses tow until police FIR filed No (UI surfaces)

SECTION 12 — SANDBOX → PRODUCTION CHECKLIST

[ ] All four tools (search/dispatch/track/cancel) implemented
[ ] Live ETA on search_assist_providers is computed from real crew GPS positions, not flat estimate
[ ] All capabilities flags correctly reflect partner's actual service set (TOMO field-tests with synthetic dispatches)
[ ] Crew photo URL + crew_vehicle_plate_last4 returned on dispatch (mandatory for safety)
[ ] live_track_url returns a working signed-token live tracking page
[ ] HMAC signing verified on test CPC webhook
[ ] amount_inr is NET; tips_inr and pass_through_inr correctly differentiated
[ ] actual_eta_minutes recorded in CPC payload for SLA tracking
[ ] No forbidden fields anywhere
[ ] SLA p95 met: search ≤1200ms (tight — emergency), dispatch ≤3000ms, track ≤800ms
[ ] Idempotency tested
[ ] Test critical-severity dispatch: weights re-balance to safety=0.45 verified
[ ] Test minor_children_present dispatch: same re-balancing verified
[ ] Insurance partner integration verified (when covered_by_user_insurance=true returns valid insurance_partner_name)
[ ] Cancellation fee logic correct: 0 before crew dispatched, partner policy after
[ ] Emergency hotline phone reachable 24x7 (TOMO field-tests)
[ ] Compliance docs: GSTIN, RSA license (state-specific), privacy policy URL live, crew background-check policy disclosed

SECTION 13 — ANTI-FABRICATION RULES

RULE 1: No paid_placement / ad / kickback fields. Single occurrence rejects entire response.
        In an emergency intent, paid placement would be especially harmful.

RULE 2: eta_minutes must be live-computed from actual crew GPS. Partners providing
        flat 30-minute defaults regardless of distance face immediate suspension.
        TOMO cross-checks by recording dispatch coordinates + actual arrival
        timestamps and computing real travel time.

RULE 3: has_capacity_now=true MUST mean a crew can actually accept the dispatch
        right now. Partners returning has_capacity_now=true and then immediately
        declining the dispatch face suspension after 3 incidents.

RULE 4: crew_photo_url must be the actual crew member's photo. Stock photos,
        AI-generated photos, or "company logo as placeholder" are forbidden.
        Mandatory for user safety. TOMO compares photos against arrival
        check-in selfies on random spot-checks.

RULE 5: crew_vehicle_plate_last4 must match the actual vehicle dispatched.
        Mismatches discovered on arrival are immediate suspension triggers
        (user safety / impersonation risk).

RULE 6: safety_protocol.background_checked=true requires partner to maintain
        documented background-check records for each crew member. Subject
        to admin spot-check during compliance review.

RULE 7: after_hours_surcharge_inr must be a real surcharge tied to time-of-day,
        not a hidden surge multiplier. Surge cannot exceed 2.0x base rate.
        TOMO measures variance between off-peak and peak total_estimate_inr;
        sustained >2.0x ratio violates the policy.

RULE 8: covered_by_user_insurance=true must reflect actual policy verification.
        Partners cannot claim insurance coverage and then bill the user direct.
        TOMO cross-checks via the user's declared insurance partner.

RULE 9: ratings.on_time_arrival_pct_last_30d must be computed from real
        completed dispatches in the past 30 days. TOMO maintains its own
        on-time ratio per provider from CPC payloads (actual_eta vs promised_eta);
        deviation >10% flags review.

RULE 10: status updates in track_assist must reflect real crew state. Falsifying
         "crew_arrived" before actual arrival, or "completed" before actual
         completion, is grounds for immediate suspension. TOMO validates
         via the dispatch_id timeline vs the CPC closed_at timestamp.

RULE 11: No "Top Pick" / "TOMO Recommended" / "Featured" badges. TTBS ranks
         source-blind; in an emergency intent these badges would be especially
         dangerous (users in crisis trust badges disproportionately).

RULE 12: Severity-tagged requests (`emergency_severity=critical`) MUST be
         routed at advertised SLA. Partners who deprioritize critical requests
         in favour of higher-margin stranded/non_urgent requests face
         immediate suspension. TOMO tracks dispatch latency by severity tier.

VERSION HISTORY

v1.0.0 — 2026-05-11 — Initial spec. NET commission base. Time-dominant weights
                       (0.50) with safety co-equal under critical severity.