ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

qwen-code `/review` 发散哨兵(successor-chain):基于 closure 血缘的跨轮评审收敛诊断

qwen-code `/review` 发散哨兵(successor-chain):基于 closure 血缘的跨轮评审收敛诊断 qwen-code/review发散哨兵successor-chain基于 closure 血缘的跨轮评审收敛诊断【免费下载链接】qwen-codeAn open-source AI coding agent that lives in your terminal.项目地址: https://gitcode.com/GitHub_Trending/qw/qwen-codeqwen-code 的/review跨轮评审会针对同一 PR 反复运行多轮修复—评审循环而本轮设计文档docs/design/review-divergence-sentinel.md描述的发散哨兵divergence sentinelissue #9905用于识别循环中同一子系统连续两轮各关闭一个 Critical、本轮又新长出一个 Critical的补丁—回归级联形态。本文将结合packages/cli/src/commands/review/下的实际源码与测试完整讲解closed列表的铸造、携带与校验机制K2 血缘检查的判定逻辑以及successor-chain建议码的机器可读输出帮助你理解这套只测量、不裁决的收敛观测体系是如何做到确定性、可审计且诚实披露的。背景评审循环的换代级联发散推送触发的评审加上修复发现的 Agent 构成一个反馈回路当回路的增益大于 1 时每次被接受的修复都会扩大 diff下一轮评审更多代码、返回更多发现循环就不会收敛。仓库实测中PR 曾携带数百个未关闭线程仍未收敛其中一个在约 500 条评论时仍未合入见 convergence.ts 头部注释。问题在于/review的跨轮 ledger 虽然追踪 finding id、carry 与 supersession却没有任何环节读取血缘lineage——当第 N 轮 Critical 的修复在第 N1 轮同一子系统上产生新的 Critical 时每一轮局部看都是正常的而子系统整体正在发散。设计文档引用的 #9659 案例是典型停止轮次的 blocker-dating 链产生了三代后继 CriticalR9-1 → R10-2/3/4 → R11-4/R11-6 → R12-1/R12-2识别发散靠的是人工的轮次数分析在机制被删除、开放 finding 数量崩塌之前整整花费了四轮 patch-and-regress。而既有收敛模块的 recurrence cluster 只能表述该文件再次出现发现无法表述修复关闭了一个、机制又长出了另一个——因为没有任何一轮记录 closures关闭事件。设计总览确定性血缘检查解决方案是一个确定性的血缘检查位于diagnoseConvergence内部由 ledger marker 携带的有界 closure 列表供数不依赖任何模型判断——只是对管道本来就会写入的数据做一次遍历每次触发都是本 PR 自身轮次之间的比较没有阈值、没有评论太多之类的数字门槛这是收敛模块的一贯原则一个工具拥有的策略就必须在它一无所知的仓库上为它辩护输出永远只是观察observation不移动事件、不扣留 anchor、不封顶裁决——是否继续修复、重构、拆分或合入是作者与运营者的决定。Ledger 标记携带closed列表数据结构Ledger增加一个可选的closed数组条目{r, id, f}记录一个 Criticalr该 finding 从工作列表消失时所属的轮次id被关闭 finding 的原始轮次 id如R9-1f被关闭 finding 所在文件。对应源码为 ledger.ts 中的LedgerClosure接口以及Ledger.closed字段ledger.tsexport interface LedgerClosure { /** The round whose marker the finding is absent from. */ r: number; /** The closed findings id — its ORIGINAL rounds id, e.g. R9-1. */ id: string; /** The closed findings file. */ f: string; }字段刻意使用单字母r/f与 finding 相同的body 字节纪律保持一致——marker 是嵌在 PR 评论体里的 HTML 注释每字节都算数。铸造minting位置的差异即关闭铸造发生在组成轮次r时把恢复出的上一轮工作列表与本轮构建的 ledger做位置差分每个消失的 Critical id 追加一条 closure 条目。要点只追踪 Critical——Suggestion 不追踪Critical 的流失才是信号fixed与superseded都读作关闭——位置差分无法区分二者而咨询性注释也不需要区分只带一代、不向前携带——K2 检查在第 N 轮只读取第 N 轮组成时铸造与第 N-1 轮从上一轮 marker 读回的 closure更早的条目是死字节。界限与字节预算closure 列表严格遵守 marker 的脚注、绝不是 payload契约数量上限LEDGER_MAX_CLOSED 50ledger.ts恰好等于一整份工作列表LEDGER_MAX_FINDINGS同为 50保留最新字节位置在序列化器的 shed 级联中closures 排在卷量遥测之后、anchor 对与工作列表之前ledger.ts。级联顺序依次为双卷量 → 单卷量 → 无卷量 →丢弃 closure 列表→ 丢弃 anchor 对 → 逐条裁剪 finding。之所以让 advisory 数据最先被 shed是因为丢失它只损失一轮血缘而 anchor 和工作列表是下一轮要据以行动的声明shed 从不设置droppedclosures 不证明任何范围range因此不存在需要保护完整性的声明见 ledger.ts 注释与 ledger.ts 解析侧的处理。铸造抑制诚实原则的 fail-closed铸造在缺席于发布集合**并不等于被判定已修复**的所有场合被抑制——这与openCriticals门对同一推断施加的诚实规则完全一致见 compose-review.ts不完整的恢复工作列表dropped/被拒绝条目——消失的 id 可能是截断而非裁决纯 diff-only 轮次——无法作出裁决本轮对某 Critical 公开回答无法判断——anchorFailsClosed谓词同时约束 closures纯外来pure-foreign前列表——条目是陌生人的不是本账号列表的缩短版#9526匿名采纳anonymous adoption——持久化接缝的机器可读记录表明该文件 finding 是在无身份担保的情况下被采纳的。铸造还按CLAIM 身份而非id 身份收敛一个本轮以重新铸造的 id 重新发布的 claim如重新生成的 gate Critical、readback 丢失的模型重发仍然成立。具体实现是compose-review.ts以claimLocator投影去 id、去—分隔、去反引号对比构建侧与恢复侧的 claim凡仍在standingClaims集合中的 claim 一律不算关闭重发通道——typed deferral 通道与 floor 强制执行喂入的 reroute——以它们携带的 IDjoin标题带原始 finding id 的条目无论以何种 severity 或路径重发该 claim 都保持成立不带任何 id 的条目无法证明它重发的是什么本轮整个铸造 fail closed什么都不铸造铸造前提还包括上一轮工作列表完整carriedWorkList.complete、本轮的构建非空、且prevFacts.foreign ! true || prevFacts.merged true合并过的外来标记仍可铸造。薄历史thin history保持沉默而非猜测——这是整个机制反复出现的诚实姿态。解析与准入parseLedger通过isLedgerClosure校验 closure上限与轮次约束与序列化器镜像轮次必须是[1, markerRound]内的整数closure 声称的轮次不可能超过 marker 自身的轮次id 必须满足LEDGER_ID_SHAPE^R\d-\d$、长度 ≤LEDGER_MAX_ID24且 id 的铸造轮次严格小于 closure 轮次r只有轮次封顶处例外——否则一条从未处于开放状态的代会被种进血缘连接ledger.ts解析侧同样不设dropped对应物——closure 不证明任何范围截断的历史没有需要保护的完整性声明。prevLedgerFacts在 side-file 路径上用同样的准入测试把 closures 带进 composepr-context.ts 在接缝处会从外来 marker 剥离closed见 pr-context.ts 附近。K2 检查successor chain 的判定在diagnoseConvergence内部、recurrence cluster 旁边一个文件 F 触发successor chain需要同时满足三个条件K2含当前轮F 在上一轮关闭了一个 Criticalprev.closed中r round - 1的条目F 在本轮关闭了一个 CriticalclosuresThisRound中r round的条目本轮在 F 上发布了一个新鲜的Critical——以构建后 ledger 的Rround-*id 为准构建 id 的轮次就是首报轮次经过 readback 与准入之后。对应实现位于 convergence.ts数据结构为export interface SuccessorChain { /** The subsystem, named by the file every generation landed on. */ file: string; /** The closure ids of each of the two rounds, oldest first. */ generations: string[][]; /** The fresh Critical ids this round posts on the file. */ newIds: string[]; }cluster 自身的文件规则原样适用(body)/(unknown)占位名LEDGER_BODY_FILE/LEDGER_UNKNOWN_FILE永不参与——闭包条目不携带k标志若参与会把一条从未锚定在任何机制上的血统发出来k标志仍用于区分碰巧拼得像占位名的真实路径ledger.ts 的isStandInName路径截断的镜像回退closure 在每条路由上都以LEDGER_MAX_FILE200封顶而检查侧以原始构建路径为键超过上限时回退到前缀切片与priorFor相同否则哨兵恰好会在它存在的深子系统上失效convergence.ts新鲜侧的身份防御一个 readback 丢失 carried id 的重发会在构建中被盖上全新 id所以仅凭birthRound round会把仍成立的 claim 误算作链条新一代。检查以铸造成的claimLocator投影对比恢复的前列表——条目存在本身就是证据无论列表完整性如何convergence.ts。与 #9659 证据的对照设计文档给出的验证组成第 11 轮时在第 10 轮关闭R9-1r10的基础上关闭R10-2/3/4r11而R11-4/R11-6落在同一文件上——注释在第 11 轮触发比人工分析发现反弹早一轮。这一场景在 convergence.test.ts 有对应单测fires on the #9659 rebound shape — closed in each of the last two rounds, fresh Critical now。输出咨询性的一等公民类型化链条与渲染ConvergenceDiagnosis.successorChains携带类型化链条{file, generations, newIds}由renderSuccessorChain渲染为R9-1 → R10-2/R10-3 → R11-4convergence.tsexport function renderSuccessorChain(c: SuccessorChain): string { const renderGeneration (ids: string[]): string { const shown ids.slice(0, MAX_CHAIN_IDS_PER_GENERATION).join(/); return ids.length MAX_CHAIN_IDS_PER_GENERATION ? ${shown} … (${ids.length - MAX_CHAIN_IDS_PER_GENERATION}) : shown; }; return [...c.generations, c.newIds].map(renderGeneration).join( → ); }每代最多展示MAX_CHAIN_IDS_PER_GENERATION 6个 id超出以… (N)省略——防止一轮关闭整个家族时段落无限膨胀。人类可读的 prose 与机器可读的 basis共用这一个渲染器保证两侧永远不会对它们指称的血缘产生分歧。双语 Divergence 语句收敛观察发布的 body stderr 的CONVERGENCE:行以⚠️ Divergence 语句开头点名子系统与链条中英双语且每个 PR 可控片段都经mdField转义convergence.tsEN⚠️ Divergence: the same subsystem closed Critical(s) in the previous round and again this round, and posts a new one now — file (chain); and N more.ZH⚠️ 发散同一子系统在上一轮和本轮各关闭了至少一个 Critical本轮又出现了新的 Critical——filechain另有 N 个。链条完整点名不只列文件因为 id 是作者据以行动的证据。此外还会附证据说明Evidence条款链条最新一代携带本轮铸造的 id——一个未解决断言在不携带原 id 的情况下被重新表述在那里与新的 Critical 无法区分该身份差距被显式披露而非断言新一代是新的convergence.ts。机器可读建议码successor-chainrecommendationsFor为匹配到的链条发射一个新的闭集词汇代码successor-chain链条渲染结果放入其basis字段——这正是 autofix 工具链读取的机器可读半边convergence.tsout.push({ code: successor-chain, basis: ${d.successorChains.length} subsystem(s) closed Critical(s) in the previous round and again this round, and post a new one now: ${shown.join(, )}${d.successorChains.length shown.length ? , … : }, });它随组装的产物一起通过既有的recommendations校验——校验会拿代码对照运行时列表RECOMMENDATION_CODESconvergence.tsexport const RECOMMENDATION_CODES [ root-cause-triage, successor-chain, land-and-defer, batch-fixes, stem-surface, ] as const;设计文档中的建议菜单原本有 12 个代码本模块实际只发射这 5 个successor-chain随 #9905 加入其余 7 个因本轮证据不足以支撑而缺席且每个缺席都有说明理由而非遗忘。闭集是刻意为之调用方在不解析散文的情况下把这些代码接到动作上词汇表就是一份契约匹配是测量 → 建议零常量、零决策。与链条匹配的人类可读建议是一句机制层面的指引convergence.ts每次修复都长出下一个 Critical 的机制是在发散而非收敛——先把这一模式提给该机制的负责人通常比继续打补丁更快结束循环。测试验证convergence.test.ts 起用一组describe(diagnoseConvergence — the successor chain (#9905))覆盖该功能#9659 反弹形态上轮关闭R9-1r10、本轮关闭R10-2r11、本轮新发R11-4于同一文件 → 断言successorChains的结构与successor-chain建议码的 basis 文本非相邻轮次r1 与 r3 的闭包不触发——K2 要求严格相邻同一轮次的闭包r2 与 r2不触发占位名文件(body)不参与连接超长路径的切片回退超过LEDGER_MAX_FILE的原始路径经前缀切片后仍能命中新鲜侧防重铸仍在上一轮列表中立足的 claim 以新 id 重发时不计为新一代排序多链条按新 Critical 数量、闭包总量、码元路径稳定排序每代 6 个 id 的上限与N省略、多文件多链条渲染等。闭包铸造侧的抑制逻辑不完整列表、外来列表、匿名采纳、无法识别的重发条目由 compose 侧与 ledger 侧测试共同守护例如 ledger.test.ts 中对isLedgerClosure轮次/id 文法/长度上限的校验。它刻意不做的事设计文档明确列出了边界避免读者高估能力无法区分fixed与superseded也无法区分被丢弃的 carry——关闭是位置性的。注释是咨询性的罕见的误报只花一句话保持 carry 诚实的是LEDGER_ID_READBACK与 stray-id 规则那套机制而非本检查从不封顶裁决、从不扣留 anchor——发散是被评审代码的属性不是本轮读到了什么仅文件级匹配——ledger 不记录符号issue 中的 symbol, if recorded——它没有被记录因此无法下钻到函数或符号级别。总结review-divergence-sentinel设计为/review跨轮评审补上了最后一块收敛观测拼图通过让 ledger marker 携带一代有界 closure 列表diagnoseConvergence得以在 K2 窗口内用纯确定性数据识别修复长出下一个 Critical的换代级联比人工轮次数分析早一轮发出 ⚠️ Divergence 警告并通过successor-chain建议码把同一事实同时交给人类阅读与 autofix 工具链消费。整套机制自始至终坚持三个约束只测量不裁决不封顶、不扣留、不移动事件、薄历史保持沉默所有推断都在证据完整时才发声、单一事实来源marker 记录、诊断、建议码与渲染文本共用同一份数据永不各自漂移。相关实现与测试设计文档docs/design/review-divergence-sentinel.md诊断与建议码packages/cli/src/commands/review/lib/convergence.tsledger 数据结构、序列化与解析packages/cli/src/commands/review/lib/ledger.ts闭包铸造与组装packages/cli/src/commands/review/compose-review.ts前轮事实恢复与外来剥离packages/cli/src/commands/review/pr-context.ts单测packages/cli/src/commands/review/lib/convergence.test.ts【免费下载链接】qwen-codeAn open-source AI coding agent that lives in your terminal.项目地址: https://gitcode.com/GitHub_Trending/qw/qwen-code创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表