# 视觉队列人工移交补充 已在两个客户端 `wechat_bot.py` 加入 `handoff_pending_replies(keys, confirm_uncertain=False)`,与共享 BotThread/离线接口契约一致。 - `sending` 阶段或发送状态一律拒绝移交。 - `uncertain`、`sent_uncommitted`、`unknown`、`receipt_check` 或已登记派发时间,需要明确 `confirm_uncertain=True` 才能移交。 - 原任务完整状态复制到同一原子队列文件的 `manual_handoffs`;字节型视觉指纹转为十六进制。`receipt_checked_by_user` 只代表用户确认已核对,`delivery_confirmed` 始终为 false。 - 有移交记录时文件使用 `{pending, manual_handoffs}` 包装,读取兼容旧裸队列和离线移交结构。移交证据不会作为自动待发任务重载。 - 内存取消标记和持久移交记录共同阻止原消息重发。写盘失败整体回滚,运行中的旧模型结果不能落入同会话的新任务。 - 普通取消同样保护发送中/送达待核对状态,不能经旧 UI 绕过核对。 - 未读扫描遇到已移交会话跳过该会话,继续其他联系人;不会把它当作队列写盘故障阻塞整个扫描。 ## 后续消息恢复 不永久拉黑会话。以下证据可以恢复新一轮自动处理,原发送证据仍保留: 1. 数据库事件是相同账号/会话,消息 ID 不同,发送时间严格晚于移交消息。 2. 纯视觉复制文本完整匹配旧消息基线,并证明末尾追加了同一客户的新消息。工作人员答复、单纯画面变化、没有旧基线的片段均不能解除防重。 纯视觉模式下,用户需打开接管会话让现有文本识别获得证据;无法证明新客户消息的图片/语音仍交人工处理。进度和队列日志会明确提示人工跟进,不会猜测旧消息未送达而重发。 ## 验证 两目录分别运行 `test_visual_handoff_visibility` 15 项及 `test_visual_review_visibility` 11 项,共各 26 项通过,进程退出码 0。全部使用合成任务/临时队列,禁止真实键鼠动作。旧的 450 项回归由主任务统一复跑。 补充修改前备份:各目录 `backups/review-visibility-20260916/wechat_bot.before-handoff.py`。本次未操作用户真实队列或客户消息。