Type: task Status: claimed Label: ready-for-agent Labels: ready-for-agent, backend-execution, wayfinder:task Category: backend-execution Assignee: Kazerin Blocked by: None
票 18 真人闭环实测(2026-10-10,工单 WO202610101511303516)。
同一张工单在两处返回互相矛盾的「是否关联当前事件」:
| 端点 | associatedWithCurrentEvent |
eventAssociation |
|---|---|---|
GET /equipments/21119740/work-orders |
true |
{ALARM, cd57be42bd18d02f7d3390fb98539b93, 15:11:30} |
GET /work-orders/WO202610101511303516/timeline |
false |
null |
时间线侧缺少关联信息,设备侧完整。前端详情面板按「未关联当前报警明确提示」消费该字段,口径不一致会直接导致同一张工单在两个位置呈现相反结论。
associatedWithCurrentEvent 与 eventAssociation 的单一权威来源(关联键为 alarm_data.work_order_id = work_order.order_id,已由历史决策确证)。false、另一处省略。真实环境复验:上述三端点对 WO202610101511303516 返回一致的 associatedWithCurrentEvent=true 与同一 eventAssociation;编译 + Cockpit*Test 全绿 + 提交推送。
发现于票 18;承接决策票 01 的关联键结论。
Status: claimed,已调用 deck_issue_report 上报。ready-for-agent,无 needs-triage,无已有实施记录,无阻塞;所属 map 允许后端执行票实施。BusinessCockpitWorkOrderReadAdapter.loadByDevice 经 alarm_data.work_order_id = work_order.order_id 查询真实关联;旧 loadTimeline 未查关联,直接 toSummary(order, null, null, false);报警维度另有独立组装逻辑。alarmsByOrderId 与报警摘要转换;唯一真实关联为 true + 关联对象,未关联显式 false/null。按维护者裁定,重复报警引用同一工单抛类型化读取异常,三个入口返回 HTTP 500 + SERVER_ERROR,不选主报警。批量关联查询的 Spring DAO / MyBatis 持久化异常转换为相同失败契约。WARNING 分支和既有时间字段语义保持原实现。CockpitWorkOrderAssociationContractTest 共 7 个测试方法,经真实适配器贯穿 HTTP 三端点,覆盖正向一致性、报警单号别名与 SQL 查询条件、未关联、同设备串单隔离、未知工单、重复关联正反序及两个真实数据库异常类型;旧适配器测试补共享反查数据桩。本轮未执行测试,不能称通过。E:\pipe-ner-server / master / 894402a,已推 origin/master(0a6b108..894402a);提交限定适配器、两个测试文件和所属领域词汇,共 4 文件。未夹带并行会话的 monitoring 改动。git diff --check 通过。静态复核不等于编译或测试通过。Cockpit*Test 与真实环境调试。下一步在用户明确要求验证后执行 Maven 契约测试、加载本票提交,复验目标工单三端点 true 与完整同一关联对象;步骤见 待验收说明。全部票面验收有证据后才能 close、完成上报并追加 map gist。维护者本轮 grilling 选择:坚持一对一,重复关联报错。多个报警引用同一工单时,设备、ALARM 事件和时间线均须明确失败,不默认取最早、最新或首条报警;不新增数据库约束,不修改现有关联数据。
DataAccessResourceFailureException / PersistenceException,用于断言适配器转换后三个入口返回 HTTP 500 + SERVER_ERROR;报警单号回退补 SQL 字段与参数断言。