aps-agent/docs/CHANGELOG.md

1751 lines
180 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-08-04 — Round 69 北海造船场景 SYNTHETIC APS 完整数据包
- **类型**:feature + data + validation + safety + docs
- **做了什么**:实现确定性船厂 APS 数据生成器和 full 数据包,覆盖 4 项目、WBS/工程发布、EBOM/PBOM/MBOM、库存/MRP、MAKE/BUY/OUTSOURCE、12,000 工序有限排产、质量返工、MES 执行、7 方案、15 异常、20 Skill、20 类 RAG。
- **审计整改**:关闭委外前后工序/供应商/运输/月产能、manifest/world 闭包、附件委外 19 字段、15 类异常逐项、WorldStore 甘特、硬约束空覆盖、返工无产能、场景假变化、validation 占位与日期语义问题。
- **硬约束**:FS/SS/FF/SF、正负 lag、资格、重量尺寸/吊装、运输、天气、维护、危险作业、区域密度、冻结区、质量和供应商产能均有非零样本;26 个非法变异全部被拒绝。
- **输出**:222 文件、51 CSV、205.206 MiB;业务摘要 `21838055715c587fa3b76dc4b640d5627cdb1626f993941c6f982c6a298594d3`;manifest `d908718e...a49fe7`;world `0f7fcdb3...991d`;fresh full 文件哈希差异 0。
- **验证**:Round69 focused 49 passed;full golden 1120 passed / 2 warnings;Node 60 passed;Web build 通过;validate-only PASS/FEASIBLE/0 hard violations;最终限定范围只读审计 `AUDIT PASS`。
- **性能**:fresh full 生成+校验+导出+哈希比对 87.238 秒,峰值工作集 1,298.496 MiB,输出 205.206 MiB,均低于门槛。
- **运行/保护**:8003/5173 HTTP 200,浏览器 title/主 UI/console 通过;四个 `server/data` 受保护文件哈希未变化。
- **边界**:全部数据为 SYNTHETIC,不代表北海造船真实业务数据;真实康尼/锐扬/北海造船现场数据仍需授权接入和校准;未 commit/push/merge/publish。
---
## 2026-08-03 — Round 67 审批迁移 Fail-Closed 与 Grant Digest 归一化
- **类型**:safety + fix + migration + tests + docs
- **做了什么**:严格审批源解析;P3 raw token 迁移为 SHA-256 digest;终态 request 重建;QUIESCED + 同锁稳定快照;request/grant/event 单事务;状态单调;legacy raw-token 原子修复;canonical event digest。
- **审计修复**:首轮计划审计 6 项阻断全部纳入;首轮代码审计发现 existing payload 身份未校验,补 request/grant payload immutable gate 与 legacy consume-once 回归后最终 `AUDIT: PASS`。
- **验证**:migration 29 passed;approval related 74 passed / 1 warning;full golden 1053 passed / 2 warnings(328.10 秒);Ruff/compile/diff-check passed。
- **真实运行**:临时 ApprovalStore -> SQLite 迁移,request=APPROVED、raw token 不落主键、consume true/false;损坏 JSON fail-closed 且 DB 不变。
- **数据保护**:现场 approvals/world/MOM hashes 前后不变;`server/data/**` 与 `.env` 无 Git 状态。
- **遗留**:R67-B2 数据库权威 clock/TTL/CAS;SAP outbound P3 evidence;真实 MySQL 多主机/停写切换外部验收。
- **交付边界**:未 commit、push、merge 或 publish。
---
## 2026-08-03 — Round 66 Windows 求解器进程隔离与 Fail-Closed
- **类型**:fix + architecture + test + docs
- **做了什么**:
- CP/HYBRID native 优化迁入独立 child,采用 `aps.solver-process.v1`;父进程校验退出、fatal marker、timeout、协议、requestId/digest 与 runtime identity 后才物化。
- fatal/timeout/非法响应均 `UNAVAILABLE`、0 PO/WO、不可发布;父进程与 8003 存活、业务世界原子,HYBRID 不静默降级 RULE。
- runtime probe 增加来源、版本、user-site、fatal+exit0 与内部 timeout 门禁;默认 PATH Anaconda 稳定拒绝,`.venv`/`.sidecar-venv` 各连续 5 次通过。
- 源码 Sidecar `--solver-child -I` 真实冒烟首次发现隔离 Python 移除源码 import root;经 GitNexus LOW impact 修复为只 bootstrap 已解析的 trusted source root,并新增 `test_source_solver_child_entry_runs_under_isolated_python`。修复后 CP `OPTIMAL`、1 PO/10 WO/10 slots、协议 v1、`runtimeSafe=true`。
- **真实运行**:复制 `world.json` 的 CP/HYBRID 均 `OPTIMAL`、1 PO/10 WO/10 operationSlots;MOM 复制数据求解器虽 `OPTIMAL`,但受现有主数据阻断为 0 PO/WO、1 slot/1 conflict,不宣称完成现场主数据。fatal 注入 CP/HYBRID 均失败关闭;timeout 15.633 秒并回收 grandchild。
- **验证**:post-fix focused 80 passed;最终全量黄金 1029 passed / 2 warnings(300.23 秒);Node 60 passed;Web build、ruff、compile、node check、diff-check passed。
- **复审补强**:大请求改用自动清理临时文件作为 child stdin,避免 Windows 管道背压使 deadline 失效;严格拒绝越界 slot 与订单/产品错绑,并补错误 pipeline/status 回归。
- **首轮审计修复**:`AUDIT: FAIL` 暴露 success response 摘要未验证与 `OPTIMAL + 空 entries` 假绿;现强制重算 `responseDigest`,校验条目完整排列/业务字段、pipeline/status 和可行槽位覆盖,新增 16 个负向用例。
- **服务/UI**:8003 PID 21576、5173 PID 9808 healthy;浏览器 title=`APS 智能排产工作台`、root=true、无 warning/error。
- **数据保护**:`world.json` SHA-256 `C6E7FF090719DB505AF5C3B0D8ADD376CBA7843D6E6982A68C1BA02C342052FA`、MOM SHA-256 `6B64ADF6F29A43A518D89718610EE71FAD60E86D3F38CD5CFF26F1740CC53F7D` 前后不变;`server/data/**`、`.env` 无 Git 状态。`master.db` 可能更新 license `last_seen` 等运行元数据,不用文件 hash 冒充业务不变。
- **遗留/边界**:现有冻结 EXE 仅旧 `--probe-child` 通过,未重建,不能宣称新 `--solver-child` 已打包;仍需构建后冒烟、干净 Windows、签名/Defender/真实 CI。下一 P0 为全量 P2/P3 evidence 封套与审批迁移可靠性。
- **最终独立复审**:`AUDIT: PASS`;2 MiB 请求且 child 不读 stdin 的真实 deadline 复现为 0.736 秒,越界/错绑 slots 与错误 pipeline/status 均失败关闭。
- **文档同步**:`plan.md`、完成矩阵、`scheduling-v1.md`、Round 66 工作/并行计划、状态与运行证据。
- **发布动作**:无 commit/push/merge/publish。
---
## 2026-08-03 — Round 65 端到端闭环 APS 排产内核
- **类型**:feature + fix + safety + docs
- **做了什么**:统一商务订单/BOM/库存/供应/工艺/设备/班组/模具/层级负荷准入与 V2 校验;修复原子排产、P2 发布、P3 MES、WMS Saga、外部 Skill、sourceHash、订单页真实状态和订单 GET 副作用。
- **证据门禁**:P2/P3 evidence 绑定完整 V2 problem/solution/validation、活动/工单身份及当前多资源快照;维保、能力、班组、模具、寿命与层级容量漂移失败关闭。
- **前端/E2E**:6 阶段读取持久化闭环和精确 gate;MOM 刷新恢复阻断,正向 fixture 经 P2 发布、P3 双人审批并产生 MES 外部工单。
- **验证**:`pytest tests/golden -q` = 979 passed;`npm run test:node` = 60 passed;Web build passed;真实隔离 Playwright = 2 passed。
- **现场保护**:旧版订单 GET 曾在 2026-08-03 10:10:24 写现场 world;现已改为幂等投影 + 深拷贝预览。当前 MOM hash `6b64adf6...53f7d` 在隔离验收前后保持一致,未擅自回退。
- **文档同步**:`plan.md`、完成矩阵、features、scheduling-v1、harness、modules、锐扬 runbook、Round 65 状态与运行证据。
- **遗留**:39 缺工艺、67 模板/缺能力、可信到货承诺与真实 MES/WMS/SAP 凭据不可伪造;最终独立复审 `AUDIT: PASS`;未提交、未合并、未发布。
> **大管家的账本。** 每次改代码、加功能、改功能、修缺陷,同一轮必须追加一节。
> 写法见 [docs/README.md §2.2](./README.md)。旧名:`PROGRESS.md`(已迁入本文件)。
---
## 2026-08-02 — 锐扬 Excel 结构化诊断与真实行号收口(round-63)
- **类型**:bugfix + data quality observability。
- **解析纠偏**:设备编码别名采用“最后一个非空值优先”,后续空列不再覆盖已有编码;补 `固定资产编号` 别名。47 行原解析噪声恢复为有效设备行。
- **结构分类**:`02-工艺模型` Excel 第 5 行二级序号表头、`07-设备模型` 4 行内嵌 section 归为 `ignorable_section`;非排产整块归为 `NON_SCHEDULING_BLOCK/ignored`。
- **诊断契约**:batch / preview / folder 新增 `diagnostics`、`diagnosticCounts`、`diagnosticsVersion=1`,每条含 sheet、真实 Excel 行号、parserIndex、kind、code、severity、classification、message、rawSummary;旧 errors/warnings/count 字段保持兼容。
- **现场结果**:锐扬目录(主表 + `订单-样例.csv`)为 **有效 1404 / blocking 1 / skippedRows 974**;diagnostics 为 ignored 979 / warning 181 / blocking 1。唯一阻塞定位到 `07-设备模型` Excel 第 130 行“3.8吨锂电叉车”,三个业务编码均空;出厂编号不冒充设备编码。
- **用户可读输出**:文件问题列直接显示真实 Excel 行号;Markdown 追加 5 行结构忽略、134 台 GENERAL 兜底、47 行别名恢复说明。
- **回归**:结构化 XLSX 缩比测试、folder 聚合契约、日期稳定性与既有导入/指导测试通过;全量黄金基线随 round-64 一并验证为 910 passed。
## 2026-08-02 — MRP 多层 BOM 自制/采购纠偏 + 分阶段界面(round-64)
- **类型**:bugfix + UX semantics(订单分解 / MRP)。
- **根因**:旧逻辑把“有默认工艺路线”错误等同于“自制”,并要求 `MAKE && hasRouting` 才继续展开;锐扬 MOM 导入又只为前 80 个自制候选生成模板路线,导致缺路线半成品被改写为采购并停止下钻。前端同时隐藏 `make`、把 DRAFT 建议标成“采购订单”,分解后还自动跳采购页。
- **后端修复**:显式 `procurementType` 优先;BOM 父项/成品/半成品即使缺工艺仍按 MAKE,生成 `missingRouting` 阻断提示并继续多层展开;同订单同物料聚合后只扣一次库存/在途;持久化独立 `makeSuggestions`,不写入/伪造 `productionOrders`;路线进一步区分 READY / TEMPLATE / MISSING。
- **前端修复**:新增“自制建议”页签,分解后默认打开;“生产订单”改为“已排生产”,“采购订单/委外订单”改为“采购建议/委外建议”;模板工艺、缺工艺分别标识,明确建议与真实生产订单的阶段边界。
- **真实验证**:`MOM--00280` 完整展开为 **106 项唯一自制建议 / 124 条采购建议 / 0 委外**;其中 **67 项仅模板工艺待确认、39 项缺工艺路线**;124 条采购全部为 `RAW_MATERIAL`,采购中半成品为 0;`B0050121-22750` 已从采购移入自制,且继续展开出原材料 `C0030800-04179`。
- **回归**:`tests/golden/test_mrp.py`、`tests/golden/test_sourcing_decompose.py` 聚焦 **10 passed**;Web `npm run build` 通过;8003/5173 均 200;在真实浏览器完成重分解和页签/文案核验。
- **边界**:当前 67 条路线来自导入模板,仅允许试排,不应视为现场已确认工艺;39 条缺路线项必须补齐主数据后才能形成可执行生产工单。
## 2026-08-01 — trace_chain 接入 schedule.run
## 2026-08-01 — trace_chain 跨引擎可复算(round-16 补充)
## 2026-08-01 — EXTERNAL 引擎接入 trace_chain + 前端追溯 UI(round-16b)
## 2026-08-01 — 对话状态与世界状态成对快照(round-17)
## 2026-08-01 — 审计完整性告警通知渠道(round-18)
## 2026-08-01 — 审计完整 Merkle 树(round-19)
## 2026-08-01 — 审计 append-only 守护:跨进程锁 + 清理策略(round-20)
## 2026-08-01 — 偏好学习升级:项目隔离/解释/重置/冷启动(round-21)
## 2026-08-01 — Explore 与 Runtime 数据边界(round-22)
## 2026-08-01 — L0-L3 Plan 重放能力(round-23)
## 2026-08-01 — 统一工具运行时(LLM 只有提议权,round-24)
## 2026-08-01 — 分支树:项目->会话->分支三级树(round-25)
## 2026-08-01 — 分支切换自动恢复锚定检查点(round-27)
## 2026-08-01 — 偏好解释 UI + stub 可复算修复(round-28)
## 2026-08-01 — 主数据工艺树升级为树形表格 + 物料分类/来源修复(round-29,产品向 sub agent 实施)
## 2026-08-01 — L0-L3 Plan 批准/驳回审计(round-30)
## 2026-08-01 — Agent 自动编排:plan 节点驱动 workflow 门禁(round-31)
## 2026-08-01 — 偏好时间衰减加权模型(round-32)
## 2026-08-01 — Explore 通道扩展:敏感性/鲁棒性接入统一边界(round-33)
## 2026-08-01 — 多智能体并行交付:会话引用/四层上下文/自动化G0-G4/分支树UI/时间线微观层(round-34,3 个并行智能体)
## 2026-08-02 — 多智能体并行交付·第二批:CP-SAT 工序级/算法库+参数优化/MCP总线+异步任务(round-35,3 个并行智能体)
- **类型**:feature(多方向并行,plan.md §9.2/§9.5/§9.8/§7/§6.8)
- **做了什么**(三个智能体并行,写范围互不重叠):
- **方向 D(Gauss)· 矩阵 84**:`cp_engine.py` 工序级模型——每工序 OptionalIntervalVar 按工艺路线串联(C1)、同工位 NoOverlap(C2)、换型矩阵 next-link 单链(C10)、冻结窗 FixedSizeIntervalVar(C11);solverMeta 增 operationSlots/totalChangeoverMin/frozenCount。
- **方向 E(Ramanujan)· 矩阵 86/87**:`algolib.py` 算法库注册表(A-E 分类+元数据+健康+版本+种子);`param_opt.py` 参数优化闭环(训练/验证隔离→回放→灰度→退化回滚+敏感性衔接)。
- **方向 F(Sartre)· 矩阵 75/88**:`mcp_bus.py` MCP 插件总线(manifest/工具契约/权限 fail-closed/健康/启停/版本兼容+Skill 桥接)+ 网关 /api/mcp/plugins*;`async_jobs.py` JobQueue 异步重算 + /api/jobs* + SkillConsole「MCP 插件」「异步任务」页签。
- **为什么**:按 plan.md 蓝图继续拆分边界并行推进矩阵 Missing/Partial 项。
- **验证**:三方向黄金测试 32 项(cp 6 + algolib 5 + param_opt 8 + mcp_bus 8 + async_jobs 5)通过;前端 `npm run build` 通过;CP/HYBRID 冒烟 OPTIMAL 且契约不变。
- **边界**:Cumulative 班组容量、ML/元启发资产落地、网关 P2 门禁接线、真实 MES/WMS 适配器、分布/置信区间留待后续轮。
---
## 2026-08-02 — 多智能体并行交付·第三批:LNS 插单/IIS 冲突归因/前端世界分区+diff+回放(round-36,3 个并行智能体)
- **类型**:feature(多方向并行,plan.md §9.11/§9.2b/§4.5/§9.4)
- **做了什么**(三个智能体并行,写范围互不重叠):
- **方向 G(Locke)· 矩阵 90**:`server/aps_domain/lns.py` LNS 插单局部修复器——固定窗口(默认急单交期 ±36h,`timeWindowHours=72`)内最小扰动邻域搜索(候选槽 + 插入右移级联,窗口外订单冻结 `windowOuterMovedCount=0`),扰动度量 movedOrderCount/shiftedHours/tardinessDelta/disturbanceRatio;受影响数/扰动率/窗口宽度超阈值 → ESCALATE 升级信号;`rush.evaluate` 附加 `impact.lns`(P1 沙盒,`payload["lns"]=False` 可关)、`rush.apply` 出卡携带 lns(P2 门禁)、`execute_confirmed` 路由 LOCAL→`apply_lns_local`(DRAFT+LNS_RUSH+LOCAL_REPAIR)/ ESCALATE→`apply_rush` 全量重排(audit 记 mode+escalateReasons);`test_rush_lns.py` 9 项。
- **方向 H(Lovelace)· 矩阵 89**:`server/aps_domain/attribution.py` 冲突归因——`detect_iis()` 约束级 IIS 最小冲突集(黄金用例验证删除任一约束后恢复可行,可行输入返回空+说明)、`attribution_for_schedule()` 结构化归因报告(evidence conflictId+versionId+日志描述可复核)、中文归因文案(约束名/订单号/资源/短日期/解开方式,不含 IIS/shadow 等数学术语)、近似影子价代理量(isShadowPriceProxy 显式标注,真实对偶价需 LP 重解);只读复用 `hard_blocking_conflicts`/`get_constraint_profile`,未改既有接口;`test_attribution.py` 7 项。
- **方向 I(Sagan)· 矩阵 54/55**:前端 Explore 与 Runtime 视觉分区(`WorldModeBadge.tsx` 世界种类徽标+只读角标、ViewportPanel 工具栏徽标+画布着色 world-explore/runtime/analysis、时间线根节点徽标、FlexPanel「沙盒试排」徽标);`WorldDiffView.tsx` 两个世界并排对比(基准 A × 对比 B:当前世界/版本快照/检查点/回放定位,订单工序时间/设备/模具/KPI 逐字段 diff 高亮+变化汇总);`AlgoReplayPanel.tsx` ALGO_RUN 动作链逐步回放(复位/上一步/播放/下一步/末步,traceSummary 链+检查点锚点+「对比此步前后世界」联动);`npm run build` 无类型错误。
- **为什么**:按 plan.md 蓝图继续把 Missing/Partial 矩阵项分发给并行智能体,保持写范围互不重叠、智能体可互相沟通。
- **验证**:新增黄金测试 16 项(rush_lns 9 + attribution 7)+ 相关回归全绿;全量回归 `618 passed`(隔离 `APS_KNOWLEDGE_PATH` 规避知识库环境污染);后端 8003 以新代码重启健康、前端 5173 构建通过。
- **边界**:真实 LP/CP 对偶影子价需线性化模型重解;CP-SAT 原生 IIS 与 flex 轨归因接入;跨产线 LNS 邻域需引擎 forcedLineId;网关 rush.apply 透传 lns 参数;检查点世界侧投影接口 `GET /api/checkpoints/{pairId}`(前端已降级展示);分支合并世界 diff、@知识 引用、滚动摘要 LLM 压缩、策略特征规则归纳留待后续轮。
- **类型**:feature(多方向并行,plan.md §4.7/§4.8/§5.3/§4.6/§6.10)
- **做了什么**(三个智能体并行,写范围互不重叠):
- **方向 A(Dirac)· 矩阵 63/64**:`server/agent_core/session_ref.py`(`@会话/@方案/@版本/@报告` 引用解析 + 按时点快照取值 + 证据链 refs + 删除/无权显式失败);`server/agent_core/context_policy.py`(四层上下文 ContextBudget + 滚动摘要可溯源 + pin 钉住)。
- **方向 B(Ptolemy)· 矩阵 76**:`server/agent_core/automation.py`(G0-G4 档位状态机 + AutomationGate 升权门禁 P3 双人 SOD + 事件/定时 cron/阈值三类规则 + 调度器 pause/resume/replay + AUTOMATION 审计)。
- **方向 C(Huygens)· 矩阵 51/54**:前端 `BranchPanel.tsx` 分支树 UI(fork/rename/switch/discard/merge + 活动高亮)+ `TimelineRail.tsx` 时间线微观层(Plan/ALGO_RUN traceSummary/审计证据 refs)+ 分支 API client。
- **为什么**:按 plan.md 蓝图拆分边界分发多智能体并行推进矩阵 Missing/Partial 项。
- **验证**:三方向黄金测试 20 项(session_ref 5 + context_policy 6 + automation_gears 6 + branch_tree 3)通过;前端 `npm run build` 通过;浏览器实测分支树 fork/merge/discard 与微观层正常。
- **边界**:接线(上下文到对话链路、自动化到网关定时/真实动作、引用自动触发)、`@知识` 引用、调度器持久化、两世界 diff 留待后续轮。
---
## 2026-08-02 — 多智能体并行交付·第四批:检查点投影/`@知识`引用/滚动摘要LLM/偏好特征规则(round-37,3 个并行智能体 + 主控 L66)
- **类型**:feature(多方向并行,plan.md §4.4/§8.1/§8.3/§8.5)
- **做了什么**(三个并行智能体写范围互不重叠 + 主控实现矩阵 66):
- **方向 J(Darwin)· 矩阵 54 收口**:`checkpoints.world_projection(pair_id)` 世界侧轻量投影(summary+固定/柔性工单+产能池,仓内数据零改动)+ `GET /api/checkpoints/{pairId}`(缺失 404 中文)与 `GET /api/checkpoints?pairIds=&branchIds=&sessionId=`(分支锚定批量投影);前端 `fetchCheckpointWorld` + `WorldDiffView` 检查点 B 侧优先投影逐字段全量 diff,失败回退元数据/近似快照降级;`test_checkpoint_projection.py` 5 项。
- **方向 K(Maxwell)· 矩阵 63 收口**:`session_ref.py` 第 5 类 `@知识` 引用(强制命中:命中→正文+出处+证据 ref,未命中→显式中文 RefResolutionError 不编造,未接线→显式 not-wired);`resolve_ref/resolve_all` 新增 keyword-only `knowledge_lookup`(既有 4 类零破坏);workflow `handle_intent` 入口自动解析注入(`_refs` + SESSION 审计 evidenceRefs,失败 fail-closed);`test_ref_knowledge.py` 9 项。
- **方向 L(Galileo)· 矩阵 64 收口**:`summarizer.py` LLM 滚动摘要压缩生成方(`compress_scroll_summary` 固定中文提示词 + ModelProvider.chat_text,不可用/异常/超预算→确定性回退绝不编造);`context_policy.scroll_summary` 可选 summarizer(compressedBy 溯源);gateway chat 每轮预算门控钩子(autoSummarize 开关,try/except 兜底不阻断对话);越权上下文 fail closed 测试补齐;`test_scroll_summary_llm.py` 14 项 + `test_context_policy.py` +3 项。
- **L66(主控实现)· 矩阵 66 收口**:`preferences.py` 多特征规则归纳——`extract_features(world)`(订单数/VIP占比/急单占比/品种数/硬冲突数)、分箱条件规则 `induced_rules`(采用2/试排1 条件得分+支持度)、`preferred_strategy_with_features`(规则投票命中→回退全局)、`explain_features` 中文规则依据;workflow/app 两处 `record()` 调用点接线 features;`test_preference_features.py` 6 项。
- **为什么**:按 plan.md 蓝图继续把矩阵剩余 Partial 项收口,保持多智能体并行、写范围互不重叠。
- **验证**:round-37 相关黄金测试 61 项通过;全量回归 `656 passed`(隔离 `APS_KNOWLEDGE_PATH` 规避知识库环境污染);前端 `npm run build` 无类型错误;后端 8003 新代码重启健康。
- **边界**:`test_guidance.py::test_workflow_guidance_and_kb_miss` 为既有知识库漂移环境失败(默认 knowledge.json 库容漂移使 miss 查询可命中,隔离路径下全绿);summaries 历史上限裁剪、@知识 标题首条子串命中依赖标题质量、检查点批量投影按分支锚定留待后续轮。
- **类型**:feature / security
- **做了什么**:`run_sensitivity` 与 `run_monte_carlo` 改为经 `explore_boundary.run_explore` 统一通道执行(fn 只拿深拷贝沙盒、主干永不外泄写引用,内部子沙盒互不污染);保留既有函数签名与输出结构(sensitivity rows/monteCarlo、monte carlo outcomes)。
- **为什么**:矩阵 55 行「Explore 与 Runtime 数据边界」剩余项「敏感性/鲁棒性等其他 Explore 工具逐一接入统一通道」。
- **验证**:`test_explore_boundary_extension.py` 3 项(sensitivity 零污染、monte carlo 零污染、只读视图 fail closed)通过;真实世界数据冒烟:sensitivity 返回 rows/monteCarlo、monte carlo 3 trials、主干逐字节不变;场景相关 15 项全绿。
- **边界**:前端 Explore 与 Runtime 视觉分区留待后续轮。
---
## 2026-08-02 — 多智能体并行交付·第五批:分支diff/plan回退/WMS缺料闭环/工具运行时收口/蒙特卡洛配置(round-38,3 个并行智能体 + 主控 L88)
- **类型**:feature(多方向并行,plan.md §4.4/§4.5/§9.9/§6.10/§5.3)
- **做了什么**(三个并行智能体写范围互不重叠 + 主控实现矩阵 88):
- **方向 M(Gibbs)· 矩阵 51/52 收口**:`branches.compute_world_diff`(两分支锚定 checkpoint 世界侧稳定 JSON 差异:版本/KPI/工序时间/柔性版本/产能池,merge 响应附 diff + 审计落库,前端 BranchPanel 合并前预览);PlanStore 分支维度——`plans_snapshot`/`restore_for_branch` 可恢复接口(plan 视图随 checkpoint 归档物化,分支切换自动回退/恢复,latest/node_at/versions/create/transition 视图感知,无锚定完全兼容);`test_branch_merge_diff.py` 4 项 + `test_plan_branch_restore.py` 5 项。
- **方向 N(Euler)· 矩阵 74/77 收口**:`wms_stub.py` MockWMS(库存台账+缺料事件流+幂等+单调 inventoryVersion);`wms_events.py` 事件消费管线(eventId 全局一次消费/乱序 seq 缓冲/重复证据、库存版本进证据链、WMS-EVENT 冲突同步);缺料→重排端到端闭环:事件→影响半径(沙盒差分只读)→Explore 方案卡(复用 flex.reschedule P2)→人工确认(L4 重排)→MES 下发(P3 双人 SOD)→回执(wmsReceipts+审计全链证据);`POST /api/wms/events` + `GET /api/wms/replay` + `GET /api/wms/inventory`;`test_wms_events.py` 3 项 + `test_wms_replay.py` 3 项。
- **方向 O(Zeno)· 矩阵 111 收口**:`tool_runtime.run_tool_async` 异步入口;scenario.apply 由直连 handle_intent 改为经工具运行时(未登记拒绝+TOOL 审计,响应契约保留;source-level 盘点确认其为唯一直连端点);GovConsole「工具调用」视图(TOOL 审计条目:意图/等级/执行者/时间/结果 放行·确认卡·拒绝);`test_tool_runtime_gateway.py` 5 项。
- **L88(主控实现)· 矩阵 88 收口**:`robustness.py` 可配置分布(normal/uniform/triangular 逐维 + shockProbability)、`correlation`(-1..1 需求-效率扰动相关,rho=0 随机流与旧实现种子兼容)、`confidence_level` 经验分位置信区间(tardinessCI/mean/std)+ config 透明元信息;`test_monte_carlo_config.py` 7 项。
- **为什么**:按 plan.md 蓝图继续把矩阵 Missing/Partial 项收口,多智能体并行、app.py 按区段划分(merge/switch、WMS 事件、scenario.apply 互不重叠)。
- **验证**:round-38 相关黄金测试 57 项通过;全量回归 `683 passed`(隔离 `APS_KNOWLEDGE_PATH` 规避知识库环境污染);前端 `npm run build` 无类型错误;后端 8003 新代码重启健康(/api/wms/* 已注册)。
- **边界**:Saga/补偿(矩阵 78/119)留待下轮(幂等键/P3 门禁/回执审计已打地基);WMS 为 Mock 形态(真实适配器需集成环境);plan 视图为 store 级单例(多会话并行切换以最后一次为准);scenario.apply 未登记拒绝返回 200+拒绝文案(契约保留)。
- **类型**:feature / algorithm
- **做了什么**:`PreferenceStore` 从简单计数升级为**时间衰减加权评分**:每样本得分 = 来源权重(采用2/试排1)× 时间衰减(2^(-age_days/半衰期14天)),偏好随最近样本漂移、久远信号自然衰减;评分舍入 2 位小数保持当天信号≈整数的既有语义;`explain` 置信度增加「最高分与次高分接近 → medium」判定。
- **为什么**:矩阵 66 行「偏好学习影响默认策略」剩余项「偏好模型升级为权重回归/规则归纳」的权重回归部分。
- **验证**:`test_preference_decay.py` 4 项(新样本主导、半衰期≈0.5、当天≈整数、来源权重叠加)通过;既有偏好测试 10 项全绿。
- **边界**:策略特征规则归纳(多特征回归:订单结构/客户等级/约束 → 策略)留待后续轮。
---
## 2026-08-02 — 多智能体并行交付·第六批:Saga补偿/13类约束目录/trace断链可视化/算法目录收口(round-39,3 个并行智能体 + 主控 L86)
- **类型**:feature(多方向并行,plan.md §5.3/§9.2a/§9.5/§9.10/§10.4)
- **做了什么**(三个并行智能体写范围互不重叠 + 主控实现矩阵 86):
- **方向 P(Hypatia)· 矩阵 78/119 收口**:`saga.py` SagaCoordinator——状态机(PENDING/RUNNING/WAITING_HUMAN/SUCCEEDED/FAILED/COMPENSATING/COMPENSATED/MANUAL_TAKEOVER)+ SagaStep(幂等键/超时/重试/补偿/gate)+ 恢复队列(world["sagas"] 持久化 + resume_all 重放)+ 补偿注册表(失败逆序补偿链,补偿失败→人工接管)+ 写前快照回滚锚点;WMS 缺料闭环接入(run_shortage_saga 事件级 dedupe)+ `mes.cancel_dispatch`/`cancel_work_order` 幂等补偿;`/api/saga/*` 列表/详情/retry/compensate/takeover;`test_saga.py` 13 项 + `test_saga_wms_closure.py` 6 项。
- **方向 Q(Jason)· 矩阵 113 收口**:13 类约束目录齐全(C1-C13,新增 C9、C12 归位、goldenCase/kindConfigurable)+ `constraint_catalog()`;四引擎(RULE/CP/HYBRID/GA)硬约束语义一致黄金测试(EQUIPMENT/CAPACITY/MATERIAL 三态,未发现不一致);`ConstraintProfileDenied` 门禁拒绝三类关闭硬约束路径 + write_audit DENIED(LLM 提案同门禁);`test_constraint_catalog.py` 19 项 + `test_engine_constraint_semantics.py` 19 项。
- **方向 R(Poincare)· 矩阵 114 剩余收口**:`verify_audit_trace` 审计链断链检测(expected/actual/reason)+ workflow 落 traceItems(canonical 全量条目精确重算)+ `/api/gov/audit` traceAlerts + `GET /api/gov/trace/verify` + GovConsole ⚠断链徽标/顶部提示条;**EXTERNAL 真实 HTTP skill 端到端验收**(uvicorn stub + HTTP skill → flex.schedule.external 真实 POST → trace 可复算);`test_trace_break_visual.py` 6 项 + `test_trace_external_http.py`。
- **L86(主控实现)· 矩阵 86 收口**:`algolib.py` 目录完整性——LNS 随 round-36 交付翻转为 available=True(entrypoint + test_rush_lns.py 黄金测试)、ML/元启发未落地资产如实登记 available=False(健康检查如实报告);`test_algolib_catalog.py` 4 项(A-E 齐全/ML元启发如实登记/query 过滤)。
- **为什么**:按 plan.md 蓝图继续把矩阵 Missing/Partial 项收口,多智能体并行、app.py 按区段划分(/api/saga、/api/gov、无冲突)。
- **验证**:round-39 相关黄金测试 111 项通过;全量回归 `755 passed`(隔离 `APS_KNOWLEDGE_PATH` 规避知识库环境污染;Poincare 标记的批量顺序相关失败未在全量中出现);前端 `npm run build` 无类型错误;后端 8003 新代码重启健康(/api/saga/*、/api/gov/trace/verify 已注册)。
- **边界**:P3 双人确认自动代行需生产接真实操作员授权(auto_approve=False 停 WAITING_HUMAN 人工确认);旧审计记录无 traceItems 仅结构校验(新记录哈希级比对生效);约束拒绝分支 store.save 持久化建议补;真实 MES/WMS 适配器(矩阵 73/74 现场对接)与 WORM/加密、信创、CI/CD 等外部环境依赖项留待后续。
- **类型**:feature / governance
- **做了什么**:新增 `server/agent_core/plan_orchestration.py`:P2 动作出确认卡时自动创建 L0 意图→L1 策略→L2 决策节点链(`stage_plan_node`,同 action 父链幂等复用);批准/驳回时流转 L2 节点状态(`decide_plan_node`,APPROVED/FAILED,按 confirmId 匹配);接入 harness.stage_confirmation 与 workflow.execute_confirmed(尽力而为,失败仅记日志不阻断门禁);修复 PlanStore `_load` 的 regenCount 校验(状态流转版本 regenCount 不变,原校验要求连续递增会误判 corrupt)。
- **为什么**:矩阵 110 行「L0-L3 Plan」剩余项「接入 Agent 自动编排(plan 节点驱动 workflow 分支)」。
- **验证**:`test_plan_orchestration.py` 4 项(出卡建链、批准/驳回流转、重启加载有效、父链复用)通过;API 端到端:排产→发布出卡→批准→L2 节点 DRAFT→APPROVED v2(历史不可变);plan 相关 20 项全绿。
- **边界**:L3 动作级节点驱动具体执行(编排链进一步细分)留待后续轮。
---
## 2026-08-02 — 多智能体并行交付·第七批:自动化网关驱动/NSGA-II多目标/可重生流水线/桌面壳决策(round-40,3 个并行智能体 + 主控 L98/L110)
- **类型**:feature(多方向并行,plan.md §6.10/§9.7/§10.2/§14)
- **做了什么**(三个并行智能体写范围互不重叠 + 主控决策收口):
- **方向 S(Ptolemy)· 矩阵 76 收口**:`automation.py` 业务动作注册表(commit→schedule.publish 发布、reschedule→flex.reschedule 重排,经 AutomationGate 升权 + 既有门禁;未登记 P2/P3 动作 G4 也按 P3 fail-closed 拦截)+ 调度器持久化(宽容加载重启恢复)+ 网关定时驱动(POST /api/automation/tick + lifespan 后台自动 tick,可配开关);`run_automation_intent` 走 execute_confirmed 真实执行;`test_automation_gateway.py` 6 项 + `test_automation_gears.py` +2。
- **方向 T(Archimedes)· 矩阵 91 收口**:`rebuild_orchestrator.py` 可重生流水线——候选构建(scan_modules+黄金测试映射)、隔离运行(subprocess + APS_* 随机临时目录跑 pytest 子集)、安全扫描(S1 阻断 + S2/S3/S4 告警)、灰度(GRAY shadow + gray_probe)、失败自动回滚(黄金失败/灰度探针失败恢复基线)、审计;registry.py 候选版本登记 + 激活指针;`/api/rebuild/*` 4 端点;`test_rebuild_pipeline.py` 10 项 + `test_registry.py` 6 项。
- **方向 U(Pauli)· 矩阵 85 收口**:`nsga2_engine.py` 真实 NSGA-II——快速非支配排序+拥挤度+锦标赛+精英保留、工序级染色体(OX/PMX 保可行性+工序交换/资源迁移变异)、3 目标(加权总延迟/容量冲突/负载均衡)输出 Pareto 解集、`nsga2_defaults` 参数模板 + manifest、`get_engine("NSGA2")` 集成 + `solve_nsga2`、`nsga2_solutions_to_cards` 衔接 rank_scenarios、大算例基线(35 订单 50 代 <15s 不劣于单目标 GA);时间预算确定性修复(小预算跑满固定代数与 GA 口径一致);algolib nsga2 条目翻转为可用;`test_nsga2_engine.py` 11 项。
- **L98(主控决策)· 桌面壳收口**:架构决策——接受 Electron 为当前桌面壳(apps/desktop 已实现 + 打包冒烟),plan.md 目标态同步修订(Tauri 列为备选不阻塞),矩阵 98 置 Done。
- **L110(主控补正)**:Plan 不可变/可版本化/可局部重生(矩阵 110 剩余=无,状态补正 Done)。
- **为什么**:按 plan.md 蓝图继续把矩阵剩余项收口,多智能体并行、app.py 按区段划分(/api/automation、/api/rebuild,无冲突)。
- **验证**:round-40 相关黄金测试 65 项通过;全量回归 `791 passed`(隔离 `APS_KNOWLEDGE_PATH` 规避知识库环境污染;NSGA-II 时间预算确定性修复后全绿);后端 8003 新代码重启健康(/api/automation/status、/api/rebuild 已注册);文档门禁通过。
- **边界**:自动化规则 CRUD UI、NSGA-II 冲突目标物化层对齐、rebuild 激活版本物理替换、真实 MES/WMS 适配器、信创/CI-CD/WORM 等外部环境依赖项留待后续。
- **类型**:feature / governance
- **做了什么**:`PlanStore.transition_status`:Plan 状态流转(DRAFT→APPROVED/FAILED/RUNNING/SUPERSEDED 等合法边),追加新版本承载状态变化(version+1、regenCount 不变、inputsHash/payload 不变保证历史不可变),evidenceRefs 追加 `status:<新状态>`、note 写入 payload._note(审计留痕);非法流转抛 `PlanTransitionError`;`POST /api/plans/{id}/approve` / `/reject` 端点。
- **为什么**:矩阵 110 行「L0-L3 Plan」剩余项「批准/驳回审计」。
- **验证**:`test_plan_transition.py` 4 项(批准追加版本+证据、驳回带 note、非法流转拒绝、连续流转历史不变量)通过;plan 相关 16 项全绿。
- **边界**:Agent 自动编排(plan 节点驱动 workflow 分支)留待后续轮。
---
## 2026-08-02 — 多智能体并行交付·第八批:CP Cumulative/参数优化门禁/前端E2E+Sidecar冒烟+CI矩阵/审批迁移(round-41,3 个并行智能体 + 主控 L112)
- **类型**:feature(多方向并行,plan.md §9.2a/§9.8/§14.3/§3.3)
- **做了什么**(三个并行智能体写范围互不重叠 + 主控实现矩阵 112):
- **方向 V(Herschel)· 矩阵 84 收口**:`cp_engine.py` Cumulative 班组/工装聚合容量(C12:跨工位并行工序占用 ≤ 可用容量,teamId/toolingId 主数据接线,personnel+剖面双闸,solverMeta.cumulative 含 peakConcurrent/unwired 诚实报告);gap(objective/bestBound/None 语义)+ 时限(确定性超时 FEASIBLE 契约)+ 性能基线(n=12 <30s);`test_cp_cumulative.py` 8 项。
- **方向 W(Bacon)· 矩阵 87 收口**:`param_opt.py` propose(P1 触发)+ record_observation 线上观测(连续劣化自动回滚+审计+落盘 paramObservations)+ P2 门禁接线(promote 经 harness 确认卡,验证回放 finalize GRAY→FULL,拒绝留 GRAY;harness _POWER_MAP 登记 param.*);`/api/params/*` 5 端点;`test_param_opt_gateway.py` 9 项 + `test_param_opt.py` +5。
- **方向 X(Boole)· 矩阵 118 部分 + 99 本地部分**:完整前端 E2E(apps/web/e2e + @playwright/test,preview 模式,3 用例含登录→跑一版柔性排产→结果块→世界对比/柔性工作台→命令面板,`npm run test:e2e` 本地 3 passed);`scripts/smoke-sidecar-local.mjs` 本地冒烟 5/5(20 次冷启动/端口冲突/崩溃重启/父进程看门狗/中文空格路径);`.github/workflows/ci.yml` 5 job 构建矩阵(lint/前端构建 Win+Ubuntu/后端 golden 隔离 Win+Ubuntu/E2E/SBOM);`docs/development/e2e.md`。
- **L112(主控实现)· 矩阵 112 部分收口**:`server/agent_core/approval_migrate.py` 文件→DB 存量迁移——幂等(重复 confirmId/token_hash/事件内容去重跳过)、dry_run 不动库、缺文件空源、未配 database 后端 fail closed、迁移后经 database 后端可读回;`test_approval_migration.py` 6 项。
- **为什么**:按 plan.md 蓝图继续把矩阵剩余项收口;E2E 实测发现 dev 模式 React StrictMode 吞 refreshWorld/captureSessionResult 状态更新(preview 生产构建不受影响,已记录 docs/development/e2e.md 建议前端跟进)。
- **验证**:round-41 相关黄金测试 93 项通过;全量回归 `818 passed`(隔离 `APS_KNOWLEDGE_PATH`);前端 `npm run test:e2e` 3 passed + `npm run build` 通过;sidecar 本地冒烟 5/5;后端 8003 新代码重启健康(/api/params 已注册)。
- **边界**:签名/SBOM 上链/Defender 入 CI 与干净离线机安装冒烟(需外部证书/验证机);WORM 归档与 MySQL 实机故障注入(外部环境);观测入口为接口驱动(每次排产自动采样后续一行接线);CI workflow 本地 YAML 校验通过但未在真实 GitHub 仓库跑通。
- **类型**:feature / fix / product
- **做了什么**:主数据「工艺路线」由 antd Tree 改为 **树形表格**(列:名称/编码/类型/来源/用量/图号,行展开折叠);后端 `build_process_tree` 修复三缺陷——BOM 去重(flexBom 与经典 bomItems 双份合并去重)、半成品推导(名称含组件/总成/支架且非标准件 → typeLabel=半成品)、工序补名称(flexOperations/operations 补齐 operationName);节点新增 `typeLabel`/`sourcingLabel`(自制/委外/采购)/`operationName` 等字段(契约只增不删)。
- **为什么**:现场计划员反馈——要树形表格而非纯树;物料必须分原材料/半成品/成品;来源必须分生产(自制)/委外/采购,否则无法排产判断。
- **验证**:`build_process_tree("28200003654300")` 去重 0 重复(22 物料)、半成品 3 项、工序缺名 0、来源缺失 0;`npm run build` 通过;sourcing/master 相关 16 项测试通过;浏览器实测外壳产品树形表格 578 行、列头/徽标/层级/展开折叠正常。
- **边界**:无工艺路线的推导半成品来源按既有规则显示采购(若现场确认为厂内自制需在 infer_material_sourcing 增加按 typeLabel 覆盖);默认展开策略可按现场反馈收紧。
---
## 2026-08-02 — 多智能体并行交付·第九批:多模态低置信确认/WORM归档模拟/前端StrictMode修复/roadmap对齐(round-42,3 个并行智能体 + 主控文档收口)
- **类型**:feature(多方向并行,plan.md §6.7/§10.4/§12)
- **做了什么**(三个并行智能体写范围互不重叠 + 主控 roadmap 对齐):
- **方向 Y(Carver)· 矩阵 101 框架落地**:`multimodal.py` 多模态管线——Extractor 协议 + ExtractorRegistry(未注册 kind 显式报错不编造,register() 为真实 ASR/VLM 接入入口)+ stub 提取器(文件导入/文本模板)+ **低置信确认门禁**(不完整显式拒绝、高置信直通、低置信 P2 确认卡,确认前绝不写世界状态)+ 审计(extract/stage/apply/reject);`/api/multimodal/extract|ingest`;`test_multimodal.py` 20 项。
- **方向 Z(Goodall)· 矩阵 104/116/112 WORM 部分**:`audit_ledger.py` WORM 归档模拟——archive_old 归档即密封(`.worm-manifest.json`:sha256+merkleRoot+coverage+readonly,chmod 只读 + 密封写守卫,同月不覆写自动分流)+ `verify_archive()`(篡改/缺失/merkle 复算不一致检出 + summary);`GET /api/gov/archive/verify` + `POST /api/gov/archive/run`;`test_audit_worm.py` 7 项。
- **方向 AA(Hooke)· 矩阵 118 dev E2E 修复**:根因定位——StrictMode 模拟卸载把 `alive` ref 永久置 false(effect 体为空只返回 cleanup)+ `captureSessionResult` 在 setWorld 更新器内(杂质);修复:alive effect 体内复位 + worldRef 镜像把捕获移出更新器;**dev 模式 E2E 3 passed**(修复前必失败)+ preview 3 passed 无回退;docs/e2e.md 缺陷状态更新。
- **主控·文档收口**:roadmap.md 对齐(13 类约束目录已落地、NSGA-II/CP Cumulative 已交付、引擎演进更新);矩阵 101 由 Missing 转 Partial(框架完成、真实 ASR/VLM 外部)。
- **为什么**:按 plan.md 蓝图继续推进矩阵剩余项;修复 E2E 发现的真实前端缺陷(dev 模式视口不可用)。
- **验证**:round-42 相关黄金测试 62 项通过;全量回归 `846 passed`(隔离 `APS_KNOWLEDGE_PATH`);前端 `npm run build` 通过 + E2E preview/dev 双路径 3 passed;后端 8003 新代码重启健康(/api/multimodal/*、/api/gov/archive/* 已注册)。
- **边界**:真实 ASR/VLM 模型服务、物理 WORM 介质、加密/密钥管理、MySQL 实机、签名/Defender/离线机安装与真实 GitHub CI 跑通(均需外部环境);低置信卡复用 import.commit 动作名(专用 multimodal.apply P2 卡需登记 _POWER_MAP 并同步 harness.md,留待后续轮)。
- **类型**:feature / fix
- **做了什么**:设置中心「个人偏好」页新增偏好学习卡片:当前默认策略、置信度(高/中/冷启动)、原因文案、得分明细、重置按钮;后端新增 `GET /api/settings/preferences`(explain,缺省取活动项目维度)与 `POST /api/settings/preferences/reset`;修复 `algo_skill_stub._stub_input_fingerprint` 误纳含时间戳的 problemId 导致同输入两次运行 runId 不同、EXTERNAL trace 链不可复算(矩阵 114 行可复算性回归缺陷)。
- **为什么**:矩阵 66 行剩余项「UI 展示偏好解释」;全量回归偶发 `test_trace_external::test_external_flex_trace_recomputable_same_input` 失败,定位为 problemId 时间戳污染 runId。
- **验证**:`test_tool_runtime + test_trace_external` 连续 3 次通过;EXTERNAL/trace 相关 13 项通过;TestClient 端到端:冷启动→3 次排产→DELIVERY_FIRST(high, 2:1) 项目维度偏好。
- **边界**:偏好模型升级为权重回归/规则归纳留待后续轮。
---
## 2026-08-02 — 多智能体并行交付·第十批:审计归档加密/Defender冒烟+离线包校验/桌面升级回滚/测试门禁修复(round-43,3 个并行智能体 + 主控)
- **类型**:feature(多方向并行,plan.md §10.4/§14.1/§12)
- **做了什么**(三个并行智能体写范围互不重叠 + 主控测试门禁修复):
- **方向 BB(Franklin)· 矩阵 104/116 加密部分**:`audit_ledger.py` 归档加密模拟——AES-256-GCM 认证加密(cryptography,scrypt 口令派生或 env 原始密钥),manifest 双层哈希(ciphertextHash+plaintextHash)+ 解密校验/密钥缺失或错误显式失败/密文篡改检出,未配置密钥 fail-closed 不静默;`test_audit_encryption.py` 12 项。
- **方向 CC(Singer)· 矩阵 99/118 本地部分**:`scripts/defender-scan.mjs`(MpCmdRun 静态扫描 Sidecar/win-unpacked/NSIS 安装包 4/4 clean,含非 ASCII 路径 temp-copy 兜底与 EICAR 威胁解析验证)+ `scripts/offline-install-check.mjs`(SHA-256 清单生成/校验/portable/dry-run 安装路径);`tests/node/packaging-smoke.test.mjs` 12 项 + `docs/development/packaging-smoke.md`。
- **方向 DD(Faraday)· 矩阵 103 升级回滚部分**:`packaging/upgrade-manifest.schema.json` + `build-upgrade-manifest.mjs`(清单生成/校验)+ `apps/desktop/updater.cjs`(校验→备份 copy/listing→NSIS 静默安装→健康检查→失败自动回滚+本地审计 JSONL,可选上报 /api/gov/audit)+ IPC(check-for-update/apply-update/rollback 走 isTrustedIpcEvent);`apps/desktop/test/updater.test.cjs` 15 项 + `updater-smoke.mjs` 4 项。
- **主控·测试门禁修复**:`test_guidance.py::test_workflow_guidance_and_kb_miss` 长期环境失败根治——测试内隔离知识库路径(APS_KNOWLEDGE_PATH 临时文件 + 清全局缓存),不再依赖已漂移的 server/data/knowledge.json(5/5 通过)。
- **为什么**:按 plan.md 蓝图继续推进矩阵剩余项;根治每个全量轮次唯一的既有失败(知识库漂移)。
- **验证**:round-43 相关测试 37 pytest + 26 node(updater 22 + packaging-smoke 12 去重后统计)通过;全量回归 `858 passed`(隔离 `APS_KNOWLEDGE_PATH`,test_guidance 自隔离);Defender 扫描 4/4 clean;离线安装包校验 PASS。
- **边界**:签名 Authenticode/SBOM 上链/provenance、WORM 物理介质、HSM/KMS 密钥管理、Defender for Endpoint CI 门禁与实时防护演练、干净离线机实机安装、真实 GitHub CI 跑通、NSIS 真装冒烟(均需外部环境/证书/验证机)。
- **类型**:feature
- **做了什么**:`_create_checkpoint` 建档后把 checkpointId 锚定到当前活动分支(分支↔快照联动);`POST /api/sessions/{id}/branches/{bid}/switch` 升级为 P1→P2:目标分支有锚定 checkpoint 时自动成对恢复世界+对话侧(restored=true),无锚点仅切换 active_node(restored=false);fork 继承父分支锚点。
- **为什么**:矩阵 52 行剩余项「分支切换时自动恢复锚定 checkpoint(成对切换联动)」;P1 安全探索验收「任意分支切换后对话和世界逐字段一致」。
- **验证**:`test_branch_checkpoint_link.py` 3 项(建档锚定分支、切换锚定分支自动恢复版本数、无锚点仅切换)通过;端到端:chat 建档→锚定→fork→污染→切换恢复版本数回锚定时。
- **边界**:PlanStore 可恢复接口(plan 版本随分支切换回退)留待后续轮。
---
## 2026-08-02 — 多智能体并行交付·第十一批:CI 6-job 扩展/health 版本+审计token/NSIS真装冒烟/文档同步(round-44,3 个并行智能体 + 主控)
- **类型**:feature(多方向并行,plan.md §14.1/§12/§10.4)
- **做了什么**(三个并行智能体写范围互不重叠 + 主控收口):
- **方向 EE(Bernoulli)· 矩阵 103/118 CI 部分**:CI 新增 `node-tests` job(Win+Ubuntu)——updater+sidecar+packaging-smoke 34 项 + sidecar 本地冒烟 + offline verify + Defender best-effort;`pyproject.toml` 声明 `cryptography>=42`;根 `package.json` 新增 `test:node`(本地 npm run test:node 34/34)。
- **方向 FF(Popper)· 矩阵 103 衔接**:`/api/health` 补 `version`(APS_APP_VERSION env 注入,web null 兜底)+ sidecar 一次性审计 token(重启重置、不落盘不进子进程 env)→ main `resolveAuditOptions` → updater Bearer+nonce 客户端链路闭环;probeHealth 版本比对显式化(无 version 退化 200 检查);`test_health_version.py` 3 项 + node +5 项。
- **方向 GG(Kant)· 矩阵 99/118 真装冒烟**:`scripts/nsis-install-smoke.mjs` NSIS 临时目录真装冒烟(/S /D=随机临时目录,2 次 PASS:33.6s/30.9s、567MB 解包、electron-builder 布局校验、卸载清理、无系统残留;验证 updater /S /D= 约定)+ `tests/node/nsis-smoke.test.mjs` 13 项 + `docs/development/nsis-smoke.md`。
- **主控·收口**:requirements.txt 补 cryptography(CI backend-tests 依赖同步);features.md 补 round-36~44 交付速览表;test_guidance 知识库隔离修复已在 round-43 完成并纳入本轮全量验证。
- **为什么**:按 plan.md 蓝图收口矩阵剩余本地可做项,把桌面升级/审计/打包链路与 CI 门禁衔接闭环。
- **验证**:全量回归 `861 passed`(隔离 APS_KNOWLEDGE_PATH);node 门禁 `npm run test:node` 34/34 + nsis-smoke 13/13 + updater 27 + sidecar 冒烟 5/5;CI YAML 6 job 校验通过;NSIS 真装 2 次 PASS;8003 新代码重启健康(health 含 version 字段)。
- **边界**:服务端审计上报端点(POST + Bearer 校验)、升级后 probeHealth nonce 续接、签名/SBOM 上链、Defender for Endpoint CI 门禁、干净离线机实机安装、真实 GitHub CI 跑通、perMachine 路径(均需外部证书/验证机/仓库);真实 MES/WMS 适配器、信创、ASR/VLM、WORM 物理介质、HSM/KMS、MySQL 实机等外部项维持矩阵标注。
## 2026-08-01 — 主数据工艺路线树产品升级(round-26,产品向 sub agent 实施)
- **类型**:feature / product
- **做了什么**:主数据「工艺路线」页签树重做:根=选中工艺路线的成品(金色「成品」徽标+自制+用量×N+图号),每个物料节点下先挂它自己工艺路线的工序序列(工序徽标+seq+自制/委外,按序),再挂 BOM 子件;原料/外购件为叶子(「原料+采购」);默认只展开到工序层、半成品可折叠;空态/异常有 Alert 不白屏。后端 `build_process_tree` 只增不减补充展示辅助字段(typeLabel/hasRouting/isLeafMaterial/unit);前端新增 `processTreeNodeTitle`/`processTreeToNodes` 与 `.pt-badge--*`/`.pt-src--*` 样式。
- **为什么**:现场计划员需要一眼看清「成品 → 半成品 → 每层各自生成哪些工序」,此前树全部平铺无层级语义。
- **验证**:`npm run build --prefix apps/web` 通过;浏览器实测外壳树 467 节点、折叠/展开正常、原料叶子无展开箭头;golden 测试 535 全绿;impact 分析 build_process_tree LOW。
- **边界**:空态 Alert 未在真实数据触发验证;更深层 BOM 子件默认折叠,可在产品迭代中调整默认展开深度。
---
## 2026-08-02 — 多智能体并行交付·第十二批:审计上报端点/HTTP MES适配器/图片元数据提取/信创依赖矩阵(round-45,3 个并行智能体 + 主控 L102)
- **类型**:feature(多方向并行,plan.md §3.6/§7/§6.7/§14.2)
- **做了什么**(三个并行智能体写范围互不重叠 + 主控实现矩阵 102):
- **方向 HH(Helmholtz)· 矩阵 103 收口**:`POST /api/gov/audit/events` 审计上报端点(desktop nonce 门禁双通道鉴权/web 登录 401/非法载荷 400/幂等 idempotencyKey 去重,复用 write_audit 落链)+ updater 上报新契约(sha256 确定性 key)+ probeHealth/applyUpdate nonce 续接(升级后健康检查带新网关 nonce,403 fail-soft 不阻塞);`test_audit_events_ingest.py` 7 项 + node 30/30。
- **方向 II(Socrates)· 矩阵 73/75 适配器框架**:`server/integrations/mes_http.py` HttpMesClient——config-driven(base_url/token/超时/重试 env)、幂等 idemKey、指数退避重试、报工回执/状态轮询/幂等撤单(saga 补偿)、MesHttpError 显式失败、未配置 fail-closed;`mes.py` env 切换客户端(stub 默认);MCP 总线注册 mes.http(dispatch P3/status P0/report P2/cancel P2,默认 deny);本地 HTTP stub 黄金测试;`test_mes_http.py` 9 项 + `test_mcp_bus.py` +1。
- **方向 JJ(Lorentz)· 矩阵 101 框架扩展**:`ImageMetaExtractor`——文件名/元数据级结构化候选(订单/物料/日期/附件类型,置信 ≤0.6 + requiresVlm 不编造、9 位数字守卫),走既有低置信 P2 确认门禁;真实 VLM 经 register(replace=True) 覆盖切换;`test_multimodal_image.py` 10 项。
- **L102(主控实现)· 信创依赖矩阵**:`docs/architecture/platform-matrix.md`(Python/OS/架构/依赖 wheel 覆盖 + 信创关键依赖标注)+ `scripts/platform-deps-check.py`(python/平台/架构/requirements 全依赖检测,本地 16/16 PASS)——矩阵 102 由 Missing 转 Partial。
- **为什么**:按 plan.md 蓝图收口矩阵剩余本地可做项(Missing 已归零);为真实 MES 对接与信创安装提供配置化框架与检测工具。
- **验证**:全量回归 `888 passed`(隔离 APS_KNOWLEDGE_PATH);node 门禁 30/30 + updater-smoke 4/4;集成组 91 项通过;8003 新代码重启健康(audit/events 端点 web 401/desktop nonce 双通道验证);文档门禁通过。
- **边界**:真实 MES 工厂对接(填配置+现场联调)、真实 ASR/VLM/OCR、麒麟/统信四组合实机安装、签名/SBOM 上链、Defender for Endpoint 门禁、干净离线机实机、真实 GitHub CI、main.cjs 新 nonce 传递接线(均需外部环境/证书/后续轮)。
- **类型**:feature
- **做了什么**:新增 `server/state/branches.py`(BranchStore):每会话一棵分支树(tree_root/active_node/branches),支持 fork(从活动分支派生,继承 checkpoint 锚点)/rename/switch/discard/merge,状态机(主干与活动分支不可丢弃、已合并/已丢弃不可再操作),JSON 持久化 + 并发锁;gateway 新增 `/api/sessions/{id}/branches` 系列端点(GET/POST fork/PATCH rename/switch/discard/merge)并写 GATE 审计(branch.fork/switch/merge/discard);成对快照 `conversationSide` 纳入分支树。
- **为什么**:矩阵 51 行「项目 -> 会话 -> 分支三级树及分支生命周期」(Missing)与 52 行成对快照的前置依赖。
- **验证**:`test_branch_tree.py` 3 项(BranchStore 生命周期+持久化、gateway 全流程+审计、丢弃活动分支 409)通过;API 冒烟 fork/switch/merge/discard 全链路正常。
- **边界**:前端分支树 UI、分支合并世界差异 diff、分支切换自动恢复锚定 checkpoint 留待后续轮。
---
## 2026-08-02 — 多智能体并行交付·第十三批:升级nonce续接/MES就绪检查/审计统计视图/基线同步(round-46,3 个并行智能体 + 主控)
- **类型**:feature(多方向并行,plan.md §14.1/§7/§3.6)
- **做了什么**(三个并行智能体写范围互不重叠 + 主控基线同步):
- **方向 KK(Curie)· 矩阵 103 最后本地项收口**:`apps/desktop/upgrade-nonce.cjs` createUpgradeNonceCoordinator——sidecar restarted 事件→新 nonce→probeHealth 重验(expectedVersion opt-in 版本比对/退化 200 检查)→成功带新 nonce 上报审计(upgrade.health-verified)/失败本地 JSONL 留痕;安装期 deferred 重启补验 + maxPendingMs 过期兜底 + 状态机防漏;main.cjs 接线 + build.files 打包包含;`test/upgrade-nonce.test.cjs` 13 项(desktop 43/43)。
- **方向 LL(Copernicus)· 矩阵 73 现场对接准备**:`mes_http.py` readiness(probe)——configured/baseUrl/tokenPresent/connectivity/lastError/message 稳定字段,未配置 fail-closed 提示不 500、探测短超时绝不抛错(2xx ok/失败 lastError);`GET/POST /api/integrations/mes/readiness[/probe]`;`test_mes_readiness.py` 8 项。
- **方向 MM(Avicenna)· 矩阵 104 审计查询与报表前端**:GovConsole「审计统计」分区(AuditStatsView:分类计数/动作 Top8/近 7 天趋势/告警概览含 traceAlerts 断链明细,中文标签+空态提示,前端聚合 limit=300 零后端改动);`npm run build` 通过。
- **主控·基线同步**:矩阵「当前验证基线」更新为 round-45 取证(888 passed + node/E2E/Defender/NSIS 门禁)+ GitNexus 索引规模 8,772 节点。
- **为什么**:按 plan.md 蓝图收口矩阵最后本地可做项;升级审计闭环、MES 现场对接第一步、审计报表可读性全部产品化。
- **验证**:全量回归 `895 passed`(隔离 APS_KNOWLEDGE_PATH);node 门禁 55/55(desktop 43 + packaging-smoke 12)+ updater-smoke 4/4;mes readiness 相关 33 pytest;前端 `npm run build` 通过;8003 新代码重启健康(/api/integrations/mes/readiness 已注册,鉴权前置)。
- **边界**:真实 MES 工厂对接/端点路径现场联调、applyUpdate 途中重启竞态根治(updater nonceMismatch→pending 语义)、签名/SBOM 上链、Defender for Endpoint、干净离线机实机、真实 GitHub CI、WORM 物理介质、HSM/KMS、麒麟/统信四组合实机、ASR/VLM、真实 WMS(均需外部环境/证书/后续轮)。
- **类型**:feature / security
- **做了什么**:新增 `server/agent_core/tool_runtime.py`:LLM 提议意图的统一执行入口——`is_registered` 校验(写入类匹配 `_POWER_MAP`、只读类白名单),未登记意图拒绝执行并写 TOOL 审计(`tool.denied`/P3),已登记意图委托 `handle_intent`(P2/P3 仍走 harness 确认卡)并写 `tool.run` 审计;gateway 聊天路径 `_run_intent` 改为经 `run_tool` 执行。
- **为什么**:矩阵 111 行「LLM 只有提议权」剩余验收「所有 LLM 工具调用都经统一工具运行时;不能通过未登记 API 或直接 store 写入绕过」。
- **验证**:`test_tool_runtime.py` 4 项(未登记拒绝+审计、已登记直通+tool.run、只读白名单放行、登记判定)通过;冒烟验证 `unknown` 拒绝、`schedule.run` 直通且双审计落盘。
- **边界**:其余 gateway 直连端点(scenario.apply 等)接入工具运行时、前端工具调用可视化留待后续轮。
---
## 2026-08-02 — 升级链路竞态根治:applyUpdate nonceMismatch→pending(round-47,主控)
- **类型**:fix(plan.md §14.1 离线升级闭环;矩阵 103 最后本地小项)
- **做了什么**:`apps/desktop/updater.cjs` 健康检查失败分支区分「升级途中 sidecar 重启导致的 nonce 轮换」——403 且已携带 nonce(`details.nonceMismatch=true`)时**不再自动回滚**(安装已成功,仅健康检查 nonce 过期),返回 `{ok:false, deferredVerification:true, reason:'NONCE_MISMATCH'}` + 审计 `upgrade.health-pending`(PENDING),由 Electron main 的 upgrade-nonce 协调器以新 nonce 补验;无 nonce 的 403(普通故障)仍走自动回滚;`test/updater.test.cjs` 新增 2 项非对称用例(带 nonce 403→pending 不回滚 / 无 nonce 403→回滚),desktop node 45/45。
- **为什么**:round-46 KK 标注的最大残留竞态——sidecar 在 applyUpdate 内部健康检查前完成重启时,自带检查用旧 nonce 403 会误触发回滚;本轮根治(非 nonce 类失败仍回滚,安全语义不变)。
- **验证**:desktop node `45/45`;根 node 门禁(updater+packaging-smoke+nsis-smoke)全绿;全量回归 `895 passed`(隔离 `APS_KNOWLEDGE_PATH`);`node --check` 通过。
- **边界**:跨进程持久化 nonce 续接(应用重启即丢 pending)与签名/SBOM 上链、真实 GitHub CI、真实 MES/信创/离线机等外部项维持矩阵标注。
- **类型**:feature / governance
- **做了什么**:`server/agent_core/plan_runtime.py` 新增 `node_at`(时间线按版本取不可变节点,越界/不存在抛 PlanNotFoundError)与 `replay_verify`(L2 单节点/L3 动作级重放校验:给定输入重算 inputsHash 与目标版本比对,一致返回节点、不一致抛 PlanInputMismatchError);`server/gateway/plan_api.py` 新增 `GET /{plan_id}/versions/{version}`(时间线回放)与 `POST /{plan_id}/versions/{version}/replay-verify`(动作级重放校验)。
- **为什么**:矩阵 110 行「L0-L3 Plan」剩余项「时间线回放和 L2 单节点/L3 动作级重放」。
- **验证**:`test_plan_replay.py` 4 项(node_at 不可变版本、相同输入可复算、输入变更拒绝、L3 动作级重放)通过;既有 `test_plan_runtime.py` 8 项全绿。
- **边界**:Agent 自动编排(plan 节点驱动 workflow 分支)、批准/驳回审计留待后续轮。
---
## 2026-08-02 — 升级 pending 跨进程持久化(round-48,主控)
- **类型**:feature(plan.md §14.1 离线升级闭环;矩阵 103 稳健性增强)
- **做了什么**:`apps/desktop/upgrade-nonce.cjs` 协调器新增 `statePath` 持久化——setPending/markInstalled/settle/clear 均原子写 `upgrade-state.json`(tmp+rename,宽容失败);应用重启后新协调器恢复未过期 pending(status→verifying)等待新 sidecar 补验,过期自动丢弃;`main.cjs` 接线 `{APS_HOME}/upgrade-state.json`;测试 3 项(持久化往返/过期丢弃/settle 清空),desktop node 48/48、根 node 门禁 60/60。
- **为什么**:round-47 前 pending 为内存态,应用重启即丢续接上下文;持久化后升级验证可跨进程续接(配合 sidecar 新 nonce)。
- **验证**:desktop node 48/48;根 node 门禁 60/60;文档门禁 16 passed;`node --check` 通过(纯 node/Electron 接线,pytest 无影响)。
- **边界**:签名/SBOM 上链、真实 GitHub CI、真实 MES/信创/离线机、WORM 物理介质、HSM/KMS、MySQL 实机等外部项维持矩阵标注。
- **类型**:feature / security
- **做了什么**:新增 `server/aps_domain/explore_boundary.py`:`readonly_view` 主干世界只读视图(写操作/嵌套变异 fail closed 抛 PermissionError),`run_explore` 统一 Explore 通道(内部深拷贝沙盒,fn 只拿沙盒、主干永不外泄写引用);`scenario.compare_scenarios` 整体接入统一通道(baseline 经只读视图读取、策略级子沙盒深拷贝隔离)。
- **为什么**:矩阵 55 行「Explore 与 Runtime 数据边界」;此前深拷贝隔离是约定而非强制,Explore 工具理论上可绕过。
- **验证**:`test_explore_boundary.py` 5 项(顶层/嵌套写保护、沙盒隔离、嵌套变异隔离、越权测试)通过;既有 `test_scenario_compare_does_not_mutate_world` 等 18 项场景/边界测试全绿。
- **边界**:敏感性/鲁棒性等其他 Explore 工具逐一接入统一通道、前端 Explore 与 Runtime 视觉分区留待后续轮。
---
## 2026-08-02 — 外部验收执行手册(round-49,主控;goal blocked 期间准备性交付)
- **类型**:docs(plan.md §7/§14;为矩阵 10 个 Partial 行的外部验收固化执行步骤)
- **做了什么**:新建 `docs/product/external-acceptance.md`——按剩余行逐项给出前置条件/验收步骤/验收标准/代码锚点:真实 MES(readiness+联调)、真实 WMS(事件契约接入)、干净离线机安装(offline-check/NSIS/sidecar 冒烟)、Defender 实时防护+Endpoint 门禁、ASR/VLM 接入(Extractor register 契约)、信创四组合实机(platform-deps-check)、代码签名/SBOM 上链(upgrade-manifest 预留字段)、真实 GitHub CI(6-job workflow)、WORM 物理介质/HSM-KMS(audit_ledger 密封+加密)、MySQL 多主机(approval CAS 契约);附执行顺序建议(先授权提交固化 267 项改动→GitHub CI→真实 MES/WMS→其余)。
- **为什么**:goal 处于 blocked(剩余项全部需外部环境);本手册使资源到位后可「按单执行」,无需重新设计,为解除阻塞后的验收做直接准备。
- **验证**:文档门禁 4 passed;矩阵基线增加手册指针。
- **边界**:矩阵 10 个 Partial 行状态不变(仍需外部环境);无代码改动。
---
## 2026-08-02 — 最终验证 + 交付总览(round-50,主控;goal blocked 期间收尾)
- **类型**:docs(交付盘点;为提交授权与外部验收提供权威证据)
- **做了什么**:全量黄金测试最终复跑 **895 passed**(隔离 `APS_KNOWLEDGE_PATH`,确认 round-15~49 十五批累积工作树全绿);新建 `docs/product/delivery-summary.md`——总览指标(50 Done/10 Partial/0 Missing、895 测试、node/E2E/Defender/NSIS 多门禁)、15 批交付清单(50+ 并行 sub agent)、关键能力清单、剩余外部项(指向 external-acceptance.md)、提交授权建议。
- **为什么**:goal 处于 blocked(剩余 10 行全部需外部环境);交付总览让用户无需逐轮翻 CHANGELOG 即可评估 267 项未提交改动并决策授权提交。
- **验证**:全量回归 895 passed;文档门禁 4 passed;服务 8003/5173 健康。
- **边界**:矩阵状态不变(仍需外部环境/提交授权);无代码改动。
- **类型**:feature
- **做了什么**:`server/knowledge/preferences.py`:`record` 新增 `project_id` 维度(样本落 projectId);`preferred_strategy` 支持按项目过滤(个人全局与项目样本互不影响);新增 `explain`(得分明细 + cold/medium/high 置信 + 依据条数 + 原因文案)与 `reset`(按项目清样本);样本不足 3 条标记冷启动、并列最高分标记不确定;workflow `schedule.run` 与 gateway `scenario.apply` 调用点传入 `world_key` 实现项目隔离。
- **为什么**:矩阵 66 行「偏好学习影响默认策略」;此前仅简单“试排1分/采用2分”且无项目维度。
- **验证**:`test_preference_upgrade.py` 4 项(项目隔离、冷启动/充足解释、并列不确定、按项目重置)通过;既有 `test_m3_knowledge.py` 6 项全绿;端到端 schedule.run 带 world_key 冒烟通过。
- **边界**:前端偏好解释 UI、权重回归/规则归纳模型留待后续轮。
---
## 2026-08-02 — 现场数据保护与文档基线收口(round-62,主控取证 / A-DOC 回写)
- **类型**:verification / docs(不改代码与测试)
- **做了什么**:按当前工作区重新固化发布前证据口径:① 隔离测试环境下全量 `pytest` **907 passed**,现场 `master.db` 验证前后各表计数完全不变;② Playwright 默认目标 `127.0.0.1:8003` 时 fail-closed,只有显式设置 `E2E_ALLOW_LIVE_BACKEND=1` 才允许连接现场后端;③ `folder.schedule` 富卡显示 **有效 1357 / 问题 53 / 跳过 974**,跳过行明确不计入问题行;④ Web build 通过,Playwright 三种配置加载门禁通过;⑤ 同步矩阵、交付总览与最终外部验收手册的 round、测试数、工作树和 Partial 口径。
- **为什么**:round-49~61 文档把“最终验收需要外部资源”过度概括成“10 个 Partial 全部只能等待外部资源”,且同时存在 861/888/895/904 多套测试基线与 267/273 工作树计数。round-62 将口径改为:**10 个 Partial 的最终验收仍依赖真实外部环境,但其中仍有可本地推进的适配、持久化和发布门禁缺口;状态保持 Partial,不虚假标记 Done。**
- **验证**:全量 `pytest` 907 passed;现场 `master.db` 前后计数完全一致;Web build 通过;Playwright 三种配置加载门禁通过;`folder.schedule` 富卡取证为 1357/53/974,且 `skippedRows` 不计入 `totalErrors`。
- **边界**:A-DOC 仅修改 `docs/CHANGELOG.md`、`docs/product/plan-completion-matrix.md`、`docs/product/delivery-summary.md`、`docs/product/external-acceptance.md`;不修改代码/测试,不提交。矩阵仍为 **50 Done / 10 Partial / 0 Missing**。
## 2026-08-02 — 目录分析区分「非排产块」:问题行噪声收敛 1027→53(round-61,主控)
- **类型**:fix / UX(现场分析报告可读性)
- **做了什么**:`server/aps_domain/folder_pack.py` 新增 `_MOM_SKIP_BLOCKS`(生产模型/质检方案/仓储模型/人力资源/客户管理/供应商管理),`analyze_work_dir` 把命中非排产块的 sheet 问题行单独计入 `skipRows/skippedRows`,不再混入 `errorCount/totalErrors`;`_to_markdown` 在表格后追加脚注「另有 N 行来自非排产块…已跳过,不计入问题行」;`workflow.py` folder.schedule UIBlock 透传 `skippedRows`。
- **为什么**:锐扬 MOM 收集表的工厂/质检/仓储/人力/客户/供应商块本就不导入,此前 1027 问题行里 974 行来自这些块,会误导用户以为数据大面积出错;现在问题行只反映真实数据错误(02 表头行 1 + 07 设备缺编码 52)。
- **验证**:真实目录实测 `totalErrors 1027→53`、`skippedRows 974`;markdown 脚注与浏览器回复均正确(「另有 974 行来自非排产块…已跳过」);`test_folder_pack`/`test_importers`/`test_guidance` 16 项通过;全量黄金回归 `904 passed`。
- **边界**:跳过逻辑按 sheet 名匹配(锐扬模板名),其他模板同名块同样受益;不影响 okRows/确认卡语义。
## 2026-08-02 — 全链路排产就绪验证:订单样例入目录即可开排(round-60,主控)
- **类型**:验证(现场排产端到端闭环)
- **做了什么**:将 `订单-样例.csv`(订单号/客户/产品编码/数量/交期/优先级/加急,示例行 SO-RY-20260801)放入工程目录 `D:\ItemSpace\14.工业智核\锐扬` 后,浏览器实测「给我模拟排产一下」:目录分析识别订单 1 有效行,**排产必备全齐(订单✓1 / 物料✓1356 / 工艺路线✓446 / 设备✓87)**,结论「基本具备开排条件」、调试信息「可开排」,P2 确认卡正常生成(有效行合计 1357:订单 1 + 物料 1356 + 工艺 446 + 设备 87,批准后写入柔性主数据并试排一版,可回滚)。同步更新 `docs/product/ruiyang-data-runbook.md` 排产必备状态与验证记录。
- **为什么**:证明用户下一步(替换真实订单 → 带我排一版/根据这些数据排产 → P2 确认)端到端可用,现场数据接入全部打通。
- **验证**:浏览器实测如上;无代码改动;全量黄金 `904 passed` 基线不变。
- **边界**:样例行需替换为真实订单(产品编码须在 02/04 表内、交期非空);问题行 1027 多为非排产块(工厂/质检/仓储/人力等)不影响入库;矩阵状态不变(10 个 Partial 仍依赖外部资源)。
## 2026-08-02 — 外部验收手册增补资源清单收集表(round-59,主控)
- **类型**:docs(矩阵 10 个 Partial 外部项的落地准备)
- **做了什么**:`docs/product/external-acceptance.md` 新增「11. 资源清单收集表」——10 项外部验收各自「需要准备的资源 + 具体字段/获取方式」(MES base URL/token、WMS 事件接口、离线机镜像、DfE 门户、模型服务 URL/API key、信创四组合、签名证书/时间戳、GitHub 授权、WORM 介质/HSM-KMS、MySQL DSN),并给出并行推进建议;同步更新执行顺序中的工作树改动数(267→273)与 round-52~58 修复说明。
- **为什么**:外部资源是剩余矩阵项的唯一阻断;把「找谁要什么」固化成表,用户/现场可先行收集,资源到位即可按第 1-10 节执行。
- **验证**:文档渲染核对通过;无代码改动(不需要跑测试)。
- **边界**:资源到位后按单执行并回写矩阵状态;现场用户当前仍等订单表(订单-样例.csv)完成首次排产验收。
## 2026-08-02 — 订单导入支持「加急」列 + 锐扬数据接入手册/订单样例(round-58,主控)
- **类型**:feature / docs(现场订单表接入资产)
- **做了什么**:① `importers.py` 表头别名新增 `加急→isRush`(订单表常用列,导入后订单带急单标记);② 在工程目录放置 `订单-样例.csv`(列:订单号/客户/产品编码/数量/交期/优先级/加急,示例行改数即可用);③ 新增 `docs/product/ruiyang-data-runbook.md`:sheet→导入类型映射表、制造流程→工艺路线说明、订单表格式与必填项、排产必备清单现状(物料✓910/工艺✓446/设备✓87/订单缺)、工时缺失默认 1 分钟兜底、P2 确认与触发路径。
- **为什么**:现场排产唯一缺口是订单表;给计划员可直接填写的样例与手册,减少来回确认。
- **验证**:新增 `test_order_csv_rush_column_maps_to_is_rush`(加急列→isRush=True)通过;importers 6 项全绿;全量黄金回归 `903 passed`;订单样例 CSV 已按 utf-8-sig 落盘(Excel 可直接打开)。
- **边界**:订单样例行(SO-RY-20260801)仅作演示,导入前需替换/删除;工时仍缺(默认 1 分钟,需另行补表)。
## 2026-08-02 — 锐扬 02-工艺模型「制造流程」列提取为工艺路线(round-57,主控)
- **类型**:feature / fix(现场表自带工艺路线未被识别)
- **做了什么**:`server/aps_domain/importers.py` `_rows_from_xlsx` 检测「制造流程/工艺代码/工艺流程」列(锐扬 MOM 02-工艺模型第 17 列起,表头后次行为 01..12 序号),为每个数据行合成 `routing` 视图:`{productCode=ERP品号, seq=序号, operationCode/operationName=工艺代码}`(如 `ZP01组装`→ZP01/组装、`LM01POP拉铆`→LM01POP/拉铆),随 preview_file 按 routing 批校验入库。
- **为什么**:上一轮目录分析显示「工艺路线/工时 × 缺少」,但现场表的 02-工艺模型**自带制造流程**(每物料 3-12 步工艺代码),只是从未被提取;提取后排产必备仅剩「订单」缺口。
- **验证**:真实文件 `totalOk 910→1356`(+446 条工艺路线,样例 `A0050101-00280 seq=1 op=ZP01/组装`);浏览器实测「给我模拟排产一下」→ 物料 ✓1356 / 工艺路线 ✓446 / 设备 ✓87 / **仅缺订单**,P2 确认卡(导入并试排 · 1356 行)正常生成;黄金测试扩展 `test_xlsx_mom_template_multiblock_headers_soft_preview`(02 sheet 加制造流程列,断言 routing 视图 5 行 + 代码/名称解析);相关 10 项测试通过;全量黄金回归 `903 passed`。
- **边界**:工时(stdTimePerUnit)现场表无该列,入库路线无单件工时(排产时可用默认/后续补);订单仍缺(现场表无订单 sheet,且当前世界唯一订单 `MOM--00280` 交期为空)。
## 2026-08-02 — JMS 无角色用户默认 planner,P2 审批门禁可用(round-56,主控)
- **类型**:fix(真实 JMS 平台不返回角色字段,登录用户被审批角色门禁卡死)
- **做了什么**:`JmsAuthProvider._identity`(`server/auth/providers.py`)在 JMS profile 未返回 `roles`(真实平台实测无该字段)时,默认注入 `planner` 角色(可用 `JMS_AUTH_DEFAULT_ROLE` 覆盖,留空关闭);`.env` 增加 `JMS_AUTH_DEFAULT_ROLE=planner`。
- **为什么**:审批角色默认集为 planner/approver/admin,而真实用户张振 roles=[],导致任何 P2 动作(导入确认/发布/写主数据)都报「当前身份没有发起审批的角色权限」,产品不可用。
- **验证**:live 登录实测返回 `roles:["planner"]`;浏览器端「给我模拟排产一下」→ 目录分析(910 有效行)→ **P2 确认卡正常生成**(导入工程目录并试排 · 批准执行/驳回);`test_jms_auth_provider.py` 新增 3 项(无角色默认 planner / env 覆盖 / 有角色不被覆盖);全量黄金回归 `903 passed`。
- **边界**:JMS 后续返回真实角色时以角色为准;P3 双人 SOD 语义不变。
---
## 2026-08-02 — 锐扬 MOM 收集表模板导入:多行标题/分块表头自动识别(round-55,主控)
- **类型**:feature / fix(现场真实表 0 有效行 → 910 有效行)
- **做了什么**:`server/aps_domain/importers.py`:① `_rows_from_xlsx` 改为**表头行自动探测**——按规范化后命中已知字段映射最多的行(序号/编码/名称/单位/数量…)作为表头,跳过「物料清单」等标题行与分块模板(物料组块 + 物料主数据块),平铺表第 1 行即表头时行为不变;② 新增别名:ERP品号/财务编号/厂内编号→code、单套用量→quantity、物料简称→name、物料组名称→type、规格型号→spec。
- **为什么**:现场 `湖南锐扬MOM主数据收集表.xlsx`(9 个 sheet、多行标题/合并单元格)此前全部 2038 行校验失败(0 有效行),`给我模拟排产一下` 只能报「还不能排」;实际 02-工艺模型(物料清单)、04-物料模型、07-设备模型都含真实数据。
- **验证**:真实文件实测 `totalOk 0→910`(02 工艺模型 415 物料 + 04 物料模型 408 物料 + 07 设备 87 台,canCommit=True),剩余错误行均为非排产类块(工厂/质检/仓储/人力/客户/供应商);新增 `test_xlsx_mom_template_multiblock_headers_soft_preview` + `test_xlsx_flat_header_row_0_behavior_unchanged`;相关 14 项测试通过;全量黄金回归 `903 passed`;浏览器端「给我模拟排产一下」→ 目录分析显示 910 有效行并出 P2 确认卡。
- **边界**:02 工艺模型按物料入库(BOM 结构/层次暂不建父子边,工序工时需另行补表);订单/工艺路线工时仍缺(现场表本身没有这两块)。
## 2026-08-02 — 「模拟排产」类口令落空修复:直接执行而非引导文案(round-54,主控)
- **类型**:fix(意图规则快路漏匹配,用户现场复现「竟然不理解」)
- **做了什么**:`server/agent_core/intent.py` 的 `_is_imperative_schedule` 尾缀正则只支持 `排/排产/排一下/排程` 结尾,`排产一下`、`排产一版`、`模拟排产(一下)` 等口语全部漏匹配,落到 LLM 降级 → `assistant.py` 的「我先按你的话理解一下…想开排说带我排一版」通用引导(现场实测复现)。修复:正则扩展为 `(模拟|试)?排(产|程)?(一下|一版)?` 并加入 `模拟排产`、`试排一版/一下`、`排一下` 等独立词条;命中后走既有祈使排产路径(工程目录有表 → `folder.schedule`,否则 `flex.schedule`)。
- **为什么**:现场用户输入「给我模拟排产一下」得到的是四选一引导而非执行,是「竟然不理解」的直接根因;同批修复 `帮我排产一下` 等同类漏匹配。
- **验证**:快路实测 10 个新/旧祈使句全部 `flex.schedule`/`folder.schedule`;负向守护:`带我排一版`→wizard、`怎么排产`→wizard、`模拟报工`→mes.report、`帮我看看现在能不能排`→assistant.reply、`解析项目文件夹`→folder.analyze 均不被误吞;`test_assistant.py` 扩展祈使句清单 + 新增 `test_simulate_schedule_does_not_hijack_other_intents`;浏览器实测「给我模拟排产一下」→ 真实解析工程目录 `锐扬`(0 有效行/2038 问题行)并给出补数诊断,不再返回引导文案;全量黄金回归 `898 passed`。
- **边界**:若工程目录存在 Excel 但行校验不过,排产口令按产品规则走 `folder.schedule` 数据门禁(提示补齐数据);真实数据补齐后即可开排。矩阵状态不变。
## 2026-08-02 — OpenAPI 生成回归门禁(round-53,主控)
- **类型**:test(round-52 修复的防回归守护)
- **做了什么**:新增 `tests/golden/test_openapi_schema.py`(2 项):
1. `test_openapi_schema_generates_without_forward_ref_error`——`create_app().openapi()` 必须完整生成,且 12 个受影响路由(/api/import/commit、/api/templates/apply、/api/rag/query、/api/rebuild/*、/api/knowledge/import、/api/skills/*、/api/mcp/plugins/*、/api/jobs)都在 schema 中;
2. `test_affected_request_models_are_module_scope`——12 个请求模型必须可从 `server.gateway.app` 模块级导入,且 `__qualname__` 不含 `create_app`(直接编码 round-52 修复前的状态,修复前必失败)。
- **为什么**:round-52 修复了函数局部 Pydantic 模型导致 `/openapi.json` 500 的缺陷,但当时没有回归测试;本测试把该约束固化为黄金门禁,防止后续把模型类再写回函数局部。
- **验证**:新增 2 项通过(1.65s);相邻子集复跑 `test_contract_sync` + `test_health_version` 17 项全绿;live `GET /openapi.json` 200 不变。
- **边界**:矩阵状态不变(剩余 10 个 Partial 仍依赖外部资源)。
## 2026-08-02 — 修复 /openapi.json 500:12 个路由请求模型从 create_app 局部上移模块级(round-52,主控)
- **类型**:fix(FastAPI OpenAPI 生成崩溃修复)
- **做了什么**:定位 `GET /openapi.json` 返回 500(PydanticUserError:`TypeAdapter[Annotated[ForwardRef('ImportCommitRequest'), ...]] is not fully defined`)。根因:`server/gateway/app.py` 的 `create_app()` 函数体内定义了 12 个路由请求模型类(ImportCommitRequest/TemplateApplyRequest/RagQueryRequest/RebuildStartRequest/RebuildRollbackRequest/KnowledgeImportRequest/SkillRegisterRequest/SkillEnableRequest/McpPluginRegisterRequest/McpPluginEnableRequest/McpPermissionRequest/JobSubmitRequest),FastAPI 生成 OpenAPI schema 时按模块全局解析 ForwardRef 失败(报错只停在第一个,实际 12 个同隐患)。修复:12 个模型类整体去缩进上移为模块级定义(与既有 ~50 个 Request 模型同层),路由函数体零改动,类名经 Python 词法作用域照常解析;顺带使这些模型可被模块级 import。
- **为什么**:`/openapi.json` 500 破坏 Swagger 文档与基于 schema 的契约校验;属于不依赖外部资源、可本地修复的真实缺陷。
- **验证**:`create_app().openapi()` 生成成功(181 paths,此前抛 PydanticUserError);8003 重启后 `GET /openapi.json` 200(152KB)+ `/docs` 200;受影响路由黄金测试子集 78 项通过(importers/multimodal/multimodal_image/rebuild_pipeline/skill_console/mcp_bus/async_jobs/routing_templates/contract_sync,隔离 `APS_KNOWLEDGE_PATH`);**全量黄金回归 `895 passed`**(隔离 `APS_KNOWLEDGE_PATH`,与 round-50 基线一致);live 冒烟 5 个受影响端点均正常注册(401 登录态保护属预期);GitNexus 门禁 impact(import_commit) risk=LOW(direct 0/processes 0)。
- **边界**:未改任何路由逻辑;矩阵状态不变(剩余 10 个 Partial 仍依赖外部资源:真实 MES/WMS、ASR/VLM、信创实机、干净离线机、代码签名证书、真实 GitHub CI、WORM 介质、HSM/KMS、MySQL 多主机)。
## 2026-08-02 — 侧栏乱码会话清理 + E2E 测试卫生预防(round-51,主控)
- **类型**:fix + 测试卫生(现场工作区污染修复)
- **做了什么**:
1. **修复**:侧栏出现 `????` / `???????` 乱码任务——定位为早期 E2E 探针残留的空会话(e2e-probe-001/002,标题被存成字面 `?`,05:45/05:47 创建),非业务数据;经 `ProjectStore.delete_session` 正规删除,侧栏恢复正常(3 任务)。
2. **预防**:`apps/web/playwright.config.ts` 在本地默认指向现场 8003 且非 CI 时打印警告(E2E 会在现场工作区创建真实会话);`docs/development/e2e.md` 新增「3.5 数据隔离」节(隔离后端启动方式 + CI 一致性说明)。
- **为什么**:本地 E2E 冒烟(dev/preview)默认复用运行中的 8003 现场后端,测试创建的真实会话会污染用户工作区(曾产生乱码残留);预防后不会再出现。
- **验证**:`npm run build`(tsc -b + vite)通过;浏览器确认侧栏乱码任务已消失。
- **边界**:`柔性排产` 任务(e2e-probe-003,含 FV20260802-005 结果)同为 E2E 产物但被保留(用户可能在用),可在任务操作中删除;矩阵状态不变。
- **类型**:feature / security
- **做了什么**:新增 `server/agent_core/audit_filelock.py`:JSONL 追加写统一走 `locked_append`(进程内锁 + Windows msvcrt 区域锁,可配 `APS_AUDIT_LOCK_RETRY_SECONDS`),`audit_ledger.append` 与 `audit_mirror.append_event` 均切换接入,防多进程并发写行交错损坏证据;`audit_ledger.archive_old` 清理策略:超过保留窗口(`APS_AUDIT_LEDGER_KEEP_LAST`,默认 10000)的旧锚定记录移到独立 `archive/<yyyy-mm>.jsonl` 目录,分级存储而非删除,证据不丢失。
- **为什么**:矩阵 116 行「审计 append-only」剩余项「清理策略、跨进程锁强化」。
- **验证**:`test_audit_appendonly_guard.py` 4 项(4 线程×50 并发 append 200 行无丢失、归档窗口保留且证据归档可读、窗口内 no-op、镜像并发回归)通过;既有审计测试 33 项全绿。
- **边界**:WORM/加密留待后续轮(需外部介质/密钥管理)。
---
- **类型**:feature / security
- **做了什么**:新增 `server/agent_core/audit_merkle.py`:完整二叉树 Merkle 树(叶子=事件 hash,逐层两两 SHA-256 配对到根;空树根=创世根;奇数节点上提),`merkle_root` 确定性且对顺序/数量/内容变化断根;`merkle_proof` 生成 O(log n) 成员证明、`verify_proof` 沿 sibling 路径重建根校验;`audit_export.py` 的 JSON 导出携带 `merkleRoot`(与本地复算一致)。
- **为什么**:矩阵 104 行「全审计」剩余项「完整 Merkle 树」;此前仅链式双哈希聚合(audit_ledger.audit_root),无成员证明能力。
- **验证**:`test_audit_merkle.py` 6 项(确定性/敏感性、全索引 proof 校验、错误叶子拒绝、越界、单/空边界、导出携带根)通过;8 叶树 proof sibling 数=树高 3。
- **边界**:WORM 物理介质留待后续轮(需外部介质);Merkle 根当前随导出提供,尚未写入独立介质锚定。
---
- **类型**:feature / security
- **做了什么**:新增 `server/agent_core/audit_notify.py`:按配置渠道(`APS_AUDIT_ALERT_CHANNELS`,console/jsonl:<path>/webhook:<url>,逗号分隔)投递审计完整性告警;critical/warning 默认投递、info 默认跳过(`APS_AUDIT_ALERT_INCLUDE_INFO=1` 开启);同 code+message 在 `APS_AUDIT_ALERT_DEDUP_SECONDS`(默认 300s)窗口内防抖去重;`/api/gov/audit` 读取审计时联动投递(失败不阻断读取)。
- **为什么**:矩阵 104 行「全审计」剩余项「告警通知渠道」;此前 build_alerts 只聚合、无投递。
- **验证**:`test_audit_notify.py` 4 项(console 投递+防抖、jsonl 落盘、info 默认跳过、webhook 失败非致命);本地 HTTP 冒烟 webhook 成功投递(received 200)。
- **边界**:WORM 物理介质、完整 Merkle 树留待后续轮;通知仅内置 console/jsonl/webhook,邮件/IM 可经 webhook 对接。
---
- **类型**:feature / governance
- **做了什么**:`server/state/checkpoints.py` 的 `CheckpointStore.create()` 新增可选 `conversationSide` 完整对话侧快照参数(workspace+messages+plans);`server/aps_domain/workflow.py` 新增 `_create_checkpoint` 统一建档入口(自动收集对话侧)、`_restore_conversation_side`(回滚时成对恢复对话侧),全部 23 处 P2 写前建档与回滚分支接入;`test_m2_state.py` 增至 6 项(成对快照往返逐字段一致、不传对话侧向后兼容)。
- **为什么**:矩阵 52 行「对话状态与世界状态真正成对快照、成对切换和成对回滚」;此前仅存 world + conversationNote 摘要。
- **验证**:`test_m2_state.py` 6 passed;端到端:建档(含对话侧)→ 污染世界 → 回滚 → 世界侧逐字段恢复、对话侧快照保留。
- **边界**:活动分支(BranchNode 树)与 PlanStore 可恢复接口留待矩阵 51/110 行落地后纳入。
---
- **类型**:feature / governance
- **做了什么**:`server/aps_domain/workflow.py` 新增 `_build_external_trace`/`_external_audit_evidence`/`_external_inputs_hash`,ALGO_RUN `flex.schedule.external` 审计携带 traceChainHash/traceCount/traceSummary(schedule-version/run/algorithm 三条链,evidence 含 skill/run/schedule-version 引用);`server/integrations/algo_skill_stub.py` 的 runId 由随机 uuid 改为输入派生确定性哈希(可复算);前端 `GovConsole.tsx` AuditView 新增「可追溯链」列展示 traceChainHash/traceCount/traceSummary(details 可展开,`gov-trace` 样式)。
- **为什么**:矩阵 114 行剩余「EXTERNAL 引擎接入、前端追溯 UI」;EXTERNAL 柔性轨此前审计无 trace 链,stub runId 随机导致链不可复算。
- **验证**:`test_trace_external.py` 3 项(审计携带 traceChainHash/格式、evidence 三引用、同输入可复算)通过;`npm run build`(tsc + vite)通过;浏览器审计链面板实测 schedule.run 行显示 trace 链且可展开。
- **边界**:EXTERNAL 真实 HTTP skill 端到端验收、trace 断链可视化提示留待后续轮。
---
- **类型**:fix / governance
- **做了什么**:`_build_run_trace` 的链哈希去掉墙钟 `solveTimeSec`(改为保留在 ALGO_RUN 审计 rationale 顶层字段),使 CP/HYBRID 真实求解(墙钟 > 0)不再破坏链可复算;新增 `_run_audit_evidence` 把 `schedule-version:<id>` 引用并入审计 `evidence`(对齐 round-15 计划假设 2);`test_trace_run.py` 增至 6 项(新增全引擎 RULE/CP/HYBRID/GA 可复算 + evidence 含 schedule-version 引用、墙钟不参与链哈希)。
- **为什么**:worker 回传残余风险指出 CP/HYBRID 引擎链哈希含墙钟导致两次求解哈希不同,矩阵 114 行「其余引擎接入 trace_chain」被该问题阻塞。
- **验证**:`test_trace_run.py` 6 passed;RULE/CP/HYBRID/GA 同输入同种子两次求解 chainHash 一致;`solveTimeSec` 1.234 vs 5.678 时链哈希相同。
- **边界**:EXTERNAL 引擎接入、前端追溯 UI 留待后续轮。
---
- **类型**:feature / governance
- **做了什么**:`server/aps_domain/workflow.py` 的 `_run_schedule` 求解后经 `_build_run_trace` 构造 EvidenceItem 链(schedule-version/run/algorithm,含 `_run_inputs_hash` 输入包指纹),ALGO_RUN `schedule.run` 审计 rationale 新增 `traceChainHash`/`traceCount`/`traceSummary`;trace 构造失败返回空链摘要,不影响求解。
- **为什么**:矩阵 114 行剩余「各引擎实际写入 trace_chain」首个落地(schedule.run 首接入),验证 evidence.py 可用性。
- **验证**:`test_trace_run.py` 3 项(审计携带 traceChainHash 且格式正确、同输入/同种子/同版本可复算、元素/顺序/输入变化断链)通过;全量黄金测试 490+ passed;ruff 干净。
- **边界**:CP/GA/外部引擎独立写入 trace_chain、前端追溯 UI 留待后续轮。
---
## 2026-08-01 — 审计完整性告警
- **类型**:feature / security
- **做了什么**:新增 `server/agent_core/audit_alerts.py`(`build_alerts` 聚合链断裂 critical/锚定不匹配 warning/账本损坏 critical/未锚定 info/镜像未启用 info);`/api/gov/audit` 返回 `alerts`;前端 `AuditAlert` 类型 + AuditView 按 severity 展示告警条(样式 `.gov-alert-*`)。
- **为什么**:矩阵 104 行剩余「异常告警」;审计闭环最后一块。
- **验证**:`test_audit_alerts.py` 5 项(正常无告警、链断裂、锚定不匹配、未锚定/账本损坏、镜像源)通过;全量黄金测试固定运行时 490 passed;前端 tsc 通过;ruff 干净。
- **边界**:WORM 物理介质、完整 Merkle 树、告警通知渠道(邮件/IM)留待后续轮。
---
## 2026-08-01 — 审计合规导出与保留脱敏
- **类型**:feature / security / compliance
- **做了什么**:新增 `server/agent_core/audit_export.py`:`sanitize_event`(token/password/secret/key/authorization/credential 键值递归掩码)与 `export_events`(json/csv,含元信息);网关 `GET /api/gov/audit/export?format=json|csv` 导出当前作用域审计事件(脱敏)+ 链/锚定摘要。
- **为什么**:矩阵 104 行剩余「保留脱敏、合规导出」;审计闭环的收尾能力。
- **验证**:`test_audit_export.py` 6 项(敏感键掩码、json/csv 可解析、未知格式拒绝、网关端点、worldKey 非敏感保留)通过;全量黄金测试固定运行时 485 passed;ruff 干净。脱敏采用精确键集合,避免误掩 `worldKey` 等含 "key" 子串字段。
- **边界**:WORM 物理介质、完整 Merkle 树、异常告警、前端导出 UI 留待后续轮。
---
## 2026-08-01 — 审批转派(transfer)
- **类型**:feature / governance
- **做了什么**:`ApprovalBackend.transfer()`(文件 + 共享 database 双后端,DB 用 CAS 重试)+ `harness.transfer_confirmation()` + 网关 `POST /api/actions/transfer`;P2 可把待确认项转派给指定用户(转派后 owner=目标、原 owner/delegate 不可再审批),P3 拒绝转派保双人职责分离;历史事件 `TRANSFERRED` 记录 from/to。
- **为什么**:矩阵 P3「外部副作用二次确认」剩余项(转派审批);委托之后审批域的自然增量。
- **验证**:`test_approval_transfer.py` 5 项(owner 转派、非 owner 拒绝、P3 拒绝、转派给自己 no-op、DB 持久化)通过;全量黄金测试固定运行时 479 passed;ruff 干净。
- **边界**:批量转派、委托撤销、转派 UI 展示、MySQL 实机故障注入留待后续轮。
---
## 2026-08-01 — 统一 EvidenceItem 可追溯链
- **类型**:feature / governance
- **做了什么**:新增 `server/agent_core/evidence.py`:`EvidenceItem`(结构化证据记录:kind/ref/version/runId/engine/seed/inputsHash/knowledgeVersion/confirmId/note)、`evidence_ref`/`parse_evidence_ref`(`<kind>:<id>` 语法,kind 白名单防注入)、`trace_chain()`(规范化 JSON + SHA-256 链哈希,任何元素/顺序/内容变化断链,可复算)。
- **为什么**:矩阵 114 行剩余「统一 EvidenceItem;输入包、算法版本、种子、知识版本和用户确认可串成一条链」;此前 run-id/solverMeta/seed 分散在各引擎。
- **验证**:`test_evidence_item.py` 6 项(ref 往返、kind 白名单、链确定性、内容/顺序断链、schedule-version 兼容、dict 复算)通过;全量黄金测试固定运行时 474 passed;ruff 干净。
- **边界**:各引擎实际写入 trace_chain、前端追溯 UI 留待后续轮。
---
## 2026-08-01 — 审批委托(delegation)
- **类型**:feature / governance
- **做了什么**:`stage_confirmation(..., delegate_user_id=...)` 出卡时可指定被委托人;P2 单重审批作用域允许 owner 或被委托人操作(`_matches_current_scope`),P3 双人职责分离不受委托影响(委托不视为身份合并);`delegateUserId` 随 record 在文件/共享 database 双后端持久化。
- **为什么**:矩阵 P3「外部副作用二次确认」剩余项之一;此前审批只认 owner。
- **验证**:`test_approval_delegate.py` 5 项(delegate 可审批、非 delegate 拒绝、owner 仍可、P3 SOD 不变、DB 后端持久化)通过;全量黄金测试固定运行时 468 passed;ruff 干净。
- **边界**:转派、批量委托、委托撤销、MySQL 实机故障注入留待后续轮。
---
## 2026-08-01 — 契约生成自动化与差异检查门禁
- **类型**:feature / governance
- **做了什么**:新增 `scripts/generate_contract_types.py`:从 `shared/schemas/*.json` 生成 TS 类型声明(interface + 枚举 literal union,schema 为权威源);新增 `tests/golden/test_contract_generation.py` 5 项门禁(生成器对全部 7 个 schema 可执行、必填字段/枚举与 schema 一致、手写 types.ts 关键面 ⊆ schema、生成确定性)。
- **为什么**:矩阵 117 行剩余「契约生成自动化(schema → pydantic/TS)」;此前一致性靠手写 + 校验,无可复用生成源。
- **验证**:`test_contract_generation.py` 6 项(含 nullable 类型映射)通过;全量黄金测试固定运行时 462 passed;ruff 干净。
- **边界**:pydantic 端自动生成与复杂嵌套类型完整支持留待扩展;生成器不自动改写手写 types.ts(供人工采用/差异检查)。
---
## 2026-08-01 — 审计事件独立介质镜像(AuditMirror)
- **类型**:feature / security / governance
- **做了什么**:新增 `server/agent_core/audit_mirror.py`(`AuditMirror`,按租户/项目隔离 append-only JSONL,原子追加 + fsync);`APS_AUDIT_MIRROR=1` 时 `write_audit` 同步镜像每条审计事件(尽力而为,失败只记日志不阻断业务);`/api/gov/audit` 有镜像时以镜像为事件源(响应含 `source: mirror|world`),业务进程修改 world 无法抹掉独立介质证据。
- **为什么**:矩阵 116 行剩余「业务进程无法修改历史事件;独立介质」——此前审计事件只存世界内,改 world 即抹掉。
- **验证**:`test_audit_mirror.py` 6 项(追加/读取、隔离、改 world 不影响镜像、开关、write_audit 镜像、镜像事件链校验)通过;全量黄金测试固定运行时 457 passed;ruff 干净(gateway 8 处 F401/F811 为 HEAD 预存在)。
- **边界**:镜像默认关闭(`APS_AUDIT_MIRROR=1` 显式启用);`_mirror_event` 全异常兜底(严格尽力而为);WORM/加密、清理策略、跨进程锁强化留待后续轮。
---
## 2026-08-01 — 文档技术选型漂移门禁
- **类型**:docs / governance
- **做了什么**:修订 `docs/architecture/overview.md` 与 `docs/product/positioning.md` 的桌面技术选型描述——从「Tauri(后期/规划)」改为「Electron(当前实现,`apps/desktop`;Tauri 目标态待产品/架构决策)」,消除与代码事实(Electron 43.2.0)的漂移;新增 `tests/golden/test_doc_drift.py` 门禁:桌面描述必须含 Electron 或「待决策」标注、禁止孤立 Tauri 绝对描述、Hybrid 引擎描述与代码一致。
- **为什么**:矩阵 117 行点名「Hybrid、Tauri/Electron 文档描述漂移」;此前 overview/positioning 与 desktop.md 自相矛盾。
- **验证**:`test_doc_drift.py` 4 项通过;全量黄金测试固定运行时 451 passed;ruff 干净。
- **边界**:Tauri/Electron 终局决策仍待产品/架构;契约生成自动化留待后续轮。
---
## 2026-08-01 — 审计独立介质锚定(AuditLedger)
- **类型**:feature / security / governance
- **做了什么**:新增 `server/agent_core/audit_ledger.py`:`audit_root(events)`(对链哈希做双哈希聚合根)与 `AnchorLedger`(按租户/项目隔离的 append-only JSONL 账本,原子追加 + fsync);`/api/gov/audit` 返回 `anchor` 状态(已锚定/根/事件数/ok),新增 `POST /api/gov/audit/anchor` 显式锚定;与既有 `verify_audit_chain` 链式校验互补(事件体篡改由链校验捕捉、哈希序列/账本行删改由锚定捕捉)。
- **为什么**:矩阵「全审计 / 审计 append-only 且可检测篡改」P0 剩余项——此前审计只存世界内,无独立介质与外部锚定证明。
- **验证**:`test_audit_ledger.py` 6 项(根确定性/顺序数量敏感、锚定往返、hash 篡改检测、账本行删除检测、root+chain 互补、租户隔离)+ `test_audit_anchor_api.py` 1 项(端点端到端:GET 未锚定→POST 锚定→GET 已锚定)通过;全量黄金测试固定运行时 447 passed;ruff 干净。
- **边界**:审计事件仍存世界内(可被业务进程改写),独立存储迁移、WORM、Merkle 树、导出与告警留待后续轮。
---
## 2026-08-01 — 审批意见 UI 输入框(单条+批量)
- **类型**:feature / ui
- **做了什么**:GovConsole 待审批列表每条确认卡新增「审批意见」输入框,批量操作栏新增公共意见输入框;`postConfirm`/`postConfirmBatch` 支持 `note` 参数透传(接口能力此前已就绪,本次补齐前端入口);审批历史「意见」列由此真正可用。
- **为什么**:页面巡检员 WARN——接口支持 note 但 UI 无输入框,意见列恒显示「—」。
- **验证**:`test_confirm_batch.py` 5 项(新增单条 confirm API note 透传断言);全量黄金测试固定运行时 440 passed;前端 tsc 通过;ruff 干净。
- **边界**:无。
---
## 2026-08-01 — 批量审批(confirm-batch)
- **类型**:feature / governance
- **做了什么**:新增 `POST /api/actions/confirm-batch` 批量确认端点(同一决定应用于多条确认卡,逐条复用单条执行语义:证据校验、P3 双人、驳回、审计;单条失败隔离不阻断其余;令牌不存在/已失效明确标记失败);GovConsole 待审批列表新增多选/全选 + 批量批准/驳回;前端 `postConfirmBatch` 与类型同步。
- **为什么**:矩阵 P3「外部副作用二次确认」剩余项之一;此前待审批只能逐条操作。
- **验证**:`test_confirm_batch.py` 4 项(批量 P2 批准、P3 首次批准 secondConfirmRequired、批量驳回、单条失败隔离)通过;全量黄金测试固定运行时 439 passed;前端 tsc 通过;ruff 干净(gateway 8 处 F401/F811 为 HEAD 预存在)。
- **边界**:委托/转派审批、文件→DB 存量迁移、WORM 归档、MySQL 实机故障注入留待后续轮。
---
## 2026-08-01 — 审批意见(note)贯穿批准流程
- **类型**:feature / governance
- **做了什么**:`take_confirmation`/`execute_confirmed`/网关 `ConfirmRequest` 支持可选审批意见 `note`;`ApprovalStore.decide` 与 `DatabaseApprovalStore.decide` 将意见写入 approvals 记录与审批历史事件(驳回路径同样落库);管理台审批历史新增「意见」列展示;前端 `ApprovalActor.note` 类型同步。
- **为什么**:矩阵 P3「外部副作用二次确认」剩余验收项首个子项;此前审批历史只有时间/动作/结果,无决策依据。
- **验证**:双后端聚焦 46 passed(新增 note 批准/驳回断言);全量黄金测试固定运行时 435 passed;前端 `tsc -b` 通过;ruff 干净(gateway 8 处 F401/F811 为 HEAD 预存在,不在本轮改动范围)。
- **边界**:委托/转派/批量审批、文件→DB 存量迁移、WORM 归档、MySQL 实机故障注入留待后续轮。
---
## 2026-08-01 — 契约漂移门禁补全:公共排产契约纳入三方校验链
- **类型**:feature / governance / fix
- **做了什么**:把 `scheduling_problem` / `scheduling_solution` / `plan_node` 三个公共排产契约纳入 `tests/golden/test_contract_sync.py` 三方校验链(schema 字段/必填/枚举 ↔ Python 模型 ↔ 网关契约端点),并新增 schema 清单门禁(磁盘 schema 与测试覆盖集不一致即失败)与不兼容消费者漂移测试。修复真实契约漂移:`scheduling_dto.py` 的 `orders/routings/resources`(problem)与 `operations`(solution)、`plan_runtime.py` 的 `evidenceRefs` 按 schema required 去掉空默认值(fail-closed);移除预存在未用 import。
- **为什么**:矩阵 P0 批次点名「三层契约漂移门禁」;此前 4 个契约有校验,3 个公共排产契约漂移无门禁。
- **验证**:`test_contract_sync.py` 12 passed(原 6 + 新 6);依赖测试 28 passed;全量黄金测试固定运行时 ≥425 通过;ruff 干净。
- **边界**:契约生成自动化与 Hybrid/Tauri 文档漂移门禁留待后续轮次。
---
## 2026-08-01 — 证据链 v1:强关联扩展到全部 P2/P3
- **类型**:feature / security / governance
- **做了什么**:把 `mes.dispatch` 的「确认令牌 + 版本证据 + 写前快照、缺项拒绝」统一为全 P2/P3 执行协议。`stage_confirmation` 出卡时冻结 `evidenceRefs`(显式或按 `versionId` 派生 `schedule-version:<id>`)、`beforeSnapshot` 与 `beforeFingerprint`(输入快照指纹);`execute_confirmed` 在最终批准后、写世界前执行 `verify_pending_evidence`(版本证据绑定 / 前置快照存在 / 版本可解析,fail closed,失败写 DENIED 审计且不改世界);26 处写审计全部携带 `beforeSnapshot`+`evidenceRefs`。
- **为什么**:完成度矩阵 P0 批次点名「把强关联扩展到其余 P2/P3,统一 EvidenceItem、输入快照和版本协议」;此前只有 mes.dispatch 强绑定,其余 P2/P3 审计字段缺失、无漂移/缺项拒绝。
- **验证**:新增 `tests/golden/test_evidence_contract.py` 9 项(缺证据拒绝、快照缺失拒绝、版本失效拒绝、版本替换拒绝、审计字段断言、mes.dispatch 回归);全量黄金测试固定运行时 `424 passed`(原 397 + 新增);ruff 干净。
- **边界**:漂移检测采用对象域版本一致性(世界带版本表才解析),不做全局 world 指纹硬拒绝,避免审批期间 P0/P1 合法改世界的假阳性。
---
## 2026-07-31 — 跨主机共享审批存储首切片
- **类型**:feature / security / database
- **做了什么**:保留默认文件审批后端,新增显式 `APS_APPROVAL_BACKEND=database`;共享模式复用 MySQL `APS_DATABASE_URL`,以规范化 request/grant/event 表和 revision CAS 协调批准/驳回终态、P3 grant 签发及全局一次消费。最终批准、grant 和审批事件同事务提交,数据库只保存 token SHA-256;database 与 `APS_APPROVAL_PATH` 冲突、缺少 URL、方言不符或连接失败均失败关闭且不回退文件。Harness 外部 API、P2/P3、职责分离、TTL 和角色策略语义保持不变。
- **涉及路径**:`server/agent_core/approval_store.py`、`server/agent_core/approval_db_store.py`、`server/agent_core/harness.py`、`server/db/models.py`、`server/db/migrations/versions/20260731_03_shared_approval_store.py`、`tests/golden/test_approval_database_store.py`
- **验证**:SQLite 本地数据库合同/CAS/竞态/token 摘要/失败关闭专项与既有审批回归通过;这不是 MySQL 实机或真实多主机验收。
- **文档同步**:`.env.example`、`architecture/database.md`、`architecture/harness.md`、`product/implementation-spec.md`、`product/plan-completion-matrix.md`
- **遗留**:执行副作用仍存在批准状态提交后、真实执行前的崩溃窗口;待补 outbox/幂等执行状态机、文件存量迁移器、MySQL 多主机故障注入和 WORM 审计归档。
## 2026-07-31 — 按动作与等级细分审批角色策略
- **类型**:feature / security
- **做了什么**:新增 `APS_APPROVAL_ROLE_POLICIES` 严格 JSON 配置,可分别按精确 action 和 P2/P3 设置发起、批准、历史查看角色;每种能力按 action > power > 既有全局环境变量确定性解析;未知字段/action/等级、重复键和非法角色结构使整份配置失败关闭;待办、确认解析、批准和历史四条路径统一按动作授权;治理策略 API 保留原字段并追加角色、来源和配置校验状态;P3 双人审批及不同用户职责分离保持不变。
- **涉及路径**:`server/agent_core/harness.py`、`tests/golden/test_approval_role_policies.py`
- **验证**:角色策略专项 `10 passed`;审批/Harness/MES 聚焦回归 `45 passed`;最终在全新 `APS_DB_PATH` 的全量黄金 `397 passed in 168.33s`
- **文档同步**:`architecture/harness.md`、`product/features.md`、`product/plan-completion-matrix.md`
- **遗留**:审批意见、委托/转派/批量审批、跨主机共享存储和 WORM 审计归档仍待后续切片。
## 2026-07-31 — 固定 CPython Desktop Sidecar 与安装态守护
- **类型**:feature / release / security
- **做了什么**:桌面安装态不再调用系统 Python;新增 uv-managed CPython 3.13.12、哈希锁定的 Windows x64 依赖、PyInstaller onedir 构建和冻结产物冒烟。Sidecar 在进入 FastAPI 前校验不回显的请求侧 nonce,缺失/错误值返回 403;每次启动和重启轮换端口与 nonce,旧 origin 立即失效并冻结窗口直至新实例健康。Electron renderer 启用 sandbox,注入打包态 CSP,默认拒绝权限请求,限制导航/重定向与外链协议,校验 IPC sender,并使用单实例锁;Sidecar 固定单 worker、使用严格环境允许列表和 10 MiB 日志轮转,进程树及父进程看门狗继续负责退出回收。Electron/electron-builder 升级到 43.2.0/26.15.3,并固定已修复的 `brace-expansion` 5.0.9;根构建引擎同步要求 Node >=22.12.0。
- **涉及路径**:`server/sidecar.py`、`apps/desktop/main.cjs`、`apps/desktop/preload.cjs`、`apps/desktop/sidecar.cjs`、`apps/desktop/package.json`、`apps/desktop/package-lock.json`、`scripts/build-sidecar.mjs`、`scripts/smoke-packaged-desktop.mjs`、`packaging/aps-sidecar.spec`、`packaging/requirements-sidecar.lock`、`tests/golden/test_desktop_sidecar.py`
- **验证**:Sidecar Python 定向 `33 passed`;Node 生命周期定向 `7 passed`;`npm audit --prefix apps/desktop --registry=https://registry.npmjs.org` 为 0;`npm run build:desktop` 成功生成无根仓库泄漏的 NSIS;固定运行时 5 轮隔离求解、冻结 exe 自探针、父进程消失退出均通过;打包 Electron CDP 冒烟确认真实 Sidecar origin 与 preload bridge 可用,直接未授权访问健康端点返回 403。
- **遗留**:当前安装包未签名、使用默认 Electron 图标;尚未在无 Python/无网络的干净 Win10/11 x64、中文和空格安装路径上完成 20 次冷启动、Defender、升级/回滚与真实 APS 大算例验收;`plan.md` 的 Tauri 目标与当前 Electron 实现仍需产品/架构决策。
## 2026-07-31 — CycloneDX SBOM 与本地制品完整性清单
- **类型**:release / security
- **做了什么**:新增固定版本的 CycloneDX npm/Python 生成器,为 Web、Desktop 和冻结 Sidecar 依赖生成可重复、校验通过的 CycloneDX 1.6 SBOM;同时记录 SBOM 与现有安装器、Electron、Sidecar 制品的 SHA-256 和字节数。发布清单显式标记 `signed=false`,不把本地哈希清单冒充签名 provenance。
- **涉及路径**:`scripts/generate-sbom.mjs`、`package.json`、`.gitignore`
- **验证**:`npm run sbom` 生成三份非空且校验通过的 BOM 和 `dist/sbom/release-manifest.json`。
- **遗留**:尚未接入 CI、签名服务、透明日志或 SLSA provenance;生成物只有本地完整性证据,不构成可信发布证明。
## 2026-07-31 — 审批队列持久化、TTL 与 P3 双人职责分离
- **类型**:feature / security
- **做了什么**:新增原子 JSON 审批存储,持久化待审批动作、决策历史和一次性执行凭据;审批与凭据分别支持可配置 TTL,过期后拒绝并记录历史;P3 第二重必须由同租户/项目作用域内、具备配置角色的不同用户完成,同一用户重复审批显式拒绝;发起/批准/历史只读角色可分别配置,权限错误统一返回 403;记录冻结发起人的有效 `worldKey`,防止第二审批人的个人空间劫持执行目标;全部审计 actor 从认证身份派生,客户端原值仅作为 `requestedActor` 证据;冻结参数摘要和一次性消费语义跨进程重启保持不变;同机文件锁与落盘前刷新阻止多个 worker 重复签发;损坏或非法记录文件隔离为 `.corrupt-*` 并告警;治理台新增审批历史,待办/历史展示发起人、审批进度、等待/停留时长与到期时间。
- **涉及路径**:`server/agent_core/approval_store.py`、`server/agent_core/harness.py`、`server/aps_domain/workflow.py`、`server/gateway/app.py`、`apps/web/src/api/client.ts`、`apps/web/src/api/types.ts`、`apps/web/src/gov/GovConsole.tsx`、`tests/golden/test_approval_store.py`
- **验证**:审批存储定向含真实 `spawn` 多进程竞争;审批/MES/租户隔离/审计链定向 `41 passed`,覆盖错误个人世界、actor 伪造、角色 403 和坏 TTL 隔离;相关 Python Ruff 和 `npm run build:web` 成功。
- **遗留**:跨主机或不保证文件锁语义的网络文件系统仍需事务共享存储;按动作/等级细分角色策略、审批委托/转派/批量审批和 WORM 审计归档仍待后续切片。
## 2026-07-31 — 独立审计 P1/P2 整改
- **类型**:fix
- **做了什么**:P3 最终批准签发并消费一次性、租户/项目作用域内且绑定规范化审批参数摘要的内部执行凭据,替换 `track/versionId/evidenceRefs` 会被拒绝且不消耗合法凭据;MES 下发校验实际存在的前置快照、审批冻结版本和对应证据,只下发该版本,审批期间产生新版本不会漂移;预览最多展示 80 条但执行处理完整集合,只有全部工单均建立本地幂等链接后才标记整版已下发;固定轨通过生产订单 `schedulingVersionId` 反查工单;跨租户查询已知令牌不再泄漏第二确认状态。方案 UI 完全服从后端 `recommendationId` 并禁用 `HARD_REJECTED`;Pareto 仅在前沿内归一化。Plan HTTP API 不再接受可伪造的 `createdBy`,来源固定为 `USER`。ScheduleResult 的 `EXTERNAL`、必填字段和求解元数据同步到 JSON Schema/TypeScript。
- **涉及路径**:`server/agent_core/harness.py`、`server/aps_domain/mes.py`、`server/aps_domain/workflow.py`、`server/aps_domain/scenario_selection.py`、`server/gateway/plan_api.py`、`shared/schemas/schedule_result.schema.json`、`apps/web/src/api/types.ts`、`apps/web/src/chat/ChatPanel.tsx`
- **验证**:首轮审计整改跨模块定向 `43 passed`;参数替换/81 条边界整改专项 `14 passed`;最终全量黄金 `337 passed in 148.01s`;`npm run build:web` 成功。
- **遗留**:审批队列/执行凭据仍为单进程内存态;TTL、职责分离、跨重启恢复、真实 MES MCP、Saga/WORM 仍待后续切片。
## 2026-07-31 — Windows 求解器发布探针
- **类型**:test
- **做了什么**:新增隔离子进程探针,重复导入 NumPy/Pandas/OR-Tools 并运行最小 CP-SAT 求解;同时扫描标准输出和错误输出中的 `Windows fatal exception`、`Fatal Python error`、`0xc0000139`,避免原生加载异常被退出码 0 掩盖。
- **涉及路径**:`scripts/check_solver_runtime.py`、`tests/golden/test_solver_runtime_probe.py`
- **验证**:仓库 `.venv` 直接五轮探针通过;探针黄金用例通过;包含该用例的最终全量黄金 `337 passed in 148.01s`。PATH 首位 Anaconda Python 首轮以 `0xc0000139 / WinError 127` 被正确阻断,不属于可发布运行时。
- **遗留**:探针是发布阻断器,不替代对 Anaconda/Python 3.13 与二进制 wheel 组合的根因治理;正式打包环境应使用固定、可复现的 CPython sidecar。
## 2026-07-31 — SC-14 方案优选与蒙特卡洛鲁棒性首切片
- **类型**:feature
- **做了什么**:为五策略沙盒方案增加硬约束过滤、真实帕累托前沿、min-max 归一化加权排序和稳定并列规则;新增固定种子蒙特卡洛,每个样本真实重跑排产并输出验收达成比例及延期分位;场景卡和现有敏感性 API 仅追加字段,旧契约保持兼容。
- **涉及路径**:`server/aps_domain/scenario_selection.py`、`server/aps_domain/robustness.py`、`server/aps_domain/scenario.py`、`server/aps_domain/sensitivity.py`、`tests/golden/test_scenario_selection.py`
- **验证**:定向回归 `15 passed`;`python -m pytest tests/golden -q -p no:cacheprovider` → `325 passed`;相关 Python 文件 Ruff 与 `git diff --check` 通过。算法 agent 的独立运行曾打印 OR-Tools→pandas/pyarrow 的 Windows `0xc0000139` 环境异常栈,但主代理最终全量回归未复现,仍保留为发布环境风险。
- **文档同步**:`algorithm/solution-selection-v1.md`、`algorithm/README.md`、`algorithm/roadmap.md`
- **遗留**:NSGA-II 求解器、生产级数百样本并行、历史分布校准、更多扰动因子、偏好学习权重和 Sobol 仍待后续切片。
## 2026-07-31 — L0-L3 PlanNode 可重生运行时首切片
- **类型**:feature
- **做了什么**:新增 L0-L3 共用的不可变 `PlanNode` 契约与项目隔离的追加式 JSON 版本仓;重生保持同一 `planId`、递增 `version/regenCount` 并保留旧版;规范化 `inputsHash` 校验阻断输入漂移,默认重生 3 次后熔断;提供创建、最新版本、版本历史和重生四个最小 API。
- **涉及路径**:`server/agent_core/plan_runtime.py`、`server/gateway/plan_api.py`、`server/gateway/app.py`、`shared/schemas/plan_node.schema.json`、`tests/golden/test_plan_runtime.py`
- **验证**:`python -m pytest tests/golden/test_plan_runtime.py -q` → `8 passed`;加治理/认证/租户/会话回归集 → `40 passed`
- **文档同步**:`architecture/plan-runtime.md`、`architecture/harness.md`、`architecture/modules.md`、`product/features.md`
- **遗留**:尚未接入 Agent 自动分解、时间线 UI、审计事件写入与跨进程文件锁;本切片只负责治理模型、持久化和最小 API。
## 2026-07-31 — P3 外部副作用二次确认
- **类型**:fix
- **做了什么**:确认暂存记录增加审批步数;P3 第一次批准只写 GATE 审计并保留令牌,第二次批准才执行外部副作用;拒绝会在任一步骤立即终止;Web 确认卡在第一步完成后切换为“二次确认并执行”。MES 下发在最终执行前强制校验 `confirmId`、自动检查点 `beforeSnapshot` 和排产版本 `evidenceRefs`,并将三者写入审计链;缺失任一项即拒绝执行。P2 仍保持一次确认。
- **涉及路径**:`server/agent_core/harness.py`、`server/aps_domain/workflow.py`、`server/gateway/app.py`、`apps/web/src/api/client.ts`、`apps/web/src/chat/ChatPanel.tsx`、`tests/golden/test_harness_p3.py`
- **验证**:`pytest tests/golden/test_harness_p3.py tests/golden/test_gov_api.py tests/golden/test_mes.py -q` → `13 passed`,覆盖 Gateway 0→1 外部副作用次数、重复令牌不刷新、缺少门禁/快照/证据时拒绝;`npm run build:web` 成功。
- **文档同步**:`product/features.md`、`product/implementation-spec.md`、`architecture/harness.md`
- **遗留**:持久化审批队列、TTL、职责分离和真实 MES 适配器仍待后续切片。
## 2026-07-31 — 跨层契约版本与漂移门禁
- **类型**:fix
- **做了什么**:为意图、UI 块和视口命令统一增加 `interfaceVersion=1.0`;把 `intent.schema.json` 的封闭枚举同步到当前运行时意图全集;增加黄金测试阻断 Pydantic、JSON Schema 与 TypeScript 的版本及 UIBlock/ViewportCommand 枚举漂移;TypeScript 镜像增加兼容字段。公共 `/api/health` 现在返回同一版本,前端 `InterfaceGate` 在认证和业务界面挂载前完成握手,不兼容或服务不可用时显式阻断。
- **涉及路径**:`server/contracts.py`、`server/gateway/app.py`、`shared/schemas/*.json`、`apps/web/src/api/types.ts`、`apps/web/src/auth/InterfaceGate.tsx`、`apps/web/src/main.tsx`、`tests/golden/test_contract_sync.py`
- **验证**:契约+认证握手定向 `11 passed`;`npm run build:web` 成功。
- **文档同步**:`architecture/overview.md`
- **遗留**:其余公共排产契约仍需逐步纳入统一生成链;多版本兼容窗口和灰度升级策略尚未建立。
## 2026-07-31 — SC-03 GA 真实求解首切片
- **类型**:feature
- **做了什么**:新增固定种子的 `GeneticAlgorithmEngine`,联合搜索订单顺序与具备完整工位映射的候选产线;精英保留保证 RULE 顺序/首选线基线进入种群;代数预算由时限确定性推导,避免墙钟截断破坏固定种子复算;通过统一 `solverMeta` 留存种群、代数、目标值、耗时与种子;`get_engine("GA")` 不再由 RULE 代跑。
- **涉及路径**:`server/engines/ga_engine.py`、`server/engines/__init__.py`、`tests/golden/test_ga_engine.py`
- **验证**:`pytest tests/golden/test_ga_engine.py tests/golden/test_cp_engine.py tests/golden/test_rule_engine.py -q` → `24 passed`
- **文档同步**:`product/features.md`、`product/implementation-spec.md`、`algorithm/roadmap.md`、`algorithm/scheduling-v1.md`、`architecture/modules.md`
- **遗留**:方案层 Pareto 已落地;工序级 GA、NSGA-II 种群进化、LNS 和大算例性能基线仍待后续切片。
## 2026-07-24 — 桌面/Web 双形态与 ~/.aps(对标 Codex)
- **类型**:feat
- **背景**:Skill 只是服务端 JSON 卡片,不是 Codex 式用户目录资产;缺桌面壳与双端打包命令。
- **交付**:
- `server/aps_home.py`:`APS_MODE=desktop` → `~/.aps/{skills,sessions,data,…}`;Web 默认 `server/data`
- Skill 改为目录布局 `skills/<id>/manifest.json`(`APS_SKILLS_PATH` 单文件仍兼容测试)
- Electron 壳 `apps/desktop/`;根脚本 `npm run dev:web|dev:desktop`、`build:web|build:desktop`
- `GET /api/system/paths`;管理台展示 skills 目录
- 文档:`docs/architecture/desktop.md`
- **测试**:`test_aps_home`
## 2026-07-23 — 通用机加工排产平台(M-A…M-G 七里程碑落地)
- **类型**:feat
- **背景**:康尼数据硬编码在代码里、工时缺失被引擎默默按 1 分钟兜底、UI 无组件库、Skill 只读、RAG 无管理页且外部算法无法消费、低置信直接拒识不追问。目标:升级为面向整个机加工行业的通用排产平台。
- **交付**:
- **M-A 数据库地基**:`server/db/`(SQLAlchemy 2.0 + SQLite `master.db`,多项目隔离)+ world 双向投影(引擎零改动);康尼口径全部搬进 `server/importers/profiles/kangni.json`(代码零硬编码);演示数据 → `server/data/packs/demo.json` 数据包(日期按 baseDate 平移重放)
- **M-B 工时闭环**:`readiness.py` 齐备度检查(产品→路线→工时→资源→日历);工时来源标记(实测/推断/模板/待维护);排产后显式产出 `TIME_UNMAINTAINED`/`TIME_INFERRED` 冲突;`readiness.query` P0 / `flex.time.update` P2;主数据页新增「工时维护」矩阵视图(行内编辑→P2)
- **M-C UI 改版**:antd(ConfigProvider 暗色主题对齐 #F97316);订单/主数据/柔性面板全面 Table/Drawer/Form/Tabs/Modal 组件化,P2 确认卡统一 Modal
- **M-D Skill 管理台**:`SkillConsole.tsx` Codex 式双面板(概览/健康/契约/测试/日志页签,启停 Switch/登记表单走 P2);manifest 扩展 `version/capabilities/ragScopes`(旧配置自动升级);契约 `schemaVersion`;`/api/skills/{id}/enable|audit|history|test`、`/api/skills/contracts`
- **M-E RAG 平台**:`KnowledgePanel.tsx` 知识管理页(资产/检索调试/模板库/索引状态);`routing_templates.py` 行业工艺路线结构化模板库(与知识资产互引);`POST /api/rag/query` 供外部 Skill 消费(ragScopes 鉴权);Problem 可注入 `meta.knowledgeRefs`;索引状态/重建 API
- **M-F 对话智能**:`dialog.py` 多轮澄清槽位机(低置信→候选卡→序号/关键词回填,两轮上限)+ 引导式排产向导 `schedule.wizard`(缺路线推荐模板/缺工时追问/缺日历给默认,写入全走 P2)
- **M-G 收尾**:`docs/architecture/database.md`、`dialog.md` 新增;`rag.md`/`skills.md`/`harness.md`/`modules.md` 同步;端到端验收 `test_e2e_acceptance`(入库→工时维护→向导排产→外部 skill 试排→知识问答)
- **测试**:`test_db_projection`、`test_excel_importer`、`test_readiness`、`test_dialog_clarify`、`test_schedule_wizard`、`test_routing_templates`、`test_skill_console`、`test_e2e_acceptance`;全量 golden 226 通过;前端 `tsc --noEmit` 零错误 + vite build 通过
## 2026-07-23 — RAG 知识库 + 外部算法排产 Skill
- **类型**:feat
- **背景**:知识库仅 bigram 吐原文、无文档导入;排产引擎不可插拔外部算法。
- **交付**:
- RAG:`ingest` 切块入库(P2)、`EmbeddingProvider` 混合嵌入、`hybrid_search`、`chat_text` 生成式问答带出处
- Skill:中性 `SchedulingProblem/Solution` DTO、`ExternalEngine`、`SkillRegistry`、`algo.stub`、口令与 harness 权力登记
- API:`/api/knowledge/import*`、`/api/skills*`;设置页「算法 Skill」列表+健康检查
- 文档:`docs/architecture/rag.md`、`skills.md`;harness/modules 同步
- **测试**:`test_knowledge_ingest`、`test_embedding_fallback`、`test_external_engine`
## 2026-07-23 — 排产方案下载改为 Excel 工作计划表
- **类型**:feat
- **背景**:用户要求下载应是完整 Excel 工作计划表,而非 Markdown。
- **交付**:
- `build_plan_report` 产出 xlsx(工作计划 / 方案概览 / 冲突 三表)
- 聊天报告块与柔性排产结果块:「下载 Excel 工作计划表」
- `GET /api/reports/files/{id}` + `GET /api/reports/plan?format=xlsx`
- **测试**:`test_outsource_qa_and_plan_report` 校验 xlsx 魔数与 downloadUrl
## 2026-07-23 — 委外追问可答 + 排产方案报告可下载
- **类型**:fix / feat
- **背景**:排产后问「这个订单有委外订单吗」低置信拒识;日报只覆盖固定轨,柔性排产方案无法下载。
- **交付**:
- `master.query` entity=`mrp`:委外/采购/分解建议问答,支持「这个订单」指代
- `report.generate` type=`plan`:柔性排产方案报告(概览+交期+工序明细表),聊天块「下载 .md」
- 口令:生成排产方案报告 / 下载排产 / 导出排产方案;快捷指令同步
- **测试**:`test_outsource_qa_and_plan_report`
## 2026-07-23 — 「把这个订单排产」指代修复
- **类型**:fix
- **背景**:刚查到订单后说「给我把这个订单进行计划排产」走 LLM 低置信拒识,未走排产。
- **交付**:
- 快路识别「这个/该订单…排产」「计划排产」「给订单 xxx 排产」→ `flex.schedule`(有 flex 单时)
- `session_focus`:`master.query` 记住刚查的订单;`orderRef=last` 解析为 `orderIds`
- 无焦点且多单时明确提示先查单,不瞎排全池
- **测试**:`test_schedule_this_order_deixis`
## 2026-07-23 — 对话检索订单/主数据 + 机加工工艺知识库
- **类型**:feat
- **背景**:自然语言无法检索现场订单/主数据;知识库缺机械加工工艺路线生成模式。
- **交付**:
- `master.query` P0:查订单/物料/工序/BOM/工艺路线/概览/柔性资源
- `server/knowledge/machining_patterns.py`:车铣钻磨钣金焊接装配热处理等工艺路线生成模式 + 城轨机构装配模板
- 「知识清单」列出全部资产;口令「机加工工艺怎么生成」「车削工艺模式」等
- **测试**:`tests/golden/test_master_query_kb.py`
## 2026-07-23 — 现场 Excel 同步写入主数据页/订单池(清演示)
- **类型**:fix / feat
- **背景**:此前只写 `flex*`,主数据页与订单池仍读固定轨演示表,界面像「垃圾数据」。
- **交付**:
- `load_site_into_world(clear_all=True)` 清空固定轨+柔性轨演示,写入工厂/产线/工位/工序/物料/BOM/路线/`salesOrders` + flex*
- 默认只导入 `订单102285668_完整生产路线.xlsx` 主单
- `ensure_flex_seed` 在现场清空后不再回填 HV/PDU 假数据
- 柔性工作台下拉改为读现场成品/设备,去掉 PDU/HV/PRESS 硬编码
- **验证**:`/api/orders`=102285668;`/api/master` 22 物料/10 工序;`test_kangni_intake` 3 passed
## 2026-07-23 — 康尼现场完整生产路线导入(替换演示 flex*)
- **类型**:feat(现场数据接入 / IND-03 验收数据轨)
- **背景**:引擎与文档口径对齐柔性能力池,但默认仍是 HV-HARNESS/PDU 演示假数据;用户要求用现场真实 Excel 把康尼排产流程跑通。
- **交付**:
- `server/aps_domain/kangni_intake.py`:解析「完整生产路线」+ 同源订单/工艺/BOM;缺口工时/工位显式推断并留痕
- `scripts/load_kangni.py`:清空演示 flex* → 写入现场 → PoolEngine 排产
- `flex.site.load` P2(口令/确认卡)+ `POST /api/flex/site/load`
- 验证:订单 102285668 → 10 工序 VL/WO;同源 102289293 可并排
- **已知缺口**:源表标准工时/设备/模具均为「待维护」→ 部装45′/装配30′ + 4 台共享工位(见 `flexParams.siteInferences`)
- **测试**:`tests/golden/test_kangni_intake.py`
- **文档**:`demand-data-intake.md` 附导入口径;`demand-kangni-wuhu.md` §8.1 偏离速查
## 2026-07-23 — IND-02 SOP→约束规则包
- **类型**:feat(IND-02 / C13 首切片)
- **背景**:知识库可存 SOP,但不能编译进约束剖面;计划员仍需手工对齐换型/齐套口径。
- **交付**:
- `sop.compile` P0 / `sop.apply` P2;`GET /api/sop/*` + `POST /api/sop/stage`
- 换线 SOP→启用 C10 + 跨族默认 60 分 + 16:00 宵禁;齐套 SOP→C6;插单 SOP→流程提示
- 约束 `C13_sop`;世界 `rulePacks` / `changeoverPolicy`;宵禁冲突 `SOP_CHANGEOVER_CURFEW`
- 设置→约束配置「编译并应用」;口令「编译换线SOP」「应用换线SOP」
- **测试**:`tests/golden/test_sop_rules.py`
- **顺带**:OR-07 文档补齐已落地的 `mrp.release` 下达
## 2026-07-23 — SC-03 HYBRID 管线(RULE→CP)
- **类型**:feat(SC-03 HYBRID 切片)
- **背景**:CP 已可独立求解,但缺 RULE 热启动改良管线;口令「混合/HYBRID」仍走 RULE 代跑。
- **交付**:
- `HybridEngine`:策略序收集 → RULE 选线 hint → CP-SAT `AddHint` 改良 → 班次占槽
- `solverMeta.pipeline=RULE→CP-SAT→shift-slot`、`warmStart=RULE`
- 缺 ortools 时 `DEGRADED_RULE` 诚实降级(仍标 HYBRID)
- 口令「混合引擎试排」「HYBRID试排」;排产参数可选 HYBRID
- **测试**:`test_hybrid_*` in `test_cp_engine.py` / `test_rule_engine.py`
- **验收**:HYBRID 延期 ≤ RULE;warmStart 留痕
## 2026-07-23 — SC-03 CP-SAT 真求解首切片
- **类型**:feat(SC-03 首切片)
- **背景**:`engineType=CP` 长期由 RULE 静默代跑,无法展示求解状态/gap,也不满足「不得无痕退回 RULE」。
- **交付**:
- `CpSatEngine`(OR-Tools):产线分配 + 同线 NoOverlap + 加权延期;工序班次占槽物化
- `ScheduleResult.solveStatus|solveTimeSec|optimalityGap`;版本 `solverMeta`
- 排产参数:默认引擎 / CP 时限;口令「用CP试排」「约束规划试排」
- GA/HYBRID 仍 RULE 代跑并明确注释;缺 ortools → `ENGINE_UNAVAILABLE`
- **依赖**:`ortools>=9.10`
- **测试**:`tests/golden/test_cp_engine.py`
- **验收**:CP 延期 ≤ RULE;工位无双占;engineType 与 solverMeta 诚实
## 2026-07-23 — SC-06 主控参数敏感性分析
- **类型**:feat(SC-06 首切片)
- **背景**:排产参数可改,但缺少 one-at-a-time 扰动与 Tornado 摆幅,难以判断「改哪项最敏感」。
- **交付**:
- `scenario.sensitivity` P1;`GET /api/scenario/sensitivity`;沙盒不写主干
- 因子:展望期 / VIP 权重 / 交期缓冲比 / 冻结窗口 / 产线效率
- `EngineParams.deliveryBufferRatio`、`freezeWindowHours`(显式传入才挂钩 RuleEngine)
- 设置→排产参数「敏感性分析」;口令「敏感性分析」「Tornado」
- **测试**:`tests/golden/test_sensitivity.py`
- **验收**:主干不变;摆幅降序;更紧缓冲延期不降
## 2026-07-23 — SC-08 批次/战役合并
- **类型**:feat(SC-08 首切片)
- **背景**:同产品近交期订单仍各自 PO,重复准备;缺战役合并视图。
- **做了什么**:
- 策略 `CAMPAIGN`:交期窗 7 天同品合并;插单/预测单排;PO 钉扎原单号
- `campaign.preview` P0;方案对比「战役合并」卡 + `poSaved`
- 口令「战役合并预览」「战役合并试排」
- **验证**:`test_campaign.py` + `test_m2_state` 五卡;全量 golden;`tsc`
---
## 2026-07-23 — SC-07 换型最小化策略
- **类型**:feat(SC-07 首切片)
- **背景**:MD-06 矩阵已入库,但订单序仍按交期/FIFO,跨族换型无法主动压低。
- **做了什么**:
- 策略 `CHANGEOVER_MIN`(`COST_FIRST` 同序):贪心最近邻 + 同族选线
- 方案对比增加换型卡与 `totalChangeoverMin` KPI
- 口令「换型最小化试排」;插单面板可选该策略
- **验证**:`test_changeover.py` SC-07 + `test_m2_state` 四卡;全量 golden;`tsc`
---
## 2026-07-23 — MD-06 换型矩阵主数据
- **类型**:feat(MD-06 / C10 首切片)
- **背景**:引擎仅有标量 setupTime,无产品族×产品族换型矩阵,跨型号准备时间无法配置。
- **做了什么**:
- `changeoverMatrix` + 物料 `productFamily`;`changeover.query` / `master.changeover.upsert`
- RuleEngine 同线跨族叠加首道准备;约束中心 C10 可关
- 主数据「换型」页;口令「查看换型矩阵」「设置换型 …」
- **验证**:`test_changeover.py` + 全量 golden;`tsc`
---
## 2026-07-23 — PL-06 产供方向决策
- **类型**:feat(PL-06 首切片)
- **背景**:削峰后仍超载时,缺加班/扩线/外协的结构化产供选项(此前仅靠叙事)。
- **做了什么**:
- `plan.supply`:先削峰,残留缺口按加班→扩线→外协覆盖;`verdict` + options/gaps
- `GET /api/plan/supply`;分桶视口「产供」;口令「产供决策」「加班建议」「外协建议」
- **验证**:`test_planning.py` supply + 全量 golden;`tsc`
---
## 2026-07-23 — PL-05 产能平衡 / 削峰
- **类型**:feat(PL-05 首切片)
- **背景**:排产层有 CAPACITY_BALANCE,计划层缺超载→空档的削峰视图与建议。
- **做了什么**:
- `plan.leveling`:有限分桶上先提前后延后挪动;输出建议+前后负荷对照
- `GET /api/plan/leveling`;分桶视口「削峰」;口令「削峰」「产能平衡」
- **验证**:`test_planning.py` leveling + 全量 golden;`tsc`
---
## 2026-07-23 — PL-04 库存投影
- **类型**:feat(PL-04 首切片)
- **背景**:计划层缺随时间库存曲线,断料只能在齐套/MRP 事后发现。
- **做了什么**:
- `plan.inventory`:期初+在途+成品交期/BOM 毛需求+采购到货;日/周投影;断料/安全库存告警
- `GET /api/plan/inventory`;分桶视口「库存投影」;口令「库存投影」「库存投影 CTRL-A」
- **验证**:`test_inventory.py` + 全量 golden;`tsc`
---
## 2026-07-23 — PL-03 可行性分析
- **类型**:feat(PL-03 首切片)
- **背景**:延期只能在详细排产后看见,缺计划层前置「能否按期 + 缺口在哪」。
- **做了什么**:
- `plan.feasibility`:交期排序累计需求 vs 累计粗能力;FEASIBLE/AT_RISK/INFEASIBLE/LATE + 缺口桶
- `GET /api/plan/feasibility`;分桶视口「可行性」页;口令「可行性分析」「能否按期」
- **验证**:`test_planning.py` feasibility + 全量 golden;`tsc`
---
## 2026-07-23 — PL-02 有限/无限产能粗评估
- **类型**:feat(PL-02 首切片)
- **背景**:分桶计划仅有限产能视角,缺西门子式无限产能粗评估与双模式对照。
- **做了什么**:
- `capacityMode=FINITE/INFINITE`:无限不卡能力、给所需日产 + 有限参照;`plan.rccp` 对照摘要
- `GET /api/plan/rccp`;分桶视口有限/无限切换;口令「有限产能粗评」「无限产能粗评」「粗能力对比」
- **验证**:`test_planning.py` infinite/rccp + 全量 golden;`tsc`
---
## 2026-07-23 — PL-01 时间分桶计划
- **类型**:feat(PL-01 首切片)
- **背景**:计划层缺日/周/月时段建模,中长期需求与粗能力只能看排产后负荷。
- **做了什么**:
- `plan.buckets` P0:DAY/WEEK/MONTH/HYBRID;确定订单 + 可选预测加权 vs 产线日产能×工作日
- `GET /api/plan/buckets`;视口「分桶计划」;口令「时间分桶」「分桶计划」「混合分桶」
- **验证**:`test_planning.py` + 全量 golden 133;`tsc`
---
## 2026-07-23 — OR-05 预测 / 长周期订单
- **类型**:feat(OR-05 首切片)
- **背景**:计划层缺独立预测需求台账;销售订单与预测混排会污染正式承诺。
- **做了什么**:
- `forecastOrders` + `forecast.upsert`/`delete`/`convert` P2、`forecast.query` P0;旧世界缺表自愈
- RuleEngine `includeForecast`:ACTIVE 预测垫后试排;转正 → APPROVED 销售单
- 订单面板预测视图;口令「查看预测」「新建预测」「预测纳入试排」「预测转正」
- **验证**:`test_forecast.py` + 全量 golden 128;`tsc`
---
## 2026-07-23 — AG-08 项目 / 会话服务端化
- **类型**:feat(AG-08 首切片)
- **背景**:项目/会话/消息只存浏览器 localStorage,刷新跨设备丢失,也无法与世界状态显式绑定。
- **做了什么**:
- `server/data/projects.json` + `ProjectStore`;`worldKey=default` 绑定共享世界
- `GET/PUT /api/workspace`、项目/会话/消息 API;`project.*` / `message.*` / `workspace.replace` P1
- 前端启动拉取/本地迁移;防抖同步;消息优先服务端;删项目不碰世界
- **验证**:`test_workspace.py` + 全量 golden;`tsc`
---
## 2026-07-22 — OR-04 紧急插单专用流
- **类型**:feat(OR-04 首切片)
- **背景**:急单仅能勾 `isRush` 或走柔性 `flex.rush`,缺少固定轨「先快评再采用」专用流。
- **做了什么**:
- `rush.evaluate` P1 双沙盒对比(受影响订单/延迟/冲突差分);主干零接触
- `rush.apply` P2:写 APPROVED 急单 + DRAFT 排产;写前自动建档可回滚
- 订单面板插单向导;口令「插单快评」「紧急插单 200件控制器A」「采用插单」;柔性急单改需带「柔性」前缀
- **验证**:`test_rush.py` + 全量 golden;`tsc`
---
## 2026-07-22 — OR-03 订单池 / 审核 / 变更
- **类型**:feat(OR-03 首切片)
- **背景**:销售订单无审核态,新建即进排产,缺少业务台账泳道。
- **做了什么**:
- 状态机 DRAFT→SUBMITTED→APPROVED/REJECTED;编辑已批→CHANGED;仅 APPROVED 进正式排产
- `order.submit` P1、`order.approve`/`order.reject` P2;`GET /api/orders.pool`;`includeUnapproved` 试排
- 订单面板泳道 + 提交/批准/驳回/批量批准;口令「订单池」「提交审核」「批量批准」
- **验证**:`test_order_pool.py` + 全量 golden;`tsc`
---
## 2026-07-22 — SC-04 约束注册表 + 配置中心
- **类型**:feat(SC-04 首切片)
- **背景**:冲突检测内嵌引擎,无法配置硬/软与启停;发布不区分硬约束。
- **做了什么**:
- `ConstraintDef` 目录 + `constraintProfile`;版本快照约束配置
- RuleEngine/PoolEngine 读齐套软硬与维保/产能/班组/模具/滚动窗开关
- 发布前硬约束门禁;设置 → 约束配置;口令「关闭物料齐套」「齐套改为硬约束」
- **验证**:`test_constraints.py` + 全量 golden;`tsc`
---
## 2026-07-22 — OR-02 优先级与客户等级权重配置
- **类型**:feat(OR-02 首切片)
- **背景**:策略排序只用 `priority`/`deliveryDate`,主管无法配置 VIP 相对权重;设置页无排产参数。
- **做了什么**:
- `scheduleParams.customerLevelWeights`;RuleEngine 综合/均衡以等级权重为第一键(交期优先仍 EDD)
- `params.query` P0 / `params.update` P2;`GET /api/params`、`POST /api/params/stage`
- 设置 → 排产参数滑杆;口令「查看排产参数」「提高VIP权重到10」「恢复默认排产参数」
- **验证**:`test_params.py` + 全量 golden;`tsc`
---
## 2026-07-22 — AG-07 主动引导(空态 / 冲突 / 知识未命中)
- **类型**:feat(AG-07 首切片)
- **背景**:欢迎页与空态仍是静态文案;冲突高/知识未命中缺少可点击下一步。
- **做了什么**:
- `build_guidance` + `guidance.next` P0 + `GET /api/guidance`
- 对话 `guidance` 块、欢迎页动态 starter、甘特空态;发布无版本 / 知识未命中 / 试排冲突≥3 自动附建议
- 口令「下一步建议」
- **验证**:`test_guidance.py` + 全量 golden;`tsc`
---
## 2026-07-22 — EX-06 资源利用率增强(设备热力 + 班组并发)
- **类型**:feat(EX-06)+ docs(SC-11/SC-10 对齐)
- **背景**:负荷热力只覆盖固定产线;柔性设备/班组利用率缺独立视口;SC-11 引擎早已落地但总表仍标未做。
- **做了什么**:
- `build_utilization_report` + `GET /api/analytics/utilization`:7 日设备热力、班组峰值并发/触顶
- 视口「利用率」;口令「打开资源利用率」;柔性工作台展示班组清单
- 文档:SC-11/SC-10/MD-07/EX-06 状态与实现对齐
- **验证**:`test_utilization.py` + 全量;`tsc`
---
## 2026-07-22 — OR-06 订单钉扎(柔性链)+ SC-12 文档对齐
- **类型**:feat(OR-06)+ docs(SC-12)
- **背景**:固定轨 `plan.trace` 已有;康尼需 FO→BOM/路线→虚拟产线→工单/设备钉扎;SC-12 已实现但总表仍标未做。
- **做了什么**:
- `flex_plan_trace` + `plan_trace(track=flex|auto)`;`GET /api/plan/trace?track=flex`
- 柔性工作台「钉扎」页;口令「钉扎 FO-2601」「追溯柔性订单」
- implementation-spec:OR-06 / SC-12 状态改为已落地
- **验证**:`test_pegging.py` + 全量;`tsc`
---
## 2026-07-22 — EX-07/08 方案对比表 + KPI 仪表盘
- **类型**:feat(分析增强)
- **背景**:视口仅有迷你 KPI 卡与方案卡,缺独立仪表盘与逐项 diff 表。
- **做了什么**:
- `build_kpi_dashboard` / `GET /api/analytics/kpi`:固定+柔性+MES+冲突聚合;视口「KPI」
- `build_compare_table` / `GET /api/analytics/compare`:策略/三模式逐项最优高亮与 delta;视口「对比表」
- `query.kpi` / `scenario.compare` / `flex.compare` 联动切换视口
- **验证**:`test_analytics.py` + 全量 golden;`tsc`
---
## 2026-07-22 — EX-05/09 MES 下发与报工回流(Mock)
- **类型**:feat(EX-05 + EX-09 首切片)
- **背景**:发布执行闭环缺车间侧;MD-05 SAP 桩已齐,需对称 MES 下发/报工。
- **做了什么**:
- `MockMesClient` + `mes.dispatch`(P3 确认卡,幂等外部工单)/ `mes.report`(P1 进度回流)
- 柔性版本下发后标 `DISPATCHED`;工序进度与订单整单完工联动
- API:`/api/mes/status|dispatch/*|execution|report`;工作台「MES 执行」;口令「下发MES」「模拟报工」
- **验证**:`test_mes.py` + 全量 golden;`tsc`
---
## 2026-07-22 — MD-05 SAP 集成桩(入站拉单 / 出站回写)
- **类型**:feat(MD-05 首切片)
- **背景**:康尼验收需 SAP↔APS 双向同步;本期用进程内 Mock,无真实 RFC。
- **做了什么**:
- `MockSapClient`(`server/integrations/sap_stub.py`)+ `sap_sync` 入站写柔性订单/库存、出站幂等回写
- 意图:`sap.status` P0;`sap.sync.inbound|outbound` P2 确认卡;口令「同步SAP」「回写SAP」
- API:`/api/sap/status`、`inbound|outbound` preview/stage;柔性工作台「SAP 集成」页
- **验证**:`test_sap_sync.py` + 全量 golden;`tsc`
---
## 2026-07-22 — EX-04 固定轨甘特拖拽调程
- **类型**:feat(EX-04 对称补齐)
- **背景**:柔性甘特已可拖;固定轨仍只读。
- **做了什么**:
- `schedule.adjust.preview` / `commit`:工位占槽、同 PO 工序先后、维保窗口校验;提交复制 PO/WO 为新草稿
- API:`/api/schedule/adjust/preview|stage`;固定甘特可拖拽 + P2 确认卡
- **验证**:`test_fixed_preview_and_commit` + 全量;`tsc`
---
## 2026-07-22 — EX-04 柔性甘特拖拽调程
- **类型**:feat(EX-04 首切片)
- **背景**:正式版甘特此前只读;POC 有拖拽,需产品化边拖边校验 + P2 提交。
- **做了什么**:
- `flex.adjust.preview`(P0):15 分钟吸附、设备占槽与工序先后校验;同虚拟产线后续工序联动平移
- `flex.adjust.commit`(P2):确认后生成新草稿版本,不改历史
- API:`/api/flex/adjust/preview`、`/stage`;柔性甘特可拖拽(绿/红描边)+ 确认卡
- **验证**:`test_adjust.py` + 全量 golden;`tsc`
---
## 2026-07-22 — EX-03 冲突解决工作流(建议 + 一键修复)
- **类型**:feat(EX-03 首切片)
- **背景**:冲突此前只能在排产结果里「看见」,无法按建议修复。
- **做了什么**:
- `conflict.list` / 冲突中心:最新版本未解决冲突 + 按类型的可执行建议
- `flex.conflict.resolve`:P1 安全修复(解锁模具 / L1 换机 / 恢复设备);重排类走 P2 确认卡
- API:`GET /api/flex/conflicts`、`POST /api/flex/conflicts/resolve`
- 柔性工作台「冲突」页;对话「查看冲突」「解决冲突」
- **验证**:`test_conflicts.py` + 全量 golden;`tsc`
---
## 2026-07-22 — 故障优先 L1 + EX-10 预测预警 + 实时分钟窗
- **类型**:feat(康尼 DY-01 / EX-10 / SC-12 增强)
- **背景**:故障一律全量重排过粗;产能池缺短中长期预测;滚动层缺实时分钟精度。
- **做了什么**:
- **DY-01**:`apply_equipment_fault` 先 dry-run L1,能全部换机则局部处理(他单不动);否则缩池 L4 重排;PRESS 冗余走 L1、WELD 单点走 L4
- **EX-10**:产能分析补 4h/1d/1w 负荷利用率与 ≥85%/95% 预警列表;视口产能池展示预测芯片与告警条
- **SC-12**:`window=realtime`(60m / 步长 1min);口令「实时排产」「分钟级排产」;工作台按钮
- **验证**:相关 golden + 全量;`tsc`
---
## 2026-07-22 — DY-01 真·L1 局部换机 + L2/L3/L4 升 P2 确认卡
- **类型**:feat(康尼 DY-01 收尾)
- **背景**:窗内重排此前直通执行;局部换机此前靠故障缩池整单重排,非真 L1。
- **做了什么**:
- **L1**:`flex.swap` / `local_swap_equipment` — 池内空闲备机接手,只改目标工单,他单时段与设备不变,不新建版本;口令「局部换机 PRESS-01」;工作台异常页按钮;`POST /api/flex/swap`
- **L2/L3/L4**:`flex.reschedule` 升 **P2**;对话与 `POST /api/flex/reschedule` 只出确认卡,批准后 `execute_confirmed` 执行并自动建档
- 柔性工作台分级重排走确认卡 UI
- **验证**:`test_l1_local_swap_keeps_others` / `test_reschedule_is_p2_and_preview` + golden;`tsc`
---
## 2026-07-22 — 康尼 SC-12 滚动窗 + DY-01 L2/L3 + SC-11 班组约束
- **类型**:feat(康尼剩余 P0)
- **背景**:验收剧本仍缺滚动分窗与窗内重排、班组人力未进引擎。
- **做了什么**:
- **SC-12**:`window=short/mid/long` 限制精排时域与步长(15min/60min/4h),窗外延期或截断
- **DY-01**:`flex.reschedule` L2/L3 冻结窗外工单占槽后只重排窗内订单;L4 全量
- **SC-11**:`flexTeams` 按工序并发人数约束占槽,工单挂 `teamCode`
- 柔性工作台增加滚动排产与 L2/L3/L4 按钮;对话「短窗重排」「滚动排产」
- **验证**:`test_rolling_reschedule.py` + 全量 golden;`tsc`
---
## 2026-07-22 — 康尼需求 P0 闭环:交期三区间 / 模具寿命 / 故障插单 / 柔性工作台
- **类型**:feat(康尼芜湖验收剧本落地)
- **背景**:用户要求先完善康尼相关能力;此前引擎有、产品面板与 DY/PL 缺口大。
- **做了什么**:
- **PL-08**:交期承诺补悲观区间 + `gaps` 资源缺口建议;对话块与柔性工作台询价
- **MD-07/SC-10**:排产消耗模具寿命,到限自动 LOCKED;工作台可锁定/解锁
- **DY-01**:`flex.fault` 设备故障缩池重排;`flex.rush` 紧急插单;对话口令对齐
- **SC-13**:`flex.compare` 三模式沙盒对比 + UI
- **EX-10**:柔性工作台「资源 What-if」停机/调区即时重算产能
- 右侧「柔性工作台」:排产 / 交期 / 异常 / What-if 四页签
- **验证**:`test_kangni_flex.py` + 全量 golden;前端 `tsc`
---
## 2026-07-22 — MD-04 导入管线 + 柔性主数据页 + EX-10 产能池仪表盘
- **类型**:feat(product MD 落地,不含西门子对标文档)
- **背景**:`docs/product` 中 MD-04/08/09、EX-10 仍为 🔜;用户五张 Excel 需要可校验入库,并要能看见柔性资源与产能池。
- **做了什么**:
- **MD-04**:`importers.py` + `POST /api/import/preview|commit`(P1 校验 / P2 入库);种类覆盖订单/物料/BOM/路线/设备/模具/工序/区域;写固定轨或 `flex*`
- **MD-08/09**:主数据「柔性资源」页签(设备/模具/工序池/区域只读 + 导入联动);`master.clear` 增 `flex` 范围
- **EX-10**:视口「产能池」模式 + `PoolCapacityView`(负载色标);口令 `flex.capacity` 联动切池并刷新
- 订单/主数据面板挂载 `ImportBar`;黄金测试 `test_importers.py`
- **验证**:`pytest tests/golden`;前端 `tsc`
---
## 2026-07-22 — 主数据一键清理改为真正清空
- **类型**:fix
- **背景**:资源页点「一键清理」后工厂/产线仍在——原实现是回种种子,不是清空。
- **做了什么**:`master.clear` 按页签**整表清空**(资源树 / 工艺模型 / 维保);确认卡明示「清空后列表为空」。
- **验证**:golden 断言 factories/lines/materials 清空
---
## 2026-07-22 — 订单/主数据一键清理
- **类型**:feat(面板运维)
- **背景**:订单与主数据录入后缺少板块级清空,演示/试错不便。
- **做了什么**:
- 订单面板「一键清理」→ `order.clear`:清空销售订单 + 采购/委外建议(P2)
- 主数据面板「一键清理」→ `master.clear`:按当前页签(资源/工艺模型/日历维保)回种到种子基线(订单与历史排产不碰)
- 对话口令:「清空全部订单」「清理工艺模型主数据」
- **验证**:golden 增补清理用例;`pytest` / `tsc`
---
## 2026-07-22 — 订单删除 + 自然语言新增/批量导入(订单与主数据)
- **类型**:feat(录数闭环)
- **背景**:订单面板只有取消没有删除;主数据/订单虽可表单维护,但缺少对话侧自然语言新增与批量导入。
- **做了什么**:
- `order.delete`:物理删除销售订单,同步清该单草稿采购/委外;面板「删除订单」+ 口令「删除订单 SOxxxx」
- `data.import`:口令「导入订单 / 导入物料」解析多行 CSV 或口语行,P2 确认后批量写入
- `master.material.upsert` 对话新建物料;订单 `order.upsert` 继续支持自然语言建单
- 快捷指令与欢迎语补充录数示例;`intake.py` 解析模块
- **验证**:golden 增补删除与导入用例;`pytest` / `tsc`
---
## 2026-07-22 — 工艺模型 CRUD 起步(对齐聚制云主数据分层)
- **类型**:feat(主数据外围)
- **背景**:手册要求工艺模型「物料→BOM→工序→工艺路线」全 CRUD,且排产前必须产线-产品绑定;原主数据面板只能改库存/工时,养不活排产依据。
- **做了什么**:
- `masterdata.py`:物料新建/全字段/停用;BOM 头新建 + 行增删改;工序库;工艺路线新建/步骤增删改;产线-产品绑定增删改;投影补 `operations`/`lineProducts`
- 发号器补 material/bom/operation/routing/lineProduct;Harness 登记 `master.operation.upsert` / `master.lineProduct.upsert`
- 前端主数据「工艺模型」拆页签:物料 / BOM / 工序 / 工艺路线 / 产线绑定
- 黄金测试 M6:工艺模型 CRUD 闭环
- **验证**:`pytest tests/golden`;前端 `tsc`
---
## 2026-07-22 — 对齐聚制云:计划追溯链 + 主数据/排产依据可查
- **类型**:feat(产品对齐 + 可解释性)
- **背景**:对照 `demand/聚制云…操作手册 V1.1`,当前主数据维护无分层顺序、排产结果无法沿 SO→BOM/路线→采购委外→PO/WO→负荷/库存追溯,用户感知“混乱、找不到依据”。
- **做了什么**:
- 产品文档 `docs/product/master-data-and-plan-chain.md`:手册主数据分层、计划链、与现状缺口、目标追溯模型
- 后端 `server/aps_domain/trace.py` + `GET /api/plan/trace` + 意图 `plan.trace`:一单给出主数据依据、分解、排产工单、负荷分钟、库存缺口与缺失项
- 订单面板「追溯」页 + 聊天 `plan-trace` 块;快捷口令「追溯订单依据」
- 知识库补种:主数据录入顺序 / 工艺路线配置 / 订单排产与追溯 / 库存齐套口径 / 柔性轨说明(旧库幂等补齐)
- **验证**:进程内分解+试排后追溯可见 BOM 缺口、工单、产线负荷;`pytest`/tsc 见本轮末
---
## 2026-07-22 — 外围功能补齐(只留核心算法待调):柔性可视化 / 对话建单 / MRP 下达 / 视口细节
- **类型**:feat(外围闭环,四批次)
- **背景**:核心算法(固定产线 RuleEngine、柔性 PoolEngine)已可跑;用户要求先补齐系统外围功能,只留核心算法后续慢慢调试。经全量盘点,缺口集中在四处闭环,逐一补齐(CP/GA/HYBRID 高级求解器属核心算法,不在本轮)。
### 批次 A — 柔性排产可视化闭环
- **后端** `server/aps_domain/flex.py` + `server/gateway/app.py`:新增 `flex_gantt_view` 与 `GET /api/flex/gantt`(行=设备按区域分组,条=柔性工单,含换型/移动/加工分解、瓶颈/超期/冲突标记)
- **前端**:`api/types.ts`+`client.ts` 加 `FlexGanttData`/`fetchFlexGantt`;新增 `viewport/FlexGanttView.tsx`;`ViewportPanel` 追加「柔性甘特」页签与柔性 KPI;`App.tsx` 的 `WorldData` 扩展 `flexGantt`,`refreshWorld` 并拉柔性甘特,`captureSessionResult`/`hasVisualResult` 支持纯柔性结果
- **联动**:`_run_flex` 触发后发 `viewport.mode=flex`+`world.refresh`,右侧自动切到柔性甘特并 capture 会话结果 —— 解决「柔性排产完了看不到工单」
### 批次 B — 对话/写入闭环
- **order.upsert 对话建单**:`intent.py` 加建/改单快路(客户/成品/数量/交期/等级/加急槽位抽取 + 中文日期解析)与 LLM 提示;`workflow._stage_order_upsert` 解析成品并出 P2 确认卡,缺字段友好追问;`orders.find_product_by_hint` 按名称/编码模糊解析成品
- **text UIBlock**:`ChatPanel` 补 `TextBlock` 渲染(标题+正文+要点),不再静默丢弃
### 批次 C — MRP 建议单确认下达(DRAFT→正式)
- `mrp.py`:`confirmation_for_mrp_release` / `apply_mrp_release`(DRAFT→RELEASED,可按订单/按 采购·委外 粒度)
- `harness` 注册 `mrp.release`=P2;`contracts` 加意图;`workflow` 出卡 + `execute_confirmed` 执行(写前自动建档);`intent` 加「下达」快路 + LLM 提示
- `POST /api/mrp/release` 出确认卡;`OrderPanel` 分解视图加「确认下达全部/只采购/只委外」按钮与 DRAFT/已下达状态徽标
### 批次 D — 视口细节
- 视口工具栏「时间粒度」徽标改为可点切换(天⇄小时)
- 负荷热力视图响应产线聚焦(`load_view` 行补 `lineCode`,`LoadView` 按编码过滤)
- **验证**:`pytest` 全套 51 项全绿;前端 `tsc --noEmit` 通过、`vite build` 成功;进程内实测 order.upsert(建单落库)与 MRP 分解→下达(48 采购草稿全部 RELEASED)闭环通过
---
## 2026-07-22 — 柔性排产结果可下钻:每条产线给出工单级依据 + 冲突原因
- **类型**:feat(可解释性)
- **背景**:用户反馈「排产结果很混乱,要每条结果都有数据可依据」。原 flex-schedule 块只给完工时间与准时/超期标签,看不到时间是怎么算出来的。
- **做了什么**:
- **后端** `server/aps_domain/workflow.py` 的 `_run_flex`:结果块新增两部分依据——
- 每条虚拟产线携带 `steps`(工单级明细:序/工序/设备+区/模具/换型min/移动min/加工min/起止时段/是否瓶颈)
- 顶层 `conflicts`(DELAY/缺料/无能力等,含描述与处置建议);虚拟产线按交期排序消除“混乱观感”,并补充订单号/优先级列
- **前端** `apps/web/src/chat/ChatPanel.tsx` 的 `FlexScheduleBlock`:行可点击展开,内嵌工单明细表 + 表尾说明「完工时间 = 各工序(换型+移动+加工)沿工艺顺序跨班次累加」;底部列出冲突依据清单
- **样式** `apps/web/src/styles.css`:新增 `.flex-line-row/.flex-detail/.flex-step-table/.flex-conflicts` 等
- **验证结果**(进程内核对):FO-2602 高压线束 6 道工序完整展开(来料检验→下线→压接★→装配→测试→包装,各工时/设备/模具清晰);4 项 DELAY 冲突与超期标签一一对应
- **回归**:`tests/golden`(51)全绿,`test_pool_engine`(14)全绿
---
## 2026-07-22 — 柔性演示数据重做:对齐康尼芜湖 4 产品共线场景
- **类型**:feat(数据)
- **背景**:原柔性种子只有 2 产品(线束/PDU),与 demand/ 康尼芜湖方案的「4 类共线产品 + 7 能力池」不匹配,演示不够真实。
- **做了什么**(`server/state/seed.py` 的 `_seed_flex`,忠实吸收 demand §3.2/§3.3/§6.1):
- **4 类产品**:高压线束总成 HV-HARNESS、PDU 配电单元 PDU-UNIT、充电枪总成 CHARGE-GUN、高压连接器 HV-CONN
- **10 道工序**,四类瓶颈与方案 §6.1 对齐:压接端子(线束)、激光焊接(PDU·全厂最紧)、控制盒装配ESD(充电枪)、插拔力测试(连接器)
- **22 台设备 / 4 区域**:下线机×2、压接机×4(可移动跨区)、装配台×3、激光焊接机×1、氦质谱+气密检测×2、ESD 装配台×2、测试台×4、插拔力测试机×1、来料检验×1、包装台×2
- **5 副压接模具**家族(代表 50+ 套)、**12 项物料 + 8 条 BOM**(4 成品各自关键料)、**4 条工艺路线**(含共用压接池的产品竞争)
- **10 张多品种小批量订单**(4 产品,交期/优先级错落,8 RELEASED + 2 CREATED)
- 班组扩到 5 个覆盖新工序
- **验证结果**(进程内核对):跑一版柔性排产 → 10 条虚拟产线 / 56 工单;瓶颈识别 = 压接(4台)·焊接(1台)·ESD(2台)·插拔力(1台);瓶颈产能法:限制性瓶颈=激光焊接≈88件/天、ESD≈182、插拔力≈228、压接≈1795(与 demand §6.1 的 96/192/240/960 量级一致)
- **同步更新**:`tests/golden/test_pool_engine.py` 计数断言(5单/30工单 → 10单/56工单;vlCount/onTime 值域)
- **涉及路径**:`server/state/seed.py` · `tests/golden/test_pool_engine.py`
- **验证**:全量 `pytest` **51 passed**;`scripts/flex_simulation.py` 全流程 exit 0
- **注意**:旧 world.json 会被 `ensure_flex_seed` 幂等补种为旧结构——要看新数据需**重启后端并「重置数据」**(或删除持久化 world.json)
- **文档同步**:本文件
---
## 2026-07-22 — 修复:对话气泡样式塌陷 + 柔性回复图文表格化
- **类型**:fix + feat(前端)
- **背景(缺陷)**:
1. 右侧用户气泡出现「短中文一字一行竖排」——根因是 `.bubble` 的 `word-break: break-all` 遇上 `.msg.user .msg-content` 的 `align-items:flex-end`,令气泡塌陷到"单字符最小宽度"
2. 左侧柔性排产/瓶颈产能/交期承诺回复**全是纯文字**,可读性差
- **做了什么**:
- `apps/web/src/styles.css`:修 `.bubble` → `width: fit-content; max-width: 100%; overflow-wrap: break-word; word-break: normal`(短内容抱紧、长内容按容器宽换行,不再逐字竖排);新增柔性块样式(KPI 指标格、虚拟产线表、瓶颈标签、能力池条形图、交期双卡)
- `server/contracts.py` + `apps/web/src/api/types.ts`:`UIBlock.type` 新增 `flex-schedule` / `flex-capacity` / `flex-due`
- `server/aps_domain/workflow.py`:三个柔性处理分支改为「一句话结论文案 + 结构化 UIBlock」——排产结果给 KPI 指标格 + 虚拟产线表(产品/数量/工序数/完工/交期/准时标签)+ 瓶颈标签;瓶颈产能给各能力池日产能条形图(瓶颈池橙→黄高亮);交期承诺给乐观/预计双卡
- `apps/web/src/chat/ChatPanel.tsx`:新增 `FlexScheduleBlock` / `FlexCapacityBlock` / `FlexDueBlock` 三个渲染组件;快捷指令加「跑一版柔性排产 / 瓶颈产能 / PDU 500套什么时候能交」
- **涉及路径**:`apps/web/src/styles.css` · `apps/web/src/chat/ChatPanel.tsx` · `apps/web/src/api/types.ts` · `server/contracts.py` · `server/aps_domain/workflow.py`
- **验证**:`npx tsc -b` 通过(前端零类型错误);全量 `pytest` **51 passed**;in-process 核对三类柔性块 props 结构正确
- **注意**:需**重启后端** + 前端热更新(或刷新页面)生效
- **文档同步**:本文件
---
## 2026-07-22 — 修复:柔性排产接入对话意图管线(不再降级乱答)
- **类型**:fix + feat
- **背景(缺陷)**:柔性排产此前只有 `/api/flex/*` REST 接口,**未进意图管线**。用户在对话里说「走一个全流程排产」时,既不命中固定产线 `schedule.run`(其要求"试排/重排/跑一版"动词),就降级到 LLM/知识库,把《排产逻辑》PPT 原文当答案吐出——表现为"乱回答"。
- **做了什么**:
- `server/contracts.py`:`IntentName` 新增 `flex.schedule` / `flex.capacity` / `flex.simulate_due`(并补登此前遗漏的 `order.decompose`,修掉其经对话触发时的契约校验隐患)
- `server/agent_core/intent.py`:一级规则快路新增柔性触发词——柔性/能力池/虚拟产线/多品种小批量/全流程排产,以及方向词 正排(ASC)/倒排(DESC)/瓶颈锚(BOTTLENECK)(方向词在本系统仅 PoolEngine 实现,故归柔性);交期问句(何时/多久能交 + 产品 + 数量)→ `flex.simulate_due` 并抽出 `productCode`/`quantity`;同步补 LLM 意图枚举
- `server/aps_domain/workflow.py`:新增 `flex.schedule`(回执版本/虚拟产线/瓶颈/准时率/各单完工)、`flex.capacity`(瓶颈产能法各池日产能 + 限制性瓶颈)、`flex.simulate_due`(乐观/预计完工)三个处理分支与文案;`_HELP` 增列柔性口令
- `server/state/seed.py`:新增幂等 `ensure_flex_seed()`;柔性领域服务在读写前调用,**旧 world.json(flex 层加入前落盘)自动补齐柔性主数据**,无需手动重置
- `server/agent_core/harness.py`:登记 `flex.capacity`/`flex.simulate_due` 为 P0(只读)
- **涉及路径**:`server/contracts.py` · `server/agent_core/intent.py` · `server/aps_domain/workflow.py` · `server/aps_domain/flex.py` · `server/state/seed.py` · `server/agent_core/harness.py` · `tests/golden/test_pool_engine.py`
- **验证**:新增意图路由护栏 F12(3 用例:柔性五口令+模式解析 / 瓶颈产能+交期槽位抽取 / 固定产线与知识库不被误吞);全量 `pytest` **51 passed**;in-process 跑通全部柔性口令并核对回执文案
- **注意**:需**重启后端**加载新代码;旧世界首次触发柔性口令会自动补种(无需 `重置数据`)
- **文档同步**:本文件
---
## 2026-07-22 — 柔性排产全流程操作手册 + 自然语言流程描述
- **类型**:docs
- **做了什么**:
- 新增 [`docs/product/flex-simulation-guide.md`](./product/flex-simulation-guide.md):第一部分「自然语言全流程描述」(设备虚拟化→能力池→虚拟产线→瓶颈产能→交期承诺→动态重排,用大白话讲一遍);第二部分走法 A 一键脚本;第三部分走法 B 逐接口(PowerShell `Invoke-RestMethod` 示例 + 端点速查);第四部分走法 C 换真实数据;第五部分验收清单 + 常见问题
- 在 `docs/product/README.md` 与大管家 `docs/README.md` 导航登记本手册与数据采集模板
- **涉及路径**:`docs/product/flex-simulation-guide.md` · `docs/product/README.md` · `docs/README.md` · 本文件
- **验证**:文档交叉引用自检;命令与端点签名对照 `server/gateway/app.py` / `scripts/flex_simulation.py`;未改运行代码
- **文档同步**:`product/*` · `docs/README.md` · 本文件
---
## 2026-07-22 — 柔性排产全流程模拟 + 瓶颈产能法 + 三模式差异化
- **类型**:feature + docs
- **做了什么**:
- 新增端到端模拟脚本 `scripts/flex_simulation.py`:一次跑通「主数据/产能池 → 瓶颈锚排产+虚拟产线甘特 → 瓶颈产能评估 → 正/倒/瓶颈锚三模式对比 → 交期承诺(PDU 500套) → 动态重排(紧急插单 / 设备故障)」全链路,全中文可读输出
- 新增 `capacity_analysis`(瓶颈产能法 PL-07)+ `GET /api/flex/capacity`:按能力池算日产能=池可用工时÷单件工时,标出限制性瓶颈(本演示=单机激光焊接池 88件/天,对照台账法压接池虚高 1920件/天)
- 修 `PoolEngine` 倒排(DESC)排序:改为交期最晚优先,使三模式在压力场景下真正分化(正排/瓶颈锚 114h 延迟、准时 1/5;倒排 295h、准时 0/5)
- `PoolEngine` 结果新增 `makespan`(最晚完工)与 `onTimeCount`(准时单数)
- 动态调度双案例:可移动压接机故障(池化韧性、日产能 1795→1344 仍有冗余)vs 单点瓶颈焊接机故障(无备机 → PDU 停摆,暴露 NO_CAPABILITY,提示备机/外包/议交期)
- **涉及路径**:`scripts/flex_simulation.py` · `server/engines/pool_engine.py` · `server/aps_domain/flex.py` · `server/gateway/app.py` · `tests/golden/test_pool_engine.py` · `docs/**`
- **验证**:`python -m pytest tests\golden -q` → **48 passed**(原 46 + 新 F10/F11);`python scripts\flex_simulation.py` 全流程跑通
- **文档同步**:`product/features.md`(PL-07)· `product/implementation-spec.md` · `architecture/harness.md`(`/api/flex/capacity`)· 本文件
- **遗留**:前端虚拟产线甘特 + 产能池仪表盘(EX-10);真正的滚动窗口分窗(SC-12)与局部重排(DY-01 L1/L2,当前重排为全量 L4)
---
## 2026-07-22 — 柔性排产首切片:设备能力池 + 虚拟产线(PoolEngine)
- **类型**:feature + docs
- **做了什么**:
- 新增柔性排产引擎 `server/engines/pool_engine.py`(`PoolEngine`,name=FLEX):订单→每道工序从**能力池**(拥有该工序能力的设备集合)动态取设备→组装**虚拟产线**(`flexVirtualLines`);含模具适配/换型、可移动设备移动耗时、设备级占槽、工序 precedence;支持 **ASC 正排 / DESC 倒排 / BOTTLENECK 瓶颈锚** 三模式(吸收 `排产逻辑.ppt`)
- 种子追加 `flex*` 数据(`server/state/seed.py` 的 `_seed_flex`):区域、可移动压接机×4+下线/焊接/检漏/测试等设备、高压端子模具族、产品 `HV-HARNESS`/`PDU-UNIT` 及工艺/BOM/订单/参数;与固定产线层**并行独立键**,不进 RULE 引擎与既有计数
- 新增领域服务 `server/aps_domain/flex.py`:能力池投影 `capability_pools`、`flex_overview`、`run_flex_schedule`(P1 经 `harness.guard`+审计)、`simulate_due`(交期承诺模拟雏形,深拷贝沙盒)
- 端点:`GET /api/flex/world` · `POST /api/flex/schedule` · `POST /api/flex/simulate-due`;`harness` 登记 `flex.schedule` P1
- 产出数据采集模板 `docs/product/demand-data-intake.md`(11 张表字段+示例,兼作合成种子 schema)
- 黄金测试 `tests/golden/test_pool_engine.py`(F1–F9:计数/设备无双占/工序序/压接必占适配模具/瓶颈摘要/冲突结构/移动痕/利用率值域/三模式)
- **涉及路径**:`server/engines/pool_engine.py` · `server/engines/__init__.py` · `server/aps_domain/flex.py` · `server/state/seed.py` · `server/state/store.py` · `server/agent_core/harness.py` · `server/gateway/app.py` · `tests/golden/test_pool_engine.py` · `docs/**`
- **验证**:`python -m pytest tests\golden -q` → **46 passed**(原 37 + 新 9,无回归)
- **文档同步**:`product/features.md`(§0 + MD-08/09·SC-13/14·PL-07/08)· `product/implementation-spec.md` · `product/demand-data-intake.md` · `architecture/harness.md` · `architecture/modules.md` · 本文件
- **遗留**:前端虚拟产线甘特 + 产能池仪表盘(EX-10);滚动窗口分窗(SC-12);班组人力约束进排产(SC-11);柔性层与固定产线层的统一;意图口令「柔性排产」(当前经 REST 触发)
---
## 2026-07-22 — 吸收 demand/ 真实需求进产品文档
- **类型**:docs
- **做了什么**:
- 解析 `demand/`:康尼芜湖柔性排产与产能评估方案(docx)+ 排产逻辑(ppt 正排/倒排/瓶颈混合)
- 新增 `docs/product/demand-kangni-wuhu.md`:抽象为行业无关能力,并与现有编号映射;明确非绑定客户工厂
- `features.md` 登记 MD-08/09、SC-12~14、PL-07/08、EX-10、DY-01、IND-03;差距清单按真实需求 P0 重排(柔性资源模型优先)
- 同步 `implementation-spec` 编号总表、`positioning` 需求输入声明、product/大管家索引;`.gitignore` 忽略本地提取目录
- **涉及路径**:`docs/product/demand-kangni-wuhu.md` · `docs/product/features.md` · `docs/product/implementation-spec.md` · `docs/product/positioning.md` · `docs/product/README.md` · `docs/README.md` · `docs/product/aps-benchmark-siemens.md` · `.gitignore`
- **验证**:文档交叉引用自检;未改运行代码
- **文档同步**:`product/*` · 本文件
- **遗留**:新编号落地规格卡随 M4/M5 开工补齐;柔性场景种子数据与引擎实现另开切片
---
## 2026-07-16 — 订单分解 MRP 首切片 + BOM/工艺路线可维护(对标西门子)
- **类型**:feature + docs
- **做了什么**:
- 新增 MRP 领域服务 `server/aps_domain/mrp.py`:订单按 BOM/工艺路线分解为 自制(进排产)/ **采购建议**(净需求=毛需求−库存−在途,建议下单日按采购前置期倒排)/ **委外建议**(`isExternal` 外协工艺步骤);写入 `purchaseOrders`/`outsourceOrders` DRAFT 建议表,重复分解幂等替换
- `order.decompose` 登记 P1;`GET /api/mrp` + `POST /api/mrp/decompose`;对话口令「分解订单 SOxxx / 生成采购建议 / MRP」走同一动作
- MD-02 深化:新增 `master.bom.upsert`(明细用量/关键料)与 `master.routing.upsert`(准备/单件时间/外协标记)两个 P2 动作;主数据面板选中成品后可直接编辑 BOM 与工艺步骤
- 订单面板新增「分解建议」视图与「分解此单」按钮,展示采购/委外建议(含来源订单、建议下单日、前置期)
- 黄金测试 `tests/golden/test_mrp.py`:缺料出采购建议+前置期倒排、充足物料零建议、外协往返、指定订单幂等、BOM 用量联动
- **涉及路径**:`server/aps_domain/mrp.py` · `server/aps_domain/masterdata.py` · `server/aps_domain/workflow.py` · `server/agent_core/harness.py` · `server/agent_core/intent.py` · `server/gateway/app.py` · `server/state/seed.py` · `server/state/store.py` · `apps/web/src/orders/OrderPanel.tsx` · `apps/web/src/master/MasterPanel.tsx` · `apps/web/src/api/*` · `tests/golden/test_mrp.py` · `docs/**`
- **验证**:`python -m pytest tests\golden -q` → **37 passed**;`npm run build` → 成功
- **文档同步**:`product/features.md`(OR-07)· `product/journeys.md`(旅程 A4)· `product/implementation-spec.md` · `product/aps-benchmark-siemens.md` · `architecture/harness.md` · `architecture/modules.md` · 本文件
- **遗留**:建议单确认下达(转正式采购/委外,P2/P3 对接 ERP)、跨订单库存分配、多层 BOM 级联、引擎跳过外协工序占槽为后续切片
---
## 2026-07-16 — MD-01/02/03 主数据维护模块首切片
- **类型**:feature + docs
- **做了什么**:
- 新增主数据领域服务 `server/aps_domain/masterdata.py`:资源树/物料BOM/日历维保只读投影 + `master.line.upsert`(产线编辑停启用)/ `master.material.upsert`(库存在途安全库存)/ `master.maintenance.upsert`(维保新增取消)三个 P2 写动作
- 新增 `GET /api/master` 与 `POST /api/master/stage`;页面只暂存确认卡,批准统一走 `/api/actions/confirm`,写前自动 Checkpoint + 审计链
- 引擎联动修复:`find_product_lines` / `find_workstation_for_operation` 补 ACTIVE 过滤(停用资源不进新排产);维保冲突检测忽略 CANCELLED 窗口
- 前端新增主数据面板 `MasterPanel`(资源/物料与BOM/日历与维保三页签),侧栏与右侧工具栏、命令面板均可进入
- `WorldStore` 发号器支持 maintenance 表
- 黄金测试 `tests/golden/test_master_data.py`:停用产线排除、库存调零缺料增加、维保窗口冲突往返、确认卡校验、审计链完整
- **涉及路径**:`server/aps_domain/masterdata.py` · `server/gateway/app.py` · `server/aps_domain/workflow.py` · `server/agent_core/harness.py` · `server/engines/queries.py` · `server/engines/rule_engine.py` · `server/state/store.py` · `apps/web/src/master/MasterPanel.tsx` · `apps/web/src/App.tsx` · `apps/web/src/projects/ProjectPanel.tsx` · `apps/web/src/api/*` · `tests/golden/test_master_data.py` · `docs/**`
- **验证**:`python -m pytest tests\golden -q` → **33 passed**;`npm run build` → 成功
- **文档同步**:`product/features.md` · `product/journeys.md`(旅程 A3)· `product/implementation-spec.md` · `architecture/harness.md` · `architecture/modules.md` · 本文件
- **遗留**:工位/设备编辑、BOM/工艺路线版本发布、周日历模板、Excel 导入(MD-04)为后续切片;主数据意图口令(对话入口)后续补齐
---
## 2026-07-16 — 对标西门子 Opcenter APS 完善产品功能清单
- **类型**:docs
- **做了什么**:
- 新增 `docs/product/aps-benchmark-siemens.md`:以西门子 Opcenter APS(原 Preactor)三大模块 + 8 段标准流程为标尺,逐项盘点覆盖度与差距
- `features.md` 扩充:新增「计划层 Advanced Planning」章节(PL-01~PL-06)+ 主数据/订单/排产/执行多项对标功能点(MD-05~07、OR-05~06、SC-07~11、EX-06~09、IND-01~02),差距清单按「缺口×频率」重排
- `implementation-spec.md` 编号总表同步新增 25 个功能编号
- 更新 product 索引与大管家导航
- **涉及路径**:`docs/product/aps-benchmark-siemens.md` · `docs/product/features.md` · `docs/product/implementation-spec.md` · `docs/product/README.md` · `docs/README.md`
- **验证**:文档编号一致性自检;未改运行代码
- **文档同步**:`product/*` · `docs/README.md` · 本文件
- **遗留**:新登记功能点的落地规格卡随各里程碑(M4/M5/M6)开工时补齐;计划层 AP 为最大缺口
---
## 2026-07-16 — Codex 式工作台布局与会话节点导航
- **类型**:feature + fix + docs
- **做了什么**:
- 将左侧从图标轨/项目面板改为 Codex 桌面端式工作区侧栏:快捷入口、项目列表、当前项目任务、底部设置
- 去掉顶栏重复项目/任务标题,中央区域回归沉浸式对话;无结果数据时对话区铺满主工作区
- 订单管理、检查点/版本、会话结果收敛到右侧工具入口,结果视图按当前会话快照展示
- 新增会话节点导航:对话区最右侧生成消息节点,悬停显示节点摘要,点击滚动到对应消息
- 修复上一版左侧新结构缺少样式导致原生控件裸露的问题
- 修复右侧工具展开后的大面积空白:右侧工作区改为吃满剩余空间,竖向工具栏固定贴最右侧
- **涉及路径**:`apps/web/src/App.tsx` · `apps/web/src/projects/ProjectPanel.tsx` · `apps/web/src/chat/ChatPanel.tsx` · `apps/web/src/styles.css`
- **验证**:`npm run build` → 成功;`python -m pytest tests\golden -q` → **28 passed**
- **文档同步**:本文件
- **遗留**:左侧快捷入口后续可继续绑定真实“知识库管理”页面;当前先复用设置/集成入口
---
## 2026-07-16 — 首屏引导与操作口径专业化
- **类型**:fix + docs
- **做了什么**:
- 将对话首屏从口号式说明改为“排产工作流 / 方案评估 / 版本治理 / 视图分析”的业务化引导
- 快捷指令与命令面板改为计划员工作台口径,如“多策略方案对比”“查看当前KPI”“发布当前排产版本”
- 甘特空态、时间线空态、后端帮助和无版本提示统一为专业表达
- 增加旧欢迎语本地缓存迁移,命中“左边说,右边动”时自动替换新版欢迎语,不清空其他消息
- **涉及路径**:`apps/web/src/chat/ChatPanel.tsx` · `apps/web/src/App.tsx` · `apps/web/src/viewport/GanttView.tsx` · `apps/web/src/timeline/TimelineRail.tsx` · `server/aps_domain/workflow.py` · `server/aps_domain/reports.py`
- **验证**:`npm run build` → 成功;`python -m pytest tests\golden -q` → **28 passed**
- **文档同步**:本文件
- **遗留**:项目/任务默认名称后续可随真实项目模板继续行业化
---
## 2026-07-16 — OR-01 订单管理首切片 + 审计契约修复
- **类型**:feature + fix + docs
- **做了什么**:
- 新增订单领域服务:订单只读投影、成品校验、`order.upsert/cancel/complete` P2 写入逻辑
- 新增 `GET /api/orders` 与 `POST /api/orders/stage`,订单页面只暂存确认卡,批准仍统一走 `/api/actions/confirm`
- 前端新增订单管理面板:列表、编辑表单、新建/编辑/取消/完成、内嵌确认卡与批准/驳回
- 修复审计事件时间契约:新增 `at`,保留 `ts`,治理页与旧数据兼容
- 黄金测试新增 OR-01 覆盖:新增订单进入排产、取消订单排除、确认卡摘要、审计双字段
- 同步门禁矩阵、模块登记、产品状态、业务旅程与落地规格
- **涉及路径**:`server/aps_domain/orders.py` · `server/aps_domain/workflow.py` · `server/gateway/app.py` · `server/agent_core/audit.py` · `apps/web/src/orders/OrderPanel.tsx` · `apps/web/src/App.tsx` · `apps/web/src/api/*` · `tests/golden/test_order_management.py` · `docs/**`
- **验证**:`python -m pytest tests\golden -q` → **28 passed**;`npm run build` → 成功
- **文档同步**:`product/features.md` · `product/journeys.md` · `product/implementation-spec.md` · `architecture/harness.md` · `architecture/modules.md` · 本文件
- **遗留**:OR-01 后续仍缺多明细、批量变更、附件;OR-03 订单审核状态机未做
---
## 2026-07-16 — 产品功能落地规格补全
- **类型**:docs
- **做了什么**:
- 新增 `docs/product/implementation-spec.md`,按主数据、订单、排产、执行、对话治理拆出功能落地卡
- 为每个功能点补充用户目标、最小切片、权力等级、数据对象、API/动作、UI、验收与测试要求
- 在 `features.md` 增加落地规格编号,覆盖当前可演示能力、主数据、订单、排产引擎、结果执行、对话治理
- 更新 product 索引和大管家导航,产品评审可从功能清单跳到落地规格
- **涉及路径**:`docs/product/implementation-spec.md` · `docs/product/features.md` · `docs/product/README.md` · `docs/README.md`
- **验证**:文档链接与编号自检;未改运行代码,未跑业务测试
- **文档同步**:`product/*` · `docs/README.md` · 本文件
- **遗留**:后续实现任一功能时仍需同步 `journeys.md`、`harness.md` 或 `algorithm/*` 的对应落地细节
---
## 2026-07-16 — 文档体系重组(大管家 + 分类落地)
- **类型**:docs
- **做了什么**:
- 建立 `docs/README.md` 大管家入口与活文档铁律
- 按角色拆分:`product/` · `architecture/` · `algorithm/`
- `PROGRESS.md` → `CHANGELOG.md`;`HARNESS`/`REGEN`/`FEATURES` 迁入对应分类并校正「已落地 vs 规划」口径
- 种子工厂名改为「演示工厂」(去地域硬编码,与产品通用定位一致)
- **涉及路径**:`docs/**` · `plan.md` §12.9 · `README.md` · `server/state/seed.py`
- **验证**:文档结构自检;种子仅改展示名,不影响黄金测试键结构
- **文档同步**:本文件 · product/* · architecture/* · algorithm/* · 大管家
- **遗留**:`plan.md` 蓝图中仍有大量「目标态」章节,以 `docs/algorithm/` 与 `product/features.md` 的状态列为准
---
## 2026-07-16 — 产品化整改:缺陷修复 + 设置收敛 + 通用化
- **类型**:fix + feature + docs
- **做了什么**:
- 修复右侧无数据:`/api/gov/tests?run=true` 改为 `asyncio.to_thread`;前端 `refreshWorld` 逐端点兜底 + 3s 重试
- 导航收敛:轨道仅 项目/对话/时间线/设置;门禁与重生并入设置
- 前端种子项目改「演示项目(示例数据)」;顶栏「智能排产 · 通用行业版」
- 产出功能清单(后迁入 `product/features.md`)
- **涉及路径**:`server/gateway/golden.py` · `apps/web/src/**` · `docs/`
- **验证**:后端多端点 200;`npm run build` 通过
- **遗留**:订单/主数据管理页等见 `product/features.md` 差距清单
---
## 2026-07-16 — plan.md 深水区五问补全
- **类型**:docs
- **做了什么**:plan.md 增补约束体系、主控参数、方案优选、插单重排、小样本迁移等蓝图节(**目标态**,多数未进代码)
- **涉及路径**:`plan.md`
- **验证**:章节编号连贯
- **遗留**:落地以 `algorithm/scheduling-v1.md` 为准;蓝图能力标 🔜
---
## 2026-07-16 — UI 对标 Codex 操作
- **类型**:feature
- **做了什么**:新建任务前置、Kebab 菜单、任务重命名、多行输入、快捷指令收起
- **涉及路径**:`apps/web/src/projects/**` · `apps/web/src/chat/**` · `apps/web/src/shell/**`
- **验证**:`npm run build` 通过
- **遗留**:任务状态仍前端固定「运行中」
---
## 2026-07-16 — M3 知识与偏好
- **类型**:feature
- **做了什么**:知识资产库 + bigram 检索带出处;日报/版本对比报告;偏好加权缺省策略;意图与前端 evidence/report 块
- **涉及路径**:`server/knowledge/**` · `server/aps_domain/reports.py` · `apps/web/**` · `tests/golden/test_m3_knowledge.py`
- **验证**:`pytest tests/golden -q` → **24 passed**;`npm run build`;E2E M3 PASS
- **遗留**:真向量 RAG、会话树服务端化、上下文四层管理
---
## 2026-07-16 — M2.5 Codex 级产品表面 + 文档体系初建
- **类型**:feature + docs
- **做了什么**:治理端点、GovConsole、Ctrl+K、过程文档初版
- **验证**:黄金测试全绿;`npm run build`
- **遗留**:权力矩阵在线编辑 🔜 M4
---
## 2026-07-16 — M2 前端补完(项目制 + 折叠 + 分隔条)
- **类型**:feature
- **做了什么**:项目/任务/文件、折叠轨、分隔条、时间线回滚口令
- **验证**:当时黄金测试 15/15;构建通过
- **遗留**:项目数据仍在浏览器 localStorage
---
## 2026-07-15~16 — M2 后端(成对状态 + 沙盒 + 时间线)
- **类型**:feature
- **做了什么**:Checkpoint、Explore 沙盒对比、时间线/治理 API、审计链
- **验证**:15/15
---
## 2026-07-15 — M0 + M1(Monorepo + 左说右动闭环)
- **类型**:feature
- **做了什么**:FastAPI + React 壳、规则引擎、意图两级管线、Harness、三视图
- **验证**:当时 11/11;断 LLM 可降级
---
## 更早 — M-POC
- **类型**:chore
- **做了什么**:`poc/workbench.html` 静态左说右动验证