Files
FT546-WCS/docs/superpowers/specs/2026-07-30-wcs-p0-b1-shadow-demo-design.md

9.0 KiB
Raw Blame History

WCS P0-B1 离线 SHADOW Demo 增量设计

1. 背景

现有 javaTest 已实现一个 Java 8、纯内存、无外部 I/O 的 LEGACY 调度演示,覆盖任务准入、确定性选车、网格寻路、通道避让、协议失败重试和业务队列归档。

本增量依据仓库根目录 docs/WCS算法优化 的设计基线继续扩展,但不复制生产工程,也不把未签字的 PLC、提升机或 ACTIVE 能力描述为已经可用。

2. 目标

在保留现有 LEGACY Demo 行为和测试的前提下,旁路增加可独立测试的 P0-B1 离线 SHADOW 领域内核:

  1. 编译并校验版本化不可变交通地图。
  2. 使用节点、无向边和显式冲突资源表达空间硬路权。
  3. 建模交通区段与资源保护状态。
  4. 冻结带版本和序号的复合交通快照。
  5. 生成确定性的 GRANT/HOLD/YIELD 决策。
  6. 通过等待图拒绝会形成环的放行组合。
  7. 根据匹配反馈逐步释放资源;错配、重启或失联时 fail closed。
  8. 记录结构化决策事件,并能用相同输入离线回放出相同结果。
  9. 证明 SHADOW 协调器不会写 PLC、LEGACY 业务状态或权威运行时预约。

3. 明确边界

3.1 范围内

  • Java 8 纯领域对象和内存测试替身。
  • P0-B1 的 L1 领域测试、L4 JSON 黄金场景和小规模固定种子属性测试。
  • 模拟节点、无向边、显式冲突资源及容量。
  • 区段状态和资源保护状态的契约测试。
  • 快照陈旧、序号倒退、plcBootId 改变和路径错配测试。
  • SHADOW 决策、差异记录、禁写保护和确定性回放。
  • 仅用于证明 fail-closed 行为的 PLC/提升机契约桩。

3.2 范围外

  • SQL Server Schema、MyBatis Mapper、真实事务和 Outbox。
  • 真实 PLC 寄存器、CRC、网络通信或硬件在环。
  • 真实 WMS 回调或业务表更新。
  • 深位和提升机的真实执行控制。
  • ACTIVE/LIMITED_ACTIVE/PRODUCTION 控制模式。
  • 现场 SHADOW 样本、现场性能基线或任何生产验收声明。

成果状态只能描述为“离线 SHADOW 模拟验证”。所有未签字外部门禁继续保持 BLOCKED 或 IN_VERIFICATION。

4. 架构

现有 com.ft546.wcs.demo LEGACY 包保持兼容。新增 com.ft546.wcs.shadow,避免把交通生命周期重新塞回业务队列:

com.ft546.wcs.shadow/
├── map/        版本化地图、资源键和编译校验
├── snapshot/   不可变复合快照与新鲜度检查
├── segment/    候选区段、区段状态机
├── resource/   资源定义、保护状态和内存账本
├── decision/   候选排序、等待图、GRANT/HOLD/YIELD
├── feedback/   匹配校验、逐步释放与隔离
├── replay/     决策事件、JSON 夹具和离线回放
└── application/SHADOW 协调器及禁写端口

LEGACY 继续拥有现有模拟发送和业务队列状态。SHADOW 只读取冻结输入,使用本轮临时计算视图,输出决策事件和差异,不改变 InMemoryWcsState 中的任务、队列或历史。

5. 地图与资源模型

5.1 版本化交通地图

TrafficMapCompiler 从内存地图定义生成 EffectiveTrafficMap。编译时验证:

  • mapCode、versionId 和基础地图校验和匹配。
  • 交通区域边界已确认。
  • 节点与边引用有效。
  • 容量为正数。
  • 无向边使用规范资源键。
  • 安全等待点不是唯一出口。

交通区域只表示统一协调和版本边界,不自动成为容量 1 的资源。

5.2 资源键

首个增量实现:

NODE:{siteId}
EDGE:{smallerSiteId}:{largerSiteId}
CONFLICT:{resourceCode}

提升机和深位资源只保留扩展类型及 fail-closed 占位,不模拟真实放行。

5.3 资源保护

预约状态为:

SOFT → COMMIT_GUARD → HARD → RELEASED
                    ↘ UNKNOWN_HARD
  • SOFT 只参与本轮候选计算。
  • COMMIT_GUARD 排他保护提交窗口。
  • HARD 表示匹配提交事实。
  • UNKNOWN_HARD 表示 ACK 丢失、失联、重启或反馈错配,按硬资源保留。
  • 时间或 ETA 到期不能释放 HARD/UNKNOWN_HARD。

SHADOW 协调器不得把这些状态写入权威运行时账本;状态机通过独立领域测试和模拟执行夹具验证。

6. 快照和区段

TrafficSnapshot 在每轮开始时冻结:

  • tickSeq、决策时间、地图版本和参数版本。
  • 每车 plcBootId/heartbeatSeq/snapshotSeq。
  • 当前位置、下一点、剩余路径、通信和故障状态。
  • 已有硬资源、未知硬资源和资源容量。
  • 待比较的 LEGACY 实际决定。

快照对象及其集合不可变。以下情况将车辆隔离并阻止新 GRANT:

  • 超过新鲜度上限。
  • 心跳或快照序号倒退。
  • plcBootId 改变。
  • 区段版本或剩余路径不匹配。
  • 通信状态未知、失联或故障。

候选区段不得跨过地图决断点、安全等待点或冲突资源边界。固定最大点数只作为技术上限。

7. 决策流程

ShadowTrafficCoordinator.decide() 固定执行:

  1. 校验模式必须为 SHADOW,地图和快照版本必须匹配。
  2. 冻结输入并登记故障、失联、HARD/UNKNOWN_HARD 为不可穿越资源。
  3. 为车辆生成软路径及下一候选区段。
  4. 按业务优先级、等待老化、清区代价、任务号和车辆号稳定排序。
  5. 逐候选检查节点、无向边、显式冲突资源和容量。
  6. 构建等待图;会形成环的候选不得 GRANT。
  7. 无冲突输出 GRANT;可安全等待输出 HOLD;只有存在已发布安全让行点时输出 YIELD。
  8. 记录结构化原因码、冲突资源、阻挡车辆和输入哈希。
  9. 通过禁写端口记录“意图”,不得发送或改变权威状态。

高优先级任务不能撤销已经提交的硬区段。没有安全 YIELD 点时保持 HOLD 并记录报警原因。

8. 反馈与失效关闭

FeedbackReconciler 只有在以下字段匹配时才允许释放:

  • plcBootId
  • plannerEpoch
  • planVersion
  • segmentSeq
  • 单调 snapshotSeq
  • 当前点及剩余路径是已提交路径的合法单调后缀

匹配 A→B 后释放节点 A 和无向边 A—B,节点 B 继续保留。重复快照幂等返回。

跳点、倒退、版本错配、PLC 重启、ACK 丢失和通信中断均不得释放;相关保护转为或保持 UNKNOWN_HARD,车辆进入隔离。模拟器不能借助任务、楼层或其他字段推断未知载货状态。

9. 决策事件与回放

每轮 DecisionEvent 至少包含:

  • 决策 ID、tick、地图/参数版本。
  • 输入快照哈希和车辆快照序号。
  • 稳定排序后的候选。
  • 每车 GRANT/HOLD/YIELD、原因码、冲突资源和阻挡车辆。
  • 资源变化模拟摘要。
  • LEGACY 实际决定及结构化差异分类。

回放服务从 JSON 黄金夹具重建相同输入,并断言决定、原因码和资源结果完全一致。事件记录允许作为 SHADOW 的唯一旁路输出,但不得被称为现场 SHADOW 证据。

10. 错误处理

  • 地图校验失败:拒绝加载,不使用旧校验和继续规划。
  • 模式不是 SHADOW:协调器拒绝运行。
  • 任一外部写端口调用:抛出 ShadowWriteForbiddenException。
  • 资源不足或等待环:返回结构化 HOLD,不抛系统异常。
  • 无安全 YIELD 点:HOLD 并记录 NO_SAFE_YIELD_SITE。
  • 未知载货、提升机信号或 PLC 契约:fail closed。
  • 不可恢复的模型定义错误:构造或编译阶段抛 IllegalArgumentException。

11. 测试策略

保持现有 20 个测试通过,并新增:

  1. 地图编译:版本、校验和、边规范键、区域非互斥、唯一出口。
  2. 资源账本:同节点、对向边、容量、非冲突并行。
  3. 状态机:非法跳转、单车单硬区段、未知提交保留。
  4. 快照:冻结、陈旧、倒退、bootId 改变。
  5. 决策:确定性排序、硬区段不可撤销、等待环、HOLD/YIELD。
  6. 反馈:逐步释放、重复快照、跳点、倒退、版本错配、ETA 到期。
  7. SHADOW:零 PLC 写、零业务状态写、零权威预约写。
  8. 回放:JSON 黄金场景稳定一致。
  9. 固定种子属性测试:资源容量不超限、等待图无环、未知资源不释放;失败信息输出 seed、地图版本和输入摘要。

验证命令:

cd javaTest
mvn clean test
mvn exec:java

验收必须读取 Surefire 汇总,确认测试数大于 0,失败和错误均为 0。控制台演示新增 SHADOW 决策与 LEGACY 对比摘要,同时保留现有事件。

12. 交付标准

  1. 现有 LEGACY Demo 及测试无回归。
  2. SHADOW 内核拥有独立包和明确端口,不依赖生产模块。
  3. 文档测试矩阵中适用于 P0-B1 离线领域层的场景均有测试。
  4. 相同输入、地图和参数版本产生相同决定。
  5. 未知、错配、重启和失联均不会释放资源或产生新 GRANT。
  6. SHADOW 协调器无法写 PLC、业务状态或权威预约。
  7. README 明确能力边界、运行命令和非现场证据属性。
  8. 不修改 ruoyi-* 生产代码,不连接数据库、PLC 或 WMS。