aps-agent/docs/round-87-independent-audit.md

93 lines
10 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 第87轮独立审查记录
审查日期:2026-09-09。审查人W2;主数据实现本人是owner,因此本人主数据修复只提供自检,最终由主控独立复核。W1、W3和主控代码按只读方式检查,并用隔离world/内存源文件副本直接复现,不以通过计数代替事实。
## 当前结论
**AUDIT: PASS(本报告审查范围)**。初审7项发现全部关闭:A1/A2/A5经W3修复后直接复验;A6/A7经主控修复后直接复验;A3在汇合树`5f1ea09`修复后直接复验;A4由owner修复、主控独立复核。对root最终汇合树运行真实导入、真实API、主数据一致性与严格消费组合57项全部通过,无跳过。
这个结论不替代整轮交付门禁:主控仍需确认最终完整全量回归与浏览器最后一次复跑结果。首轮全量曾暴露机器路径/外部夹具与脚本接口问题,不将其修复中状态写成已经全量通过。
本轮不要求原表缺失的生产事实凭空补齐;正确行为是保留原值、阻断受影响订单,明确标记的隔离补充场景再验证维护影响方案。
## 发现与复现
### A1 [P1] 分批在制被覆盖;执行中余量未确认仍放行后序
- 位置:`server/engines/pool_engine.py:259`(operationCode字典只留最后条);修复入口 `server/aps_domain/masterdata_consumption.py:63`。
- 触发:订单10件、CUT两条不同taskNo在制,第一条RUNNING已完成3/剩余2/预计10:00结束,第二条WAITING剩余5。旧 `order_execution_issues=[]`,输出FEASIBLE且再次CUT10和BEND10。分批事实丢失,已完成与正在加工部分被重复排。
- 单条RUNNING如果明确完成3+剩余2,订单10仍直接跳过CUT并给BEND10,同样把局部进度当成整单完成。
- 建议:本轮不猜分批合并;同订单同工序多批明确阻断,单RUNNING要求整道工序余量确认且完成+余量=订单量;设备占用保守保留。
- 修复复验:W3新增 `WIP_SPLIT_UNSUPPORTED/WIP_REMAINING_UNCONFIRMED/WIP_QUANTITY_UNCONFIRMED`。同原场景输出BLOCKED、0工单,同时保留占用;复验通过。
### A2 [P2] 缺料检查说可排,实际试排却阻断
- 位置:`server/aps_domain/readiness.py:106`、`:116`。
- 触发:严格场景1单,BOM需要10.2件、库存0/在途0。初审检查summary为ready1/blocked0,而Pool输出BLOCKED、0工单。
- 影响:再次出现用户所说的检查和执行逻辑不一致。
- 修复复验:W3 strict资料缺档/缺口改为error。同场景readiness.ready=0,solve=BLOCKED,复验通过。多个订单共享供应的最终先后仍由求解排序决定,基础检查不应虚称全局可行。
### A3 [P1] 新版完整工作簿少了一道工序,采用后旧工序仍参与排产
- 位置:`server/importers/ruiyang_aps.py:448`、`:455`;同SHA幂等守卫`:444`只处理相同文件。
- 触发:先导入指定真实工作簿,再只在内存副本删除“工艺路线”第6行。新SHA预览canCommit=true、entityCounts.routing=14;批准采用后flexRoutings=15、classic routingSteps=15。
- 影响:用户已确认新快照,结果仍混用旧快照残留的步骤。同样的upsert模式用于设备、人员、BOM和在制,缺少删除/撤销的版本语义。
- 建议:本轮可保守拒绝已采用profile的不同SHA替换,并明确到新项目核对;完整增量更新需先呈现来源范围内差异、确认删除/停用,保留手工覆盖与历史版本。不能对整表无条件清空。
- 修复复验:W1 `e703078`(root汇合为`5f1ea09`)在候选构造前检查intakeSources和planningContext来源身份,同profile不同SHA明确拒绝,相同SHA保留幂等。独立用原复现的删工序副本再次验证:预览合法/14步,原项目采用被拒绝且world逐值不变;聊天入口直接说明独立项目核对、不出确认卡、不排旧新混合数据;空独立项目普通/柔性都精确14步。新增设备16台变体与身份fallback包含在独立运行的57项组合中。关闭。
### A4 [P1] 真实设备区域映射失败,区域日历编辑扩大到全部设备
- 位置:`server/importers/ruiyang_aps.py:98`产生`zone`;初版 `server/aps_domain/masterdata_sync.py:231`只读取`zoneCode`。
- 触发:实际源15设备,区域分布ZONE-A14、ZONE-D1;经典主数据仅有`IMPORT:UNASSIGNED`一条line,全部设备混在一起。
- 影响:用户按区域/产线建立周末日历时不能按实际区域限定对象,维护范围与真实资源不符。
- Owner修复:`666683b`兼容zone/zoneCode,仅纠正本helper生成的IMPORT工位关系;真正存量工位关联保持。真实回归验证14:1,给ZONE-D建周末模板只影响1台设备,48项组合自检通过。
- 状态:该实现属于本审查人owner范围,由主控独立检查zone字段与范围映射,并独立运行真实工作流/主数据/引导29项通过;主控确认ZONE-D仅对应单台设备。依据主控复核关闭,本审查人未以自己的owner自检替代独立验收。
### A5 [P2] 跨午夜班次的凌晨休息未扣除
- 位置:`server/aps_domain/masterdata_consumption.py:134`及`:143`。
- 触发:班次22:00至次日06:00,休息01:00至02:00。初版interval返回连续22:00至次日06:00,凌晨休息被绑定到前一日期而遗漏。
- 影响:跨夜工厂会在休息时段安排加工。本指定源晚班18:00至22:00且默认关闭,原表不受该边界影响。
- 修复复验:W3修正休息跨日offset;直接返回22:00至次日01:00、次日02:00至06:00,复验通过。
### A6 [P2] 已维护的资料复查仍反复提示原文件缺项
- 位置:`server/aps_domain/planning_intake.py:35`、`:36`和`:50`。
- 触发:实际导入后在隔离world补入明确TEST-PAINT技能记录,当前确有PAINT人员。再次调用profile_intake_reply(adopted=true),返回诊断仍含3条NO_PERSONNEL_SKILL,因为diagnostics来自磁盘原文件batch,没有使用当前主数据。
- 影响:用户补完数据再问“分析一下”,继续被要求补同样的信息,会误认为修改无效。当前block的业务数量也仍取原源表快照。
- 建议:采用前展示源文件检查;采用后区分“原文件来源说明”和“当前待处理问题”,当前问题从check_readiness(world)生成,保留原来源可展开。
- 状态:主控改为采用后读取当前readiness,原始诊断移入sourceDiagnostics。独立复验当前NO_PERSONNEL_SKILL=0、原来源记录=3;UI将原记录单独折叠,标明可能已处理。关闭。
### A7 [P2] 原表5单全部受阻却回执未排0项并鼓励下载完整计划
- 位置:`server/aps_domain/workflow.py:2078`、`:2093`;`_run_flex`结果块未传trialOnly。
- 触发:直接在隔离Store对真实工作簿执行_run_flex,版本orderCount=5、woCount=0、conflictCount=9;回复写“制造需求0项,准入0项,未排0项”,随后“下载Excel工作计划表可导出完整工序计划”。
- 原因:回执读取只有闭环V2才提供的demandCount/admittedDemandCount/unscheduledDemandCount,新的Pool严格试排返回orderCount/blockedOrderCount,字段合同未对齐。
- 建议:POOL_TRIAL按实际订单、成功订单与阻断订单统计,显示“5单待处理、0单排出”;没有工单时提供问题清单,不暗示已有完整生产计划;保留trialOnly/productionReady=false标识。
- 状态:主控针对本profile回执按实际orderCount/vlCount统计,真实API返回5单/已安排0/待处理5、0工单、trialOnly=true、无下载链接,不再显示完整工序计划。关闭。
## 最终入口复验补充
- 主控真实上传→聊天检查→确认采用→主数据维护→再次检查/试排API测试5项全部通过。
- 独立脚本用实际源表、明确测试PAINT人员和库存补充,只选择原表已明确CUT完成的SO-001。将apply_import_commit替换为“任何调用即报错”,再两次执行已采用profile的folder.schedule;两次均4工单,普通维护BEND工时后88.9→177.8分钟,旧版本与旧工单逐值不变,证明没有回灌原文件覆盖维护。
- 真实harness.stage_confirmation保存16个完整batch后修改原预览对象,pending的batch保持逐值一致,16表SHA均与sourceSha256一致;篡改复制的pending嵌套batch后verify_confirmation_envelope拒绝,说明没有把审批数据简化或变形。出卡时主数据仍空。
- 既有审批深拷贝持久化专项另跑1项通过。本次独立脚本显式关闭临时数据库句柄,退出无清理错误。
## 审查确认的有效边界
- W1按16表结构识别并保留SHA、sheet、row和原始值,不执行工作簿文字里的历史加载指令;原文件未修改。
- 完整profile使用候选world,验证失败不发布半份主数据;SO-006不混入5张正式订单,相同SHA采用不覆盖人工维护。
- 主控聊天附件先调用项目完整文件上传,再发起分析;不再把每表两行样例当完整数据。上传失败保留draft并不自动分析;会话切换后不把旧会话上传结果带入新会话。
- 采用资料明确P2确认,排产作为后续用户动作;run_flex保存独立inputSnapshot,示例工时来源未升级为现场已确认值。
- 严格消费使用真实到货日期,不再统一“+3天”;同一计划内共享库存预留,设备维护/WIP占用、单个人员并发、日期日历参与排程。
- 源文件库存仍属于2026-08-04场景快照,不代表2026-09-09实时库存;回放语义来自planningContext,验收没有向ERP/MES/WMS写入。
- 非演示试排缺SchedulingProblemV2/SolutionV2证据时,现有MES校验不会放行发布;未据此声称完成工厂联调。
## 未覆盖
本审查未操作浏览器。页面上传、确认、编辑、刷新、展示需由W1/主控浏览器验收完成。没有全应用压力、外部工厂联调、真实生产计划放行验证。A4 owner修复与其测试由主控独立验收。
主控另报告浏览器两个视口业务流程与console检查2项通过,并新增待采用资料时隐藏快捷排产的断言待最终复跑;本报告不把尚未结束的复跑写成通过。最终全量门禁同样由主控确认。
一次隔离_run_flex脚本退出时Windows文件句柄导致临时测试目录未自动清理;尝试清理该精确临时目录被工具自动审批拒绝(blocked by policy),未改用其他方式绕过。真实源表、用户DB和服务没有写入。