{
  "synthetic": true,
  "execution": "Teaching record only; no live integration tested",
  "slug": "bulk-import-result-reconciliation",
  "group": "catalogue",
  "title": [
    "A finished bulk job still needs row-level reconciliation",
    "批量任务结束，还要逐行对账"
  ],
  "intro": [
    "A catalogue migration supplier may show “completed” while some product mutations failed. Require a source-line register, successful-object readback and a precise retry set. This solves partial execution, separately from pagination or the meaning of a blank CSV column.",
    "目录迁移供应商可能展示completed，但部分商品操作仍失败。应要求原始行登记、成功对象回读及准确重试集合；它处理部分执行，与分页或CSV空值含义不同。"
  ],
  "facts": [
    [
      "Shopify’s bulk-import documentation describes per-line mutation results, user errors and __lineNumber mapping. Operation status alone is not every-row success.",
      "Shopify批量导入文档说明逐行结果、用户错误及__lineNumber映射，任务状态不等于每行成功。",
      "https://shopify.dev/docs/apps/build/apis/graphql-admin/bulk-operations/imports#operation-failures"
    ]
  ],
  "columns": [
    [
      "Synthetic input line",
      "Result evidence",
      "Disposition"
    ],
    [
      "合成输入行",
      "结果依据",
      "处置"
    ]
  ],
  "example": [
    [
      [
        "0 / externalP10",
        "ProductID returned; no userErrors; readback matches",
        "Confirmed success"
      ],
      [
        "0／外部P10",
        "返回商品ID，无用户错误，回读一致",
        "确认成功"
      ]
    ],
    [
      [
        "1 / externalP11",
        "userErrors:invalid field value",
        "Correct row 1; do not replay row 0 blindly"
      ],
      [
        "1／外部P11",
        "用户错误：字段值不符",
        "修正第1行，不能盲重放第0行"
      ]
    ],
    [
      [
        "2 / externalP12",
        "No output row in available result",
        "Unknown; reconcile before retry"
      ],
      [
        "2／外部P12",
        "现有结果没有该行",
        "未知，重试前先核对"
      ]
    ],
    [
      [
        "Operation markedCOMPLETED",
        "3 inputs; 1 success; 1 error; 1 unknown",
        "Not 3 products imported"
      ],
      [
        "任务标COMPLETED",
        "输入3，成功1，错误1，未知1",
        "不能叫导入3件成功"
      ]
    ]
  ],
  "steps": [
    [
      "Freeze the input JSONL file and map stable source IDs to zero-based line numbers. Record operation ID and chosen API version; do not assume output order.",
      "固定输入JSONL，稳定来源ID映射到零起始行号；保存任务ID及API版本，不能假定结果顺序。"
    ],
    [
      "Read the full result and per-line errors, then retrieve successful target objects to verify key business fields. Detect missing, duplicate and unmatched lines explicitly.",
      "读完整结果及逐行错误，再回读成功对象的关键商业字段；明确发现缺行、重复及无法匹配的行。"
    ],
    [
      "Build a correction/reconciliation queue with one owner per unresolved source. Design safe create/update retry semantics before resubmitting any row.",
      "为每个未解决来源指定处理人，建立纠错与核对队列；重提交前先设计创建与修改的安全重试。"
    ]
  ],
  "result": [
    "The example reconciles 3 = 1 confirmed + 1 failed + 1 unknown. A retry file should not be generated until the unknown row is resolved; otherwise the supplier may create a duplicate. A job status and a migration acceptance receipt answer different questions.",
    "本例对账为3=1已确认+1失败+1未知。未知行未解决前不应生成重试文件，否则可能创建重复对象。任务状态与迁移验收回执回答不同问题。"
  ],
  "accept": [
    "Require input-total reconciliation, redacted per-row outcomes and readback evidence for claimed successes. Any unresolved row must remain visible at handover.",
    "须输入总数对账、脱敏逐行结果及所称成功的回读依据；未解决行不能在交接时消失。"
  ],
  "limit": [
    "Synthetic JSONL result, no mutation submitted. API-version semantics and mutation support must be checked for the actual implementation. Resource URLs can expire and must be handled securely.",
    "合成JSONL结果，没有提交修改；实际实施须核对版本及操作支持。结果资源链接可能到期，须安全处理。"
  ]
}
