交互卡内核结算与 Outbox 唤醒:从两阶段 Settle 到原载体精确续跑

交互卡内核结算与 Outbox 唤醒:从两阶段 Settle 到原载体精确续跑 由 Archify 生成的时序图。 POST /interactions/:id/settle (actorPolicyVersion, answer) beginSettlement:校验 status=pending,INSERT attempt(submitting) 若非 pending 则查 alreadyWritten(payloadHash) 幂等返回 duplicate validateAnswer + authorityCoordinator.verify 通过 → completeSettlement 置 lifecycle_status=resolved(v+1) + 写 resume_commands(command_id=attempt_id) 返回 SettleInteractionResult(accepted, interactionVersion=v+1) lockRoot FOR UPDATE + 3 表 Join (resume_commands ⋈ attempts ⋈ interactions) 核对 attempt_v+1=interaction_v、destination_binding 与 pending_interaction_id settleInteractionInTx 写消息 + 置 agent_runs=pending, ckpt=active UPDATE conversation_interaction_resume_commands SET status=completed 阶段 1:客户端携带版本提交答复、ActorPolicy 校验与 beginSettlement 阶段 2:领域验证、completeSettlement 原子推进 version+1 与 Outbox 落盘 阶段 3:读取只读 Outbox 证据、3 表 Join 核对冻结目的地并唤醒原载体 Desktop Card UI · Resolution v2 · 时序参与者 Desktop Card UI Resolution v2 InteractionKernel · settle() · 时序参与者 InteractionKernel settle() PG Kernel Tables · Ix / Attempts / Outbox · 时序参与者 PG Kernel Tables Ix / Attempts / Outbox Work Activation · activateFromSettlement · 时序参与者 Work Activation activateFromSettlement PG Work Carrier · Runs / Checkpoints · 时序参与者 PG Work Carrier Runs / Checkpoints 图例 请求 返回 安全

交互状态与尝试状态解耦

  • • conversation_interactions 维护卡生命周期与单调版本号 version
  • • settlement_attempts 独立记录每次提交尝试与 payloadHash
  • • 网络重试命中同 actorRef + payloadHash 直接返回 duplicate

Outbox 仅作只读唤醒证据

  • • resume_commands.command_id 精确等于获批的 attempt_id
  • • 创建交互时冻结的 resumeDestinationBinding 必须与结算目的地一致
  • • 绝不因唤醒命令新建第二个 Run,严格复用原 Run 与 Invocation

死信与过期卡 Fail-Closed

  • • recoverRuntimeWorkChildInteraction 区分永久错误与待核对恢复
  • • 同步将 resume_commands 与 interaction_outbox 置为 dead_letter
  • • Stop 已生效时历史 ACK 仅返回 already_stopped 绝不越权推进