{
  "id": "bi-loop",
  "title": "Anti-loop: inbound->outbound->inbound converges, no proliferation",
  "kind": "hubspot_sync",
  "caseTimeoutMs": 540000,
  "linkedIssues": [],
  "provenance": {
    "businessScenario": "BI-LOOP — one record cycling inbound->outbound->inbound across rounds must keep stable count and values, no infinite loop, no proliferation. Single round-trip modeled linearly with delayMs settle on each leg. step2 baseline FirstName=LoopFN, step4 jobtitle=LoopTitle (outbound leg landed), step6 FirstName converges to LoopFN2 with Title retained, step7 COUNT()=1.",
    "reportedBy": "HubSpot sync spec BI-LOOP (hubspot-nexuscrm-sync-CASE-EXEC-SELFCONTAINED)",
    "capturedAt": "2026-06-18",
    "calibrated": "[calibrated] Reviewed against ksyun sandbox: native-Lead anti-loop round-trip; all values (email/firstname/Title) sandbox-legal, COUNT()=1 anti-proliferation invariant retained. No value changes needed."
  },
  "steps": [
    {
      "id": "create-contact",
      "system": "hubspot",
      "method": "POST",
      "path": "/crm/v3/objects/contacts",
      "body": {
        "properties": {
          "email": "biloop-{{__runId}}@example.com",
          "firstname": "LoopFN",
          "lastname": "LoopLN"
        }
      },
      "expectStatusRange": [200, 299],
      "assertions": [
        { "path": "response.body.id", "exists": true }
      ]
    },
    {
      "id": "wait-row",
      "system": "nexuscrm",
      "authRole": "admin",
      "method": "GET",
      "path": "/services/data/v63.0/query?q=SELECT Id, FirstName FROM Lead WHERE HubSpot_Id__c='{{steps.create-contact.response.body.id}}' LIMIT 1",
      "expectStatus": 200,
      "poll": { "budgetMs": 180000, "intervalMs": 6000 },
      "onTimeout": "fail",
      "assertions": [
        { "path": "response.body.records[0].FirstName", "equals": "LoopFN" }
      ]
    },
    {
      "id": "nx-edit-title",
      "system": "nexuscrm",
      "authRole": "admin",
      "method": "PATCH",
      "path": "/services/data/v63.0/sobjects/Lead/{{steps.wait-row.response.body.records[0].Id}}",
      "body": { "Title": "LoopTitle{{__runId}}" },
      "delayMs": 20000,
      "expectStatusRange": [200, 299]
    },
    {
      "id": "confirm-nx-title",
      "system": "nexuscrm",
      "authRole": "admin",
      "method": "GET",
      "path": "/services/data/v63.0/query?q=SELECT Id, Title FROM Lead WHERE Id='{{steps.wait-row.response.body.records[0].Id}}' LIMIT 1",
      "expectStatus": 200,
      "poll": { "budgetMs": 30000, "intervalMs": 3000 },
      "onTimeout": "fail",
      "assertions": [
        { "path": "response.body.records[0].Title", "equals": "LoopTitle{{__runId}}" }
      ]
    },
    {
      "id": "wait-outbound-leg",
      "system": "hubspot",
      "method": "GET",
      "path": "/crm/v3/objects/contacts/{{steps.create-contact.response.body.id}}?properties=jobtitle",
      "expectStatus": 200,
      "poll": { "budgetMs": 240000, "intervalMs": 6000 },
      "onTimeout": "fail",
      "assertions": [
        { "path": "response.body.properties.jobtitle", "equals": "LoopTitle{{__runId}}" }
      ]
    },
    {
      "id": "hs-edit-fn",
      "system": "hubspot",
      "method": "PATCH",
      "path": "/crm/v3/objects/contacts/{{steps.create-contact.response.body.id}}",
      "body": { "properties": { "firstname": "LoopFN2{{__runId}}" } },
      "delayMs": 20000,
      "expectStatusRange": [200, 299]
    },
    {
      "id": "assert-converge",
      "system": "nexuscrm",
      "authRole": "admin",
      "method": "GET",
      "path": "/services/data/v63.0/query?q=SELECT Id, FirstName, Title FROM Lead WHERE HubSpot_Id__c='{{steps.create-contact.response.body.id}}' LIMIT 1",
      "expectStatus": 200,
      "poll": { "budgetMs": 240000, "intervalMs": 6000 },
      "onTimeout": "fail",
      "assertions": [
        { "path": "response.body.records[0].FirstName", "equals": "LoopFN2{{__runId}}" },
        { "path": "response.body.records[0].Title", "equals": "LoopTitle{{__runId}}" }
      ]
    },
    {
      "id": "assert-count-one",
      "system": "nexuscrm",
      "authRole": "admin",
      "method": "GET",
      "path": "/services/data/v63.0/query?q=SELECT COUNT() FROM Lead WHERE HubSpot_Id__c='{{steps.create-contact.response.body.id}}'",
      "expectStatus": 200,
      "delayMs": 15000,
      "poll": { "budgetMs": 120000, "intervalMs": 6000 },
      "onTimeout": "fail",
      "assertions": [
        { "path": "response.body.totalSize", "numericEquals": 1 }
      ]
    }
  ]
}
