{
  "experimentId": "n8n-http-retry-behavior",
  "protocolVersion": "1.0.0",
  "n8nImage": "n8nio/n8n:2.30.5",
  "n8nImageDigest": "n8nio/n8n@sha256:450853cd21a2ce36587c4c860eb26927c1ceba9496bf55f4c213b5d3a6dc8c6f",
  "runtime": {
    "platform": "darwin",
    "architecture": "arm64",
    "dockerServerVersion": "28.3.3"
  },
  "startedAt": "2026-07-23T08:59:39.368Z",
  "completedAt": "2026-07-23T09:05:01.534Z",
  "workflowRuns": 70,
  "strategyObservations": 140,
  "repetitionsPerScenario": 10,
  "retryPolicy": {
    "maxTries": 3,
    "waitBetweenTriesMs": 100,
    "requestTimeoutMs": 300,
    "fixtureTimeoutDelayMs": 800
  },
  "transientRecovery": {
    "recovered": 30,
    "total": 30
  },
  "persistentFailure": {
    "remainedFailed": 30,
    "total": 30
  },
  "requests": {
    "noRetry": 70,
    "retry3": 190,
    "retryToNoRetryRatio": 2.714
  },
  "protocolMismatches": 0,
  "scenarios": {
    "control_200": {
      "no_retry": {
        "observations": 10,
        "successes": 10,
        "failures": 0,
        "totalRequests": 10,
        "nodeDurationMs": {
          "min": 42,
          "p50": 49,
          "p95": 64,
          "max": 64
        }
      },
      "retry_3": {
        "observations": 10,
        "successes": 10,
        "failures": 0,
        "totalRequests": 10,
        "nodeDurationMs": {
          "min": 10,
          "p50": 12,
          "p95": 444,
          "max": 444
        }
      }
    },
    "recover_429": {
      "no_retry": {
        "observations": 10,
        "successes": 0,
        "failures": 10,
        "totalRequests": 10,
        "nodeDurationMs": {
          "min": 38,
          "p50": 64,
          "p95": 93,
          "max": 93
        }
      },
      "retry_3": {
        "observations": 10,
        "successes": 10,
        "failures": 0,
        "totalRequests": 30,
        "nodeDurationMs": {
          "min": 232,
          "p50": 237,
          "p95": 250,
          "max": 250
        }
      }
    },
    "recover_500": {
      "no_retry": {
        "observations": 10,
        "successes": 0,
        "failures": 10,
        "totalRequests": 10,
        "nodeDurationMs": {
          "min": 39,
          "p50": 53,
          "p95": 103,
          "max": 103
        }
      },
      "retry_3": {
        "observations": 10,
        "successes": 10,
        "failures": 0,
        "totalRequests": 30,
        "nodeDurationMs": {
          "min": 225,
          "p50": 236,
          "p95": 251,
          "max": 251
        }
      }
    },
    "recover_timeout": {
      "no_retry": {
        "observations": 10,
        "successes": 0,
        "failures": 10,
        "totalRequests": 10,
        "nodeDurationMs": {
          "min": 350,
          "p50": 358,
          "p95": 411,
          "max": 411
        }
      },
      "retry_3": {
        "observations": 10,
        "successes": 10,
        "failures": 0,
        "totalRequests": 30,
        "nodeDurationMs": {
          "min": 842,
          "p50": 852,
          "p95": 858,
          "max": 858
        }
      }
    },
    "persistent_429": {
      "no_retry": {
        "observations": 10,
        "successes": 0,
        "failures": 10,
        "totalRequests": 10,
        "nodeDurationMs": {
          "min": 35,
          "p50": 46,
          "p95": 190,
          "max": 190
        }
      },
      "retry_3": {
        "observations": 10,
        "successes": 0,
        "failures": 10,
        "totalRequests": 30,
        "nodeDurationMs": {
          "min": 231,
          "p50": 235,
          "p95": 245,
          "max": 245
        }
      }
    },
    "persistent_500": {
      "no_retry": {
        "observations": 10,
        "successes": 0,
        "failures": 10,
        "totalRequests": 10,
        "nodeDurationMs": {
          "min": 43,
          "p50": 54,
          "p95": 66,
          "max": 66
        }
      },
      "retry_3": {
        "observations": 10,
        "successes": 0,
        "failures": 10,
        "totalRequests": 30,
        "nodeDurationMs": {
          "min": 237,
          "p50": 241,
          "p95": 246,
          "max": 246
        }
      }
    },
    "persistent_timeout": {
      "no_retry": {
        "observations": 10,
        "successes": 0,
        "failures": 10,
        "totalRequests": 10,
        "nodeDurationMs": {
          "min": 353,
          "p50": 362,
          "p95": 380,
          "max": 380
        }
      },
      "retry_3": {
        "observations": 10,
        "successes": 0,
        "failures": 10,
        "totalRequests": 30,
        "nodeDurationMs": {
          "min": 1144,
          "p50": 1162,
          "p95": 1187,
          "max": 1187
        }
      }
    }
  },
  "conclusion": "Three fixed attempts recovered every controlled transient 429, 500, and timeout in this protocol, but did not recover persistent failures and increased request volume. Retry limits and failure classification are required together.",
  "limitations": [
    "The HTTP service is local and deterministic; it does not model internet routing, vendor rate-limit windows, or shared quotas.",
    "The result covers the n8n HTTP Request node in n8n 2.30.5 with a fixed 100 ms wait and 300 ms response-header timeout.",
    "The experiment does not test exponential backoff, jitter, Retry-After compliance, idempotency, credentials, queue mode, or concurrent workflows.",
    "Ten repetitions per scenario are sufficient to validate this protocol outcome, not to estimate rare production failure rates."
  ]
}
