{
  "schemaVersion": 1,
  "runId": "2026-09-24-llm-api-retry-local",
  "kind": "legacy",
  "title": "LLM API 재시도 클라이언트 로컬 HTTP 실험",
  "protocol": {
    "id": "llm-api-retry-local",
    "version": "2026-09-24",
    "label": "API 재시도 동작 확인",
    "round": null,
    "path": "downloads/llm-api-retry-local/run-experiment.mjs",
    "commit": null,
    "commitNote": "실행 전에 저장소 커밋을 남기지 않았어요. 시나리오와 기대 결과는 run-experiment.mjs 안에 먼저 선언돼 있지만, 그 시점을 증명할 커밋이나 해시 기록은 없어요. 공개한 결과는 시험 중 날짜 해석을 고친 뒤 마지막으로 통과한 실행이에요."
  },
  "startedAt": "2026-09-24T01:25:52.812Z",
  "finishedAt": "2026-09-24T01:25:52.812Z",
  "environment": {
    "runtime": "Node.js v22.19.0 (darwin arm64)",
    "notes": [
      "시작 시각은 남기지 않아 결과 파일을 쓴 시각(runAt)만 적었어요.",
      "127.0.0.1 로컬 시험 서버만 썼고 실제 AI API는 부르지 않았어요. 토큰·요금·모델 품질은 재지 않았어요.",
      "Retry-After 해석 사례 11개도 같은 실행에서 통과했어요."
    ]
  },
  "subjects": [
    {
      "key": "retry-client",
      "provider": "코딩하는 상인 예제 코드",
      "modelId": "retry-client.mjs",
      "displayName": "retry-client.mjs",
      "iconSlug": "",
      "access": "local",
      "settings": {
        "maxAttempts": 3,
        "deadlineMs": 3000,
        "maxRetryDelayMs": 2000,
        "baseDelayMs": 100,
        "jitterMs": 0
      }
    }
  ],
  "trials": [
    {
      "subjectKey": "retry-client",
      "taskId": "429_then_200_retry_after_seconds",
      "attempt": 1,
      "outputPath": "downloads/llm-api-retry-local/results.json",
      "finish": "stop",
      "latencyMs": 1012
    },
    {
      "subjectKey": "retry-client",
      "taskId": "503_then_200_http_date",
      "attempt": 1,
      "outputPath": "downloads/llm-api-retry-local/results.json",
      "finish": "stop",
      "latencyMs": 1028
    },
    {
      "subjectKey": "retry-client",
      "taskId": "500_twice_then_200",
      "attempt": 1,
      "outputPath": "downloads/llm-api-retry-local/results.json",
      "finish": "stop",
      "latencyMs": 305
    },
    {
      "subjectKey": "retry-client",
      "taskId": "500_persistent",
      "attempt": 1,
      "outputPath": "downloads/llm-api-retry-local/results.json",
      "finish": "stop",
      "latencyMs": 310
    },
    {
      "subjectKey": "retry-client",
      "taskId": "429_credit_exhausted",
      "attempt": 1,
      "outputPath": "downloads/llm-api-retry-local/results.json",
      "finish": "stop",
      "latencyMs": 0
    },
    {
      "subjectKey": "retry-client",
      "taskId": "401_invalid_key",
      "attempt": 1,
      "outputPath": "downloads/llm-api-retry-local/results.json",
      "finish": "stop",
      "latencyMs": 3
    },
    {
      "subjectKey": "retry-client",
      "taskId": "429_unknown_code",
      "attempt": 1,
      "outputPath": "downloads/llm-api-retry-local/results.json",
      "finish": "stop",
      "latencyMs": 0
    },
    {
      "subjectKey": "retry-client",
      "taskId": "429_delay_60s",
      "attempt": 1,
      "outputPath": "downloads/llm-api-retry-local/results.json",
      "finish": "stop",
      "latencyMs": 2
    },
    {
      "subjectKey": "retry-client",
      "taskId": "429_beyond_deadline",
      "attempt": 1,
      "outputPath": "downloads/llm-api-retry-local/results.json",
      "finish": "stop",
      "latencyMs": 1
    },
    {
      "subjectKey": "retry-client",
      "taskId": "503_invalid_retry_after",
      "attempt": 1,
      "outputPath": "downloads/llm-api-retry-local/results.json",
      "finish": "stop",
      "latencyMs": 102
    },
    {
      "subjectKey": "retry-client",
      "taskId": "200_body_timeout",
      "attempt": 1,
      "outputPath": "downloads/llm-api-retry-local/results.json",
      "finish": "stop",
      "latencyMs": 81
    },
    {
      "subjectKey": "retry-client",
      "taskId": "429_then_200_retry_after_seconds",
      "attempt": 2,
      "outputPath": "downloads/llm-api-retry-local/results.json",
      "finish": "stop",
      "latencyMs": 1003
    },
    {
      "subjectKey": "retry-client",
      "taskId": "503_then_200_http_date",
      "attempt": 2,
      "outputPath": "downloads/llm-api-retry-local/results.json",
      "finish": "stop",
      "latencyMs": 1192
    },
    {
      "subjectKey": "retry-client",
      "taskId": "500_twice_then_200",
      "attempt": 2,
      "outputPath": "downloads/llm-api-retry-local/results.json",
      "finish": "stop",
      "latencyMs": 305
    },
    {
      "subjectKey": "retry-client",
      "taskId": "500_persistent",
      "attempt": 2,
      "outputPath": "downloads/llm-api-retry-local/results.json",
      "finish": "stop",
      "latencyMs": 304
    },
    {
      "subjectKey": "retry-client",
      "taskId": "429_credit_exhausted",
      "attempt": 2,
      "outputPath": "downloads/llm-api-retry-local/results.json",
      "finish": "stop",
      "latencyMs": 0
    },
    {
      "subjectKey": "retry-client",
      "taskId": "401_invalid_key",
      "attempt": 2,
      "outputPath": "downloads/llm-api-retry-local/results.json",
      "finish": "stop",
      "latencyMs": 0
    },
    {
      "subjectKey": "retry-client",
      "taskId": "429_unknown_code",
      "attempt": 2,
      "outputPath": "downloads/llm-api-retry-local/results.json",
      "finish": "stop",
      "latencyMs": 0
    },
    {
      "subjectKey": "retry-client",
      "taskId": "429_delay_60s",
      "attempt": 2,
      "outputPath": "downloads/llm-api-retry-local/results.json",
      "finish": "stop",
      "latencyMs": 0
    },
    {
      "subjectKey": "retry-client",
      "taskId": "429_beyond_deadline",
      "attempt": 2,
      "outputPath": "downloads/llm-api-retry-local/results.json",
      "finish": "stop",
      "latencyMs": 1
    },
    {
      "subjectKey": "retry-client",
      "taskId": "503_invalid_retry_after",
      "attempt": 2,
      "outputPath": "downloads/llm-api-retry-local/results.json",
      "finish": "stop",
      "latencyMs": 102
    },
    {
      "subjectKey": "retry-client",
      "taskId": "200_body_timeout",
      "attempt": 2,
      "outputPath": "downloads/llm-api-retry-local/results.json",
      "finish": "stop",
      "latencyMs": 82
    },
    {
      "subjectKey": "retry-client",
      "taskId": "429_then_200_retry_after_seconds",
      "attempt": 3,
      "outputPath": "downloads/llm-api-retry-local/results.json",
      "finish": "stop",
      "latencyMs": 1003
    },
    {
      "subjectKey": "retry-client",
      "taskId": "503_then_200_http_date",
      "attempt": 3,
      "outputPath": "downloads/llm-api-retry-local/results.json",
      "finish": "stop",
      "latencyMs": 1203
    },
    {
      "subjectKey": "retry-client",
      "taskId": "500_twice_then_200",
      "attempt": 3,
      "outputPath": "downloads/llm-api-retry-local/results.json",
      "finish": "stop",
      "latencyMs": 308
    },
    {
      "subjectKey": "retry-client",
      "taskId": "500_persistent",
      "attempt": 3,
      "outputPath": "downloads/llm-api-retry-local/results.json",
      "finish": "stop",
      "latencyMs": 311
    },
    {
      "subjectKey": "retry-client",
      "taskId": "429_credit_exhausted",
      "attempt": 3,
      "outputPath": "downloads/llm-api-retry-local/results.json",
      "finish": "stop",
      "latencyMs": 1
    },
    {
      "subjectKey": "retry-client",
      "taskId": "401_invalid_key",
      "attempt": 3,
      "outputPath": "downloads/llm-api-retry-local/results.json",
      "finish": "stop",
      "latencyMs": 0
    },
    {
      "subjectKey": "retry-client",
      "taskId": "429_unknown_code",
      "attempt": 3,
      "outputPath": "downloads/llm-api-retry-local/results.json",
      "finish": "stop",
      "latencyMs": 0
    },
    {
      "subjectKey": "retry-client",
      "taskId": "429_delay_60s",
      "attempt": 3,
      "outputPath": "downloads/llm-api-retry-local/results.json",
      "finish": "stop",
      "latencyMs": 0
    },
    {
      "subjectKey": "retry-client",
      "taskId": "429_beyond_deadline",
      "attempt": 3,
      "outputPath": "downloads/llm-api-retry-local/results.json",
      "finish": "stop",
      "latencyMs": 1
    },
    {
      "subjectKey": "retry-client",
      "taskId": "503_invalid_retry_after",
      "attempt": 3,
      "outputPath": "downloads/llm-api-retry-local/results.json",
      "finish": "stop",
      "latencyMs": 103
    },
    {
      "subjectKey": "retry-client",
      "taskId": "200_body_timeout",
      "attempt": 3,
      "outputPath": "downloads/llm-api-retry-local/results.json",
      "finish": "stop",
      "latencyMs": 82
    }
  ],
  "pricing": [],
  "fx": null,
  "totals": {
    "costUsd": 0,
    "costKrw": 0
  },
  "grading": {
    "method": "auto",
    "rubricPath": "downloads/llm-api-retry-local/run-experiment.mjs",
    "humanSampleCount": 0
  },
  "files": [
    {
      "path": "downloads/llm-api-retry-local/README.md",
      "sha256": "9c410bda0097db0e6887eb73d4a5235f3213b1e5207b399ba4a032855442d06e",
      "bytes": 3176
    },
    {
      "path": "downloads/llm-api-retry-local/results.json",
      "sha256": "c12d209ea3f637bdf73445a288128164b85d0f0eec6993f98f07ca129f57260f",
      "bytes": 18911
    },
    {
      "path": "downloads/llm-api-retry-local/retry-client.mjs",
      "sha256": "6eec4abd14d0f17d3e9bbbe7331b8d6e18b7bfba615fa0eef5021aa2f1b96b8a",
      "bytes": 3618
    },
    {
      "path": "downloads/llm-api-retry-local/run-experiment.mjs",
      "sha256": "474503dfd6fb39197932b5a82458549395ec779f4d2ad57cd4545bd2d87e0b61",
      "bytes": 4982
    }
  ],
  "licence": "CC-BY-4.0",
  "outputsLicenceNote": "AI 출력물은 없어요. 로컬 시험 서버 응답과 실행 기록만 담았어요.",
  "secretsScan": {
    "tool": "scripts/lab/build-legacy-runs.ts 비밀값 패턴 검사(sk- 키, AIza 키, Bearer 토큰, Authorization 헤더, 개인 키)",
    "passedAt": "2026-10-13"
  }
}
