@chenmk/superflow 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (198) hide show
  1. package/INSTALL.en.md +106 -0
  2. package/INSTALL.md +664 -0
  3. package/LICENSE +21 -0
  4. package/README.md +142 -0
  5. package/README.zh-CN.md +117 -0
  6. package/assets/context-templates/business-rules.md +98 -0
  7. package/assets/context-templates/decisions.md +153 -0
  8. package/assets/context-templates/external-systems.md +166 -0
  9. package/assets/context-templates/incidents.md +89 -0
  10. package/assets/manifest.json +53 -0
  11. package/assets/prompts/superflow-archive.md +9 -0
  12. package/assets/prompts/superflow-clarify.md +10 -0
  13. package/assets/prompts/superflow-design.md +10 -0
  14. package/assets/prompts/superflow-docs.md +10 -0
  15. package/assets/prompts/superflow-implement.md +10 -0
  16. package/assets/prompts/superflow-pipeline.md +13 -0
  17. package/assets/prompts/superflow-verify.md +10 -0
  18. package/assets/rules/superflow-phase-guard.md +50 -0
  19. package/assets/scripts/claude-auto-backup-hook.sh +313 -0
  20. package/assets/scripts/codex-auto-backup-hook.sh +361 -0
  21. package/assets/scripts/install-sql-pre-commit.sh +44 -0
  22. package/assets/scripts/superflow-contract-hooks.sh +744 -0
  23. package/assets/scripts/superflow-delivery-check.sh +315 -0
  24. package/assets/scripts/superflow-dependency-update-hook.sh +161 -0
  25. package/assets/scripts/superflow-enforce-hook.sh +70 -0
  26. package/assets/scripts/superflow-hook-guard.sh +132 -0
  27. package/assets/scripts/superflow-integration-evidence-hook.sh +80 -0
  28. package/assets/scripts/superflow-sql-sync-hook.py +950 -0
  29. package/assets/scripts/superflow-test-report-lint.py +433 -0
  30. package/assets/scripts/superflow-verify-integration.sh +90 -0
  31. package/assets/scripts/sync-settings-json.py +52 -0
  32. package/assets/skills/api-doc-changelog/SKILL.md +193 -0
  33. package/assets/skills/openspec-apply-change/SKILL.md +156 -0
  34. package/assets/skills/openspec-archive-change/SKILL.md +114 -0
  35. package/assets/skills/openspec-explore/SKILL.md +288 -0
  36. package/assets/skills/openspec-propose/SKILL.md +110 -0
  37. package/assets/skills/superflow-archive/SKILL.md +61 -0
  38. package/assets/skills/superflow-clarify/SKILL.md +146 -0
  39. package/assets/skills/superflow-clarify/agents/openai.yaml +4 -0
  40. package/assets/skills/superflow-design/SKILL.md +83 -0
  41. package/assets/skills/superflow-design/agents/openai.yaml +4 -0
  42. package/assets/skills/superflow-docs/SKILL.md +316 -0
  43. package/assets/skills/superflow-docs/agents/openai.yaml +4 -0
  44. package/assets/skills/superflow-hotfix/SKILL.md +48 -0
  45. package/assets/skills/superflow-implement/SKILL.md +461 -0
  46. package/assets/skills/superflow-implement/agents/openai.yaml +4 -0
  47. package/assets/skills/superflow-pipeline/SKILL.md +844 -0
  48. package/assets/skills/superflow-pipeline/agents/openai.yaml +4 -0
  49. package/assets/skills/superflow-pipeline/references/api-design-template.md +431 -0
  50. package/assets/skills/superflow-pipeline/references/architecture-design-template.md +119 -0
  51. package/assets/skills/superflow-pipeline/references/batch-prompt-template.md +536 -0
  52. package/assets/skills/superflow-pipeline/references/batch-split-guide.md +140 -0
  53. package/assets/skills/superflow-pipeline/references/decision-point.md +30 -0
  54. package/assets/skills/superflow-pipeline/references/dirty-worktree.md +35 -0
  55. package/assets/skills/superflow-pipeline/references/document-templates.md +123 -0
  56. package/assets/skills/superflow-pipeline/references/feature-gated-workflow.md +124 -0
  57. package/assets/skills/superflow-pipeline/references/implementation-prompt-template.md +1056 -0
  58. package/assets/skills/superflow-pipeline/references/mock-strategy-guide.md +86 -0
  59. package/assets/skills/superflow-pipeline/references/openspec-format.md +57 -0
  60. package/assets/skills/superflow-pipeline/references/orchestration.md +639 -0
  61. package/assets/skills/superflow-pipeline/references/p0-baseline-template.md +174 -0
  62. package/assets/skills/superflow-pipeline/references/project-config.md +40 -0
  63. package/assets/skills/superflow-pipeline/references/prompt-usage-template.md +152 -0
  64. package/assets/skills/superflow-pipeline/references/quality-gate.md +299 -0
  65. package/assets/skills/superflow-pipeline/references/quality-standards.md +190 -0
  66. package/assets/skills/superflow-pipeline/references/reviewer-checklist.md +154 -0
  67. package/assets/skills/superflow-pipeline/references/sql-risk-review-checklist.md +323 -0
  68. package/assets/skills/superflow-pipeline/references/subagent-progress.md +90 -0
  69. package/assets/skills/superflow-pipeline/references/superpower-technical-design-template.md +125 -0
  70. package/assets/skills/superflow-pipeline/references/test-execution-template.md +220 -0
  71. package/assets/skills/superflow-pipeline/references/test-guide.md +30 -0
  72. package/assets/skills/superflow-pipeline/references/traceability-matrix.md +106 -0
  73. package/assets/skills/superflow-pipeline/references/validation-integrity.md +134 -0
  74. package/assets/skills/superflow-pipeline/scripts/superflow-archive.sh +178 -0
  75. package/assets/skills/superflow-pipeline/scripts/superflow-env.sh +118 -0
  76. package/assets/skills/superflow-pipeline/scripts/superflow-guard.sh +428 -0
  77. package/assets/skills/superflow-pipeline/scripts/superflow-handoff.sh +296 -0
  78. package/assets/skills/superflow-pipeline/scripts/superflow-state.sh +574 -0
  79. package/assets/skills/superflow-pipeline/scripts/superflow-status.sh +172 -0
  80. package/assets/skills/superflow-pipeline/scripts/superflow-yaml-validate.sh +138 -0
  81. package/assets/skills/superflow-table-impact-analysis/SKILL.md +77 -0
  82. package/assets/skills/superflow-tweak/SKILL.md +46 -0
  83. package/assets/skills/superflow-verify/SKILL.md +112 -0
  84. package/assets/skills-en/api-doc-changelog/SKILL.md +193 -0
  85. package/assets/skills-en/openspec-apply-change/SKILL.md +156 -0
  86. package/assets/skills-en/openspec-archive-change/SKILL.md +114 -0
  87. package/assets/skills-en/openspec-explore/SKILL.md +288 -0
  88. package/assets/skills-en/openspec-propose/SKILL.md +110 -0
  89. package/assets/skills-en/superflow-archive/SKILL.md +61 -0
  90. package/assets/skills-en/superflow-clarify/SKILL.md +146 -0
  91. package/assets/skills-en/superflow-clarify/agents/openai.yaml +4 -0
  92. package/assets/skills-en/superflow-design/SKILL.md +83 -0
  93. package/assets/skills-en/superflow-design/agents/openai.yaml +4 -0
  94. package/assets/skills-en/superflow-docs/SKILL.md +316 -0
  95. package/assets/skills-en/superflow-docs/agents/openai.yaml +4 -0
  96. package/assets/skills-en/superflow-hotfix/SKILL.md +48 -0
  97. package/assets/skills-en/superflow-implement/SKILL.md +461 -0
  98. package/assets/skills-en/superflow-implement/agents/openai.yaml +4 -0
  99. package/assets/skills-en/superflow-pipeline/SKILL.md +844 -0
  100. package/assets/skills-en/superflow-pipeline/agents/openai.yaml +4 -0
  101. package/assets/skills-en/superflow-pipeline/references/api-design-template.md +431 -0
  102. package/assets/skills-en/superflow-pipeline/references/architecture-design-template.md +119 -0
  103. package/assets/skills-en/superflow-pipeline/references/batch-prompt-template.md +536 -0
  104. package/assets/skills-en/superflow-pipeline/references/batch-split-guide.md +140 -0
  105. package/assets/skills-en/superflow-pipeline/references/decision-point.md +30 -0
  106. package/assets/skills-en/superflow-pipeline/references/dirty-worktree.md +35 -0
  107. package/assets/skills-en/superflow-pipeline/references/document-templates.md +123 -0
  108. package/assets/skills-en/superflow-pipeline/references/feature-gated-workflow.md +124 -0
  109. package/assets/skills-en/superflow-pipeline/references/implementation-prompt-template.md +1056 -0
  110. package/assets/skills-en/superflow-pipeline/references/mock-strategy-guide.md +86 -0
  111. package/assets/skills-en/superflow-pipeline/references/openspec-format.md +57 -0
  112. package/assets/skills-en/superflow-pipeline/references/orchestration.md +639 -0
  113. package/assets/skills-en/superflow-pipeline/references/p0-baseline-template.md +174 -0
  114. package/assets/skills-en/superflow-pipeline/references/project-config.md +40 -0
  115. package/assets/skills-en/superflow-pipeline/references/prompt-usage-template.md +152 -0
  116. package/assets/skills-en/superflow-pipeline/references/quality-gate.md +299 -0
  117. package/assets/skills-en/superflow-pipeline/references/quality-standards.md +190 -0
  118. package/assets/skills-en/superflow-pipeline/references/reviewer-checklist.md +154 -0
  119. package/assets/skills-en/superflow-pipeline/references/sql-risk-review-checklist.md +323 -0
  120. package/assets/skills-en/superflow-pipeline/references/subagent-progress.md +90 -0
  121. package/assets/skills-en/superflow-pipeline/references/superpower-technical-design-template.md +125 -0
  122. package/assets/skills-en/superflow-pipeline/references/test-execution-template.md +220 -0
  123. package/assets/skills-en/superflow-pipeline/references/test-guide.md +30 -0
  124. package/assets/skills-en/superflow-pipeline/references/traceability-matrix.md +106 -0
  125. package/assets/skills-en/superflow-pipeline/references/validation-integrity.md +134 -0
  126. package/assets/skills-en/superflow-pipeline/scripts/superflow-archive.sh +178 -0
  127. package/assets/skills-en/superflow-pipeline/scripts/superflow-env.sh +118 -0
  128. package/assets/skills-en/superflow-pipeline/scripts/superflow-guard.sh +428 -0
  129. package/assets/skills-en/superflow-pipeline/scripts/superflow-handoff.sh +296 -0
  130. package/assets/skills-en/superflow-pipeline/scripts/superflow-state.sh +574 -0
  131. package/assets/skills-en/superflow-pipeline/scripts/superflow-status.sh +172 -0
  132. package/assets/skills-en/superflow-pipeline/scripts/superflow-yaml-validate.sh +138 -0
  133. package/assets/skills-en/superflow-table-impact-analysis/SKILL.md +77 -0
  134. package/assets/skills-en/superflow-tweak/SKILL.md +46 -0
  135. package/assets/skills-en/superflow-verify/SKILL.md +112 -0
  136. package/dist/cli/index.js +186 -0
  137. package/dist/cli/index.js.map +1 -0
  138. package/dist/commands/archive.js +6 -0
  139. package/dist/commands/archive.js.map +1 -0
  140. package/dist/commands/clarify.js +6 -0
  141. package/dist/commands/clarify.js.map +1 -0
  142. package/dist/commands/design.js +6 -0
  143. package/dist/commands/design.js.map +1 -0
  144. package/dist/commands/docs.js +6 -0
  145. package/dist/commands/docs.js.map +1 -0
  146. package/dist/commands/doctor.js +473 -0
  147. package/dist/commands/doctor.js.map +1 -0
  148. package/dist/commands/implement.js +6 -0
  149. package/dist/commands/implement.js.map +1 -0
  150. package/dist/commands/init.js +471 -0
  151. package/dist/commands/init.js.map +1 -0
  152. package/dist/commands/pipeline.js +6 -0
  153. package/dist/commands/pipeline.js.map +1 -0
  154. package/dist/commands/scan.js +59 -0
  155. package/dist/commands/scan.js.map +1 -0
  156. package/dist/commands/status.js +173 -0
  157. package/dist/commands/status.js.map +1 -0
  158. package/dist/commands/uninstall.js +213 -0
  159. package/dist/commands/uninstall.js.map +1 -0
  160. package/dist/commands/update.js +187 -0
  161. package/dist/commands/update.js.map +1 -0
  162. package/dist/commands/verify.js +6 -0
  163. package/dist/commands/verify.js.map +1 -0
  164. package/dist/core/assets.js +27 -0
  165. package/dist/core/assets.js.map +1 -0
  166. package/dist/core/context.js +100 -0
  167. package/dist/core/context.js.map +1 -0
  168. package/dist/core/dependencies.js +146 -0
  169. package/dist/core/dependencies.js.map +1 -0
  170. package/dist/core/detect.js +71 -0
  171. package/dist/core/detect.js.map +1 -0
  172. package/dist/core/i18n.js +103 -0
  173. package/dist/core/i18n.js.map +1 -0
  174. package/dist/core/integrity.js +46 -0
  175. package/dist/core/integrity.js.map +1 -0
  176. package/dist/core/manifest.js +18 -0
  177. package/dist/core/manifest.js.map +1 -0
  178. package/dist/core/prompts.js +20 -0
  179. package/dist/core/prompts.js.map +1 -0
  180. package/dist/core/registry.js +134 -0
  181. package/dist/core/registry.js.map +1 -0
  182. package/dist/core/rules.js +17 -0
  183. package/dist/core/rules.js.map +1 -0
  184. package/dist/core/scripts.js +40 -0
  185. package/dist/core/scripts.js.map +1 -0
  186. package/dist/core/skill-check.js +31 -0
  187. package/dist/core/skill-check.js.map +1 -0
  188. package/dist/core/skills.js +56 -0
  189. package/dist/core/skills.js.map +1 -0
  190. package/dist/core/state.js +43 -0
  191. package/dist/core/state.js.map +1 -0
  192. package/dist/types.js +2 -0
  193. package/dist/types.js.map +1 -0
  194. package/dist/utils/path.js +11 -0
  195. package/dist/utils/path.js.map +1 -0
  196. package/dist/utils/shell.js +29 -0
  197. package/dist/utils/shell.js.map +1 -0
  198. package/package.json +60 -0
@@ -0,0 +1,154 @@
1
+ # 代码评审清单
2
+
3
+ ## 使用方式
4
+
5
+ 每批实现完成后,Reviewer Agent 按此清单逐条检查。任一检查项未通过,不得进入下一批次。
6
+
7
+ ---
8
+
9
+ ## 数据一致性检查
10
+
11
+ | # | 检查项 | 检查方法 | 通过标准 |
12
+ |---|--------|----------|----------|
13
+ | 1 | SQL 与实体字段一致 | 对比 CREATE TABLE 与实体类 @Column | 字段名、类型、长度、nullable 一致 |
14
+ | 2 | 实体与 Mapper XML 一致 | 对比 resultMap / 列名 | 无遗漏字段、无拼写错误 |
15
+ | 3 | 实体与 DTO 一致 | 对比字段列表 | DTO 字段与设计意图一致 |
16
+ | 4 | 枚举值与数据库约束一致 | 对比 enum 定义与 CHECK/字典表 | 枚举值在约束范围内 |
17
+ | 4.1 | 跨仓实体与真实库字段一致 | 对比所有消费仓 `@TableName` 实体、BaseMapper、Mapper XML 和 `SHOW CREATE TABLE` / `information_schema.columns` | 不存在列不被实体映射;旧字段已删除或 `@TableField(exist = false)`;查询条件不依赖已迁移字段 |
18
+ | 4.2 | 共享表消费仓完整枚举 | 搜索 sibling service、外部集成、回调、定时任务、测试端点是否读取同表 | 已列出全部消费仓并逐个给出对账结论;无法验证的消费仓标记阻塞 |
19
+
20
+ ## 健壮性检查
21
+
22
+ | # | 检查项 | 检查方法 | 通过标准 |
23
+ |---|--------|----------|----------|
24
+ | 5 | 是否破坏历史枚举 | 检查枚举修改是否影响既有值 | 不删除/重命名已有枚举值,新增值只能追加 |
25
+ | 6 | 是否 fail-open | 检查服务间调用失败时的处理 | 失败时返回错误/降级,不返回成功或默认放行 |
26
+ | 7 | 是否缺少幂等 | 检查创建/更新/消费操作 | 关键操作有幂等控制(唯一键/幂等键/状态机去重) |
27
+ | 8 | 是否缺少事务边界 | 检查多表操作和消息发送 | @Transactional 覆盖正确,消息发送不在事务内或已做补偿 |
28
+
29
+ ## 架构边界检查
30
+
31
+ | # | 检查项 | 检查方法 | 通过标准 |
32
+ |---|--------|----------|----------|
33
+ | 9 | 是否绕过既有接入点 | 检查外部系统调用路径 | 走已有的 SDK/中间件/适配层,不新增旁路 |
34
+ | 10 | 是否出现重复实现 | 搜索相似逻辑 | 复用既有工具类/Service/常量,不重复造轮子 |
35
+ | 11 | 是否把外部协议逻辑写进业务核心 | 检查 Service 层代码 | 外部协议转换在 Adapter/Client 层完成,不污染核心业务 |
36
+ | 12 | 是否只改状态不做真实资金/权益动作 | 检查状态变更后的后续动作 | 状态变更为 "已退款" 时,必须有真实的退款调用 |
37
+ | 12.1 | 是否把出口适配层变成业务入口 | 检查跨模块链路方向、模块 owner 和新增入口 | 业务入口落在业务 owner 模块;出口网关/协议转换/设备网关/MQ 通知消费者不承接业务编排 |
38
+ | 12.2 | 是否证明调用方向符合既有架构 | 对比已有接口、MQ topic、回调、日志链路和部署职责 | 技术详设含职责方向矩阵;每条新增边有证据锚点和禁止绕路说明 |
39
+
40
+ ## 代码质量检查
41
+
42
+ | # | 检查项 | 检查方法 | 通过标准 |
43
+ |---|--------|----------|----------|
44
+ | 13 | 空指针风险 | 检查方法入口和链式调用 | 对可能为 null 的对象做判空 |
45
+ | 14 | 异常处理 | 检查 try-catch 和全局异常处理 | 不吞异常,有合理的错误码和日志 |
46
+ | 15 | 日志规范 | 检查日志输出 | 关键操作有 INFO 日志,异常有 ERROR 日志,无敏感信息 |
47
+ | 16 | 线程安全 | 检查共享状态 | 无并发修改共享变量,正确使用锁/原子类 |
48
+
49
+ ## 提交质量检查
50
+
51
+ | # | 检查项 | 检查方法 | 通过标准 |
52
+ |---|--------|----------|----------|
53
+ | 17 | 是否提交脏文件 | `git diff --cached --name-only` | 无 target/、.DS_Store、*.iml、本地配置等 |
54
+ | 18 | 提交信息规范 | 检查 commit message | 符合项目规范,说明做了什么 |
55
+ | 19 | 修改范围合规 | `git diff --name-only` | 只修改了 prompt 允许范围内的文件 |
56
+
57
+ ## 数据库前置门禁检查
58
+
59
+ | # | 检查项 | 检查方法 | 通过标准 |
60
+ |---|--------|----------|----------|
61
+ | 20 | 数据库核查证据 | 检查研发报告中的数据库核查章节 | 包含 SHOW CREATE TABLE / SHOW COLUMNS 等真实查询证据 |
62
+ | 21 | SQL 执行证据 | 检查研发报告中的汇总 SQL 执行记录 | 写明汇总 SQL 文件路径、执行的脚本、执行结果 |
63
+ | 22 | SQL 文件管理 | 检查本需求下 SQL 文件数量 | 只维护一个需求级汇总 SQL 文件,无各任务独立 SQL 文件 |
64
+ | 23 | 无代码绕过数据库缺失 | 检查业务代码中是否有绕过逻辑 | 未因字段/默认值/初始化数据缺失而在代码中加 if-null/硬编码兼容 |
65
+ | 24 | SQL 风险评审 checklist | 跑 `python3 ~/.codex/hooks/superflow-sql-sync-hook.py --check-all`,对照 `~/.codex/skills/superflow-pipeline/references/sql-risk-review-checklist.md` §3 全量勾选 | B1-B8 全部已显式处理(合规或显式豁免),W1-W13 全部已显式处理(已修复 / 评审豁免 / 不适用并写明理由),test-report.md 末尾有 SQL 收口对账表 |
66
+ | 25 | SQL 文件头规范 | 抽样检查 `sql/v*.x/*.sql` 文件头 | 按 sql-risk-review-checklist.md §4 模板写明目标 MySQL 版本、关联批次、风险等级、评审人、涉及表、变更摘要;缺字段触发 W7 警告 |
67
+
68
+ **评审 SOP**:
69
+
70
+ 1. 评审开始时执行 `python3 ~/.codex/hooks/superflow-sql-sync-hook.py --check-all` 拿到风险扫描结果
71
+ 2. 对照 `sql-risk-review-checklist.md` §3 模板,把 B1-B8 禁用项和 W1-W13 警告项的命中情况填入 reviewer 报告
72
+ 3. 任一 B# 违规未豁免 → 不通过,必须修复或显式豁免(`-- allow-sql-risk-rule: B#`)
73
+ 4. 任一 W# 命中无处理结论 → 不通过,必须在 test-report.md 写明处理动作
74
+
75
+ ## 文件流接口检查
76
+
77
+ | # | 检查项 | 检查方法 | 通过标准 |
78
+ |---|--------|----------|----------|
79
+ | 25 | 文件流接口方法签名 | 检查导出/下载 Controller 方法返回类型 | 不返回 Response<T>,直接操作 HttpServletResponse |
80
+ | 26 | Content-Type 设置 | 检查方法体是否设置 Content-Type | 导出为 application/vnd.openxmlformats-officedocument.spreadsheetml.sheet 或 application/octet-stream |
81
+ | 27 | Content-Disposition 设置 | 检查方法体是否设置 Content-Disposition | 包含 attachment 和文件名 |
82
+ | 28 | 失败时 JSON 返回 | 检查异常处理 | 文件接口失败时返回 JSON 错误信息,成功时返回文件流 |
83
+ | 29 | 文件头/文件体测试 | 检查 tests.md | 包含验证响应头和文件体的测试用例 |
84
+ | 30 | 导出不受分页影响 | 检查导出方法调用 | 导出查询不传分页参数或传足够大的 pageSize |
85
+
86
+ ## 导入接口检查
87
+
88
+ | # | 检查项 | 检查方法 | 通过标准 |
89
+ |---|--------|----------|----------|
90
+ | 31 | 上传参数只含前端提交字段 | 检查导入 DTO | DTO 字段与 api.md 定义一致,不含内部字段 |
91
+ | 32 | Excel 模板列头一致性 | 对比模板下载 DTO 和导入解析 DTO 的 @ExcelProperty | 列头名称和顺序完全一致 |
92
+ | 33 | failureCount 失败码 | 检查导入结果处理 | failureCount > 0 时业务 code 必须非 0 |
93
+ | 34 | 日期格式兼容性 | 检查日期解析代码 | 至少覆盖 yyyy-MM-dd 和 yyyy-MM-dd HH:mm:ss |
94
+ | 35 | 行级错误保留 | 检查失败行数据结构 | failureRows 包含行号和失败原因 |
95
+
96
+ ## 路由一致性检查
97
+
98
+ | # | 检查项 | 检查方法 | 通过标准 |
99
+ |---|--------|----------|----------|
100
+ | 36 | api.md 路径与 Controller mapping 一致 | 对比 api.md 接口路径和 Controller @XxxMapping | 双向可找到,无遗漏 |
101
+ | 37 | 固定路径 vs `{id}` 冲突 | 检查同一 Controller 下固定路径和路径变量 | 固定路径(如 /export、/template)排列在 `{id}` 之前,或使用正则约束 |
102
+ | 38 | 路由映射测试 | 检查 tests.md | 包含固定路径和路径变量的测试用例 |
103
+
104
+ ## 数据权限检查
105
+
106
+ | # | 检查项 | 检查方法 | 通过标准 |
107
+ |---|--------|----------|----------|
108
+ | 39 | 是否访问业务数据 | 检查接口功能 | 明确判断该接口是否访问业务敏感数据 |
109
+ | 40 | 数据权限决策 | 检查 api.md/design.md | 每个访问业务数据的接口有明确决策:需要/不需要/不确定 |
110
+ | 41 | 不需要数据权限的原因 | 检查 api.md | 写明不做数据权限的原因(公开接口/字典/统一AOP等) |
111
+ | 42 | 不确定项是否已确认 | 检查 api.md | 不确定的数据权限问题已向用户确认,未确认的不进入实现 |
112
+ | 43 | 是否复用已有权限模型 | 检查代码实现 | 复用当前仓库已有权限工具/注解/AOP/上下文,未临时发明新过滤 |
113
+ | 44 | 列表与导出权限一致性 | 对比列表和导出查询条件 | 使用同一数据权限口径,除非需求明确不同 |
114
+ | 45 | 详情接口归属校验 | 检查详情/查询代码 | 做了数据归属或范围校验,不允许越权查看 |
115
+ | 46 | 写操作越权保护 | 检查编辑/删除/退款/审批代码 | 做了越权保护,不只靠前端隐藏按钮 |
116
+ | 47 | 角色行为覆盖测试 | 检查 tests.md | 至少覆盖两个角色的数据范围测试 |
117
+ | 48 | 未授权响应安全 | 检查越权响应 | 返回稳定错误,不泄露数据是否存在 |
118
+
119
+ ## 外部依赖检查
120
+
121
+ | # | 检查项 | 检查方法 | 通过标准 |
122
+ |---|--------|----------|----------|
123
+ | 49 | SDK 参数来源说明 | 检查 api.md / design.md | 每个 SDK 参数有来源说明,不是猜测 |
124
+ | 50 | 真实请求/响应记录 | 检查 tests.md | 记录了真实请求/响应或明确标记外部阻塞 |
125
+ | 51 | SDK 版本变更说明 | 检查 pom.xml / build.gradle 变更 | SDK 版本变更记录了原因和影响范围 |
126
+
127
+ ## 真实入口验收检查
128
+
129
+ | # | 检查项 | 检查方法 | 通过标准 |
130
+ |---|--------|----------|----------|
131
+ | 52 | Mock 与真实入口分级 | 检查 test-report.md | `Mock 验证`、`测试端点验证`、`真实入口验证` 分开记录,mock-only 不写 Passed |
132
+ | 53 | 真实入口 payload 证据 | 检查 curl、第三方日志、小程序请求或网关日志 | 真实入口有请求方法、关键参数、响应摘要、traceId 或同等关联键 |
133
+ | 54 | 真实入口日志闭环 | 检查服务日志 | 从入口日志到业务校验、DB 查询、外部调用或异常返回有同一 trace/业务单号串联 |
134
+ | 55 | 泛化失败归因 | 检查外部错误、业务日志和 DB 旁证 | 外部平台泛化失败时未直接写通过;已区分外部阻塞、合同漂移、代码异常 |
135
+
136
+ ## 检查记录格式
137
+
138
+ ```
139
+ 批次评审报告:P{n} - {名称}
140
+
141
+ 检查项总数:55
142
+ 通过:X 项
143
+ 未通过:X 项
144
+ 不适用:X 项
145
+
146
+ 未通过项详情:
147
+ - [#{编号}] {检查项}
148
+ - 位置:{file}:{line}
149
+ - 问题:{描述}
150
+ - 建议:{修复方式}
151
+ - 严重程度:CRITICAL / HIGH / MEDIUM / LOW
152
+
153
+ 结论:通过 / 不通过(需修复后重新评审)
154
+ ```
@@ -0,0 +1,323 @@
1
+ # SQL 风险评审清单
2
+
3
+ > **目的**:在 SQL 发布或提测前完成风险扫描,减少平台 SQL 解析校验和人工/自动化风险评审的返工。
4
+ >
5
+ > **使用时机**:每个 P/CR 任务在 `design.md` 冻结后、生成实现 prompt 前,由研发或 Reviewer 走完本清单;任一项未通过必须修复或显式豁免后才进入实现阶段。
6
+ >
7
+ > **本文与现有规则的关系**:
8
+ > - `superflow-pipeline/SKILL.md` 的"数据库 SQL 门禁"章节定义**通用规则**
9
+ > - `superflow-sql-sync-hook.py` 实现**阻断级**自动检查(commit / edit 阶段)
10
+ > - 本文档定义**风险评审级**完整门禁(评审阶段 + 阻断级检查的语义说明)
11
+
12
+ ---
13
+
14
+ ## 1. 两层评审关系
15
+
16
+ | 层级 | 触发时机 | 工具 | 责任方 | 失败处理 |
17
+ |---|---|---|---|---|
18
+ | **L1 平台解析校验** | SQL 提交到发布/提测平台时 | 目标环境 SQL parser 或发布平台校验 | 平台 | 拦截发布/提测 |
19
+ | **L2 风险评审** | 发布/提测前后 | 人工评审或自动化扫描 | Reviewer/QA | 打回返工 |
20
+
21
+ **L1 + L2 之间的关系**:
22
+ - L1 只做**语法兼容性 + 平台基线**校验,不做**业务/性能/可维护性**判断
23
+ - L2 做**业务风险/性能/可维护性**评审,但依赖 L1 先过
24
+ - 我们的目标是 **L2 风险前置到 L1 之前**,避免"提测被拦/打回"的双重返工
25
+
26
+ **L1 已知技术约束(按目标环境替换)**:
27
+ - 目标 SQL parser 可能落后于数据库版本,所有提交 SQL 必须按项目目标数据库和发布平台共同支持的语法编写
28
+ - 评审前必须确认目标数据库版本和发布平台 parser 版本
29
+
30
+ ---
31
+
32
+ ## 2. 评审门禁清单(20+ 条)
33
+
34
+ 按"禁用 / 警告 / 允许"三档分级。**禁用项**由 hook 强制阻断;**警告项**提交流程不阻断但评审记录必须写明处理结论;**允许项**是无需评审的标准做法。
35
+
36
+ ### 2.1 禁用项(pre-commit 阻断,评审必须移除或显式豁免)
37
+
38
+ | # | 规则 | 触发场景 | 理由 | 修复方法 |
39
+ |---|---|---|---|---|
40
+ | **B1** | `ALTER TABLE ... ADD COLUMN IF NOT EXISTS` | 增量改字段 | 静默兼容字段冲突,掩盖数据迁移遗漏 | 直接 `ALTER TABLE ... ADD COLUMN`,让冲突在部署时暴露 |
41
+ | **B2** | `CREATE [UNIQUE] INDEX IF NOT EXISTS` | 增量建索引 | 静默兼容索引冲突,掩盖迁移遗漏 | 直接 `CREATE INDEX`,让冲突在部署时暴露 |
42
+ | **B3** | `INFORMATION_SCHEMA` / `information_schema.columns` / `information_schema.tables` | 判断字段/表是否存在 | 动态 DDL 绕过显式迁移,本质上同 IF NOT EXISTS | 评审时人工核对目标表结构,确认无重复后写显式 DDL |
43
+ | **B4** | `PREPARE` / `EXECUTE` / `DEALLOCATE PREPARE` | 动态 DDL | 同 B3,绕过显式迁移 | 评审时人工核对,显式 DDL 替代 |
44
+ | **B5** | `SET @变量` | 拼接或控制 DDL | 同 B3,且容易引入 SQL 注入风险 | 评审时人工核对,显式 DDL 替代 |
45
+ | **B6** | `ALTER TABLE ... ALGORITHM=...` / `LOCK=...` | 强制指定在线 DDL 参数 | 不同 MySQL 版本/平台参数不同时触发 `ERROR 1221`,应由执行平台按目标库能力选择 | 移除参数,由执行平台决定 |
46
+ | **B7** | `FOREIGN KEY (...) REFERENCES ...` 外键约束 | 表结构 | 跨服务/多租户业务通常不依赖数据库外键做强制关联,应由代码层或应用约束控制一致性 | 改由 Service 层 + 唯一键 + 状态机控制 |
47
+ | **B8** | 单条 SQL 缺失显式 `DEFAULT` 的 `NOT NULL` 字段 | ALTER TABLE ADD COLUMN | 老数据回填时该字段会以 `NULL` 写入导致失败 | 必须有 `DEFAULT <value>` 或显式 `NULL` 允许 |
48
+
49
+ ### 2.2 警告项(不阻断,但 test-report.md 必须记录处理结论)
50
+
51
+ | # | 规则 | 触发场景 | 风险 | 评审动作 |
52
+ |---|---|---|---|---|
53
+ | **W1** | 回填类 UPDATE 使用相关子查询 | 数据回填 | O(k·N) 性能,k=子查询数 | **必须改写为 JOIN**,O(N) 单表扫描;评审人在 checklist 勾选 |
54
+ | **W2** | `JSON_EXTRACT` / `JSON_UNQUOTE` 后无 `COALESCE` / `IFNULL` / `CASE WHEN` 兜底 | JSON 字段提取 | NULL 传播导致业务字段为 NULL,破坏"不限额=-1"等业务语义 | **必须加显式 NULL/类型兜底**(`COALESCE`、`IFNULL` 或更精确的 `CASE WHEN ... REGEXP` 数字校验);评审人在 checklist 勾选 |
55
+ | **W3** | 唯一键包含 DATETIME 列且未指定精度 | 唯一约束 | DATETIME 默认秒级精度,业务毫秒级切片时产生意外冲突 | **必须确认业务唯一性**(如改 `DATETIME(3)` 或加 `segment_seq INT`);**改精度时也要核对所有源表和消费表字段**;评审人在 checklist 勾选 |
56
+ | **W4** | `INSERT IGNORE INTO ... SELECT` 用在数据迁移 | 数据迁移 | 静默吞错,重复执行不报错但数据可能不一致 | **改用显式预检查**(如 `WHERE NOT EXISTS`,让错误显式抛出)或**先清空目标表**再迁移;评审人在 checklist 勾选 |
57
+ | **W5** | 单条 `CREATE INDEX` 包含 > 3 列 | 索引设计 | 宽索引,写入性能差,占用 buffer pool | **必须说明业务查询场景**(WHERE 条件/ORDER BY/覆盖索引),不合理论证必须拆分;评审人在 checklist 勾选 |
58
+ | **W6** | 业务实体表缺少 `update_time DATETIME ON UPDATE CURRENT_TIMESTAMP` 或 `deleted TINYINT NOT NULL DEFAULT 0` | 新建表 | 与项目约定的业务表审计/软删除模式不一致 | 先判断表类型(业务实体表/快照表/关系同步表/流水表),**业务实体表必须遵循项目约定的审计和删除字段**;评审人在 checklist 勾选 |
59
+ | **W7** | SQL 文件没有 header 注释(目标 MySQL 版本、关联批次、风险等级) | 文件头 | 评审人/测试人无法快速定位责任 | **必须按 §4 模板写文件头**;评审人在 checklist 勾选 |
60
+ | **W8** | `JSON_LENGTH` / `JSON_EXTRACT` 解析的 JSON 字段无 `JSON_TYPE` CHECK 约束 | 新建表 JSON 字段 | 业务写入脏数据导致解析失败 | **新建表 JSON 字段必须有 CHECK 约束**(参考 `chk_*_json` 模式);评审人在 checklist 勾选 |
61
+ | **W9** | 单条 `INSERT ... SELECT` 涉及 > 10000 行迁移 | 数据迁移 | 大事务、锁等待、从库延迟 | **必须分批**(如 `LIMIT 5000` 循环),或确认评估为小表;评审人在 checklist 勾选 |
62
+ | **W10** | 没有 SQL 收口对账表(`P编号 \| 表 \| 字段/索引/数据 \| 源码引用 \| 总SQL位置 \| 开发库状态 \| 测试库状态 \| 处理结论`) | 任务完成 | 无法证明 SQL 收口 | **test-report.md 必须包含**;评审人在 checklist 勾选 |
63
+ | **W11** | 关系同步表被误判为业务实体表 | 新建/整改表 | 按"业务实体表"模式加审计/软删除字段,但业务代码可能是物理 delete + 物理 insert,加字段可能没有业务价值 | **必须看业务 Service 实现**,确认是物理删除还是软删除;物理删除时按项目表类型规则判断是否需要审计/软删除字段。**评审动作:源码审查**(参考 §6 流程) |
64
+ | **W12** | JSON 提取 NULL 兜底不充分 | JSON 字段业务校验 | `COALESCE(..., <default>)` 只兜底 NULL,不处理"非数字字符串"(如 `JSON_EXTRACT` 返回 `"abc"`) | **优先用 `CASE WHEN <text> REGEXP '^-?[0-9]+(\.[0-9]+)?$' THEN CAST(... AS DECIMAL) ELSE <default> END` 模式**;COALESCE 仅作为"业务允许 NULL"的兜底 |
65
+ | **W13** | 宽索引无查询支撑 | 索引设计 | 宽索引可能没有真实查询支撑,或数据量较小时收益小于写入与维护成本 | **必须审查 Mapper XML/Repository 查询条件和真实数据量**,没有查询支撑或收益不足时拆分、删除或改为更合适的索引。**评审动作:源码审查**(参考 §6 流程) |
66
+
67
+ ### 2.3 允许项(无需评审的标准做法)
68
+
69
+ | # | 场景 | 写法 | 理由 |
70
+ |---|---|---|---|
71
+ | **A1** | 创建新业务表 | `CREATE TABLE IF NOT EXISTS ...` | 业界标准,幂等建表 |
72
+ | **A2** | 创建备份表 | `CREATE TABLE IF NOT EXISTS <bak_table> LIKE <source_table>` | 同上,备份场景重跑不破坏原始备份 |
73
+ | **A3** | 新库基线建表 | `CREATE TABLE ...`(无 IF NOT EXISTS) | 新库一次性执行,无需幂等 |
74
+ | **A4** | 普通增量改字段 | `ALTER TABLE ... ADD COLUMN ...` | 无 IF NOT EXISTS,让冲突显式抛出 |
75
+ | **A5** | 普通增量建索引 | `CREATE INDEX ...` | 无 IF NOT EXISTS |
76
+ | **A6** | DML 段事务保护 | `START TRANSACTION; ... COMMIT;` | 保护 DML 段原子性,**不能保护 DDL**(MySQL DDL 隐式提交) |
77
+ | **A7** | 显式预检查幂等 | `INSERT INTO ... SELECT ... WHERE NOT EXISTS (...)` | 阻断式预检查,错误显式抛出,不静默吞错 |
78
+ | **A8** | 单库基线 DDL 与增量 DDL 分离 | `sql/{version}.sql`(基线)+ `sql/{version}.migrate.sql`(增量) | 避免重跑全量脚本 |
79
+
80
+ ---
81
+
82
+ ## 3. 评审 checklist 模板
83
+
84
+ 每个 P/CR 任务的 `tasks.md` 中应包含以下 checklist,所有 W 项必须勾选处理结论:
85
+
86
+ ```markdown
87
+ ## SQL 风险评审 checklist(P{xx})
88
+
89
+ **评审人**:{name} **评审时间**:{yyyy-MM-dd}
90
+
91
+ ### 禁用项检查
92
+ - [ ] B1-B8 无违规(或已显式豁免,豁免理由:{理由})
93
+
94
+ ### 警告项检查(test-report.md 必须记录处理结论)
95
+ - [ ] W1 回填 UPDATE 已改 JOIN(或确认非回填场景)
96
+ - [ ] W2 JSON 提取已有 NULL 兜底(或确认无 NULL 业务风险)
97
+ - [ ] W3 唯一键 DATETIME 已确认业务唯一性(或已加精度/序号)
98
+ - [ ] W4 INSERT IGNORE 已改显式预检查(或已先清空目标表)
99
+ - [ ] W5 宽索引已说明业务场景(或已拆分)
100
+ - [ ] W6 业务实体表已有 update_time + deleted(或已说明表类型不需)
101
+ - [ ] W7 SQL 文件头已按 §4 模板写
102
+ - [ ] W8 JSON 字段已有 CHECK 约束(或已说明无脏数据风险)
103
+ - [ ] W9 大批量迁移已分批(或已说明是小表)
104
+ - [ ] W10 test-report.md 已含 SQL 收口对账表
105
+ - [ ] W11 关系同步表已确认无需 update_time + deleted(**源码审查** Service 是物理 delete 还是软删除)
106
+ - [ ] W12 JSON 提取已用 COALESCE 或 CASE WHEN REGEXP 数字校验(NULL + 非数字字符串双重兜底)
107
+ - [ ] W13 宽索引已审查 Mapper XML/Repository 真实查询(**源码审查** + 数据量评估)
108
+
109
+ ### 跨仓影响(如涉及)
110
+ - [ ] 跨仓数据合同对账已完成(参考 superflow-pipeline 的"跨仓数据合同门禁")
111
+
112
+ ### 评审结论
113
+ - [ ] **通过**:进入实现阶段
114
+ - [ ] **不通过**:修复后重新评审(列出未通过项)
115
+
116
+ ### 豁免记录
117
+ | 规则 | 豁免位置 | 豁免理由 | 豁免人 |
118
+ |---|---|---|---|
119
+ | (无) | | | |
120
+ ```
121
+
122
+ ---
123
+
124
+ ## 4. SQL 文件头模板
125
+
126
+ 每个 `sql/**/*.sql` 文件**必须**以以下 header 开头(位于文件第一行 `-- ===...` 之后):
127
+
128
+ ```sql
129
+ -- ============================================================================
130
+ -- 目标 MySQL 版本:{5.7 | 8.0}
131
+ -- 平台 SQL 解析校验:{parser/version,已确认语法兼容}
132
+ -- 关联批次:P{xx}、CR{y} 或 v{x.y.z}
133
+ -- 风险等级:{高 | 中 | 低}
134
+ -- 评审人:{name}
135
+ -- 评审 checklist:参考 sql-risk-review-checklist.md
136
+ -- 涉及表:{table1, table2, ...}
137
+ -- 字段/索引/数据变更:{新增字段: ... | 新增索引: ... | 数据迁移: ...}
138
+ -- ============================================================================
139
+ ```
140
+
141
+ **示例**:
142
+
143
+ ```sql
144
+ -- ============================================================================
145
+ -- 目标 MySQL 版本:5.7
146
+ -- 平台 SQL 解析校验:{parser/version,已确认语法兼容}
147
+ -- 关联批次:P{xx} 或 v{x.y.z}
148
+ -- 风险等级:中
149
+ -- 评审人:{name}
150
+ -- 评审 checklist:参考 ~/.codex/skills/superflow-pipeline/references/sql-risk-review-checklist.md
151
+ -- 涉及表:{table_a}, {table_b}, {relation_table}
152
+ -- 字段/索引/数据变更:新增字段、索引、表或数据迁移摘要
153
+ -- ============================================================================
154
+ ```
155
+
156
+ ---
157
+
158
+ ## 5. 豁免机制
159
+
160
+ 评审人或开发者可对**禁用项**申请豁免。机制:
161
+
162
+ ### 5.1 单行豁免(推荐)
163
+
164
+ 在违规行尾或上方加注释:
165
+
166
+ ```sql
167
+ -- allow-dynamic-ddl: 历史库兼容期,target_version={version} 移除
168
+ SET @exist := (SELECT COUNT(*) FROM information_schema.columns WHERE ...);
169
+ ```
170
+
171
+ **机制说明**:
172
+ - 关键词 `-- allow-dynamic-ddl: <原因>` 已被 `superflow-sql-sync-hook.py` 识别为整文件豁免
173
+ - 本清单**新增** `-- allow-sql-risk-rule: <B1-B8>` 用于**单行 / 单规则**豁免,规则更精细
174
+
175
+ ### 5.2 文件级豁免
176
+
177
+ 在文件 header 中加 `-- allow-dynamic-ddl: <原因>`,整文件豁免(**慎用**,需 Leader 审批)。
178
+
179
+ ### 5.3 评审豁免
180
+
181
+ 评审人在 checklist 中**显式记录**豁免,并写明:
182
+ - 豁免规则编号
183
+ - 豁免位置(文件 + 行号)
184
+ - 豁免理由
185
+ - 移除/解除条件(如"target_version=2.0.0")
186
+
187
+ ---
188
+
189
+ ## 6. 与 superflow-sql-sync-hook.py 的联动
190
+
191
+ 本清单的 **B1-B8 禁用项** 已由 hook 强制阻断;**W1-W13 警告项** 新增为**警告级**,不阻断但提交流程记录到 test-report.md。
192
+
193
+ hook 升级清单(与本 reference 同步落地):
194
+
195
+ | 改动 | 描述 |
196
+ |---|---|
197
+ | **拆分场景** | `CREATE TABLE IF NOT EXISTS`(建新表/备份表)从禁用移除,保留 `ALTER TABLE ADD COLUMN IF NOT EXISTS` 禁用 |
198
+ | **新增警告级规则** | W1-W13 的正则模式 + 警告输出,不返回 2(不阻断) |
199
+ | **W2 精确度提升** | 识别 `CASE WHEN ... REGEXP` 数字校验已覆盖 JSON NULL 风险,避免误报 |
200
+ | **新增 header 检查** | SQL 文件必须按 §4 模板写 header;缺 header 警告 |
201
+ | **新增豁免语法** | `-- allow-sql-risk-rule: <B#>` 单行豁免 |
202
+ | **新增子命令** | `--risk-review` 输出风险清单到 stdout(不阻断),便于 CI/手动扫描 |
203
+
204
+ ### 6.1 需要人工源码审查的规则
205
+
206
+ 评审中常见 **3 条规则需要源码审查才能正确判断**(hook 自动化不够,需人工):
207
+
208
+ | 规则 | hook 能抓什么 | hook 抓不到需要源码审查的 |
209
+ |---|---|---|
210
+ | **W11 关系表误判** | ❌ 抓不到 | 业务 Service 是 `mapper.delete()`(物理)还是 `deleted=1`(软删除) |
211
+ | **W12 JSON 兜底精确度** | ⚠️ 部分(识别 COALESCE 即可放过) | 区分"用 COALESCE 兜底 NULL" vs "用 CASE WHEN REGEXP 校验非数字" |
212
+ | **W13 宽索引无用** | ❌ 抓不到 | Mapper XML/Repository 真实查询 + 数据量评估 |
213
+
214
+ **评审 SOP**(hook 自动化 + 人工源码审查):
215
+ 1. hook `--check-all` 跑一遍(B 类阻断、W 类警告)
216
+ 2. **人工源码审查**(必做,hook 抓不到的 3 条)
217
+ 3. 解决所有 B 类 + 评估 W11/W12/W13
218
+ 4. checklist 全部勾选后才能进入实现阶段
219
+
220
+ ---
221
+
222
+ ## 7. 演进历史
223
+
224
+ | 版本 | 日期 | 来源 | 主要变更 |
225
+ |---|---|---|---|
226
+ | v1.0 | 2026-06-10 | SQL 风险评审规则整理 | 初版 |
227
+
228
+ **未来演进方向**:
229
+ - 根据后续项目发布评审结果新增/合并规则
230
+ - 接入 `superflow-verify-integration.sh` 自动跑 `--risk-review`
231
+ - 警告项 W1-W13 中命中 ≥3 项的 SQL 自动升级为禁用
232
+
233
+ ---
234
+
235
+ ## 8. 自动修复能力矩阵
236
+
237
+ `~/.codex/hooks/superflow-sql-sync-hook.py` 提供两个自动修复子命令:
238
+
239
+ - `python3 ~/.codex/hooks/superflow-sql-sync-hook.py --auto-fix`:dry-run,输出每个文件的修复报告
240
+ - `python3 ~/.codex/hooks/superflow-sql-sync-hook.py --auto-fix-write`:实际写文件(带 `.bak` 备份)
241
+
242
+ ### 8.1 自动修复矩阵
243
+
244
+ | 规则 | 类别 | auto-fix 行为 | 原因 |
245
+ |---|---|---|---|
246
+ | **B1** ADD COLUMN IF NOT EXISTS | 禁用 | ✅ 自动删 `IF NOT EXISTS` | 删后字段已存在会显式报错,正是"早期暴露问题"的目标行为 |
247
+ | **B2** CREATE INDEX IF NOT EXISTS | 禁用 | ✅ 自动删 `IF NOT EXISTS` | 同 B1 |
248
+ | **B6** ALGORITHM= / LOCK= | 禁用 | ✅ 自动删子句 | 删除后由执行平台按目标库能力选择 DDL 策略,行为不变 |
249
+ | **W7** SQL 文件头缺失 | 警告 | ✅ 自动加文件头 | 头模板基于路径推断(`v1.2.3.feature.sql` → 版本 v1.2.3、批次 feature),评审人/涉及表/变更摘要字段留 `(待填)` 让人补 |
250
+ | B3 INFORMATION_SCHEMA | 禁用 | ⚠️ 输出修复模板 | 移除判断后,DDL 怎么写取决于具体业务场景,**必须人确认** |
251
+ | B4 PREPARE/EXECUTE | 禁用 | ⚠️ 输出修复模板 | 同 B3 |
252
+ | B5 SET @变量 | 禁用 | ⚠️ 输出修复模板 | 同 B3 |
253
+ | B7 FOREIGN KEY | 禁用 | ⚠️ 输出修复模板 | 移除外键会破坏数据库引用完整性约束,**需确认代码层有等效控制** |
254
+ | B8 ADD COLUMN NOT NULL 缺 DEFAULT | 禁用 | ⚠️ 输出修复模板 | 需人选默认值(0/''/CURRENT_TIMESTAMP/-1/NULL),**业务决策** |
255
+ | W1 UPDATE 相关子查询 | 警告 | ⚠️ 输出修复模板 | 改 JOIN 要懂 SQL 语义,**高风险自动改** |
256
+ | W2 JSON 提取缺 COALESCE | 警告 | ⚠️ 输出修复模板 | 兜底值(-1/NULL/业务默认值)需要人选 |
257
+ | W3 唯一键含 DATETIME | 警告 | ⚠️ 输出修复模板 | 改精度/加 segment_seq 是 schema 变更 |
258
+ | W4 INSERT IGNORE 迁移 | 警告 | ⚠️ 输出修复模板 | WHERE NOT EXISTS 的子查询条件依赖业务 |
259
+ | W5 宽索引 > 3 列 | 警告 | ⚠️ 输出修复模板 | 性能优化决策 |
260
+ | W6 业务实体表缺字段 | 警告 | ⚠️ 输出修复模板 | schema 决策 |
261
+ | W8 JSON 字段无 CHECK | 警告 | ⚠️ 输出修复模板 | 需人选 JSON_TYPE(OBJECT/ARRAY) |
262
+ | W9 大批量迁移未分批 | 警告 | ⚠️ 输出修复模板 | 分批策略是性能决策 |
263
+ | W10 test-report 缺对账表 | 警告 | ⚠️ 输出修复模板 | 文档类,需人填内容 |
264
+
265
+ ### 8.2 auto-fix 典型工作流
266
+
267
+ ```bash
268
+ # 1. 改完 SQL 后先 dry-run 扫一遍
269
+ python3 ~/.codex/hooks/superflow-sql-sync-hook.py --auto-fix
270
+
271
+ # 输出示例(节选):
272
+ # === sql/{version}/{version}.{batch}.sql ===
273
+ # ✅ [自动修] [B1] 移除 1 处 'IF NOT EXISTS' (ADD COLUMN)
274
+ # ✅ [自动修] [W7] 添加 SQL 文件头(...)
275
+ # ⚠️ [需开发者确认] sql/{version}/{version}.{batch}.sql:55 [W1] 回填类 UPDATE ...
276
+ # 修复模板:相关子查询改 JOIN:
277
+ # 原: UPDATE t SET x = (SELECT s.x FROM s WHERE s.id = t.id)
278
+ # 新: UPDATE t JOIN s ON s.id = t.id SET t.x = s.x
279
+ # ⚠️ [需开发者确认] sql/{version}/{version}.{batch}.sql:60 [W2] JSON 提取 ...
280
+ # 修复模板:JSON 提取后必须 COALESCE 兜底:...
281
+
282
+ # 2. 确认 auto-fix 范围合理后实际写文件(带 .bak 备份)
283
+ python3 ~/.codex/hooks/superflow-sql-sync-hook.py --auto-fix-write
284
+
285
+ # 3. 处理"需开发者确认"项(按模板手工改或与产品/评审人对齐)
286
+
287
+ # 4. 再跑一次 --check-all 确认所有 B 类都已消除
288
+ python3 ~/.codex/hooks/superflow-sql-sync-hook.py --check-all
289
+ ```
290
+
291
+ ### 8.3 auto-fix 安全边界
292
+
293
+ **绝不自动改的项**:
294
+
295
+ - 任何涉及**业务默认值**的修改(`DEFAULT 0` 还是 `DEFAULT NULL`?是 `-1` 还是 `0`?)
296
+ - 任何涉及**业务查询模式**的修改(索引列怎么排、JSON_TYPE 选什么)
297
+ - 任何涉及**代码层引用完整性**的修改(移除外键前必须确认代码层有等效控制)
298
+ - 任何涉及**测试库/开发库状态**的修改(必须先看 `SHOW CREATE TABLE`)
299
+
300
+ **auto-fix 的安全前提**:
301
+
302
+ - 删除 `IF NOT EXISTS` 后的"字段已存在则报错"行为 = 目标行为(早期暴露)
303
+ - 删除 `ALGORITHM=/LOCK=` 后的"由执行平台选择"行为 = 目标行为(不强制参数)
304
+ - 添加文件头不会改变任何 DDL 语义,只影响注释
305
+
306
+ ### 8.4 开发者确认 SOP
307
+
308
+ auto-fix 报告中的"⚠️ 需开发者确认"项,开发者必须:
309
+
310
+ 1. **读懂修复模板**(不是无脑 apply)
311
+ 2. **看上下文**:打开原 SQL 文件对应行号,确认是模板里描述的场景
312
+ 3. **改完后**重新跑 `--check-all` 确认已消除
313
+ 4. **复杂项**(B3/B4/B5/B7/B8)建议和 Reviewer/产品二次对齐再改
314
+
315
+ ---
316
+
317
+ ## 9. 演进历史(更新)
318
+
319
+ | 版本 | 日期 | 来源 | 主要变更 |
320
+ |---|---|---|---|
321
+ | v1.0 | 2026-06-10 | SQL 风险评审规则整理 | 初版 |
322
+ | v1.1 | 2026-06-10 | hook 升级 + auto-fix | §8 自动修复能力矩阵,auto-fixable: B1/B2/B6/W7;manual-review: 其他 |
323
+ | v1.2 | 2026-06-10 | 通用 SQL 风险评审补充 | §2.2 新增 W11/W12/W13(源码审查型规则);§6.1 人工审查 SOP;W2 升级 `CASE WHEN REGEXP` 精确兜底 |
@@ -0,0 +1,90 @@
1
+ # SDD Subagent Progress Transaction Log
2
+
3
+ Use this for subagent-driven development, parallel worktrees, or multi-window
4
+ implementation.
5
+
6
+ Create or update `.sdd/subagent-progress.md` in the change/task directory.
7
+ This file is a durable recovery checkpoint, not a casual status board.
8
+
9
+ ## Template
10
+
11
+ ```md
12
+ # Subagent Progress
13
+
14
+ - handoff_hash: `<hash>`
15
+ - phase: implement|verify
16
+ - build_mode: subagent-driven-development
17
+ - isolation: worktree|branch
18
+ - updated_at: <UTC timestamp>
19
+
20
+ ## Current Transaction
21
+
22
+ - plan_file: `<path>`
23
+ - plan_task_text: `<full unchecked or checked task text>`
24
+ - openspec_task_file: `<path or null>`
25
+ - openspec_task_text: `<full mapped task text or null>`
26
+ - stage: implementing|spec-review|quality-review|checkoff|done|blocked|final-review|final-fix
27
+ - implementation_commit: `<hash or null>`
28
+ - changed_files: `<comma-separated files or null>`
29
+ - red_evidence: `<command/report link or null>`
30
+ - green_evidence: `<command/report link or null>`
31
+ - spec_review: pending|passed|failed|skipped
32
+ - quality_review: pending|passed|failed|skipped
33
+ - unresolved_feedback: `<summary or none>`
34
+ - review_fix_round: 0|1|2|3
35
+ - blocker: none|<specific blocker>
36
+
37
+ ## Agent Ledger
38
+
39
+ | Agent | Role | Worktree | Port | Scope | Stage | Evidence | Blocker |
40
+ |---|---|---|---:|---|---|---|---|
41
+ | worker-1 | Worker | <path> | <port> | <single task> | implementing | <command/report link> | none |
42
+ | tester-1 | Tester | <path> | <port> | <test scope> | quality-review | <command/report link> | none |
43
+ | reviewer-1 | Reviewer | <path> | <port> | <review scope> | spec-review | <checklist link> | none |
44
+
45
+ ## Merge/Closeout Queue
46
+
47
+ - [ ] Worker delivery docs updated
48
+ - [ ] Tester evidence copied into test-report
49
+ - [ ] Reviewer checklist resolved
50
+ - [ ] Plan task checked with exact task text
51
+ - [ ] OpenSpec task checked with exact mapped task text
52
+ - [ ] `superflow-state.sh task-checkoff <plan_file> <plan_task_text>` passed
53
+ - [ ] `superflow-state.sh task-checkoff <openspec_task_file> <openspec_task_text>` passed when mapped
54
+ - [ ] Leader aggregate docs updated
55
+ - [ ] `superflow-guard.sh <change-dir> implement` passed
56
+ ```
57
+
58
+ ## Rules
59
+
60
+ - Update this board at each handoff, context compression, or worktree switch.
61
+ - Each row must link to real evidence: prompt, test-report section, command
62
+ output, screenshot, curl result, or review checklist.
63
+ - If `handoff_hash` changes, every active agent must reread the handoff and
64
+ original OpenSpec/SDD docs before continuing.
65
+ - The coordinator must not execute implementation tasks directly when
66
+ `build_mode: subagent-driven-development`; it dispatches fresh workers and
67
+ reviewers, then records their commits/evidence here.
68
+ - Do not bundle multiple implementation tasks into one transaction. One current
69
+ transaction maps to exactly one unique plan task text.
70
+ - The task text must be unique in the plan. If it is not unique, fix the plan
71
+ before dispatching.
72
+ - A task can move to `checkoff` only after implementation commit exists,
73
+ RED/GREEN evidence is recorded, spec review passed, and quality review passed.
74
+ - Each task gets at most 3 review-fix rounds. When round 3 still fails, mark
75
+ `stage: blocked` and stop for user input with the accumulated feedback.
76
+ - A worker cannot mark delivery complete while `blocker` is not `none`.
77
+ - After checkoff passes, immediately continue to the next unchecked task unless
78
+ the user explicitly paused or the transaction is blocked.
79
+
80
+ ## Recovery
81
+
82
+ On context compression or new session:
83
+
84
+ 1. Run `superflow-state.sh recover <change-dir>`.
85
+ 2. Read `.sdd/handoff/sdd-context.md` and original `api.md`/`design.md`/`tests.md`.
86
+ 3. Read this file and resume from the exact `stage`.
87
+ 4. If `implementation_commit` is not visible in the current worktree, recover
88
+ or merge it before continuing.
89
+ 5. If the transaction does not match the first unchecked task, create a new
90
+ transaction for that task and keep the old one as evidence.