feat: add audited workflow review and bounded task recovery

This commit is contained in:
2026-09-18 05:02:47 +08:00
parent 7eac8c365a
commit 1d1a441167
20 changed files with 1437 additions and 35 deletions

View File

@@ -1,6 +1,6 @@
# Weave 流程编排功能与设计
> 版本 0.6 · 2026-09-18。首版功能范围已确认。定义结构、发布校验与不可变版本已实现,见[定义格式](api/workflow-definition-format.md)和[发布API](api/workflow-definitions.md);[实例受理](11-workflow-admission.md)、[结果消费与根推进](12-workflow-runtime.md)、[TIMER与POLL时钟](13-workflow-clock.md)已接入。[信号等待及最终查询竞争](14-workflow-signals.md)已接入内部运行器;[暂停/继续/取消与停止结清](15-workflow-controls.md)已实现内部链路;人工核查及实例公共API/SDK仍待P4–P5实现验收。
> 版本 0.7 · 2026-09-18。首版功能范围已确认。定义结构、发布校验与不可变版本已实现,见[定义格式](api/workflow-definition-format.md)和[发布API](api/workflow-definitions.md);[实例受理](11-workflow-admission.md)、[结果消费与根推进](12-workflow-runtime.md)、[TIMER与POLL时钟](13-workflow-clock.md)已接入。[信号等待及最终查询竞争](14-workflow-signals.md)已接入内部运行器;[暂停/继续/取消与停止结清](15-workflow-controls.md)已实现内部链路;[人工核查与TASK恢复](16-workflow-recovery.md)已接入内部服务;POLL/等待恢复及实例公共API/SDK仍待P4–P5实现验收。
## 1. 职责与边界
@@ -174,7 +174,7 @@ Weave 不执行特定业务逻辑,也不把整段业务代码放入平台进
3. 在一个事务内记录管理操作,创建新的步骤激活及关联 Pulse 任务,并固定关联关系。
4. 保留旧激活与旧任务结果,沿用恰当的业务幂等身份。
这是人工恢复的建议模型,具体 API 在评审后冻结。普通任务人工重试入口应拒绝绕过流程管理的关联任务请求。已经确认成功的步骤不能通过“重试流程”随意再执行一次。
执行核查、步骤结论、解除核查及TASK新激活已按[人工恢复约定](16-workflow-recovery.md)实现内部服务,原预算和绝对截止不重置;POLL跨激活及等待恢复仍需补齐,公共API另行交付。普通任务人工重试入口应拒绝绕过流程管理的关联任务请求。已经确认成功的步骤不能通过“重试流程”随意再执行一次。
取消和补偿是不同业务操作。若未来增加补偿,补偿本身也必须是有权限、可审计、可重试或可核查的业务步骤;不能宣称撤销流程就能撤回已经生效的外部业务操作。

View File

@@ -208,3 +208,7 @@ Signal新增payload_version、target_activation_sequence、evidence_ref、dispos
## 停止意图增量(000021)
Instance新增StopKind和StopRequestedAt,冻结首次用户取消或失败结清目标;CancelRequestedAt仍只表示用户显式取消。成对CHECK防止半条意图,任务所有者索引支持双向归属核验。当前35个实体、303个直接持久化字段声明,均有中文注释。历史停止实例关闭门控并恢复根接续,不改变原截止、预算、控制版本或终态数据;保持零外键,详见[控制约定](15-workflow-controls.md)。
## 流程人工核查与TASK新激活
复用现有激活sequence、任务retry_of、审计和幂等回执,不增加表、字段或外键。TASK人工重试以新激活保留旧执行,原尝试预算跨激活扣除,原绝对截止不改变;执行核查和步骤逻辑结论分别保存。35个实体、303个中文注释字段。当前内部支持范围与POLL/等待恢复剩余项见[核查约定](16-workflow-recovery.md)。

View File

@@ -28,8 +28,8 @@
| P1 任务受理闭环 | 应用凭据与作用域权限、队列、幂等提交、查询、待执行取消、受理事件;SDK 客户端 | API/SDK 创建查询闭环;重复键与内容冲突、响应未确认重报、跨命名空间拒绝、参数边界 | 已完成并通过阶段回归(见 P1 报告;真实断路/提交 ACK 丢失注入留后续故障阶段) |
| P2 Worker 执行闭环 | WSS 接入、能力/容量、领取与开始、租约、续租、结果确认、排空与恢复;Worker SDK | 真 Worker 执行;失联/重连/重复确认/旧尝试拒绝;业务效果未知转核查;节点故障接管 | 已完成并通过阶段回归:服务端、自动 SDK、历史查询、完整 Schema 与真实进程强杀恢复;测试拓扑和剩余生产故障矩阵见 P2 验收报告 |
| P3 Pulse 完整能力 | 安全重试、延时、Cron/固定间隔、漏跑策略、计划版本、运行中取消、并发许可、配额/背压、可靠结果订阅、批量受理、独立任务核查/人工重试、查询筛选与事务Outbox接入 | 多实例领取/触发竞争、重试上限、取消竞争、队列隔离、积压恢复、事件重复交付 | 已完成平台功能阶段验收:[原范围逐项核对](reports/phase-3.md)、[本轮完整回归](reports/phase-3-delay-recovery.md)。补齐相对延迟、改参数关联示例和四种重试全停恢复场景;20个可运行示例全部通过。全平台生产门槛及SDK首版交付剩余项仍按P6–P7推进 |
| P4 Weave 主流程 | SDK 定义构建与发布校验、实例、顺序/分支/结构化并行汇合、信号/定时等待、版本绑定 | 重启接续、早到/重复信号、并行竞争、内部事件重放、发布版本兼容;端到端通用流程 | 定义格式/词法类型校验、不可变发布、独立SDK及六类节点定义例子已实现,已通过[子项验收](reports/phase-4-definitions.md);已补[有限决策器及内部结果交付](reports/phase-4-engine-core.md);[实例受理及首批事务](reports/phase-4-admission.md)已实现;[结果消费和根接续](reports/phase-4-runtime.md)已接入后台,顺序/分支/并行及真实进程恢复已验证;[TIMER与后续POLL轮次](13-workflow-clock.md)已接入;[信号消费和最终查询竞争](14-workflow-signals.md)已接入内部运行器;[内部控制与停止结清](15-workflow-controls.md)已接入;人工恢复和实例公共API/SDK继续开发 |
| P5 Weave 恢复与查询 | 有界查询、暂停继续、取消、人工核查恢复、控制门控与审计 | 轮次与尝试独立预算;暂停/开始/回执/超时竞争;恢复保留预算;未知结果不盲目重复 | 有界查询轮次/尝试独立预算及原截止恢复已接入内部运行器;最终信号竞争及在途查询结清已接入;内部暂停/继续/取消与失败结清已接入;人工恢复及公共API/SDK继续开发 |
| P4 Weave 主流程 | SDK 定义构建与发布校验、实例、顺序/分支/结构化并行汇合、信号/定时等待、版本绑定 | 重启接续、早到/重复信号、并行竞争、内部事件重放、发布版本兼容;端到端通用流程 | 定义格式/词法类型校验、不可变发布、独立SDK及六类节点定义例子已实现,已通过[子项验收](reports/phase-4-definitions.md);已补[有限决策器及内部结果交付](reports/phase-4-engine-core.md);[实例受理及首批事务](reports/phase-4-admission.md)已实现;[结果消费和根接续](reports/phase-4-runtime.md)已接入后台,顺序/分支/并行及真实进程恢复已验证;[TIMER与后续POLL轮次](13-workflow-clock.md)已接入;[信号消费和最终查询竞争](14-workflow-signals.md)已接入内部运行器;[内部控制与停止结清](15-workflow-controls.md)已接入;[内部核查与TASK新激活](16-workflow-recovery.md)已接入;POLL/等待恢复和实例公共API/SDK继续开发 |
| P5 Weave 恢复与查询 | 有界查询、暂停继续、取消、人工核查恢复、控制门控与审计 | 轮次与尝试独立预算;暂停/开始/回执/超时竞争;恢复保留预算;未知结果不盲目重复 | 有界查询轮次/尝试独立预算及原截止恢复已接入内部运行器;最终信号竞争及在途查询结清已接入;内部暂停/继续/取消与失败结清已接入;执行核查、步骤结论、解除核查及TASK新激活已接入;POLL/等待恢复及公共API/SDK继续开发 |
| P6 生产验证与运维 | 完整监控、凭据轮换、备份恢复、滚动升级、运行手册、可复现负载和故障工具 | 对照生产验收清单执行,报告环境/指标/遗留项;容量、RPO/RTO 按真实拓扑验证 | 待开发 |
| P7 首版交付核对 | SDK 兼容与发布准备、完整 API 手册、场景示例、全量回归及交付清单 | 新接入者按文档跑通全部示例;所有首版能力可追溯到实现与测试;报告实际生产边界 | 待开发 |
@@ -41,7 +41,7 @@ P4/P5定时等待与后续查询轮次的实现及回归记录见[时钟报告](
1. 已实现FAIL_AFTER_SETTLED与显式取消的内部分支结清,见[控制报告](reports/phase-5-controls.md):持久取消意图、复用Pulse取消、收集已发出查询/任务结果、等待全部已激活工作结清后才进入失败或取消终态。效果未知仍保留核查。
2. 已实现实例暂停/继续/取消内部操作,以control_revision、操作幂等身份、明确原因及审计保护控制决定;暂停不延长原截止,继续不覆盖核查或取消状态。
3. 完成人工核查恢复与旧激活隔离,保留原预算、结果和证据,不能通过换激活/新键绕过未知效果或执行上限。
3. 已实现内部执行核查、步骤结论、解除核查及TASK新激活和旧激活隔离,见[核查报告](reports/phase-5-recovery.md)。继续POLL跨激活及等待恢复,保留原预算、轮次、结果和证据,不能通过换激活/新键绕过未知效果或执行上限。
4. 同步开放实例/步骤/信号/来源/审计HTTP、独立SDK和端到端场景,覆盖原键恢复、权限、版本冲突、竞争与进程全停;公共能力逐项记录实际验收结果。
5. 转入P6/P7的生产故障、容量、运维、发布与全部文档核对。内部存储阶段通过不会提前勾选公共接口或生产验收。

View File

@@ -74,7 +74,7 @@ v16及以前的未处理记录缺少冻结来源,升级后统一标为QUARANTI
## 4. 后续存储适配必须满足的条件
以下保留存储运行器的完整要求。第1项已按[受理报告](reports/phase-4-admission.md)验证;第2–4项结果消费和根接续已接入[实际运行器](12-workflow-runtime.md),第5项的TIMER/POLL已接入[时钟运行器](13-workflow-clock.md),第5项的信号等待已接入[信号运行器](14-workflow-signals.md),内部控制与结清已接入[控制运行器](15-workflow-controls.md),人工恢复、接口和SDK仍继续实现:
以下保留存储运行器的完整要求。第1项已按[受理报告](reports/phase-4-admission.md)验证;第2–4项结果消费和根接续已接入[实际运行器](12-workflow-runtime.md),第5项的TIMER/POLL已接入[时钟运行器](13-workflow-clock.md),第5项的信号等待已接入[信号运行器](14-workflow-signals.md),内部控制与结清已接入[控制运行器](15-workflow-controls.md),[核查与TASK新激活](16-workflow-recovery.md)已接入;POLL/等待恢复、接口和SDK仍继续实现:
1. 启动时认证、固定不可变版本/输入和策略、校验全部队列、计算实例截止,并在同事务创建实例、门控、首批激活/任务及审计回执。相同身份返回原实例。
2. 消费者领取内部事件后核对命名空间、来源任务版本、激活/轮次及当前步骤版本;消费确认、步骤变化、后续任务或持久化待续记录同事务提交。

View File

@@ -1,6 +1,6 @@
# Weave 实例受理与首批工作
状态:内部Go服务与MySQL存储适配已实现实例Start/Get/Steps、固定版本、首批决策落库和可靠结果交付。[后台Inbox消费和根待续扫描](12-workflow-runtime.md)已接通。**尚未开放实例HTTP路由、启动SDK或命令行入口;[内部控制和结清](15-workflow-controls.md)已接入,人工恢复继续开发;[信号运行器](14-workflow-signals.md)已接入。** Weave相关公开SDK目前仅支持定义发布。[TIMER和后续POLL轮次](13-workflow-clock.md)已接入,TASK及组合节点已可自动推进,不能将此解释成全部等待/控制能力已实现。
状态:内部Go服务与MySQL存储适配已实现实例Start/Get/Steps、固定版本、首批决策落库和可靠结果交付。[后台Inbox消费和根待续扫描](12-workflow-runtime.md)已接通。**尚未开放实例HTTP路由、启动SDK或命令行入口;[内部控制和结清](15-workflow-controls.md)已接入,[内部核查及TASK恢复](16-workflow-recovery.md)已接入,POLL/等待恢复继续开发;[信号运行器](14-workflow-signals.md)已接入。** Weave相关公开SDK目前仅支持定义发布。[TIMER和后续POLL轮次](13-workflow-clock.md)已接入,TASK及组合节点已可自动推进,不能将此解释成全部等待/控制能力已实现。
## 1. 受理事务
@@ -49,7 +49,7 @@ Get返回当前实例视图;Start重报返回受理时冻结的原始视图,
| 活跃实例 | 每个namespace最多10000个RUNNING/WAITING/CANCELLING/NEEDS_REVIEW实例;终态不计入;满额仍可恢复原受理回执 |
| 信号关联 | 新受理最多512字节;数据库兼容旧191字符最长764字节,升级不截断历史 |
| 截止 | 数据库时间生成;任务、查询与等待均不超过实例总截止 |
| 自动运行 | Inbox消费、根待续、TIMER到期及后续POLL轮次已接入;SIGNAL与最终查询竞争已接入,内部控制与结清已接入,人工恢复仍待实现 |
| 自动运行 | Inbox消费、根待续、TIMER到期及后续POLL轮次已接入;SIGNAL与最终查询竞争已接入,内部控制与结清已接入,内部核查及TASK恢复已接入,POLL/等待恢复仍待实现 |
迁移000018为Wait增加signal_name和payload_version两个带中文注释的可空字段;NULL仅表示TIMER或尚未核实的历史元数据,未来消费者不得把历史NULL自动解释为有效的新信号等待。correlation_key转为精确字节存储;实例business_key改为utf8mb4_0900_bin。该迁移时为35个实体、含公共Record的295个直接持久化字段声明,全部有中文注释,继续保持零外键。

View File

@@ -1,6 +1,6 @@
# Weave 结果消费与自动推进
状态:内部实例的TASK结果消费、顺序、分支、有限并行汇合和根检查点接续已接入Orbit后台运行器。[定时等待和后续查询轮次](13-workflow-clock.md)也已接入。[信号等待与最终查询竞争](14-workflow-signals.md)已接入。实例公共HTTP/SDK仍未开放,[失败后的分支取消结清与内部控制](15-workflow-controls.md)已接入,人工恢复继续开发,不能将本阶段等同于完整Weave交付。
状态:内部实例的TASK结果消费、顺序、分支、有限并行汇合和根检查点接续已接入Orbit后台运行器。[定时等待和后续查询轮次](13-workflow-clock.md)也已接入。[信号等待与最终查询竞争](14-workflow-signals.md)已接入。实例公共HTTP/SDK仍未开放,[失败后的分支取消结清与内部控制](15-workflow-controls.md)已接入,[内部核查及TASK恢复](16-workflow-recovery.md)已接入,POLL/等待恢复继续开发,不能将本阶段等同于完整Weave交付。
## 1. 后台运行和事务边界
@@ -64,4 +64,4 @@ flowchart LR
进程回归由`make integration`构建二进制后显式执行。缺少一次性数据库或`ORBIT_TEST_SERVER_BINARY`时测试会跳过;跳过不构成进程恢复证据。验证记录见[本阶段报告](reports/phase-4-runtime.md)。
持久化信号等待及查询最终信号竞争已按[信号运行约定](14-workflow-signals.md)实现。内部控制及停止结清也已接入。下一步仍包括人工恢复、实例/来源公共API、独立SDK和通用端到端场景。P4整体及P5–P7继续按[完整计划](08-development-plan.md)执行。
持久化信号等待及查询最终信号竞争已按[信号运行约定](14-workflow-signals.md)实现。内部控制及停止结清也已接入。下一步仍包括POLL/等待恢复、实例/来源公共API、独立SDK和通用端到端场景。P4整体及P5–P7继续按[完整计划](08-development-plan.md)执行。

View File

@@ -1,6 +1,6 @@
# Weave 控制与停止结清
状态:内部Go暂停、继续、取消服务及后台失败/取消结清运行器已接入。**公共实例/控制HTTP与独立SDK尚未开放,人工核查恢复仍在后续交付范围**。本文说明已实现的持久化规则,不把内部存储回归当作全部Weave或生产验收。
状态:内部Go暂停、继续、取消服务及后台失败/取消结清运行器已接入。**公共实例/控制HTTP与独立SDK尚未开放,[内部核查及TASK新激活](16-workflow-recovery.md)已接入,POLL/等待恢复仍在后续交付范围**。本文说明已实现的持久化规则,不把内部存储回归当作全部Weave或生产验收。
## 1. 控制操作
@@ -60,4 +60,4 @@ CANCELLED仅表示本次流程停止已结清,不撤销先前成功的业务
[控制及结清回归](../internal/storage/mysql/workflow_controls_integration_test.go)覆盖控制版本、权限重报、开始竞争、失败/未知、审计回滚、信号与查询及超过32步骤接续;[真实v20升级](../internal/storage/mysql/workflow_stop_upgrade_integration_test.go)验证兼容回填;[实际Orbit进程回归](../internal/storage/mysql/workflow_runtime_process_integration_test.go)覆盖停止意图和结果在全停期间保存后由两个新进程接续。实际结果见[阶段报告](reports/phase-5-controls.md)。
下一步仍需完成人工核查恢复、公共实例/控制/信号/审计接口、独立SDK及可运行场景,再完成P6–P7生产故障、性能、运维和发布验收。当前测试不替代生产MySQL复制、故障切换、备份恢复或RPO/RTO验证。
下一步仍需完成POLL/等待恢复、公共实例/控制/信号/审计接口、独立SDK及可运行场景,再完成P6–P7生产故障、性能、运维和发布验收。当前测试不替代生产MySQL复制、故障切换、备份恢复或RPO/RTO验证。

View File

@@ -0,0 +1,76 @@
# Weave 人工核查与接续
状态:内部Go服务已提供执行核查、步骤结论确认、解除核查,以及TASK新激活重试。公共HTTP、独立SDK和通用接入示例尚未交付;**POLL新激活恢复尚未实现,不能把已有逻辑结果核查当作查询重试已经完成**。完整交付继续按[开发计划](08-development-plan.md)推进。
## 1. 四类操作
[内部服务](../weave/recovery/service.go)要求显式`workflows:recover`权限,普通Worker、任务核查和流程暂停权限均不自动包含它。四个方法都接收认证身份、实例ID、稳定幂等键和命令,命名空间与操作者从认证取得。
| 方法 | 作用 | 不会自动发生的事情 |
| --- | --- | --- |
| ReviewTask | 核实本实例历史激活拥有的NEEDS_REVIEW任务,写入SUCCEEDED/FAILED、明确执行已结束和证据 | 不把查询请求成功解释成业务成功,不解除步骤或实例核查 |
| ResolveStep | 将当前待核查/失败/取消叶子步骤核实为SUCCEEDED或FAILED,保存符合固定契约的逻辑结果 | 不重新执行旧任务,不清除实例核查或原停止意图 |
| Continue | 在当前证据和步骤状态允许时解除实例核查,保存根接续 | 不解除显式paused,不延长截止,不撤销取消或失败结清 |
| RetryStep | 为已确认失败/取消的TASK建立新的激活和关联任务,继续消耗原尝试预算 | 不重跑成功步骤,不改变输入/业务关联,不为POLL另起新轮次 |
查询请求、外部业务结果和流程接续是不同事实。例如,查询任务核实为成功但返回PENDING,仍不能将POLL步骤核实为成功;POLL成功结论必须通过固定映射分类为SUCCEEDED。未知执行须先完成ReviewTask,再等待新版本结果进入内部Inbox并消费,才能确认步骤结论。
## 2. 身份、版本与证据
所有命令携带:
| 字段 | 约束 |
| --- | --- |
| expected_revision | 当前实例revision,JSON十进制字符串;必须大于0,不使用control_revision代替证据版本 |
| reason | 1至1024个Unicode字符,非空白,不含NUL |
| evidence_ref | 1至512个无空白或控制字符的Unicode字符;受控证据引用,平台不访问该地址 |
ReviewTask还要求`task_id`、`expected_task_revision`、`execution_settled=true`、SUCCEEDED/FAILED结论和非null JSON结果。声明表示全部历史外部执行已结束且不会继续产生效果;租约失效和UNKNOWN本身不能证明这一点。
ResolveStep和RetryStep都要求固定`step_key`、当前`activation_id`及`expected_step_revision`。前者要求`execution_settled=true`,后者要求`safe_to_retry=true`。Continue要求`review_resolved=true`,服务端仍独立检查当前图、历史任务与来源事件,不把声明作为绕过检查的开关。
同键相同命令返回首次冻结回执;同键不同内容冲突。回执恢复仍检查当前凭据和固定定义引用的全部队列权限。后台新增事实使原实例revision失效,新键携带旧版本会冲突;原键可继续核对已提交决定。每个成功人工操作同时递增revision和control_revision,防止旧暂停/继续命令覆盖人工恢复后的控制状态。
## 3. 事务与历史
认证 → 应用额度 → 管理操作身份 → 固定版本的排序队列 → 实例 → 门控 → 子项。操作只针对NEEDS_REVIEW实例;新决定要求内部Inbox不存在PENDING或QUARANTINED记录。尚未消费的事实应先消费,损坏来源不能靠人工声明直接放行。
核查状态、额度、实例/步骤、门控、必要根接续、审计和幂等回执同事务。ReviewTask在所有这些写入完成后发布新的Pulse结果事件,结果流锁最后获取,之后不能再锁另一任务。执行审计与流程审计使用不同操作身份,流程审计明确引用执行审计,二者同事务提交。结果流写入失败时全部回滚。
步骤核查先校验所有历史任务的双向归属,再检查该步骤全部历史任务均已知结清、无有效尝试和未释放许可。兄弟分支仍可收集自己的在途结果;Continue还会拒绝任何历史未知结果及当前未解决的步骤。关联检查按命名空间和固定队列执行,不使用数据库外键。
ResolveStep保存当前激活的新管理结论,审计记录前一状态、前一输出和新结果摘要。Pulse原成功/失败结果不因此改写,执行尝试、旧事件、等待和查询轮次记录均保留。真正重新执行时才由RetryStep创建新激活,旧激活及旧任务结果保持原样,旧激活迟到结果只留痕。
## 4. TASK重试预算
当前仅TASK支持RetryStep。要求没有取消或失败停止意图,实例和原任务绝对截止尚未到达,相关历史执行均已知失败或取消。核实实际尝试行数、任务attempt_count、连续激活序号、retry_of链、固定处理器/输入/队列/优先级和策略一致性。
- 新激活sequence递增;新任务retry_of指向前一任务,同一原任务只允许一个直接后继。
- 新max_attempts = 固定定义max_attempts − 全部历史激活已用尝试数;首次尝试也计入。
- 新任务沿用首次激活的绝对deadline_at、最晚开始时间、精确输入、business_key与concurrency_key,不因人工操作重新计时。
- 激活总数也不超过原max_attempts,避免反复取消尚未开始的任务而无限创建零尝试激活。
- 原预算耗尽时拒绝新激活;业务关联键不自动提供幂等,接入方须在固定输入中保存正确的外部业务操作身份,并提供安全重试证据。
- 新任务受当前应用和队列配额约束;满额或审计失败不能留下新激活、孤立任务或多扣额度。
创建新任务后实例仍处于核查,门控保持关闭。操作者确认其他事项已处理后调用Continue,才允许新任务取得执行授权;原paused仍为true时还需正常RESUME。
POLL恢复仍需实现跨激活的原轮次归属、单轮剩余尝试及原查询截止传递。当前RetryStep明确拒绝POLL,禁止通过新建业务轮次规避耗尽的单轮预算。SIGNAL/TIMER逻辑结论可核查,但不通过此操作重新开始等待;恢复等待/查询的完整范围仍需后续实现与验收。
## 5. 停止与到期
存在原stop_kind时,核查可消除未知事实,但Continue只返回CANCELLING并接续原停止目标,门控继续关闭;停止运行器核验所有工作结清后才进入CANCELLED或FAILED。后来核实某一步成功也不能撤销先前已提交的停止意图。
无停止意图且原实例已过期时,Continue拒绝启动新工作。可以继续保存核查证据、确认步骤结论,并通过已有CANCEL和停止结清路径结束实例。TIMER成功核查还要求原等待时长确实已到,成功输出必须为显式null,不能人为提前满足时间条件。
## 6. 内部调用顺序
| 场景 | 顺序 |
| --- | --- |
| TASK效果未知,核实成功 | 读取当前实例/任务 → ReviewTask(SUCCEEDED) → 等待内部结果消费 → 读取当前版本 → ResolveStep(SUCCEEDED) → Continue → 后台接续 |
| TASK已确认失败,原预算仍有余量 | 读取当前实例/步骤/激活 → RetryStep → 核对新任务及原截止 → Continue → Worker执行新任务 |
| POLL次数耗尽,人工取得最终结果 | 核实历史请求均已结束 → ResolveStep(符合固定成功映射的结果) → Continue;原used_rounds不改变 |
| 取消后出现UNKNOWN | ReviewTask → 等待消费 → ResolveStep → Continue → 原取消结清;不创建后继工作 |
这些是内部服务流程说明,公共接入方目前不能调用未开放的HTTP路由或SDK。后续接口文档和可运行场景须覆盖相同证据与版本要求。
[存储专项](../internal/storage/mysql/workflow_recovery_integration_test.go)、[实际进程测试](../internal/storage/mysql/workflow_runtime_process_integration_test.go)和[阶段报告](reports/phase-5-recovery.md)记录验证范围。本阶段不替代生产数据库高可用、灾难恢复和容量验收。

View File

@@ -0,0 +1,40 @@
# P5 人工核查与TASK恢复回归
日期:2026-09-18。范围为内部执行核查、叶子步骤结论确认、解除核查和TASK新激活重试。POLL新激活恢复、等待恢复、公共HTTP/独立SDK和完整通用示例仍未完成,持续目标保持完整。
## 已实现与边界
实现约定见[核查文档](../16-workflow-recovery.md)。执行事实和业务步骤结论分开确认;显式权限、最新实例/任务/步骤版本、当前激活、原因及证据共同约束操作。新TASK激活保留原输入和绝对截止,历史尝试从原预算扣除,旧激活与旧任务结果不覆盖。
任务核查、流程审计、内部结果和外部结果流在同一事务提交。未知事实、未结束尝试、未释放许可、待消费或隔离Inbox不能由继续操作跳过。原停止目标、暂停标记和固定定义不改变。无新数据库表或持久化字段,仍为35个实体、303个中文注释字段,禁止外键与级联删除。
## 环境与证据
本机darwin/arm64、Go 1.27.1、Docker MySQL 8.4.10,一次性隔离数据库。
| 检查 | 当前结果 |
| --- | --- |
| 首轮专项 | 原任务恢复/流程控制通过;新核查两个测试夹具错误:权限ID误以二进制写入JSON、查询助手已消费后再次消费;已修正,该轮不计为通过 |
| 修订后专项 | 11组新核查场景、原任务恢复与实际流程进程通过,`-race`,48.899秒;新核查4.47秒、流程进程33.85秒 |
| 最终增补 | 增加实际门控保持、跨实例任务/旧版本/非法输出拒绝、原实例过期只能结清等保护与回归 |
| 输入与截止来源补强 | 重新验证首次输入契约和截止计算来源后,14组核查、原任务恢复及实际流程进程通过,48.964秒;流程进程32.37秒 |
| 最终叶子步骤专项 | 16组核查、原任务恢复及原流程控制通过,29.950秒;核查9.68秒。增加SIGNAL过期核查及TIMER不能提前满足原等待时长的真实时钟验证,生产逻辑未再修改 |
| 基础回归 | 补强后再次运行`make fmt test vet build`通过,退出0 |
| 完整隔离回归 | 整条脚本通过,退出0;开始时13组核查及全部存储187.796秒,实际流程进程31.601秒,Worker SDK 94.238秒,最终SDK进程故障组90.200秒;19个SDK示例和2个独立业务示例全部通过 |
| 数据结构与文档 | 实际MySQL外键0、无COMMENT字段0;303个持久化字段声明均有中文注释;908个本地链接、53段JSON检查通过 |
进程测试确认全部控制节点退出后,人工执行核查的新结果由两个新节点消费;再次全停后提交解除核查,原取消目标被正确结清。另一个已失败TASK在全停期间建立新激活并保留原任务截止和剩余1次尝试,两个新节点接管后只执行新任务,原失败激活保留。
完整链路开始后发现首次输入契约与截止来源还可加强,未中断正在执行的完整脚本。该增补由后续真实MySQL专项及重新构建的实际进程验证;不能把此前整套存储187.796秒的记录描述为包含这项增补。最后增加的SIGNAL/TIMER测试也已通过独立专项及vet,生产逻辑未再修改。各临时数据库容器均已由脚本清理。
存储回归还覆盖同键12路并发、旧激活真实结果重放、普通Pulse入口不得绕过流程归属、撤销队列授权后拒绝原回执、结果流故障全事务回滚、配额满额及审计失败不留新任务、PENDING不能变为业务成功、原任务截止不重置、暂停保留及停止意图恢复。
完整复现入口为[隔离MySQL脚本](../../scripts/test-mysql.sh)。未提供一次性DSN或实际二进制时跳过的测试不构成通过;专项使用真实MySQL和构建后的Orbit二进制。
## 未完成范围
1. POLL跨激活恢复及等待恢复:保留原查询截止、轮次身份、每轮尝试预算和迟到信号隔离,不把剩余范围改成仅支持TASK。
2. 实例/步骤/控制/信号/恢复/来源/审计公共HTTP、独立SDK、端到端场景与完整P4–P5验收。
3. P6–P7:监控、故障/容量证据、生产MySQL切换与备份恢复、发布和运维交付。
当前证据只证明对应内部状态与本机单MySQL恢复行为,不宣称整个平台已达到生产验收标准。