M54: harden operations and demo resilience
MobilityOps acceptance / backend (push) Failing after 19s
MobilityOps acceptance / frontend (push) Successful in 25s
MobilityOps acceptance / e2e (push) Skipped

This commit is contained in:
NuklearRabbit
2026-08-24 03:31:03 +02:00
parent b0706989db
commit 81e3fd63bd
101 changed files with 5641 additions and 828 deletions
+2 -2
View File
@@ -17,9 +17,9 @@ credential values are never embedded; nodes reference named n8n credentials inst
| Live workflow ID | `mobilityops-return-processing` |
| Active status (as of 2026-08-04) | Active / Published |
| Error Workflow | `Fleet Ops — Workflow Error Handler` (wired) |
| Timeouts / bounded retries | `Record follow-up` and heartbeat HTTP nodes: 15s timeout, retry on fail (3 tries, 1000ms wait) |
| Timeouts / bounded retries | `Record follow-up` and heartbeat HTTP nodes: 2s timeout, retry on fail (2 tries, 1000ms wait); their combined 10s worst-case retry budget remains below Fleet Ops's 15s dispatcher timeout and 120s delivery lease. |
| Execution telemetry | Successful runs POST execution ID and status to `/api/v1/integrations/n8n/heartbeat`; failed runs are registered by the Error Workflow. |
| Checksum (sha256) | `19f233b6de90a3474010d5495a53c75e969fb5de591e84dd3abcf9635304c1f1` (HTTPS callback definition, 2026-08-21) |
| Checksum (sha256) | `a282d92dc33cb838609ab32ca2d9502d141d0c82d83668bdfb341a24e19e3bdc` (bounded retries and strict event/correlation forwarding, 2026-08-23) |
## 2. Fleet Ops — Scheduled Data Quality Scan
+5 -5
View File
@@ -24,7 +24,7 @@
},
{
"parameters": {
"jsCode": "const e = $json.body ?? $json;\nif (e.event_type !== 'vehicle.returned.v1') throw new Error('Unsupported event type');\nconst reasons = e.data?.attention_reasons ?? [];\nreturn [{json: {event_id: e.event_id, event_type: e.event_type, aggregate_ref: e.aggregate.public_ref, follow_up: reasons.length ? 'attention_required' : 'cleaning', summary: reasons.join('; ') || 'Create cleaning follow-up'}}];"
"jsCode": "const e = $json.body ?? $json;\nif (e.event_type !== 'vehicle.returned.v1') throw new Error('Unsupported event type');\nconst reasons = e.data?.attention_reasons ?? [];\nreturn [{json: {event_id: e.event_id, correlation_id: e.correlation_id, event_type: e.event_type, aggregate_ref: e.aggregate.public_ref, follow_up: reasons.length ? 'attention_required' : 'cleaning', summary: reasons.join('; ') || 'Create cleaning follow-up'}}];"
},
"id": "validate-node",
"name": "Validate and derive follow-up",
@@ -52,7 +52,7 @@
"rawContentType": "application/json",
"body": "={{JSON.stringify($json)}}",
"options": {
"timeout": 15000
"timeout": 2000
}
},
"id": "callback-node",
@@ -66,7 +66,7 @@
}
},
"retryOnFail": true,
"maxTries": 3,
"maxTries": 2,
"waitBetweenTries": 1000
},
{
@@ -84,7 +84,7 @@
{ "name": "execution_id", "value": "={{ $execution.id }}" },
{ "name": "status", "value": "succeeded" }
]},
"options": { "timeout": 15000 }
"options": { "timeout": 2000 }
},
"id": "heartbeat-node",
"name": "Report workflow heartbeat",
@@ -93,7 +93,7 @@
"position": [980, 300],
"credentials": { "httpHeaderAuth": { "name": "Fleet Ops Service Token" } },
"retryOnFail": true,
"maxTries": 3,
"maxTries": 2,
"waitBetweenTries": 1000
},
{