Overview
AUTO-TOW-019, Select Nearest Qualified Operator, compares candidate towing operators using proximity, certification match, current job load, safety history, and customer rating.
- Decision ID
AUTO-TOW-019- Decision Name
- Select Nearest Qualified Operator
- Industry Profile
auto-towing-select-nearest-qualified-opera-auto-tow-019version1.0.0- Default Profile
balanced- Runnable Scenario
standard- Catalog
DKR-AUTO-RUNTIME-001, version13.9.3- API Compatibility
7.4.0or later catalog execution flow
Understanding This Decision
Select Nearest Qualified Operator helps a towing operation compare available candidate operators before dispatching one to an incident. The decision is useful when dispatch teams need a repeatable recommendation that balances proximity, qualification fit, operator workload, safety history, and recent customer service performance.
Business question
Which operator should be recommended for select nearest qualified operator in the selected Auto Towing context?
Expected outcome
A recommended operator or ranked set of operators with the criteria that most influenced the result.
Typical users
Dispatch managers, towing coordinators, fleet supervisors, service-center staff, and integration teams building towing dispatch workflows.
Decision boundary
Use this decision to rank supplied candidate operators. It does not discover missing operators and does not replace safety, legal, police, roadside, or customer-service procedures.
Architecture
- Request a token from the Identity service.
- Use the returned
jwtTokenas the bearer token. - Load the catalog and decision detail from DKS.
- Build a Prepared Decision Input using canonical criterion IDs.
- Execute the decision through DDE.
- Use
X-Request-IdandX-Correlation-Idfor tracing across DDE and DKS.
Authentication
Request a secure session token from Identity. The current token response field is jwtToken.
POST https://identity.vinquery.com/connect/token
Content-Type: application/json
{
"clientId": "{clientId}",
"clientSecret": "{clientSecret}",
"audience": "vinquery:api:decisioq"
}
Catalog Discovery
Use DKS to discover the catalog and then load complete metadata for AUTO-TOW-019.
GET https://dks.vinquery.com/decisioncatalog
Authorization: Bearer {jwtToken}
GET https://dks.vinquery.com/decisioncatalog/decisions/AUTO-TOW-019
Authorization: Bearer {jwtToken}
Criteria
Criterion IDs are intentionally stable machine identifiers. Display labels are for users; request values should be keyed by canonical criterionId.
| Criterion ID | Name | Direction | Weight | Validation |
|---|---|---|---|---|
proximity_score | Proximity Score | maximize | 25 | score_0_to_100 |
certification_match_score | Certification Match Score | maximize | 25 | score_0_to_100 |
current_job_load | Current Job Load | minimize | 20 | non_negative_number |
safety_history_score | Safety History Score | maximize | 15 | score_0_to_100 |
customer_rating_score | Customer Rating Score | maximize | 15 | score_0_to_100 |
Constraint Processing
This decision currently has no catalog-defined hard constraints. All validated candidates proceed to criteria-based ranking.
| Verified Catalog Constraint | Status | Effect |
|---|---|---|
None returned by DKS for AUTO-TOW-019 | No hard constraints defined | Candidate eligibility is determined by request validation; all validated candidates are ranked by criteria. |
{
"constraintSummary": {
"definedConstraintCount": 0,
"activeConstraintCount": 0,
"eligibleOptionCount": 3,
"excludedOptionCount": 0,
"eligibleOptions": [
"OPTION-001",
"OPTION-002",
"OPTION-003"
],
"excludedOptions": []
}
}
const constraints = decisionDetail.constraints || [];
if (constraints.length === 0) {
// No catalog-defined hard constraints.
// Submit all validated candidates for criteria-based ranking.
}
const summary = response.constraintSummary;
const excluded = response.decisionResult?.excludedOptions || [];
Excluded candidates do not participate in ranking because hard constraints are evaluated before scoring. For AUTO-TOW-019, no candidates are excluded by catalog-defined constraints because DKS currently defines none for this decision.
Industry Profile
The active industry profile uses $.towRequests as the options path, $.optionId as the option ID, and $.name as the option display name.
| Business Data Path | Criterion ID |
|---|---|
option.assessment.proximityScore | proximity_score |
option.assessment.certificationMatchScore | certification_match_score |
option.resource.allocation.currentJobLoad | current_job_load |
option.assessment.safetyHistoryScore | safety_history_score |
option.assessment.customerRatingScore | customer_rating_score |
{
"requestContext": {
"sourceSystem": "auto-towing-demo",
"correlationId": "auto-tow-019-demo-001"
},
"towRequests": [
{
"optionId": "OPTION-001",
"name": "Operator North Zone",
"assessment": {
"proximityScore": 88,
"certificationMatchScore": 88,
"safetyHistoryScore": 88,
"customerRatingScore": 88
},
"resource": {
"allocation": {
"currentJobLoad": 1
}
}
}
]
}
{
"optionId": "OPTION-001",
"name": "Operator North Zone",
"values": {
"proximity_score": 88,
"certification_match_score": 88,
"current_job_load": 1,
"safety_history_score": 88,
"customer_rating_score": 88
}
}
Profiles and Scenarios
A profile changes criterion weights. A scenario describes the operating context for the execution. The active DKS catalog exposes these choices with the decision detail response.
| Profile ID | Name | Purpose |
|---|---|---|
balanced | Balanced | General-purpose profile that preserves the default DKS criterion weights. |
speed_focused | Speed Focused | Places stronger emphasis on response time, proximity, and operational availability. |
safety_focused | Safety Focused | Places stronger emphasis on safety, traffic risk, hazardous conditions, and compliance exposure. |
cost_control | Cost Control | Places stronger emphasis on controlling dispatch, resource, and recovery costs. |
| Scenario ID | Name | Use When |
|---|---|---|
standard | Standard Dispatch Scenario | Normal towing operations with routine dispatch constraints. |
emergency_response | Emergency Response Scenario | Use when public safety, traffic exposure, or police/fire involvement increases urgency. |
limited_capacity | Limited Capacity Scenario | Use when tow units, operators, or equipment are constrained. |
severe_weather | Severe Weather Scenario | Use when weather, road conditions, or visibility materially affect towing operations. |
standard in runnable examples because it is present in the active DKS scenario list for AUTO-TOW-019.Prepared Input
For Prepared Decision Input, send decisionId, selected profile/scenario IDs, and option values keyed by canonical criterion ID.
{
"decisionId": "AUTO-TOW-019",
"profileId": "balanced",
"scenarioId": "standard",
"algorithm": "TOPSIS",
"weightStrategy": "Manual",
"runSensitivity": false,
"requestContext": {
"correlationId": "auto-tow-019-demo-001"
},
"options": [
{
"optionId": "OPTION-001",
"name": "Operator North Zone",
"values": {
"proximity_score": 88,
"certification_match_score": 88,
"current_job_load": 1,
"safety_history_score": 88,
"customer_rating_score": 88
}
},
{
"optionId": "OPTION-002",
"name": "Operator Central Zone",
"values": {
"proximity_score": 80,
"certification_match_score": 80,
"current_job_load": 3,
"safety_history_score": 80,
"customer_rating_score": 80
}
},
{
"optionId": "OPTION-003",
"name": "Operator East Zone",
"values": {
"proximity_score": 72,
"certification_match_score": 72,
"current_job_load": 5,
"safety_history_score": 72,
"customer_rating_score": 72
}
}
]
}
Execute
curl -X POST "https://dde.vinquery.com/api/v1/decide" \
-H "Authorization: Bearer ${DECISIOQ_TOKEN}" \
-H "Content-Type: application/json" \
-H "X-Correlation-Id: auto-tow-019-demo-001" \
--data @auto-tow-019-execute.json
The Decision Engine validates the request, retrieves authoritative criteria, constraints, profiles, scenarios, and validation metadata from DKS, applies hard constraints, ranks eligible options, and returns the decision result plus execution metadata.
Interpret the Result
The successful response is centered on decisionResult. The winner and ranking are deterministic outputs; optional explanation fields add context but do not change the ranking.
{
"service": "decisioq",
"version": "7.6.3",
"requestId": "0HNE...",
"operation": "Decide",
"success": true,
"decisionType": "AUTO-TOW-019",
"decisionVersion": "13.9.3",
"timestampUtc": "2026-07-18T00:00:00Z",
"decisionResult": {
"winner": "OPTION-001",
"confidence": 72.4,
"ranking": [
{
"optionId": "OPTION-001",
"score": 0.8421,
"breakdown": {
"proximity_score": 0.25,
"certification_match_score": 0.25,
"current_job_load": 0.20,
"safety_history_score": 0.15,
"customer_rating_score": 0.15
},
"normalizationBreakdown": {}
}
],
"excludedOptions": [],
"explanation": {
"summary": "Operator North Zone ranked highest based on the submitted towing dispatch criteria.",
"strengths": [],
"weaknesses": [],
"exclusions": []
}
},
"constraintSummary": {
"definedConstraintCount": 0,
"activeConstraintCount": 0,
"eligibleOptionCount": 3,
"excludedOptionCount": 0,
"eligibleOptions": [
"OPTION-001",
"OPTION-002",
"OPTION-003"
],
"excludedOptions": []
},
"warnings": [],
"requestContext": {
"correlationId": "auto-tow-019-demo-001"
}
}
decisionResult.winner.Sensitivity Analysis
Set runSensitivity to true on catalog execution when the client wants recommendation-stability information in the same response. The sensitivity engine perturbs criterion weights by controlled factors and reports whether the winner remains stable.
{
"sensitivityResult": {
"stableWinner": true,
"winner": "OPTION-001",
"mostSensitiveCriterion": "proximity_score",
"confidence": 95,
"criterionImpacts": {
"proximity_score": 0.1842
},
"winnerChangeCounts": {
"proximity_score": 0
}
}
}
Use sensitivity output to decide whether a recommendation is robust enough for automation or should be reviewed by a person.
Explanation of Decision Result
Every successful response can include deterministic explanation text under decisionResult.explanation and explanation. If the optional AI layer is enabled, the response may also include an ai block with structured business-language explanation fields.
{
"ai": {
"enabled": true,
"generated": true,
"schemaValidated": true,
"explanation": {
"summary": "The selected towing operator provided the strongest overall dispatch fit.",
"whyRecommended": "It combined strong proximity and certification match with low current job load, strong safety history, and strong customer rating.",
"keyDrivers": [],
"tradeoffs": [],
"competitors": [],
"sensitivitySummary": "Sensitivity analysis was not included in this response.",
"scenarioSummary": "The standard dispatch scenario was selected.",
"risks": [],
"nextSteps": [],
"assumptions": []
}
}
}
Tracing and Logs
Use request identifiers to connect client, catalog, and execution activity during support or integration testing.
X-Request-Id- Optional client-supplied request ID. If omitted, the server generates one.
X-Correlation-Id- Optional client correlation value propagated from DDE to DKS.
requestContext.correlationId- Optional payload value echoed in the response and used for tracing.
executionTrace- Advanced execution metadata including selected profile, selected scenario, effective weights, and applied constraints.
Code Examples
These examples demonstrate the current DecisioQ flow:
- Request
jwtTokenfromhttps://identity.vinquery.com/connect/token. - Load
AUTO-TOW-019metadata fromhttps://dks.vinquery.com/decisioncatalog/decisions/AUTO-TOW-019. - Execute a Prepared Decision Input at
https://dde.vinquery.com/api/v1/decide.
Set these environment variables before running any companion example:
DECISIOQ_CLIENT_ID
DECISIOQ_CLIENT_SECRET
Optional:
DECISIOQ_IDENTITY_URL=https://identity.vinquery.com/connect/token
DECISIOQ_DKS_URL=https://dks.vinquery.com
DECISIOQ_DDE_URL=https://dde.vinquery.com
Download the source files directly:
Troubleshooting
| Symptom | Likely Cause | What to Check |
|---|---|---|
| 401 Unauthorized | Missing, expired, or invalid bearer token. | Request a fresh jwtToken from Identity and send it as Authorization: Bearer .... |
| Decision not found | The decision ID is not in the active catalog. | Load /decisioncatalog/decisions/AUTO-TOW-019 and confirm the ID is published. |
| Validation failed | A required criterion value is missing or outside its rule. | Use canonical criterion IDs and keep score values in the expected range. |
| HTML error response | An upstream hosted service failed before returning JSON. | Check service health and server logs for Identity, DKS, or DDE. |
Production Checklist
Security
Keep API Consumer credentials and jwtTokens on the server side. Use HTTPS, short-lived bearer tokens, and an API Consumer linked to a DecisioQ account for usage accounting.
Catalog
Load decision metadata from DKS and cache cautiously. Refresh when catalog versions change.
Request Quality
Use canonical criterion IDs, validate value ranges, and send at least two candidate options.
Operations
Send correlation IDs, record request IDs, and monitor non-JSON upstream failures.
Explanation
Display explanation text as supporting context only. Never let AI text override deterministic results.
User Experience
Show business labels to users and keep raw execution trace collapsed for advanced diagnostics.
