"""用人工结果演示批任务对账；不提交外部任务，本轮未执行。

不按返回顺序关联输入。缺失结果保持 pending，失败只列为待处理，
是否可重试还应根据真实错误类别与任务语义判断。
"""
submitted = {
    "ticket-001": {"input_version": "v3", "text": "普通咨询"},
    "ticket-002": {"input_version": "v3", "text": "重复扣款"},
    "ticket-003": {"input_version": "v3", "text": "陌生登录"},
}
# 故意乱序返回，并遗漏第三项，让“尚未收到”与“失败”成为不同状态。
received = [
    {"id": "ticket-002", "input_version": "v3", "status": "failed", "error": "temporary"},
    {"id": "ticket-001", "input_version": "v3", "status": "succeeded", "category": "general"},
]
ledger = {task_id: {"status": "pending"} for task_id in submitted}
seen = set()
for item in received:
    task_id = item["id"]
    if task_id not in submitted:
        raise ValueError(f"返回了未知任务：{task_id}")
    if task_id in seen:
        raise ValueError(f"结果重复，需要依据尝试号去重：{task_id}")
    if item["input_version"] != submitted[task_id]["input_version"]:
        raise ValueError(f"输入版本不一致，不能覆盖当前结果：{task_id}")
    seen.add(task_id)
    ledger[task_id] = item

for task_id, record in ledger.items():
    print(task_id, record["status"])
# 这里只生成列表，不自动执行重试。真实结果成功后仍需校验类别与业务事实。
print("失败待处理：", [key for key, value in ledger.items() if value["status"] == "failed"])
print("尚无结果：", [key for key, value in ledger.items() if value["status"] == "pending"])
