拓冰建站拓冰建站
首页 / 资讯中心 / 正文

NemoClaw 维护者评审技能:用分层裁决模型比较竞争 PR 并给出合并或抢救建议

NemoClaw 维护者评审技能用分层裁决模型比较竞争 PR 并给出合并或抢救建议【免费下载链接】NemoClawRun agents like Hermes, LangChain Deep Agents, and OpenClaw more securely inside NVIDIA OpenShell with managed inference项目地址: https://gitcode.com/gh_mirrors/ne/NemoClaw本文围绕 NemoClaw 仓库中的维护者技能nemoclaw-maintainer-pr-comparator展开当同一个 issue 存在多个竞争 PR 时它用「Tier 0 资格门禁 → Tier 1/2 加权评分 → Tier 3 平局裁决」的分层模型从真实 review 证据中推荐合并候选或抢救候选。读完本文你将掌握该技能的完整九步工作流、六项资格门禁的判定细节、加权计分规则以及候选 PR 中「转移工作」的归因处理策略并能理解每个判定背后的脚本实现与降级机制。1. 技能定位为多 PR 竞争同一 issue建立可审计的裁决流程该技能定义在 SKILL.md其 frontmatter 声明了技能名称nemoclaw-maintainer-pr-comparator与用途Compare competing NemoClaw PRs for one issue and recommend a merge or salvage candidate from review evidence.针对同一 issue 比较竞争的 NemoClaw PR并基于评审证据推荐合并或抢救候选且标记user_invocable: true即可由用户直接触发。技能的整体裁决结构是四级分层层级职责依据文件Tier 0资格门禁Eligibility六项布尔门禁不满足则 PR 不可合并checks/tier-0-gates.mdTier 1正确性评分六项模型判定每项权重 2.0checks/tier-1-correctness.mdTier 2代码质量评分四项模型判定每项权重 1.0checks/tier-2-quality.mdTier 3平局裁决happy 模式加权分 tiebreakersdegraded 模式按距离可合并的差距排序tiebreakers.md核心原则在 SKILL.md 开篇即给出Tier 0 determines eligibility. Tiers 1 and 2 score correctness and quality. Tier 3 resolves ties. If no PR passes Tier 0, rank eligible PRs for salvage. 即没有任何 PR 通过 Tier 0 时不推荐合并而是为可抢救的 PR 排序。2. 运行前提与仓库安全模型2.1 前提条件ghCLI 已安装并完成认证目标仓库中存在一个带有两个或更多 open PR 的 issue。2.2 仓库策略与安全边界SKILL.md 明确了两条安全约束这是该技能区别于普通PR 比较脚本的关键设计默认策略绑定 NemoClaw 约定CODEOWNERS、DCO、CodeRabbit 和docs/目录。可复用的被取代 PR 归因superseded-PR attribution规范位于 workflow-policy.md换仓库时通过编辑 repo-policy.md 调整。辅助脚本的信任来源comparator 的辅助脚本必须从拉取到的 canonical NVIDIA/NemoClawmain检出中执行或在使用前对照该版本校验其可执行代码和依赖。被比较的候选 PR 修改过的辅助脚本绝不能被授予 GitHub 凭据——也就是说如果某个候选 PR 恰好改了这些脚本不能直接运行 PR 分支里的版本。SKILL.md 还强调Inspect helper source when needed; a section heading does not establish trust.需要时检查辅助脚本源码一个章节标题不构成信任依据。Step 4 中引用的受信门禁脚本 run-trusted-check-gates.sh 就存放在nemoclaw-maintainer-day技能目录下通过git show origin/main:...从远端 main 分支取出执行避免信任本地或候选分支中的副本。3. 工作流 Step 1解析 issue提取验收标准第一步读取 issue 正文和全部评论提取每一条验收标准acceptance criteriongh issue view issue-number --json title,body,commentsSKILL.md 特别提示评论可能补充 issue 正文中没有的要求。这一点对后续评分很关键——Tier 1 的检查项见第 7 节会直接把正文 评论中的每条要求映射到 diff 中对应的改动或测试行为覆盖矩阵第 10 节也是以这些标准逐行构建的。4. 工作流 Step 2候选 PR 发现三级发现算法scripts/find-candidates.sh issue-numberfind-candidates.sh 按固定的默认顺序逐级扩展直到候选数量达到 2 个即停止显式链接gh search prs --state open #issue in:body查找正文中引用该 issue 的 open PR。注意脚本注释强调in:body是搜索限定词属于查询字符串的一部分不是 CLI 参数。文件路径扩展若候选少于 2 个且 issue 正文含有形如src/foo.ts的文件路径正则[a-zA-Z0-9_./-]\.[a-zA-Z]{1,5}最多取 5 个则用gh pr list --search file in:files查找触碰这些文件的 open PR。标题 Jaccard 相似度扩展若仍少于 2 个提取 issue 标题的显著词元小写化、去掉长度 ≤3 的片段与最近 100 个 open PR 的标题做 Jaccard 相似度计算保留 0.4的 PR。输出为去重后的 PR 编号列表上限max_candidates: 10。脚本中的JACCARD_THRESHOLD0.4与 repo-policy.md 中的title_token_jaccard_threshold是同一默认值脚本注释坦承该技能当前不解析 YAML阈值在脚本中重复了一份以保持同步。5. 工作流 Step 3取代关系supersession与转移工作检测scripts/parse-supersession.sh pr-number-1 pr-number-2 ...parse-supersession.sh 以大小写不敏感的方式解析 PR 正文中的四类声明输出有向边superseder - superseded语句族主动式指向 #N被动式指向当前 PRsupersed[a-z]*后接#Nsupersedes #Nsuperseded by #Nreplac[a-z]*后接#Nreplaces #Nreplaced by #Nclos[a-z]* in favor of后接#N—closes in favor of #N、closed in favor of #Nfold[a-z]* in后接#Nfolds in #Nfolded into #N脚本内的reverse_pattern用正则区分主动/被动形式并翻转边方向方括号表达式如supersed[a-z]*描述的是解析器文法匹配supersedes、superseding等变体不是要求 PR 正文里的字面文本。两点语义澄清同样重要follow-up to #N只是相关 PR信号不构成取代声明除非同时出现上表短语这些声明只记录 PR 间关系不给候选排序也不证明该 diff 里包含了另一位贡献者的工作。对每个已声明或疑似的取代关系还需比较双方的 commits 与 diff把关系分为三类independent该 PR 未携带其他贡献者的实质性代码、测试或文档transferred该 PR 携带了其他贡献者的实质性工作 → 必须先应用 canonical superseded-PR 归因策略链接 workflow-policy.md才能设 winner 或建议关闭源 PRunclear现有证据无法判定 →winner保持 null请求维护者人工判断。6. 工作流 Step 4Tier 0 六项资格门禁Tier 0 的完整规则见 tier-0-gates.mdAll six gates are required. A PR that fails a gate cannot merge. 执行命令scripts/collect-gates.sh pr-number scripts/check-coderabbit-threads.sh pr-number git fetch --no-tags origin refs/heads/main:refs/remotes/origin/main bash (git show origin/main:.agents/skills/nemoclaw-maintainer-day/scripts/run-trusted-check-gates.sh) pr-number六个门禁及其判定实现结合 collect-gates.sh 与 check-coderabbit-threads.sh 的源码Gate 1 — PR 状态 OPENstate必须为OPEN。脚本中gate_state_open$([ $state OPEN ] echo true || echo false)。理由没有这条门禁排序可能选中一个 diff 与 open PR 相同、但已经关闭的 PR。Gate 2 — CI 在 PR SHA 上全绿从statusCheckRollup读取该 SHA 的检查结果。脚本采用 fail-closed 策略必需检查[checks,check-hash,changes,commit-lint,dco-check]缺失即失败包括空 rollup存在失败或未完成项即失败。作者若 push 新 commit需记录新短 SHA 并等待其检查。Gate 3 — 可合并、无冲突mergeable: MERGEABLE且mergeStateStatus: CLEAN。常见失败形态CONFLICTING基线分支已分叉、DIRTY暂存变更阻塞合并、BLOCKED必需检查失败或缺评审。Gate 4 — 贡献者合规PR 正文必须含Signed-off-by: Name email声明脚本用正则^Signed-off-by:.........$逐行匹配且 GitHub 必须显示每个 commit 为Verified脚本通过gh api repos/$repo/pulls/$pr/commits --paginate拉取commit.verification.verified字段任一 commit 未验证或拉取/解析失败都判 false。CI 通过不能替代这两项检查维护者不得替贡献者修改、签名、force-push、批准或合并——只有dependabot类 bot 作者享有 DCO 声明豁免。Gate 5 — 分支保护reviewDecision: APPROVED且分支保护检查全部满足用分支保护强制执行 CODEOWNERS。若分支保护不执行 CODEOWNERS需在 repo-policy 中设codeowners_enforced_via_branch_protection: false并配置团队检查。Gate 6 — 自动化评审线程已解决REST 的 comments 端点不含线程解决状态脚本因此用 GraphQL 查询pullRequest.reviewThreads.isResolved见 check-coderabbit-threads.sh 第 57–93 行只统计首条评论作者是配置的 bot默认coderabbitai可用--bot覆盖的线程。另外一条边界规则SKILL.md 要求把 PR Review Advisor 的输出当作维护者评审的输入而不是合并授权。每个门禁的记录内容包括pass/fail、证据短 SHA、检查名、合并状态、线程 ID、以及失败分类——ineligiblePR 正文缺 DCO 或存在未验证 commit、trivial如缺 issue 链接、substantiveCI 红、冲突、缺批准。collect-gates.sh 末尾的classify_failures数组正是这样产出的例如ineligible:contributor_compliance、substantive:ci_failures...。该分类直接喂给 Tier 3 的 degraded 模式ineligible 的 PR 是被拒绝而非参与抢救排序。7. 工作流 Step 5Tier 1 六项正确性检查每项权重 2.0check/tier-1-correctness.md 覆盖CI 抓不到的失败每项判 pass 1、yellow 0.5、fail 0且每个判定必须附 file:line 证据1.1 测试确实触达 bug 路径新/改测试在修复前代码上运行必须失败修前修后都通过的测试证明不了任何东西。典型 yellow 信号测试只断言没抛异常、断言与 bug 无关的输出、mock 掉了 bug 所在的行为。1.2 评论即规格acceptance criteria from comments把 issue 正文和评论中的每条要求转成验收标准逐条映射到 diff 的改动文件或新增测试。部分标准未覆盖且无解释 → yellow半数及以上标准未处理 → fail。1.3 负面测试覆盖修复必须包含非法/边界输入测试——空/null/undefined、边界值0、max、min、off-by-one、类型混淆、畸形输入、纯空白/非 ASCII/unicode。要求按输入域适配Dockerfile 改动关注包存在性与版本锁定断言而非 HTTP 边界。只测 happy path → yellowbug 类别有明显负面用例却全未覆盖 → fail。1.4 覆盖形状为 diff 新增的每个if/else/catch/switch分支找测试未测分支记 yellow。覆盖率百分比不变不代表新分支被触达。1.5 重构 vs 行为扫描标题或描述声称refactor/rename/extract/move时diff 中条件新增if(、?、、||、新增throw new Error(、process.exit(代码变化、返回值变化必须净零统计增删行中的这些 token总数上升即可能藏着行为变化记 yellow 或 fail——行为变化可能绕过它本应获得的评审。1.6 mock 边界mock 外部依赖不要 mock 被测单元本身mock 掉测试声称要验证的函数直接 fail。常见红旗mock 了与测试描述同名的函数只断言 mock 被调用在被测单元调用图深处而非外部边界处 mock。8. 工作流 Step 6Tier 2 四项质量检查每项权重 1.0checks/tier-2-quality.md2.1 描述与 diff 漂移PR 描述必须覆盖每个改动文件点名或通过描述隐含。用gh pr view pr --json files,body核对正文未点名也未隐含的文件记 yellow。隐含是允许的——onboarding-parser 抽取隐含onboard.ts与onboard-parser.ts的改动但不隐含unrelated-helper.ts。2.2 迁移完成度新增替代路径时要么本 PR 删除旧路径要么正文链接后续 PR/issue旧路径仍在且无后续链接 → yellow。2.3 公共表面保持对以下公共表面做内容改动时要求 PR 带 Notes 章节并更新相关文档flag 定义--name、Flags.x(、oclif flag schema、帮助/用法字符串Usage:、description:、summary:、错误消息throw new Error(、console.error、退出码process.exit(。仅有内容改动但无 Notes → yellow改变用户可见行为且既无 Notes 也无文档更新 → fail。2.4 权宜之计 vs 根因在 diff 中搜索症状抑制模式——空catch块、无重抛/日志的catch (err) { return; }、针对特定 errnoEACCES/ENOENT/EEXIST的静默忽略、隐藏失败于调用者之外的防御性返回。发现新增抑制模式而正文没有原因 issue 链接或为何抑制是预期行为的解释 → yellow。9. 工作流 Step 7加权计分SKILL.md 规定的计分规则用六个布尔键构建 Tier 0 资格集state_open、ci_green_sha、mergeable、contributor_compliance、branch_protection、coderabbit_threads_resolved候选缺少必需键、出现未知键、或值非布尔时流程必须停止六项门禁全为true的 PR 才进入 happy-path 评分每项 pass 满分yellow 半分fail 0Tier 1 每项权重 2.0Tier 2 每项权重 1.0。计分上限与实现一致render-verdict.py 中定义了TIER_1_WEIGHT 2.0每项 pass 2 分、TIER_2_WEIGHT 1.0每项 pass 1 分TIER_0_GATES恰好列出上述六个键的展示标签。因此满分 6×2.0 4×1.0 16.0与 tier-2-quality.md 结尾的Tier 1 贡献最高 12.0 分Tier 2 最高 4.0 分加权总分上限 16.0吻合。10. 工作流 Step 8Tier 3 排名与降级模式Tiebreakers.md 规定mode 必须从 Tier 0 结果推导不接受调用方传入的 mode。Happy 模式至少一个 PR 通过 Tier 0淘汰所有 Tier 0 未通过的 PRwinner只设给幸存者closest_to_ready设为 null计算 Tier 1–2 加权分构建行为覆盖矩阵behavior-coverage matrix对每条验收标准建一行标注各 PR 的covered全/partialyellow/missing红矩阵既作为加权分与平局裁决的证据也用来发现胜者缺少的测试/改动——verdict 可以建议从另一 PR 做小幅转移但必须完成转移与归因后重跑比较器才能选 winner按序应用平局裁决器tiebreakers更小的 diff两者都覆盖 issue 范围时更好的边界测试覆盖比较 Tier 1.3 的输出;最近的活动最近一次 commit 更新更低的 PR 编号。证据足以区分时才设 winner否则winner保持 null。对携带转移工作transferred的替代 PR在完成并核验归因之前不得设winner。Degraded 模式没有任何 PR 通过 Tier 0winner置 null按距离可合并还差多少对合格 PR 排序对每个 PR 的 Tier 0 失败分类trivial缺 issue 链接、基线过期、上次评审后 force-push/ineligible正文无 DCO 声明或 commit 非全 Verified直接拒绝须由贡献者提供合规历史/substantiveCI 红、合并冲突、缺 CODEOWNERS 批准、未解决的 CodeRabbit 线程排序规则ineligible PR 排在所有 eligible PR 之后全部 ineligible 则返回仅拒绝的 verdicteligible 之间substantive 失败少者胜 → trivial 失败少者胜 → 仍平则比 Tier 1/2 加权分 → 证据不支持排序时closest_to_ready置 nullclosest_to_ready只能设给通过贡献者要求的 open PR输出每个 PR 的 Tier 0 失败列表与 Tier 1/2 记分卡典型措辞Neither mergeable yet. PR A is closer — fix [substantive list]. PR B has [issues].11. 工作流 Step 9渲染 verdict带模式校验使用 templates/verdict.md 模板并用 render-verdict.py 渲染渲染器非零退出时必须停止不得推荐合并。渲染器的输入是 stdin 上的 JSON spec脚本 docstring 给出完整结构issue、criteria、每个 PR 的number/title/tier_0/tier_1/tier_2/matrix/evidence以及tier_0_failures、supersession_edges、tiebreaker_fired、winner、closest_to_ready、可选的mode断言。validate_spec会校验 gate schema、mode、winner 资格与抢救候选资格——mode 若未提供则从 Tier 0 门禁推导非法 spec 以退出码 64INVALID_SPEC_EXIT拒绝。职责划分明确渲染器负责格式与一致性校验评审者仍对分数、排序和证据负责每个判定必须包含证据file:line 或 SHA/日志行、观察到的事实、做出的推断、贡献的得分。verdict 模板还内置了带转移工作的建议行动清单见模板 Suggested action 一节要点包括确认源 PR 的Signed-off-by:声明、从源 commit 读取而非猜测作者身份、优先git cherry-pick -S -x source-sha保留源贡献者的 Git 作者身份、必要时加Co-authored-by:trailer、在替代 PR 正文写Supersedes #B并指明转移的测试、合并后在 #B 的关闭评论中链接 #A。12. 可移植性配置repo-policy.md换仓库时编辑 repo-policy.md它集中了技能读取的策略值codeowners_enforced_via_branch_protection: true dco_required: true dco_location: pr_description dco_check_name: dco-check github_verified_signatures_required: true auto_reviewers: - login: coderabbitai is_bot: true require_resolution: true docs_dir: docs coverage_ratchet_enforced_via_ci: true title_token_jaccard_threshold: 0.4 max_candidates: 10 excluded_bot_authors: - dependabot[bot] - renovate[bot] - github-actions[bot]各字段的作用CODEOWNERS 是否经分支保护强制否则列出必需团队DCO 声明位置与检查名自动化评审 bot 列表CodeRabbit/Copilot 等供check-coderabbit-threads.sh按登录名过滤docs_dir供 Tier 2.3 在行为变化时检索docs/NemoClaw 的文档确实位于仓库根部的docs/目录覆盖率棘轮是否由 CI 强制——NemoClaw 使用 ci/coverage-threshold-cli.json 与 ci/coverage-threshold-plugin.json技能本身不计算覆盖率变化只委托 CI候选发现的 Jaccard 阈值与上限以及从作者质量信号中过滤的 bot 作者列表。13. 可信度验证backtest 回测机制validation/backtest.md 要求在新决策之前用历史已解决的 PR 竞争案例回测比较器的假阳/假阴率案例选取用gh pr list --state closed --search is:closed -is:merged找未合并且正文含supersed|duplicate|fixed by|closed in favor的 PR再用gh search prs --merged supersedes in:body找明确取代他人的已合并 PR挑选 5–10 个覆盖不同模式的案例diff 完全相同的时序竞争、workaround vs 根因的架构分歧、停滞 PR 被新 PR 替换、一红一绿的 CI、作者因 DCO 重开分支等记录为(issue, [pr_a, pr_b, ...], actual_winner_pr)判定分类Match / False positive推荐了实际被拒的 PR/ False negative拒绝了实际合并的 PR/ Ambiguous目标阈值假阳 10%、假阴 5%、模糊 10%超阈值则定位失效的 tier 或检查项修正提示词或补充 tiebreaker 后重跑。该文件还记录了回测曾驱动的两处规则演进两条字节相同的 PR 竞争出较旧者被关闭→ 增加 Tier 0 的 PR state must be OPEN 门禁三段重构链中只有最新一段可合并 → 增加取代关系检测与新鲜度 tiebreaker。同时列出四类需警惕的失败模式Tier 0 过严CI flake 被误杀可用最新一次 CI 与上一次 CI 交叉核对、Tier 1 的 LLM 幻觉强制 file:line 证据与推理链、tiebreaker 噪音记录每次由哪个 tiebreaker 决出胜负持续选错则降级或移除、描述漂移假阳补充隐含即覆盖的训练例子。14. 能力边界该技能明确不做的事SKILL.md 的 Limits 一节划定了四条边界不跑 PR 代码对抗性输入不扫描其他 issue 的相关行为需要跨 issue 证据时单独运行nemoclaw-maintainer-cross-issue-sweep该技能存在于 nemoclaw-maintainer-cross-issue-sweep/SKILL.md不模拟对关联 PR 的 revert不运行 CodeQL、Semgrep 等静态分析器。15. 小结证据驱动的 PR 裁决方法论nemoclaw-maintainer-pr-comparator把两个 PR 抢同一个 issue 该合谁这件依赖经验的维护者工作拆成了可审计的流水线先资格后评分六个 fail-closed 的布尔门禁collect-gates.sh 与 check-coderabbit-threads.sh 自动产出过滤出合法合并候选加权评分六项正确性检查2.0 分/项 四项质量检查1.0 分/项上限 16.0每项判定强制 file:line 证据平局与降级四级 tiebreakers 只在证据足够时决出 winner无人通过 Tier 0 时切换 degraded 模式按 ineligible/trivial/substantive 分类的失败给最接近可合并排序而绝不设 winner转移工作归因transferred类候选在完成 canonical 归因核验前禁止胜出配合git cherry-pick -S -x保留源贡献者身份渲染即校验render-verdict.py 非零退出即停止推荐schema 与 winner 资格由代码强制回测自证历史案例回测给出假阳 10%、假阴 5% 的量化门槛并保留了由回测反推规则演进的历史记录。整套机制的安全底线是辅助脚本只信 canonicalmain检出、候选 PR 修改的脚本不接触凭据、维护者不替贡献者修补合规问题、证据不足以区分时 winner 保持 null——把不确定显式留在 verdict 里而不是用模糊措辞掩盖。【免费下载链接】NemoClawRun agents like Hermes, LangChain Deep Agents, and OpenClaw more securely inside NVIDIA OpenShell with managed inference项目地址: https://gitcode.com/gh_mirrors/ne/NemoClaw创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门