Files
ecm_sync_system/docs/state_machine.md
T
2026-04-01 16:23:43 +08:00

4.1 KiB
Raw Blame History

状态机形式化说明(与代码一致)

1. 真源与执行入口

  • 配置真源:sync_state_machine/config/node_state_machine.yaml
  • 事件入口:sync_state_machine/engine/events.py
  • 状态落地:sync_state_machine/engine/state_apply.py
  • 不变量校验:events._apply_decision() 内调用 runtime.check_invariants()

2. 状态集合(Sxx

  • S00bind 起点(UNCHECKED/NONE/PENDING
  • S01NORMAL,待后续 create/update 判定
  • S02:MISSING,待依赖检查/自动绑定/create
  • S03ABNORMAL,阻断
  • S04WARNING,阻断
  • S05DEPENDENCY_ERROR,阻断
  • S06CREATE 待执行(目标节点)
  • S07UPDATE 待执行(action=UPDATE,status=PENDING
  • S08UPDATE 前置失败(action=UPDATE,status=PRECONDITION_FAILED
  • S10C/S10U/S10D:按动作拆分的执行中状态
  • S11C/S11U/S11D:按动作拆分的执行成功状态
  • S12C/S12U/S12D:按动作拆分的执行失败状态
  • S13:对侧创建等待态(PEER_CREATING/NONE/PENDING
  • S14UPDATE 运行时降级为 NONE 并跳过

3. 事件到代码映射

bootstrap

  • E01sync_state_machine/engine/events.py::e01_bootstrap()

bind

  • E10sync_state_machine/engine/events.py::e10_bind_core()
  • E15sync_state_machine/engine/events.py::e15_bind_dependency()
  • E16sync_state_machine/engine/events.py::e16_bind_auto()(自动绑定判定;ZERO+create_enabled=true 时进入 S13,等待创建副作用提交)

create/update prepare

  • E20sync_state_machine/engine/events.py::e20_create_prepare()spawn 成功从 S13 提交到 S01;失败保持 S13
  • E21sync_state_machine/engine/events.py::e21_create_prepare()
  • E30sync_state_machine/engine/events.py::e30_update_prepare()

sync execute

  • E40C_START/E40CCREATE 执行入口与结果回写
  • E40U_START/E40UUPDATE 执行入口与结果回写
  • E40D_START/E40DDELETE 执行入口与结果回写

4. strategy 调用链(当前)

  • bind 主入口:sync_state_machine/sync_system/strategy.py::DefaultSyncStrategy.bind()
  • create 主入口:sync_state_machine/sync_system/strategy.py::DefaultSyncStrategy.create()
  • update 主入口:sync_state_machine/sync_system/strategy.py::DefaultSyncStrategy.update()
  • reset 主入口:sync_state_machine/pipeline/full_sync_pipeline.py::_load_persistence_state() -> sync_state_machine/sync_system/strategy_ops/reset_ops.py::run_phase2_cleanup()

5. context 字段(以 YAML 为准)

bind 相关

  • has_binding_record
  • core_binding_result / peer_core_binding_result (NORMAL|WARNING|ABNORMAL)
  • data_present
  • has_depend_fields
  • dep_satisfied
  • auto_bind_enabled
  • auto_bind_outcome (ONE_TO_ONE|AMBIGUOUS|ZERO|KEY_MISSING|KEY_ID_RESOLVE_FAIL|DATA_MISSING)

create/update 相关

  • create_enabled
  • create_id_resolve_ok
  • spawn_success
  • update_enabled
  • target_has_data_id
  • update_id_resolve_ok
  • has_diff

execute 相关

  • handler_result (SUCCESS|FAILED|SKIPPED|IN_PROGRESS)
  • poll_timeout

6. 语义边界

  • strategy 负责业务语义计算(如依赖是否满足、自动绑定结果、差异检测)。
  • 状态机只负责迁移判定与不变量校验,不直接访问数据源。

7. 不变量

  • INV-1_UNCHECKED_ACTION_NONE
  • INV-2_BLOCKING_NO_ACTION
  • INV-3_PRECOND_IMPLIES_UPDATE

当状态落地后违反 invariant,运行时会直接抛错。

8. 校验与出图

  1. python tools/validate_config.py --config sync_state_machine/config/node_state_machine.yaml
  2. python tools/render_graph.py --config sync_state_machine/config/node_state_machine.yaml --format mermaid --out docs/state_machine.mmd

9. 事件意图命名(图示层)

  • 为了让流程意图更直观,图示可使用 E01.reset.* / E10.core.* / E20.create.* / E30.update.* / E40<action>.* / E41.create.* 这类别名。
  • 别名仅用于图标签;运行时事件 ID 仍以 YAML 中 E01/E10/E15/E16/E20/E21/E30/E40C_START/E40C/E40U_START/E40U/E40D_START/E40D/E41 为准。
  • S10C/S10U/S10DS11C/S11U/S11D 现已是配置中的真实状态 ID(不再是图示别名)。