Files
FT546-WCS/docs/runbooks/ft546-shadow-20260908-phase-storage-repair.md

59 lines
7.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 2026-09-08 影子阶段与存储修复
适用:现场源码基线 `414b3bf`,分支 `optimize/wcs`,目录 `C:\project\FT546-WCS-SHANDOW`,Windows CMD + IDEA + Java 8 + Maven 3.6.0。
本次更新仅用于继续影子测试。正式调度、PLC 通讯和生产数据库写入路径不变。本次没有现场 SQL 迁移、权限调整、清理历史数据、扩大容量上限或远程进程操作。
## 修复后的行为
1. 从现有只读视图增加采集 `issued`、`execution_status`。只有明确的 `0 / 1` 待下发阶段可产生新预测。已下发、已完成、生命周期不明、已到终点及无移动阶段记录为 `OBSERVATION_ONLY`,不产生虚拟寄存器写入,也不计入算法不一致。
2. 保留队列已绑定的车辆;忙碌、禁止发送、低电量和故障门槛不放宽。绑定阶段按正式程序的发送规则,从车辆当前位置到当前终点预测,不再回到旧队列起点折返。跨楼层及两阶段交接当前只观察,仍需专门的状态机证据才能评价其新调度行为。
3. 旧结果还原遵循 PLC 发送规则:`tsj` 的 `default02=1/2` 终点为 `09050<楼层>`,`8` 为 `07050<楼层>`。路径可在提升机入口结束,而实际发送端点会被改写,不能直接用路径末点当作发送末点。与本阶段终点不符的旧路径,以及待下发阶段起点已漂移的路径,记录为旧结果不可用。
4. 新输入采用无损 gzip;同一次证据保存中的相同输入只存一份压缩正文,其余记录引用本批首条输入。原始 JSON 的哈希保持不变。使用现有表、同一事务,不增加生产访问权限。
5. 安全等待/避让点只能通过 `shadow.traffic.safe-wait-sites`、`shadow.traffic.safe-yield-sites` 显式配置。默认空列表,状态显示 `UNCONFIGURED`。配置点必须是可通行数字站点且至少有两个相邻出口;这个校验不能代替现场人员确认物理安全。未取得现场确认前保持空列表。
6. `/shadow/status` 和运行心跳新增 `runtimeIdentity`。本次 `buildId` 为 `ft546-shadow-20260908-phase-storage-v2`。`effectiveSettingsSha256` 自动计算,覆盖返回的非秘密调度、存储、端口及安全点配置;不包含数据库连接凭据、外部配置文件或已编译类的完整指纹。
## 现场更新顺序
与操作人员逐步进行,每一步确认结果后再进入下一步。只停止 `Ft546ShadowApplication`;不要停止 `RuoYiApplication`,不要使用 Stop All,也不要批量结束 Java 进程。
1. 在 IDEA 中选中影子程序 `Ft546ShadowApplication` 的运行窗口,点红色停止按钮,确认这个影子进程退出。
2. CMD 进入 `C:\project\FT546-WCS-SHANDOW`,先执行 `git status --short` 和 `git fetch origin optimize/wcs`。保留现场配置、忽略文件和 `shadow-evidence`。若有与本次源码重叠的本地修改,先备份并核对;不要 reset、clean 或强制覆盖。
3. 使用交付消息指定的准确提交执行 `git merge --ff-only <提交号>`,再执行 `git log -1 --oneline` 核对。不要无条件更新到将来的其他提交。
4. IDEA 刷新 Maven,保持原有 Java 8 和 Maven 3.6.0,编译 `ruoyi-wcs-shadow` 及其依赖。沿用此前已验证的离线依赖,不需要部署脚本或 JAR 包。
5. 核对影子运行配置:主类仍为 `com.ruoyi.shadow.Ft546ShadowApplication`;数据库账号、生产只读库、证据库、18091 本机端口和存储上限沿用现场设置。新增安全点列表保持空,直到现场确认。
6. 修正运行元数据后,仅启动这个影子配置。浏览器访问 `http://127.0.0.1:18091/shadow/status`。核对 `READY`、全部启动检查 PASS、上述 buildId,以及 `cycleDiagnostics.dispatch` 内各项计数。只观察时 `eligiblePhases=0` 可以是正常状态,不代表算法完成验证。
## IDEA 中两个人工哈希字段
历史运行的元数据不修改。审计发现此前配置哈希填入了源码归档哈希;新运行不要照抄或互换这两个值。
- `shadow.evidence.run.artifact-sha256`:记录本次交付物的 SHA-256。源码运行时,可以使用当前准确提交的源码归档哈希,并在现场记录中注明 `source archive`,不能称为运行中 JAR 或编译类的校验值。
- `shadow.evidence.run.configuration-sha256`:记录本次现场运行配置快照文件的 SHA-256。配置快照保留在现场受控目录,不提交到 Git,不发送含密码的文件。
- 在 CMD 中可以使用 `certutil -hashfile "文件完整路径" SHA256` 计算实际文件的哈希。若用源码归档,可先运行 `git archive --format=tar -o "%TEMP%\ft546-shadow-source.tar" HEAD`,再对这个文件运行 certutil。归档仅用于现场计算元数据,不是额外的部署包。
- 状态中的 `operatorArtifactSha256` / `operatorConfigurationSha256` 是上述人工输入,程序没有将其认证为实际运行产物。`buildId` 是代码内版本标签;`effectiveSettingsSha256` 是程序自动计算的配置摘要,两者与人工哈希分开显示。
## 证据导出兼容性
`shadow_input_batch.captured_json` 现在允许三种形式:旧版原始 JSON、`ft546-input-gzip-v1` 压缩信封、`ft546-input-ref-v1` 同批引用。`content_hash` 始终校验原始 JSON,不能对压缩信封直接算哈希后判定损坏。
推荐从生产服务器本机浏览器或可访问本机 HTTP 的 AI 工具读取:
```text
http://127.0.0.1:18091/shadow/inputs/<cycle_id>
```
每次返回一条输入:`cycleId`、`runId`、`contentHash`、`hashVerified=true`、`capturedJson`(原始 JSON 字符串)。接口只查询证据库;拒绝非本机连接、缺失/跨运行/循环/多层引用、损坏哈希和超限解压。单份原始输入最多 8 MiB。
如果 AI 只能查询 SQL,应同时导出引用记录和所指向的根记录,保留原样交给分析程序解码。仅按尾部时间窗口导出可能遗漏根记录。不要再假定 `captured_json` 始终直接包含 `maps/queues/vehicles`。
同批根输入与引用在同一事务中写入,任一子表失败整批回滚。压缩格式不影响原始输入哈希、决定哈希和逻辑证据哈希。旧程序回退运行仍可新增旧格式输入;分析工具必须继续理解新旧两种物理存储形式。不要逐条删除某个根输入而保留引用。
## 验证与剩余边界
- 最终本地验证命令:`mvn -o -pl ruoyi-wcs-shadow -am test -Dshadow.replay.audit-directory=<本地审计导出目录>`。覆盖 WCS 核心、FT546 协议和影子模块;现场样本留在 Git 之外。旧 300 条归档已不在原附件路径,本次使用仍可读取的 2026-09-08 审计导出回放,未编造或补填其生命周期。
- 新增回归覆盖生命周期隔离、已到终点、绑定车辆不可重分配、忙碌车辆保护、提升机端点改写、旧阶段路径、显式安全点、压缩还原、篡改/解压上限/引用校验和事务回滚。
- 2026-09-08 审计导出的 25 条样本包含 17 份不同输入,离线回放保持 JSON 与哈希原样。输入字段按 SQL Server nvarchar 字节估算,从 3,294,254 字节降至 604,048 字节(18.34%);此数字不包括其他表、索引、页开销、事务日志,也不代表数据库文件自动缩小。
- 当日最后一次容量检查为 14.39 GiB / 16 GiB。压缩只降低后续增长;旧空间不释放,容量上限不变。再次达到保护上限仍会停止影子采集,需要另行评估归档方案,不能只调大阈值。
- `READY` 只说明影子采集链路健康。正式版接管前还需本次新运行的有效待下发样本、路线与协议差异、拥堵/避让及特殊交接阶段证据;本修复不构成正式版上线批准。