# 模块 1:案例引子:从状态变更提取资产原料
“取消原因不能为空”看起来只是一个字段校验,实际却处在派车、车辆、司机和行程状态交汇的位置。 这里不讨论如何完成这一项改动,而是用它识别后续可沉淀的约束、提问框架与验证方法。
申请
派车
车辆 / 司机
行程
--- # 公务用车模块中的三条状态线
| 对象 | 正常演进 | 取消或完成后的变化 | |---|---|---| | 申请 | `DRAFT -> PROCESSING -> COMPLETED` | 取消回到 `CANCELLED` | | 派车 | `DISPATCHED -> COMPLETED` | 取消变为 `CANCELLED` | | 车辆 | `AVAILABLE -> RESERVED -> IN_USE` | 取消或行程完成后回到 `AVAILABLE` | | 司机 | `AVAILABLE -> ON_TASK` | 行程完成后回到 `AVAILABLE` |
一个派车动作会改变多个对象;校验位置错了,错误状态就会扩散。
--- # 取消派车的真实调用链
```text 取消按钮(仅 DISPATCHED 状态可见) -> 取消弹窗(cancelReason 必填) -> POST /official/vehicle/dispatch/cancel -> Controller(权限 + 审计) -> DispatchService.cancel -> 派车状态 CANCELLED + 车辆状态 AVAILABLE ```
前端:减少误操作
权限:限制谁能调用
Service:保护业务状态
--- # 把业务语言变成可验证的目标
| 业务表达 | 可验证的技术表达 | |---|---| | 取消必须写原因 | `cancelReason` 不能是 `null`、空串或全空白 | | 不允许无效取消 | 在读取派车记录、更新派车和释放车辆之前拒绝请求 | | 不能影响正常取消 | 非空原因仍沿用原有状态更新与资源释放逻辑 | | 不扩大改动 | 不改变权限、审计、页面交互、数据库字段或行程协议 |
目标越可验证,TRAE 越不容易把一个小需求扩写成跨层重构。
--- # 从案例中提取资产原料
项目事实
状态、入口、权限、写入顺序和测试结构。
重复判断
哪些结论下次同类任务仍然需要重新做。
可沉淀资产
Rule、Prompt、Skill、检查单和反例各自承接什么。