用途:该技能讲解如何为一段工作引入生命周期状态机——XState 负责命名状态与状态间的事件迁移,Effect 负责副作用、类型化错误、服务依赖与清理。仅当工作确实存在“需要追踪的状态”时才引入,否则保留直接的 Effect。
主要能力与用法:
- 先写状态:列出状态与最终结果,可用显式 result 联合表示已知错误进入的终态。
- 副作用放入 actor:用 fromEffect 在机器外定义,携带类型化错误与服务依赖;通过 setupEffect 声明,不要在 XState 内联回调中返回 Effect。
- 构建机器:把 actors 和 schemas 传给 setupEffect,再调用 createMachine,定义 context、initial、output 与 states。
- 在 Effect 中运行:用 createEffectActor 启动(不要用 XState 的 createActor),交给 @rat-stack/capability/actor-watch 的 watchActor,再用 join 在 Effect.scoped 中等待。watchActor 在 devtools 运行该能力前不做任何事,之后 rat_list_actors、rat_list_transitions、rat_get_actor 可展示状态与事件。
- 生成输入与命令历史:每个生命周期配属性测试与模型测试,使用 effect/Arbitrary 和 @effect/vitest,不要另加生成器依赖。用 getShortestPaths 覆盖两种结局,用 getPathsFromEvents 探索历史。
适用场景:文件检查等具有“读取、已检查、不可读”这类有意义状态的工作流;需要类型化失败与服务注入的生命周期。
限制与注意事项:修改 Effect 或 XState 代码前需阅读 node_modules/effect/AGENTS.md 及其中钉住的 XState、@xstate/effect 源码;缺少结果或机器级错误属于设计缺陷;已知产品错误应放入最终结果;join 有未知机器错误通道,示例中使用一处窄范围诊断覆盖再 Effect.orDie。不要为 XState 6 安装 @xstate/graph,getShortestPaths 复用同一 XState 钉版。xstate-effect/no-inline-effect 规则应修代码而非禁用。验证测试前可临时破坏一条生命周期规则,记录收缩输入与重放令牌,恢复后证明测试通过。完成时运行 pnpm turbo run check test build。