gstack-review 是 gstack 仓库提供的一项代码评审技能,定位是在合并分支或 PR 之前使用,审查 diff 中那些“能通过 CI 但在生产环境会出问题”的缺陷,修掉明显的部分,其余向用户确认。
用途与定位:面向合并前的差异审查,要求先完整阅读全部 diff 及未跟踪文件,再评论;未跟踪文件较多时按脚本提示列出其余文件;若无可审内容则说明并停止;无基线时向用户询问基线分支或审查未提交改动。
使用方式:先进入仓库目录,执行 sh skills/gstack-review/scripts/diff-base.sh <base>,脚本会输出基线、合并基线、自基线以来的提交与 diff 统计,并提示下一步运行 git diff <merge base>。若脚本缺失,可用 git merge-base origin/main HEAD 与 git diff --stat <merge-base> 替代。评审时还需阅读被改动代码所影响、但自身未改动的调用方。
主要能力(评审类别): 第一类为 CRITICAL,涵盖:SQL 与数据安全(SQL 字符串插值、TOCTOU 竞态、绕过模型校验直写数据库、N+1 查询);竞态与并发(读-检查-写缺少唯一约束或重试、find-or-create 缺少唯一索引、状态转换未用原子 WHERE、不安全 HTML 渲染导致 XSS);LLM 输出信任边界(未校验就落库或发信、结构化工具输出未做类型形状检查、URL 未经允许列表即抓取引发 SSRF、未净化即写入知识库或向量库的存储型提示注入);Shell 注入(Python 中 shell=True 加插值、os.system 插值、未沙箱执行 LLM 生成代码的 eval/exec);枚举与取值完整性(新增枚举/状态/类型或放宽输入接受面时,追踪每个消费方,检查允许列表、if-elsif 分支与 diff 之外的消费代码)。 第二类为 INFORMATIONAL,涵盖:异步/同步混用(async 中同步阻塞调用、time.sleep、同步数据库调用);列/字段名安全(对照表结构核验 ORM 列名与查询结果取值);LLM 提示词问题(0 起始索引列表、提示词所述工具与实际接线不符、多处字数限制漂移);完整性缺口(本可低成本补全的简化实现、测试覆盖、80–90% 完成度);时间窗口安全(按日键查询假设覆盖全天、相关功能窗口不一致);时序依赖测试(放宽时限或加重试掩盖偶发失败);边界类型强制转换(跨语言边界的数值与字符串、哈希输入未归一化);视图/前端(局部模板内联 style、视图内 O(n*m) 查找、可在 WHERE 完成的 Ruby 端过滤)。
处理与输出:按“Fix-First 启发式”分类,机械性修复直接执行(如死代码、N+1、过期注释、魔数命名、缺失的 LLM 输出校验、路径版本不匹配等),需人判断的先以一条消息列出带建议的编号清单并等待回复(如安全、竞态、设计决策、超过 20 行的大改动、枚举完整性、删除功能、影响用户可见行为)。输出需对每条结论做证据核验(引用证明安全论断的行、引用所依赖的处理代码、指出覆盖测试的文件与方法),最终给出 CRITICAL 与 INFORMATIONAL 列表,每条一行问题、一行修复并标注 file:line,再说明已修复内容;零发现也是完整结果。
限制与规则:只标记资深工程师确会在评审中改动的问题,并列出明确的抑制项(如无害冗余、阈值注释、更严格断言、仅一致性改动、受限输入的正则边界、同时触发多个守卫的测试、无害空操作、diff 已处理的问题、上游已负责的错误处理、穷举 switch 的“函数过长”、类型流已收窄的空指针、固定小基数循环的 N+1、测试夹具硬编码、非加密场景的 Math.random() 等)。技能仅做评审,不提交、推送或创建 PR;表述需简洁,无前言。