The STAR Booking Contract
Every booking-shaped artifact AVX produces — service request tickets,
appointment proposals, warranty pre-checks — is emitted as STAR-shaped
JSON.
The structure maps 1:1 to the Standards for Technology in Automotive
Retail (STAR) XML message types, so tenants already consuming STAR XML
can receive a JSON equivalent and enable an optional XML converter
via the booking.starXmlConversion tenant config flag.
Message envelope
Every STAR-JSON message shares a common outer envelope:
{ "schemaVersion": "1.0.0", "messageType": "ServiceRequestAdd", "messageId": "msg-<uuid>", "sessionId": "vsa-sess-<id>", "tenantId": "<tenant-slug>", "createdAt": "<ISO 8601 UTC>", "createdBy": "vsa-supervisor-v1", "correlation": { "triageDecisionId": "<triage-uuid>", "vin": "<vin>", "customerId": "<customer-id or null>" }, "payload": {}, "signature": { "algo": "HMAC-SHA256", "keyId": "<signing-key-id>", "value": "<base64>" } }
The three message types and their scope are:
messageType
|
Scope | Triggered by |
|---|---|---|
|
|
Implemented — emitted by every |
P0 (automatic) or P1/P2/P3 on customer confirmation via |
|
|
Extension point — not emitted by the current |
|
|
|
Extension point — not emitted by the current |
|
Booking behavior and extension points
The book() tool creates a ServiceRequestAdd envelope with the triage
classification, recommended action, and session context.
When the CMS write is enabled (VSA_BOOK_WRITE_CMS=true), the booking is
persisted as a scheduled row in the CMS service-history table so the iOS app
and the CMS Fleet Intelligence portal can surface it alongside completed service records.
The envelope is returned to the caller with status: "sink-accepted" (CMS
write succeeded) or "draft-created" (CMS write skipped or unavailable).
AppointmentAdd and WarrantyClaimPreCheck message types are defined in the
STAR schema but are not emitted by the current book() implementation.
To extend:
To add calendar slot proposal: extend book() to read a tenant
calendar-availability feed and propose concrete slots.
Emit an AppointmentAdd message with status: "proposed" and populated
proposedSlots.
Transition to "confirmed" when the customer accepts a slot.
Gate this path on features.calendarSlotProposal: true in the tenant config.
To add DMS booking: extend book() to call a tenant DMS API and receive a
confirmed booking number.
Emit AppointmentAdd with status: "confirmed" from the live DMS response.
Gate this path on features.dmsBooking: true in the tenant config.
Consuming STAR-JSON messages
STAR-JSON messages are delivered to the tenant’s configured sink. Tenants that process STAR XML can enable the converter:
{ "booking": { "starXmlConversion": true, "starVersion": "5.6.4" } }
When enabled, a thin Lambda (vsa-star-xml-converter) converts the JSON
envelope to STAR 5.x XML.
To add the converter, implement a Lambda that:
-
Maps the
ServiceRequestAddJSON envelope to STAR 5.x XML. -
Validates output against the STAR XSD and fails hard on any mapping error — never silently emits invalid XML.
-
Is invoked after every
book()call whenbooking.starXmlConversion: trueis set in the tenant configuration.
Fields not present in the STAR schema are emitted inside a STAR UserArea
extension block to preserve round-trip integrity.
XML conversion is opt-in; the default behavior emits JSON only.
The full field reference for all three message types, including the
ServiceRequestAdd, AppointmentAdd, and WarrantyClaimPreCheck
payloads, enumerations, and STAR XML mapping principles, is defined in
docs/VSA_STAR_JSON_SCHEMA.md in the AVX repository.
Emitting a booking artifact from a custom tool
If a custom tool needs to produce a STAR message — for example, a
partner DMS tool that generates a repair order — it should call the
book() tool rather than constructing the envelope directly.
Pass the structured service request data and let book() assign the
messageId, sessionId, and signature:
# Inside a custom partner-DMS tool from agents.supervisor.tools.book import make_book_tool # The supervisor registers book() normally; the custom tool delegates # to it rather than constructing the STAR envelope itself. # This preserves the HMAC signature and sink delivery logic.
Custom message types not in the STAR set should be emitted inside
the payload._extensions field to preserve round-trip integrity if a
STAR XML converter is added later.