# 🔴 AgentForge 铁律(不可违反) > 所有智能体在处理任何任务时必须遵守。违反任何一条 = 阻断提交。 > 唯一源头文件:修改此文件后所有智能体自动生效。 --- ## 一、Bug 状态管理 - **已关闭/已解决的 Bug 禁止处理** — 处理前检查禅道 status,resolved/closed 直接跳过 - **人类提的 Bug 只加备注不改状态** — reporter 是人类账号时,不改 status、不改 assignedTo - **智能体提的 Bug 可改分配和加备注** — 状态变更等测试通过后由华佗确认 - **每个修复必须有 git commit** — 格式: `fix(#bug_id): 简要描述` - **🔴 修复完成必须提交** — `git add --all && git commit && git push`,未提交=没修 - **🔴 修复必须合并到 develop** — 工作树 commit ≠ 生效,必须 cherry-pick/merge 到 develop - **🔴 未合并到 develop 的修复等于没修** — 验收时检查 develop 上是否有该 commit - **🔴 修复必须编译部署后才算完成** — `mvn package` → `systemctl restart` → 验证启动时间 --- ## 二、修复流程 - **一次只修一个 Bug**,不扩大范围 - **修前必须完整获取 Bug 全部信息** — 描述、复现步骤、所有截图/附件、所有备注历史。禁止只看标题就写代码 - **修复前必须读 AGENTS.md** - **修复后必须验证编译** — `mvn compile` / `vue-tsc --noEmit` 0 error - **commit 前必须验证** — 编译通过 + 无新增 lint 警告 --- ## 三、全链路 6 环分析 涉及数据库字段的 Bug 必须走完整链路: ``` 前端/页面 → Controller → Service → Mapper → DB/SQL → 关联模块 ①录入 ②验证 ③业务 ④持久化 ⑤存储 ⑥联动 ``` --- ## 四、状态值一致性(来自 Bug #574 教训) 修改任何状态值前,**必须**列出完整链路并逐项检查: 1. 枚举定义(如 `SlotStatus`)的值 2. Service 层设置的状态值是否与枚举一致 3. 查询/列表接口的状态映射是否覆盖所有枚举值 4. 前端 `STATUS_CLASS_MAP` 是否包含新状态 5. 前端过滤条件(`v-if`、`v-for`)是否兼容新状态 6. 池/统计表的聚合 SQL 是否包含新状态值 **禁止**:只改一端不检查其他端。 --- ## 五、状态变更影响面分析(来自 Bug #574→575 教训) 改任何状态枚举值前,**必须**执行影响面分析: 1. `rg "原状态枚举名" --type java` 列出所有引用文件 2. 逐个检查:设置值?查询过滤?显示映射?统计聚合? 3. 检查逆向流程:退号、取消、停诊是否兼容新状态 4. 检查 XML mapper 中所有查询过滤条件 5. 检查前端所有 v-if/v-for/disabled 条件 **禁止**:只改正向流程不验逆向流程。 --- ## 六、逆向流程验证(来自 Bug #575 教训) 涉及状态流转的 Bug,验证时**必须**覆盖: - 正向:预约→签到→就诊→完成 - 逆向:退号、取消预约、停诊、退费 - 边界:并发操作、重复操作、异常中断 **禁止**:只测正向流程就标记"修复完成"。 --- ## 七、全链路验证(状态流转 Bug 必做) 修复后按以下顺序验证,**编译通过不等于修复完成**: ``` ① 数据库:SELECT status FROM table WHERE id = ? → 确认写入正确 ② 后端接口:检查所有 if/switch 分支 → 确认映射正确 ③ 前端显示:检查 STATUS_CLASS_MAP → 确认文本正确 ④ 前端交互:检查 v-if/v-for/disabled → 确认按钮状态正确 ⑤ 统计数据:检查聚合 SQL → 确认统计包含新状态 ``` --- ## 八、池/统计表同步(来自 Bug #574 反复修复教训) - **任何状态变更必须同步更新关联统计表** - 检查清单: 1. 状态变更后,哪些统计字段需要更新? 2. 是原子递增/递减,还是全量重算? 3. 并发安全:用 `SET field = field + 1` 还是先查后改? 4. 逆向操作(退号/取消)是否正确回滚统计? - **禁止**:只改状态不改统计,或只改统计不改状态 --- ## 九、统计变更必须验证实际值(来自 Bug #575 教训) - 修改统计逻辑后,**必须查数据库验证实际值** - `SELECT booked_num, locked_num FROM adm_schedule_pool WHERE id = ?` - 对比操作前后的值,确认统计正确 - **禁止**:改了统计逻辑不查数据库验证 --- ## 十、禁止删除源文件 - **绝对禁止**删除项目中已有的 Java/Vue/SQL 源文件 - 编译错误 → 修复错误,不删除文件 - 重复文件 → 重构合并,不删除文件 - AI 幻觉文件 → 检查 `git ls-tree baseline -- ` 确认后再删除 - **唯一例外**:人类明确确认删除 --- ## 十一、禁止修改已有公开方法签名 - 不能删除或重命名已有的 public 方法 - 不能修改已有方法的参数列表 - 需要新功能 → 添加重载方法 - 需要改行为 → 修改方法内部实现 --- ## 十二、搜索所有相关代码路径 修复前必须用 `rg` 搜索: ``` rg "状态枚举名|相关方法名|相关字段名" --type java --type vue ``` 确保不遗漏任何引用路径。 --- ## 十三、数据库铁律 - **修前必须查询真实数据库** — 确认表结构、字段约束、索引 - **禁止凭猜测写 SQL** — 先 `\d table_name` 查看表结构 - **修改 SQL 后必须验证** — `EXPLAIN` 或实际查询验证语法 - **NOT NULL 约束必须检查** — INSERT/UPDATE 前先查 `is_nullable` - **关联表必须查完整** — 涉及 JOIN 查所有关联表结构和外键 - **涉及 SQL 必须先查真实数据库** --- ## 十四、测试铁律 - Playwright 必须 `--workers=1` - 超时 120 秒,最多重试 3 次 - 测试失败自动重试,超过 3 次通知人工介入 - 测试结果写入禅道备注 - **DB审查失败自动回退** — 路由回原修复智能体 --- ## 十五、归档铁律 - **三重写入** — Git + SQLite + Redis - SQLite 必须使用完整字段 - 禅道备注格式:`[📝 陈琳归档] Bug #xxx` - 归档报告必须包含:基本信息 + 根因分析 + 修复文件 + 流程时间线 --- ## 十六、禅道交互 - 备注使用 resolve+activate workaround - 不直接调用 comment API(会 404) - 图片附件必须 OCR 读取 --- ## 十七、质量门禁 - L1: 编译通过 - L2: 测试通过 - L3: DB审查通过 - L4: 验收通过 - L5: 归档完成 --- ## 过往教训 | Bug | 教训 | 根因 | |---|---|---| | #574 | 状态值 BOOKED(1)→应为 CHECKED_IN(3),前端映射缺失 | 没走完整状态链路 | | #574 | AI 看到编译错误直接删文件 | 没检查 git baseline | | #574 | 多次 fallback 修错文件(OrderServiceImpl) | 没用 rg 搜索所有引用 | | #574 | 签到后 booked_num 未累加 | 只改状态没改统计 | | #575 | 改了签到状态没检查退号流程 | 只验正向不验逆向 | | #575 | booked_num 应在预约时累加而非签到时 | 统计变更未验证实际值 | | — | 修复完成未提交到 develop | 框架未强制验证提交 | | — | 退号流程只检查 BOOKED(1) 不兼容 CHECKED_IN(3) | 状态变更影响面分析缺失 | --- ## 十八、禁止硬编码业务默认值(来自 Bug #617 教训) - **禁止**在提交参数中硬编码业务默认值(如 `contractNo: '0000'`) - 必须使用用户在表单中选择的值,硬编码值仅作为 fallback - 检查清单: 1. 表单字段是否有 `v-model` 绑定? 2. 构建提交参数时是否使用了绑定值? 3. 提交后是否覆盖了用户选择? - **禁止**:用户选了医保,提交时却写死为自费 --- ## 过往教训(补充) | Bug | 教训 | 根因 | |---|---|---| | #617 | 费用性质硬编码为 '0000'(自费),用户选医保无效 | 构建参数时写死默认值 | --- ## 十九、前端验证铁律 - **提交前必须编译前端** — `npm run build` 或 `npx vite build` 通过才算完成 - **禁止只改 .vue 文件不验证编译** — 改完必须跑一次编译确认无报错 - **SCSS 括号闭合必须检查** — `