用途:在代码评审时检测拉取请求可能引入的回归风险,通过交叉比对被审查 PR 删除的代码行与近期被标记为缺陷修复的 PR 所添加的代码行来完成。
主要能力:采用五步算法。第一步收集被审查 PR 删除的行;第二步用 git log --follow --since=6mo 查找近期修改过同一文件的 PR;第三步筛选带有 i/regression、t/bug、p/0 或 p/1 标签的 PR 或其关联 issue;第四步获取每个修复 PR 的差异并收集其对同一文件添加的行;第五步进行忽略空白的字符串相等比较,输出三级结果:REVERT(删除行与修复 PR 添加行匹配,风险最高)、OVERLAP(同一文件被修改但无精确行回退)、CLEAN(无缺陷修复 PR 触及相同文件)。该工具为纯机械式,不使用 AI 或 LLM。
使用方式:脚本为独立 PowerShell 脚本。可按 PR 自动检测文件:pwsh -NoProfile -Command '& ./.github/scripts/Find-RegressionRisks.ps1 -PRNumber 33908 -OutputDir /tmp/out';也可仅分析指定文件:pwsh -NoProfile -Command '& ./.github/scripts/Find-RegressionRisks.ps1 -PRNumber 33908 -OutputDir /tmp/out -FilePaths @("src/Core/src/Platform/Android/MauiWindowInsetListener.cs")'。参数包括:-PRNumber(必填,待分析 PR 号)、-Repo(默认 dotnet/maui)、-FilePaths(默认自动检测)、-MonthsBack(默认 6,git log 历史窗口)、-MaxRecentPRsPerFile(默认 20,每文件速率限制)、-BaseBranch(默认 main)、-OutputDir(输出目录)、-WriteInlineFindings(默认 off,输出 inline-findings.json)。
输出:指定 -OutputDir 后生成 result.txt(单一令牌:CLEAN、OVERLAP 或 REVERT)、risks.json(结构化结果供下游代理使用)、content.md(用于 PR 评论的 Markdown 摘要)、inline-findings.json(仅在开启 -WriteInlineFindings 时生成)。
集成方式:该脚本作为 Review-PR.ps1 的 STEP 4(回归交叉比对,位于 UI 测试检测之后、Gate 步骤之前)运行;其 content.md 由 post-ai-summary-comment.ps1 汇总到 AI 摘要评审中。检测到 REVERT 风险时,会执行被回退修复 PR 的回归测试:UI 测试使用 BuildAndRunHostApp.ps1 -Platform <plat> -TestFilter <filter>;设备测试使用 Run-DeviceTests.ps1 -Project <proj> -Platform <plat> -TestFilter <filter>;单元/XAML 测试使用 dotnet test <project> --filter <filter>。专家评审代理(maui-expert-reviewer.md 第 6 维度)读取 risks.json 检查 REVERT 条目。
已知限制:内联发现方面,-WriteInlineFindings 标志会生成左侧(删除侧)注释,但 post-inline-review.ps1 目前仅发布右侧注释,左侧发现会被静默丢弃,已记录为未来工作。仅空白变更方面,出于设计,对修复行的纯缩进改动不会触发 REVERT(空白归一化会折叠空白),以避免重新格式化带来的误报。从 bash 独立调用时的 pwsh -File 数组参数问题:应使用 pwsh -Command '& ./script.ps1 -FilePaths @(...)' 语法,pwsh -File 不会求值 @() 表达式。测试命令:pwsh -NoProfile -File .github/scripts/tests/Test-FindRegressionRisks.ps1。
适用场景:适用于使用 GitHub PR 流程、带标签标注缺陷修复的代码仓库,尤其是 dotnet/maui 项目,用于评审阶段的回归风险检测。