Files
ecm_sync_system/docs/node_state_definition.md
T
strepsiades 4a9c444b10 first commit
2026-03-09 16:31:42 +08:00

3.4 KiB
Raw Blame History

节点状态定义(业务核心)

本文档定义 SyncNode 的状态字段语义,并说明状态机如何把这些语义形式化为可执行规则。

1. 节点状态字段

binding_status

  • 含义:绑定判定结果,决定节点是否允许进入 create/update。
  • 取值:UNCHECKED | NORMAL | MISSING | PEER_CREATING | WARNING | ABNORMAL | DEPENDENCY_ERROR

action

  • 含义:本轮同步意图。
  • 取值:NONE | CREATE | UPDATE | DELETE
  • 说明:本项目当前主路径使用 NONE/CREATE/UPDATE

status

  • 含义:执行状态。
  • 取值:PENDING | IN_PROGRESS | SUCCESS | FAILED | SKIPPED | PRECONDITION_FAILED

data_id

  • 含义:目标系统业务主键是否就绪。
  • 关键语义:UPDATE 路径要求目标节点具备 data_id,否则进入 PRECONDITION_FAILED

error

  • 含义:阻断/失败原因。
  • 说明:依赖错误与执行错误都在该字段记录可读原因。

2. 绑定状态业务语义

binding_status 业务语义 是否允许进入 create/update
UNCHECKED 尚未执行 bind 判定
NORMAL 绑定链路健康,可做差异检测与同步
MISSING 无绑定记录,需做依赖检查与自动绑定/创建策略 有条件
PEER_CREATING 对侧创建进行中(等待创建提交) 否(等待 E20 提交)
WARNING 风险态(如自动绑定歧义/关闭)
ABNORMAL 数据损坏或核心绑定异常
DEPENDENCY_ERROR 依赖不可满足

3. create / update 语义

create

  • 来源:MISSING 节点在策略允许时生成目标 CREATE 节点。
  • 形式化:E20/E21 + spawn_target_node_state: S06

update

  • 来源:NORMAL 节点差异检测后生成目标 UPDATE
  • 形式化:E30
  • 前置失败:目标缺 data_id 或依赖 ID 解析失败时进入 S08,且必须 action=UPDATE

4. 执行状态语义(datasource

  • SUCCESS:执行成功,必要时回填 data_id
  • FAILED:执行失败,保留错误。
  • IN_PROGRESS:异步任务进行中。
  • SKIPPEDhandler 决策跳过;若由 UPDATE 降级为 NONE,则进入 S14
  • PRECONDITION_FAILED:准备阶段失败,不进入实际 API 提交。

5. 状态机形式化映射

状态机把“业务语义”变成“可执行迁移”:

  • 语义输入:strategy/datasource 提供 context
  • 迁移判断:StateMachineRuntime.dispatch(current_state, event_id, context)
  • 状态落地:Decision.to_state 对应 YAML states[Sxx]
  • 不变量:每次落地后执行 runtime.check_invariants()

6. 关键一致性约束

  • UNCHECKED 不允许带动作(INV-1_UNCHECKED_ACTION_NONE)。
  • 阻断态(ABNORMAL/WARNING/DEPENDENCY_ERROR)不允许动作(INV-2_BLOCKING_NO_ACTION)。
  • PRECONDITION_FAILED 必须 action=UPDATEINV-3_PRECOND_IMPLIES_UPDATE)。

7. 当前默认依赖语义(业务取向)

以下是当前代码默认策略,不是单纯命名差异:

  • 空依赖引用允许放行(allow_empty_dependency_ref=True)。
  • 依赖节点缺失 data_id 默认允许放行(allow_missing_dep_data_id=True)。

这意味着:DEPENDENCY_ERROR 的触发更偏向“依赖节点不存在或状态异常”,而不是“依赖节点尚未回填 data_id”。如果要改为严格模式,需要在 strategy 语义层切换该策略并同步文档。