aps-agent/docs/round-66-solver-isolation-s...

83 lines
6.0 KiB
Markdown
Raw Permalink 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.

# Round 66 求解器进程隔离可恢复状态快照
更新日期:2026-08-03
- Goal:Windows 求解器进程隔离与 Fail-Closed | Round 66 本地完成(最终独立复审 `AUDIT: PASS`);APS 总目标继续推进下一 P0
- 目标分支:`main`(不提交、不推送、不合并、不发布)
- 主工作区:`<repo-root>` | 权威 dirty 工作区
- 协议:`aps.solver-process.v1`
- 服务:8003 PID `21576`、5173 PID `9808`,均 healthy
## 已落地能力
- CP/HYBRID 的 native 求解被隔离到受控子进程;父进程只在退出码、fatal marker、协议、请求身份与运行时身份全部通过后物化排产结果。
- fatal、非零退出、超时、非法/截断响应、缺 success marker、协议或 request mismatch 均结构化 fail-closed。
- 成功响应必须通过 `responseDigest`、请求/响应条目完整排列与关键业务字段守恒、pipeline/status、可行解 objective/gap 与 operationSlots 全覆盖校验;任何不一致统一 `SOLVER_RESPONSE_INVALID`。
- CP 与 HYBRID 失败都返回 `UNAVAILABLE`,不生成 PO/WO,不产生可发布版本;HYBRID 不静默降级成 RULE 假成功。
- timeout 会回收完整进程树;子进程及 grandchild 不残留,父进程和 8003 保持存活。
- 默认 PATH Anaconda 运行时被稳定拒绝;`.venv` 与 `.sidecar-venv` 各连续 5 次探针通过。
- Sidecar 支持 `--solver-child`;桌面 child env 清理 Conda/Python 污染变量,并强制关闭 user-site。
## 源码 Sidecar `-I` 真实发现与修复
- 首次真实执行源码 `server/sidecar.py --solver-child` 且启用 Python `-I` 时失败:隔离模式移除了源码 checkout 的 import root,导致 worker 无法导入。
- 在 GitNexus LOW impact 门禁后,`server/sidecar.py` 仅 bootstrap 已解析、已校验的 trusted source root,再委托 `solver_worker`;未恢复任意外部 `PYTHONPATH`。
- 新增黄金测试 `test_source_solver_child_entry_runs_under_isolated_python`。
- 修复后的真实源码 Sidecar child:CP `OPTIMAL`,1 PO / 10 WO / 10 operationSlots,协议 `aps.solver-process.v1`,`runtimeSafe=true`。
## 回归与质量门禁
- 最新 post-fix focused:`80 passed`,包含源码 Sidecar `-I` 与协议摘要/语义假绿负向回归。
- 最终全量黄金:`1029 passed, 2 warnings`(最新源码复跑,300.23 秒)。
- Node:`60 passed`;Web build:passed。
- ruff、Python compile、Node syntax check、`git diff --check`:passed。
- 浏览器:title=`APS 智能排产工作台`,root=true,console warning/error 均为 0。
## 真实运行证据
### 复制 `world.json` 正向路径
- CP:`OPTIMAL`,1 PO / 10 WO / 10 operationSlots,协议 v1,`runtimeSafe=true`。
- HYBRID:`OPTIMAL`,1 PO / 10 WO / 10 operationSlots,协议 v1,`runtimeSafe=true`。
- 来源文件 SHA-256 前后均为 `C6E7FF090719DB505AF5C3B0D8ADD376CBA7843D6E6982A68C1BA02C342052FA`。
### 复制 MOM 数据边界
- CP/HYBRID 求解器均返回 `OPTIMAL`,但现有业务主数据阻断导致 0 PO / 0 WO、1 operationSlot / 1 conflict,且不可发布。
- 该结果证明进程边界可运行,不证明 MOM/工厂现场主数据已补齐,更不得宣称现场完整排产闭环完成。
- MOM 来源文件 SHA-256 前后均为 `6B64ADF6F29A43A518D89718610EE71FAD60E86D3F38CD5CFF26F1740CC53F7D`。
### 故障注入
- fatal:CP/HYBRID 均 `UNAVAILABLE`,0 PO / 0 WO、不可发布;父进程存活、业务世界原子、无 RULE 静默降级。
- timeout:15.633 秒后失败关闭,grandchild 随进程树回收;同样 0 PO / 0 WO、不可发布,父进程存活且业务世界原子。
## 首轮独立审计与修复
- 首轮独立审计结论为 `AUDIT: FAIL`:发现合法 JSON 可携带错误/缺失摘要,或自行重算摘要后把非空请求伪造成 `OPTIMAL + entries=[]`。
- 已修复:父进程强制重算 `responseDigest`,校验请求/响应条目基数、重复语义与关键字段完整排列,校验 pipeline/status 以及可行解 objective/gap/operationSlots 覆盖;新增 8 个负向用例,原假绿复现现返回 `SOLVER_RESPONSE_INVALID`。
- 冻结链路源码已增加 `sys.frozen -> sys.executable --solver-child` 自举;当前旧冻结 EXE 未重建,因此仍只列构建后验收,不冒充发布制品通过。
- 后续复审又发现“大请求 + 子进程不读 stdin”会让 Windows pipe 写入绕过 deadline,以及 `operationSlots` 可带越界索引;现改为临时文件 stdin,严格拒绝越界索引并校验 orderNo/productId 绑定,同时补 wrong pipeline/status 负向用例。
- 最终独立只读复审:`AUDIT: PASS`;2 MiB 请求且 child 永不读取 stdin 的真实复现 0.736 秒内 `SOLVER_PROCESS_TIMEOUT`,focused 80 passed。
## 数据保护口径
- `server/data/world.json` 与 MOM world 的 JSON 业务源验收前后 hash 不变。
- `server/data/**` 与 `.env` 无 Git 状态变化;未用现场目录承载测试输出。
- `master.db` 会因运行时 license `last_seen` 等操作元数据更新;不得用文件级 hash 冒充“数据库完全不变”。业务数据保护以隔离目录、业务表/对象核对和 JSON 业务源 hash 为准。
## 外部/构建后边界
- 现有冻结 Sidecar EXE 仅旧 `--probe-child` 通过;本轮未重建冻结产物,不能宣称新 `--solver-child` 已被打包验证。
- 需要在重建后对冻结 `--solver-child` 做真实冒烟,并继续完成干净 Win10/11、签名、Defender for Endpoint、真实 CI 与客户 DLL/运行时验收。
- MOM 仍受现有工艺、能力、班组/模具、采购/委外承诺等主数据边界约束;正式现场数据需工厂/SAP/WMS 补齐。
- 真实 MES/WMS/SAP 凭据、网络和白名单仍是外部输入。
## 下一优先级
- P0 下一本地项调整为:**全量 P2/P3 evidence 封套**与**审批迁移可靠性**。
- 审批迁移可靠性需覆盖 token 摘要一致性、损坏源 fail-closed、数据库时钟/TTL 与 CAS 并发语义;不得因已有首切片提前标记完成。
- 未经用户授权,不执行 commit/merge/push/publish。
运行证据:`docs/round-66-solver-isolation-runtime.json`。