{
  "artifact": "telegram-job-attachment-contract",
  "version": "2026.07.19.1",
  "sampleOnly": true,
  "inputContract": {
    "required": ["telegramUpdateId", "telegramFileUniqueId", "jobKey", "capturedAt"],
    "jobKeySource": "caption, QR, or explicit bot selection",
    "forbiddenMatchSource": "vision-only guess",
    "idempotencyKey": "telegramUpdateId:telegramFileUniqueId"
  },
  "acceptanceCases": [
    {
      "id": "TG-01",
      "name": "valid explicit job key",
      "input": {
        "telegramUpdateId": "900001",
        "telegramFileUniqueId": "demo_file_a",
        "jobKey": "JOB-DEMO-1042",
        "capturedAt": "2026-07-19T12:00:00Z"
      },
      "jobLookup": {"matches": 1},
      "expected": {"status": "attached", "writes": 1, "reviewRequired": false}
    },
    {
      "id": "TG-02",
      "name": "Telegram retry",
      "input": {
        "telegramUpdateId": "900001",
        "telegramFileUniqueId": "demo_file_a",
        "jobKey": "JOB-DEMO-1042",
        "capturedAt": "2026-07-19T12:00:02Z"
      },
      "jobLookup": {"matches": 1},
      "expected": {"status": "duplicate_acknowledged", "writes": 0, "reviewRequired": false}
    },
    {
      "id": "TG-03",
      "name": "missing job key",
      "input": {
        "telegramUpdateId": "900002",
        "telegramFileUniqueId": "demo_file_b",
        "jobKey": "",
        "capturedAt": "2026-07-19T12:01:00Z"
      },
      "jobLookup": {"matches": 0},
      "expected": {"status": "review_required", "writes": 0, "reviewRequired": true}
    },
    {
      "id": "TG-04",
      "name": "ambiguous job lookup",
      "input": {
        "telegramUpdateId": "900003",
        "telegramFileUniqueId": "demo_file_c",
        "jobKey": "JOB-DEMO-DUPLICATE",
        "capturedAt": "2026-07-19T12:02:00Z"
      },
      "jobLookup": {"matches": 2},
      "expected": {"status": "review_required", "writes": 0, "reviewRequired": true}
    }
  ],
  "receiptFields": [
    "idempotencyKey",
    "jobKey",
    "objectKey",
    "contentSha256",
    "capturedAt",
    "status"
  ],
  "privacyBoundary": "Synthetic identifiers only. No photo bytes, tokens, chat history, staff identity, customer data, or production job records are included."
}
