{
  "artifact": "Synthetic GHL stage-change recovery blueprint",
  "jobProviderObjectId": "2093047458245144222",
  "disclosure": "Application proof only. No client credentials, endpoints, payloads, or production performance claims.",
  "eventContract": {
    "correlationKey": ["opportunityId", "stageId", "occurredAt"],
    "persistedFields": ["rawPayload", "payloadHash", "receivedAt", "sourceRevision", "processingState"]
  },
  "nodes": [
    { "id": "ghl-stage-change", "type": "source", "purpose": "Authoritative opportunity stage transition" },
    { "id": "webhook-ingress", "type": "ingress", "purpose": "Validate, normalize, calculate idempotency key" },
    { "id": "durable-event-ledger", "type": "persistence", "purpose": "Store raw event before acknowledging the request" },
    { "id": "n8n-worker", "type": "processor", "purpose": "Route, enrich, and fan out with bounded retries" },
    { "id": "destination-upserts", "type": "destination", "purpose": "Idempotent Airtable, Slack, reporting, and billing writes" },
    { "id": "dead-letter-queue", "type": "recovery", "purpose": "Hold terminal failures for inspected replay" },
    { "id": "scheduled-reconciliation", "type": "recovery", "purpose": "Compare recent GHL state changes with event receipts and replay gaps" }
  ],
  "failureTests": ["timeout", "duplicate delivery", "out-of-order stage update", "rate limit", "malformed payload", "downstream outage"],
  "operatorMetrics": ["ingress receipt rate", "reconciliation drift", "queue depth", "retry count", "dead-letter age", "destination receipt rate"]
}
