feat(review): engage the severity floor early on a sustained convergence signal (#9903) - #9938
Conversation
…nce signal (#9903) The convergence diagnosis prints the remedy — drop to a critical posting floor — whenever the first-time-finding rate stops falling, but the floor itself engaged on a fixed round-6 schedule, so rounds 3-5 kept posting Suggestions inline at full cost while re-deriving the same root-cause cluster. Record the consecutive not-falling rounds in a new ledger field (flatRounds); at two — the shortest window in which "not falling" is an observation — engage the floor on the firing round, ahead of schedule, latched for the rest of the loop, and disclosed in the posted body with the streak that armed it. The streak rides the churn streak's trust group (foreign markers stripped at the recovery seam, planted values clamped to the rounds the PR actually ran); an explicit suggestion floor still overrides the latch and an unknowable round still fails open. Fixes #9903
|
Re-run after two fix commits ( Template looks good ✓ Problem: observed, not theoretical. Issue #9903 records a real review loop where the convergence diagnosis named its own remedy ("drop this PR's reviews to Direction: aligned. This refines the review pipeline's existing self-throttling policy — the round-adaptive floor — by making its trigger signal-driven instead of round-fixed, with the diagnosis keeping its advisory role and the floor policy (the layer that already decides what posts) consuming the signal. That is the exact split the issue's triage verdict prescribed. Size: ~354 production logic lines ( Approach: the scope still matches the accepted verdict one-for-one, and the two commits since the first pass answered review-round findings inside that same shape: the streak measurement is now gated to the Risk: no elevated risk signals — none of the changed files is on the revert-correlated path list. Moving on to code review. 🔍 中文说明两个修复提交( 模板完整 ✓ 问题:已观测到,非理论性问题。Issue #9903 记录了一次真实的评审循环——收敛诊断从第 3 轮起就给出了它自己的解法("把本 PR 的评审降到 方向:对齐。这是对评审管线既有自节流策略(轮次自适应 floor)的精化——把触发器从固定轮次改为信号驱动,诊断保持建议角色,由已经掌握发布决策权的 floor 策略层消费信号。这正是 issue 分诊结论规定的分工。 规模:约 354 行生产逻辑( 方案:范围仍与被接受的结论一一对应,且首轮审查以来的两个提交在同一形态内回应了评审轮次的发现:计数测量现在只对 风险:无升级风险信号——改动文件均不在与回滚相关的路径列表上。 进入代码审查。🔍 — Qwen Code · qwen3.8-max Reviewed at |
Code reviewApproached cold, my own proposal for this problem would have been: persist a consecutive-round streak of the existing Walking the implementation:
Three items remain from the review loop's round-3 deferral list, none blocking — worth a follow-up issue if the author doesn't fold them in: the operator-facing settings docs ( Flow of one round under the new triggersequenceDiagram
participant P1 as compose-review
participant P2 as diagnoseConvergence
participant P3 as floor resolution
participant P4 as ledger marker
P1->>P2: measure volumeNotShrinking over pre-reroute FRESH drafts (auto rounds only)
P2-->>P1: fires, or not
P1->>P1: advance, reset, or pin the flatRounds streak
P1->>P3: resolve floor, schedule arm first, signal arm second
P3-->>P1: auto-resolved, auto-signaled, or open
P1->>P1: reroute drafted Suggestions into the deferral list
P1->>P4: stamp flatRounds beside churnRounds
P1-->>P1: disclose the engagement reason in the posted body
Files changed (11 of 11)
Test evidenceUnattended CI run — nothing was built or executed here; the evidence is the PR's own CI on the reviewed commit, fetched via the API at the time of this pass. Every check that ran is green, including the ubuntu unit suite carrying the new regression block. The skips are the workflow's own design, not a PR-caused condition:
One row per check name (latest run); skipped checks omitted; failures sort first. / 每个检查名一行(取最新一次运行),省略 skipped,失败项排在最前。 The live multi-round loop itself is model-in-the-loop by nature and no harness here can exercise it; the deterministic compose path it terminates in is what the unit suite covers end to end. The sandboxed lane my first pass asked for was triggered and is in flight: 中文说明代码审查不看 diff 先独立构想,我的方案是:把既有 逐点核对:
评审循环第 3 轮的延后清单还剩三项,均不阻断——若作者不顺手收掉,值得转跟进 issue:面向操作者的设置文档( 测试证据无人值守 CI 运行——此处未构建或执行任何代码;证据为评审提交上 PR 自己的 CI,经 API 在本次审查时点抓取。所有运行的检查全绿,包括承载新回归块的 ubuntu 单元套件。skipped 是 workflow 自身设计而非 PR 导致: 真实多轮循环本身天然需要模型在环,此处任何装置都无法演练;其终点所在的确定性 compose 路径正是单元套件端到端覆盖的对象。首轮要求的沙箱验证已被触发、正在运行: — Qwen Code · qwen3.8-max Reviewed at |
|
Confidence: 4/5 — the two fix commits close exactly the class of hole a first pass misses (posture licensing of the measurement, planted-streak arithmetic, byte-cap survival), each pinned by tests; what remains is recorded non-blocking doc and comment polish. Stepping back: this is still what a good response to a triage verdict looks like, and now also what a good response to review feedback looks like. The first pass approved the shape; the rounds after it found that the streak measurement was ungated against explicit-floor rounds, that the planted-streak clamp admitted one dishonest-but-reachable shape, and that the serializer's latch could shed at the byte cap — and each came back with the fix and the test that pins it, not a rewrite. The autofix loop addressed the round-1 feedback, the maintainer re-reviewed and approved the current head, and the review loop's last round reports no blockers — while printing, about this very PR, the convergence advice this feature exists to act on. The parts that usually go wrong in this kind of change are all attended to: the streak advances only on measured auto-posture firing rounds (earliest engagement round 4), the latch is pinned rather than re-measured because the floor quiets the trend it reads and survives a context-unavailable blip, the round-6 schedule still wins when both arms fire, every planted-value route clamps to the honest maximum, and an explicit The 4 rather than 5 is the recorded remainder, none of it blocking: the operator-facing settings docs still describe the CI landed green on the reviewed commit with no 中文说明回头整体看:这仍然是对分诊结论的一次教科书式回应,而且这次也是对评审反馈的一次教科书式回应。首轮批准了形态;此后的轮次发现计数测量未对显式 floor 轮次设门、植入计数的钳制放行了一种不诚实但可达的形状、序列化器的锁存可能在字节上限处被丢弃——每一项都带着修复与钉住它的测试回来,而不是重写。autofix 循环处理了第 1 轮反馈,维护者重审并批准了当前 head,评审循环的最后一轮报告无阻断——同时还在对本 PR 打印着本特性正是为了付诸行动的收敛建议。 这类改动通常出错的地方全都处理到了:计数只在测得的 auto 姿态触发轮推进(最早第 4 轮激活);锁存采用钉住而非重测,因为 floor 会让它读取的趋势安静下来,且能挺过 context-unavailable 闪断;两臂同时命中时第 6 轮时间表仍然获胜;每条植入值路径都被钳制到诚实上限;显式 给 4 而非 5 是记录在案的余项,均不阻断:面向操作者的设置文档仍把 评审提交上 CI 全绿且无仍在运行的 pull_request 工作流,因此批准立即给出,钉在评审提交上。 — Qwen Code · qwen3.8-max Reviewed at |
|
@qwen-code /takeover |
Code Coverage Summary
CLI Package - Full Text ReportCore Package - Full Text ReportFor detailed HTML reports, please see the 'coverage-reports-22.x-ubuntu-latest' artifact from the main CI run. |
qwen-code-ci-bot
left a comment
There was a problem hiding this comment.
LGTM, looks ready to ship — CI landed green after the review. ✅
|
🤝 Takeover engaged: the autofix loop now manages this PR — it will address new review feedback and resolve base conflicts until the label is removed or the round cap is reached. Remove the 中文说明🤝 已接管:autofix 循环现在管理此 PR —— 将持续处理新的评审反馈与 base 冲突,直到移除标签或达到轮次上限。移除 |
qwen-code-ci-bot
left a comment
There was a problem hiding this comment.
Partially reviewed — gaps disclosed.
Not reviewed: reverse audit of chunk 4 (round 4) — the auditor never returned (two infrastructure failures).
中文说明
仅完成部分审查,审查缺口已披露。
未审查:reverse audit of chunk 4 (round 4) — the auditor never returned (two infrastructure failures)。
— qwen3.8-max via Qwen Code /review (v0.22.0)
| const flatFires = | ||
| !flatLatched && | ||
| input.contextUnavailable !== true && |
There was a problem hiding this comment.
[Critical] The streak measurement is posture-blind: flatFires never reads severityFloor and measures the trend with hardcoded floor: 'o', so rounds run under an explicit operator floor still advance the streak — and the latch then engages off rounds the operator had explicitly taken out of the posture. A round under --severity-floor suggestion stamps marker floor 'o' exactly like an open auto round (the marker vocabulary has no letter for suggestion), so the trend's floorChanged guard cannot see the change either; the same holds for an explicit critical round. This is the false-engagement direction the design doc's error asymmetry excludes ("never a false one … on insufficient evidence"): rounds 1–3 under auto with round 3 firing (flatRounds: 1), then round 4 under --severity-floor suggestion (posture off, everything drafted inline) advances the streak to 2, and round 5 back on auto latches — the floor engages one round ahead of the round-6 schedule, disclosing "2 consecutive round(s)" of which one ran under a policy where deferral is unlicensed.
Witness (probe in a scratch tree, PR's own harness):
PR (unmodified):
ROW-A (round 4, severityFloor 'suggestion'): marker.flatRounds: 2 ← advanced under posture OFF
ROW-B (round 5, severityFloor 'auto'): floorEnforced: [1,2] ← latch engages (schedule says 6)
ROW-C (round 4, severityFloor 'critical'): marker.flatRounds: 2 while the same round's rendered
diagnosis (actual floor 'c') declares the trend non-comparable
FIX ARM (flatFires gated on the auto floor):
ROW-A/ROW-C: marker.flatRounds omitted ← non-auto rounds reset (fail-open direction)
ROW-B: floorEnforced: [] + compose-review.test.ts 529/529 pass with the fix
Gate the measurement where the arm is gated: require the resolved floor to be auto (folding an absent severityFloor into auto, as criticalFloorKind does) in flatFires' guard list, so non-auto rounds reset the streak — one condition subsumes both posture variants. Add rows: sideFile(firingPrev({ round: 4, flatRounds: 1 })) with compose({ severityFloor: 'suggestion' }) and with compose({ severityFloor: 'critical' }) → streak resets, and the next auto round engages nothing before round 6.
中文说明
[Critical] streak 的测量对姿态不敏感:flatFires 从不读取 severityFloor,且用硬编码的 floor: 'o' 测量趋势,因此在操作者显式指定 floor 的轮次里 streak 仍会推进——随后锁存会基于操作者已明确退出该姿态的轮次激活。--severity-floor suggestion 轮次在 marker 上盖的 floor 与开放的 auto 轮次完全相同('o'),趋势自带的 floorChanged 守卫同样看不到这一变化;显式 critical 轮次同理。这正是设计文档的错误不对称性所排除的方向("绝不允许错误激活"):第 1–3 轮在 auto 下、第 3 轮触发(flatRounds: 1),第 4 轮切到 --severity-floor suggestion(姿态关闭、全部行内起草)却把 streak 推进到 2,第 5 轮回到 auto 即锁存——floor 比第 6 轮时间表提前一轮生效,披露的 "2 consecutive round(s)" 中有一轮运行在延后根本未获许可的策略之下。
证据(scratch tree 探针,使用 PR 自带测试脚手架):未修改的 PR 上,ROW-A(第 4 轮,suggestion)marker.flatRounds 推进到 2;ROW-B(第 5 轮,auto)floorEnforced 为 [1,2](时间表应为第 6 轮);ROW-C(第 4 轮,critical)marker.flatRounds 推进到 2,而同轮渲染诊断(实际 floor 为 'c')却判定该趋势不可比。修复臂(flatFires 增加 auto floor 门):ROW-A/ROW-C 的 marker.flatRounds 被省略(非 auto 轮次复位,失败打开方向),ROW-B 的 floorEnforced 为 [],且打上修复后 compose-review.test.ts 529/529 全绿。
建议把测量与激活臂放在同一道门后:在 flatFires 的守卫列表里要求解析后的 floor 为 auto(缺省 severityFloor 按 auto 折叠,与 criticalFloorKind 一致),使非 auto 轮次复位 streak——一个条件同时覆盖两种姿态变体。补两行测试:sideFile(firingPrev({ round: 4, flatRounds: 1 })) 分别配 compose({ severityFloor: 'suggestion' }) 与 compose({ severityFloor: 'critical' }) → streak 复位,且下一个 auto 轮在第 6 轮前不激活任何东西。
— qwen3.8-max via Qwen Code /review (v0.22.0)
| const flat = streakOf(ledger.flatRounds); | ||
| if (flat !== undefined && flat > 0) payload.flatRounds = flat; |
There was a problem hiding this comment.
[Suggestion] The new flatRounds write/parse code has no counterpart in ledger.test.ts, where its sibling churnRounds has a six-property block — two mutations of this diff's own lines survive the whole suite. (1) Moving payload.flatRounds inside the volume-shed block leaves every test green, but in production a marker at the byte cap — exactly the long, not-converging PR this feature targets — sheds the latched streak with the volume tier and silently releases the floor between rounds 4 and 6. (2) Deleting the parse-side round-clamp at ledger.ts:799 also stays green: a hand-edited marker {round: 1, flatRounds: 2} propagates a streak the serializer never emits; the deterministic compose read re-clamps, but SKILL.md's model-side routing reads the side file raw and would defer Suggestions on rounds the code floor leaves open. Probe: both mutants flip a scratch-tree probe (marker carries/loses flatRounds; forged marker reads 2 vs clamped 1) while the full review suite (4991 tests) stays green. Mirror the churn block for flatRounds: byte-squeeze survival, forged-marker clamp ({round: 2, flatRounds: 9999} → 2), zero-omission, and the LEDGER_MAX_ROUND bound.
中文说明
[Suggestion] 新增的 flatRounds 写入/解析代码在 ledger.test.ts 中没有对应测试块,而其兄弟字段 churnRounds 有六条属性测试——对本 diff 自身代码的两处变异在整个测试套件下均存活。(1) 把 payload.flatRounds 移进 volume 丢弃块:所有测试仍绿,但生产中标记到达字节上限时——恰恰是本功能针对的长尾不收敛 PR——锁存的 streak 会随 volume 层一起被丢弃,floor 在第 4–6 轮之间被悄悄解除。(2) 删除解析侧的轮次钳制(ledger.ts:799)同样全绿:手改的 marker {round: 1, flatRounds: 2} 会传播一个序列化器永远不会产出的 streak;确定性 compose 读取会再次钳制,但 SKILL.md 的模型侧路由直接读原始侧文件,会在代码 floor 仍开放的轮次延后 Suggestions。探针:两种变异都能让 scratch tree 探针翻转(marker 是否携带 flatRounds;伪造 marker 读到 2 对比钳制后的 1),而完整 review 套件(4991 个测试)保持全绿。建议为 flatRounds 镜像 churn 测试块:字节挤压存活、伪造 marker 钳制({round: 2, flatRounds: 9999} → 2)、零值省略、LEDGER_MAX_ROUND 上界。
— qwen3.8-max via Qwen Code /review (v0.22.0)
| it('fails open in the context-unavailable state — the round is unknowable', () => { | ||
| sideFile(firingPrev({ round: 4, flatRounds: 1 })); | ||
| const r = compose({ contextUnavailable: true }); |
There was a problem hiding this comment.
[Suggestion] The latch's documented survival of a context-unavailable blip (pinned streak ≥ bar) has no test row — this row uses a below-bar streak (flatRounds: 1), where a reset is expected regardless. Mutating the pin to release the latch on a context outage (flatLatched && input.contextUnavailable !== true ? prevFlat : …) survives the whole suite, and the shipped regression would be: one transient GitHub outage on a latched PR wipes the pinned streak from the marker, disengages the floor, and returns rounds 4–5 to full-volume Suggestion posting until the streak rebuilds from zero or round 6 arrives — contradicting the code's own comment ("the latch survives the blip") and the design doc. Probe: the mutant prints marker.flatRounds: undefined where the current code pins 2. Add a row: sideFile(firingPrev({ round: 4, flatRounds: 2 })), compose({ contextUnavailable: true }) → expect(r.floorEnforced).toEqual([]) (floor fails open for the round) and expect(parseLedger(r.body)?.flatRounds).toBe(2) (pin survives).
中文说明
[Suggestion] 锁存在 context-unavailable 闪断下存活(streak 已达标时被钉住)这一有文档记载的行为没有测试行——本行用的是未达标的 streak(flatRounds: 1),该场景下无论是否变异都预期复位。把钉住逻辑变异为"context 故障时解除锁存"(flatLatched && input.contextUnavailable !== true ? prevFlat : …)后整个套件仍全绿;由此可上线的回归是:一次瞬时的 GitHub 故障就会把已锁存 PR 的 streak 从 marker 中抹掉、解除 floor,让第 4–5 轮回到全量发布 Suggestion,直到 streak 从零重建或第 6 轮到来——与代码自己的注释("锁存在闪断中存活")和设计文档相悖。探针:变异体输出 marker.flatRounds: undefined,当前代码钉住 2。补一行:sideFile(firingPrev({ round: 4, flatRounds: 2 }))、compose({ contextUnavailable: true }) → expect(r.floorEnforced).toEqual([])(本轮 floor 失败打开)且 expect(parseLedger(r.body)?.flatRounds).toBe(2)(钉值存活)。
— qwen3.8-max via Qwen Code /review (v0.22.0)
| // The engagement says WHY: an unexplained critical floor at round 5 | ||
| // would read as a pipeline fault. | ||
| expect(r.body).toContain( | ||
| 'the floor engaged early: the first-time-finding rate has not fallen for 2 consecutive round(s)', |
There was a problem hiding this comment.
[Suggestion] This assertion cannot discriminate the two sites the diff spans: signalFloorNote is interpolated into both floorEnforcedNote (renders only when reroute.entries.length > 0) and the deferral header (renders whenever deferredSuggestions is non-empty, including model-side entries), and in the engagement test both are present — removing the interpolation from either site leaves every test green (probe-verified). The bite: a future edit dropping the note from the deferral header would go unnoticed, and on a compliant latched round — the norm per SKILL.md's marker routing, where the model defers its Suggestions itself so reroute is empty and floorEnforcedNote never renders — the deferral header is the only disclosure site; the posted body would present an unexplained early floor, the exact "reads as a pipeline fault" defect the note exists to prevent. Add a case with a latched side file (flatRounds: 2), Critical-only draftedComments (empty reroute), and deferredSuggestions carrying one model-side entry; assert the deferral header line itself contains the "floor engaged early" note.
中文说明
[Suggestion] 该断言无法区分 diff 跨的两个插入点:signalFloorNote 同时被插入 floorEnforcedNote(仅在 reroute.entries.length > 0 时渲染)与延后清单头部(只要 deferredSuggestions 非空就渲染,包括模型侧条目),而激活测试里两处同时存在——从任一处删除该插入,所有测试仍绿(已用探针验证)。危害:未来某次编辑把延后头部的注记删掉不会被察觉;而在一个合规的锁存轮次——按 SKILL.md 的 marker 路由这是常态,模型自行延后其 Suggestions,reroute 为空、floorEnforcedNote 根本不渲染——延后头部是唯一的披露点,发布正文将呈现一个无法解释的提前生效 floor,恰是该注记要防止的"读起来像流水线故障"缺陷。补一个用例:锁存侧文件(flatRounds: 2)、仅 Critical 的 draftedComments(空 reroute)、deferredSuggestions 携带一条模型侧条目;断言延后头部那一行本身包含 "floor engaged early" 注记。
— qwen3.8-max via Qwen Code /review (v0.22.0)
| // Same rung, same bound, same zero-omission for the floor trigger's | ||
| // streak — the pull request whose rate never falls is exactly the one | ||
| // whose marker sits at the byte cap. |
There was a problem hiding this comment.
[Suggestion] The streak rides above the byte-shed cascade, but the trend it is built from does not: fresh rides in the volume tier that sheds FIRST. Under sustained byte-cap pressure the streak can never build, so the trigger never engages on exactly the PRs it targets — a loop whose work list exceeds LEDGER_MAX_BYTES (8192) during the build-up window (a PR carrying ~50 findings by rounds 2–3, the shape this serializer's own docstring measures) sheds fresh on every marker; the next round's trend measurement reads prev.fresh === undefined, volumeNotShrinking is false, the pre-latch streak resets to 0 every round, and rounds 4–5 post full-volume Suggestions until the round-6 backstop engages two rounds late. Probe (same drafts, same round, only marker size varies): under-cap marker → streak advances (flatRounds=1); over-cap marker (len=8061, fresh shed) → streak resets (flatRounds=undefined). The churn blocker does not share this hole — its input is the model-written census, not the marker's fresh. Either shed fresh beside the streaks rather than with the volume tier (~10 bytes, and it now decides a trigger), or state in the docstring that a byte-capped build-up window defers engagement to the round-6 schedule, so this comment's byte-cap claim matches what the mechanism delivers.
中文说明
[Suggestion] streak 本身位于字节丢弃级联之上,但它所依赖的趋势输入不在:fresh 位于最先被丢弃的 volume 层。持续的字节上限压力下 streak 永远无法累积,于是触发器恰恰在它针对的 PR 上永不激活——构建窗口内工作列表超过 LEDGER_MAX_BYTES(8192)的循环(第 2–3 轮就携带约 50 条发现的 PR,正是本序列化器 docstring 亲自度量的形状)每个 marker 都会丢弃 fresh;下一轮趋势测量读到 prev.fresh === undefined,volumeNotShrinking 为假,锁存前的 streak 每轮复位为 0,第 4–5 轮继续全量发布 Suggestion,直到第 6 轮兜底晚两轮生效。探针(同样的草稿、同样的轮次,仅 marker 大小变化):上限以内的 marker → streak 推进(flatRounds=1);超限 marker(len=8061、fresh 被丢弃)→ streak 复位(flatRounds=undefined)。churn 阻塞器没有这个洞——它的输入是模型写入的 census,而非 marker 的 fresh。建议要么把 fresh 与 streak 同层放置而不是随 volume 层丢弃(约 10 字节,而它现在决定一个触发器),要么在 docstring 中写明"字节上限下的构建窗口会把激活推迟到第 6 轮时间表",使这段注释的字节上限声明与机制实际交付一致。
— qwen3.8-max via Qwen Code /review (v0.22.0)
There was a problem hiding this comment.
Deferred to the next round under this round's batch bound — the finding is accepted and the fix direction is already decided, so nothing is dropped: it will land as the docstring fix (your option b), not the tier move. Moving fresh above the shed cascade conflicts with the ladder's documented trade: at the tightest rung those ~10 bytes are paid with the anchor pair (sha + model), exactly the "trading a full-diff re-review for a trend line" outcome the cascade's own comment warns against — while the round-6 backstop bounds the engagement delay the current placement causes. So the honest fix is to state in the flatRounds docstring what the mechanism delivers: the streak itself survives the byte cap (a latched floor holds), but a byte-capped build-up window defers FIRST engagement to the round-6 schedule because the trend's fresh input rides the volume tier that sheds first.
中文说明
在本轮批量上限下延后到下一轮——该发现已被接受,修复方向也已确定,不会丢失:将以 docstring 修复(你的选项 b)落地,而不是移动层级。把 fresh 移到丢弃级联之上与级联记录的权衡冲突:在最紧的那一档,这约 10 字节要用锚点对(sha + model)来偿付,正是级联自身注释警告的"拿全量重审换一条趋势线"——而第 6 轮兜底为当前放置造成的激活延迟兜了底。因此诚实的修复是在 flatRounds 的 docstring 中写明机制实际交付的行为:streak 本身在字节上限下存活(锁存的 floor 保持),但字节上限下的构建窗口会把首次激活推迟到第 6 轮时间表,因为趋势的 fresh 输入位于最先被丢弃的 volume 层。
| // The floor trigger's streak rides the same carry, through the same | ||
| // reader, with the same clamp — a planted `flatRounds` cannot engage | ||
| // the floor off rounds the pull request never ran either. | ||
| expect(carry({ flatRounds: '2' }).flatRounds).toBeUndefined(); |
There was a problem hiding this comment.
[Suggestion] Second location of the un-pinned drop seam (root: CHURN_FIELDS in pr-context.ts). The new flatRounds carry term in persistRecoveredLedger is tested only on its CARRY side (ownMarkerRead: false); the resurrection-guard siblings ('does NOT resurrect a streak the own marker actually reset', UNSET-ownMarkerRead) seed and assert churnRounds only, so a mutation leaking the flat term past the ownMarkerRead === false guard survives the whole suite. The shipped regression: when this account's own marker IS read and reset the flat streak, the side file's stale streak is resurrected over the authoritative write — a stale latched value (≥ 2) re-engages the floor with no measurement at all, deferring Suggestions on insufficient evidence. Seed flatRounds: 2 beside churnRounds: 2 in both guard tests and assert written.flatRounds is toBeUndefined().
中文说明
[Suggestion] 未钉扎丢弃缝的第二处位置(根在 pr-context.ts 的 CHURN_FIELDS)。persistRecoveredLedger 中新的 flatRounds carry 项只在 CARRY 侧(ownMarkerRead: false)被测试;复活守卫的兄弟用例("不得复活自身 marker 实际已重置的 streak"、UNSET-ownMarkerRead)只种并断言 churnRounds,因此把 flat 项泄漏出 ownMarkerRead === false 守卫的变异在整个套件下存活。可上线的回归:当本账号自身 marker 确实被读取并重置了 flat streak 时,侧文件里的陈旧 streak 会复活并覆盖权威写入——陈旧的锁存值(≥ 2)在没有任何测量的情况下重新激活 floor,基于不充分的证据延后 Suggestions。在两个守卫测试中于 churnRounds: 2 旁补种 flatRounds: 2,并断言 written.flatRounds 为 toBeUndefined()。
— qwen3.8-max via Qwen Code /review (v0.22.0)
| floor: 'o', | ||
| })?.volumeNotShrinking === true; |
There was a problem hiding this comment.
[Suggestion] The streak's documented reliance on the trend's floorChanged guard is carried entirely by this floor: 'o' argument, and no test anywhere exercises streak advancement against a closed-floor predecessor — deleting the argument survives the whole suite (probe-verified: 529/529 green under the mutant). Then a predecessor that posted under a closed floor becomes a comparable trend point: rounds 2–3 under an explicit critical floor record a suppressed fresh count under floor: 'c'; round 4 back on auto with new work compares two fresh drafts against the suppressed count, the streak advances on volumes measured across a posture change, and the disclosure credits "consecutive round(s)" of a trend the streak's own comment calls non-comparable. Add a row: sideFile(firingPrev({ round: 4, flatRounds: 1, floor: 'c' })), compose() → expect(r.floorEnforced).toEqual([]) and expect(parseLedger(r.body)?.flatRounds).toBeUndefined() — under the mutant this row reddens (expected [ 1, 2 ] to deeply equal []).
中文说明
[Suggestion] streak 对趋势 floorChanged 守卫的依赖(有文档记载)完全由这个 floor: 'o' 参数承载,而任何测试都没有演练过"前一轮处于关闭 floor"时的 streak 推进——删除该参数后整个套件仍全绿(探针验证:变异下 529/529 通过)。于是在关闭 floor 下发布过的前一轮会变成可比较的趋势点:第 2–3 轮在显式 critical floor 下以 floor: 'c' 记录了被压制的 fresh 计数;第 4 轮回到 auto 且有新工作时,两条新草稿与被压制的计数比较,streak 基于跨姿态变化测量的量推进,披露把"consecutive round(s)"记在一条被 streak 自己的注释称为不可比的趋势上。补一行:sideFile(firingPrev({ round: 4, flatRounds: 1, floor: 'c' }))、compose() → expect(r.floorEnforced).toEqual([]) 且 expect(parseLedger(r.body)?.flatRounds).toBeUndefined()——变异体下该行为红(expected [ 1, 2 ] to deeply equal [])。
— qwen3.8-max via Qwen Code /review (v0.22.0)
| clamp-to-round. | ||
| 2. `pr-context.ts`: persist/recover `flatRounds` with the churn group's | ||
| seam rules (foreign strip, anonymous carry). | ||
| 3. `compose-review.ts`: |
There was a problem hiding this comment.
[Suggestion] The implementation outline enumerates the per-file edits but never mentions the co-shipped behavior change to the #9410 residual-risk advisory: its floor-engagement conjunct now reads the caller's signal-inclusive enforcement state (compose-review.ts:3514–3520 replaces the old schedule-only re-derivation), and the CLI-glue test 'fires the persistently-critical advisory under a SIGNAL-engaged floor too (#9903)' exists solely for that change. With the signal arm the advisory first fires at round 5 on a signal-engaged PR; the doc's schedule-only model implies it cannot appear before round 7 (round-6 engagement plus the 'previous round posted under the same engaged floor' conjunct), so a maintainer reading this doc derives a first-appearance round two rounds later than shipped code, and any follow-up editing the signal arm or the advisory conjunct has no record that the two are coupled. Add a bullet under the compose-review.ts item recording that the advisory surfaces from the signal-engaged round, not the round the schedule first proves.
中文说明
[Suggestion] 实现大纲逐文件列出了改动,却从未提及同船交付的 #9410 残余风险建议的行为变化:其 floor 激活合取项现在读取调用方包含信号的执行状态(compose-review.ts:3514–3520 替换了旧的仅时间表重推导),而 CLI 胶水测试 'fires the persistently-critical advisory under a SIGNAL-engaged floor too (#9903)' 正是为该变化而存在。有了信号臂,该建议在信号激活的 PR 上第 5 轮即可首次触发;而文档的仅时间表模型暗示它不可能早于第 7 轮出现(第 6 轮激活加上"上一轮在同一已激活 floor 下发布过"的合取项),读者按本文档推导出的首次出现轮次比实际代码晚两轮,后续任何修改信号臂或建议合取项的跟进都没有记录表明二者耦合。建议在 compose-review.ts 条目下补一条:该建议自信号激活轮起即可出现,而非时间表首次证明的轮次。
— qwen3.8-max via Qwen Code /review (v0.22.0)
There was a problem hiding this comment.
Deferred to the next round under this round's batch bound — accepted as stated, docs-only, and it couples to nothing this round changed, so the wait costs nothing: the implementation outline will gain the bullet recording that the #9410 residual-risk advisory's floor-engagement conjunct reads the signal-inclusive enforcement state and therefore first fires on a signal-engaged round, not the round the schedule first proves.
中文说明
在本轮批量上限下延后到下一轮——按原文接受,纯文档改动,且与本轮改动无任何耦合,等待没有成本:实现大纲将补上这条记录——#9410 残余风险建议的 floor 激活合取项读取的是包含信号的执行状态,因此它在信号激活轮即可首次触发,而非时间表首次证明的轮次。
| drafted: ReadonlyArray<{ path?: unknown; line?: unknown; body?: unknown }>, | ||
| signalEngaged?: boolean, |
There was a problem hiding this comment.
[Suggestion] The diff adds the signal arm to floorEnforcedReroute's resolution, but the function's own contract docstring (lines 564–579) still enumerates the engagement set as "an explicit critical floor at any round, or auto at round ≥ 6" and lists "auto before round 6" among the states that "fail OPEN" — now false: the PR's own test 'a second consecutive flat round engages the floor' enforces at round 5 under auto. A maintainer auditing when the backstop may move a finding derives "enforcement never fires on auto before round 6" from the changed function's own contract comment and writes a test or narrowing edit on that authority. The SKILL.md equivalent enumeration WAS updated by this PR, isolating the code comment as an oversight; the same stale enumeration rides in the deferredSuggestions field doc (~line 709) and the terminal-line comment (~line 6374). Update all three sites to the signal-inclusive set and strike "auto before round 6" from the fail-open list (to "auto before round 6 with the streak below its bar").
中文说明
[Suggestion] diff 给 floorEnforcedReroute 的解析增加了信号臂,但该函数自身的契约 docstring(564–579 行)仍把激活集合枚举为"任意轮次的显式 critical floor,或第 ≥ 6 轮的 auto",并把"第 6 轮之前的 auto"列为"失败打开"的状态之一——这现在不成立了:PR 自己的测试 'a second consecutive flat round engages the floor' 就在 auto 下第 5 轮执行了强制。维护者审计兜底何时会移动发现时,会从被修改函数自己的契约注释推出"第 6 轮之前 auto 永不强制",并据此写测试或收窄性编辑。SKILL.md 里对应的枚举本 PR 已更新,说明代码注释的遗漏是疏忽;同样的陈旧枚举还出现在 deferredSuggestions 字段文档(约 709 行)与终端行注释(约 6374 行)。请把三处都更新为包含信号的集合,并把"第 6 轮之前的 auto"从失败打开清单中改为"第 6 轮之前且 streak 未达标的 auto"。
— qwen3.8-max via Qwen Code /review (v0.22.0)
| const flatRounds = | ||
| round === 0 ? 0 : Math.min(streakOf(prev.flatRounds) ?? 0, round); |
There was a problem hiding this comment.
[Suggestion] This round-clamp is looser than honest reachability: volumeNotShrinking gates on round >= 3, so rounds 1–2 can never be measured and the honest max streak at round N is max(0, N−2) — but clamping only to round admits planted values no honest run can emit. A forged own-account-looking marker/side file {round: 2, flatRounds: 2} passes the clamp intact (min(2, 2)), latches, and engages the floor at round 3 — a full round earlier than the honest minimum engagement (round 4) — with the disclosure crediting "2 consecutive round(s)" over rounds in which the signal cannot measure anything. The stated invariant ("a planted streak cannot engage the floor off rounds the PR never ran") holds in words — the rounds "ran" — but is defeated in substance: they could never have been measured. Impact stays inside the design's accepted worst case for forged streaks (disclosed, non-capping, operator-disengageable), but the hardening the docstring promises is not what the clamp delivers. Probe: the planted row engages at round 3 on the PR and the fix arm (Math.max(round - 2, 0)) blanks it while leaving the honest round-4 engagement untouched. Clamp to the honest maximum at both read sites — here and in parseLedger (ledger.ts:797, same shape; the probe exercised this site, parseLedger needs the same change for markers recovered off the PR walk) — or state in the docstrings that a forged round-2 marker can engage one round before the honest minimum.
中文说明
[Suggestion] 这个轮次钳制比诚实可达性更宽松:volumeNotShrinking 以 round >= 3 为门,因此第 1–2 轮永远无法被测量,第 N 轮的诚实最大 streak 为 max(0, N−2)——但只钳制到 round 会放行任何诚实运行都不可能产出的植入值。伪造的本账号样貌 marker/侧文件 {round: 2, flatRounds: 2} 原样通过钳制(min(2, 2)),锁存,并在第 3 轮激活 floor——比诚实最早激活轮(第 4 轮)整整早一轮——披露还把 "2 consecutive round(s)" 记在信号根本无法测量的轮次上。所声明的不变量("植入的 streak 不能基于 PR 从未运行过的轮次激活 floor")在字面上成立——那些轮次确实"运行过"——但实质上被击败:它们从来不可能被测量。影响仍在设计为伪造 streak 接受的最坏情形之内(有披露、不封顶、操作者可解除),但 docstring 承诺的加固并不是钳制实际交付的东西。探针:植入行在 PR 上第 3 轮激活;修复臂(Math.max(round - 2, 0))使其失效,同时诚实的第 4 轮激活不受影响。请在两个读取点都钳制到诚实最大值——此处与 parseLedger(ledger.ts:797,同样形状;探针演练的是本站点,parseLedger 需要对从 PR 游走恢复的 marker 做同样修改)——或在 docstring 中写明伪造的第 2 轮 marker 可以比诚实最早轮提前一轮激活。
— qwen3.8-max via Qwen Code /review (v0.22.0)
|
🤖 Addressed the latest review feedback (round 1/100). What changed, and what I pushed back on: · 已处理最新评审反馈(第 1/100 轮)。改动内容与我反驳保留之处如下: Address-review round summary — PR #9938Commit: This round addresses the automated reviewer's round-1 findings on the signal-driven early floor (#9903): one Critical reproduced-and-fixed, eight Suggestions implemented (code hardening, contract comments, and mutation-witness tests), and two docs-only Suggestions explicitly deferred to the next round (recorded in Feedback dispositionsCritical — reproduced, then fixed
Suggestions — implemented
Suggestions — deferred to the next round (threads left open)
Review body
VerificationCommands actually run this round (all from the repository checkout):
中文说明处理评审轮次总结 — PR #9938提交: 本轮处理自动化评审器对信号驱动提前生效下限(#9903)的第 1 轮发现:1 个 Critical 已复现并修复,8 个 Suggestion 已实现(代码加固、契约注释、变异见证测试),2 个纯文档类 Suggestion 明确延后到下一轮(记录于 反馈处置Critical — 先复现,后修复
Suggestion — 已实现
Suggestion — 延后到下一轮(线程保持打开)
评审正文
验证本轮实际执行的命令(均在仓库检出目录内):
Base-conflict check · 基分支冲突检查: no conflict with main. · 与 main 无冲突。 Re-review when you have a moment. After round 100 this bot stops and leaves the PR for a human. · 有空请复审;第 100 轮后本 bot 停止并将 PR 交给人工。 🧠 Handled by Qwen Code · model/模型 |
doudouOUC
left a comment
There was a problem hiding this comment.
Not reviewed: coverage — no plan was given, so this run cannot show that any of the diff was read.
— qwen3.8-max via Qwen Code /review (v0.21.10)
doudouOUC
left a comment
There was a problem hiding this comment.
Not reviewed: the entire diff — no agent reported covering it; nobody read it.
Not reviewed: every dimension — none of the 8 required agents is on record as launched with a prompt this skill built, so this diff was reviewed, if at all, from prompts the run wrote for itself: no record shows the severity bar, the finding format or this project's own rules reaching an agent.
Not reviewed: reverse audit — no auditor was launched with a prompt this skill builds — the pass that hunts what the rest of the review missed ran, if at all, without the method its brief carries.
— qwen3.8-max via Qwen Code /review (v0.21.10)
qwen-code-ci-bot
left a comment
There was a problem hiding this comment.
Reviewed — no blockers. Suggestions are inline.
Deferred under the convergence posture (round 2, not a blocker) — recorded, not requested in this round:
docs/design/2026-08-24-signal-driven-early-floor.md:87 — [review] Design doc misstates the forgery clamp: flatRounds is clamped to max(round−2, 0), tighter than churn's clamp-to-roundpackages/cli/src/commands/review/pr-context.ts:1421 — [review] The flat arm of the persistRecoveredLedger carry clamps to round; the read-side clamp it documents mirroring is max(round−2, 0)packages/cli/src/commands/review/compose-review.ts:1599 — [review] The trigger's deliberate pre-reroute measurement basis has no discriminating testdocs/design/2026-08-24-signal-driven-early-floor.md:95 — [review] Design doc claims latch survival under anonymous recovery; anonymous recovery actually sheds the streak
中文说明
已审查——无阻断问题。 建议见行内评论。
收敛姿态下延后(第 2 轮,非阻断)——已记录,本轮不要求修改:共 4 条(原文未翻译,列表见上方英文部分)。
— qwen3.8-max via Qwen Code /review (v0.22.0)
| clamp-to-round. | ||
| 2. `pr-context.ts`: persist/recover `flatRounds` with the churn group's | ||
| seam rules (foreign strip, anonymous carry). | ||
| 3. `compose-review.ts`: |
There was a problem hiding this comment.
[Suggestion] R1-9: The implementation outline enumerates the per-file edits but never mentions the co-shipped behavior change to the #9410 residual-risk advisory: its floor-engagement conjunct now reads the caller's signal-inclusive enforcement state (compose-review.ts:3514–3520 replaces the old schedule-only re-derivation), and the CLI-glue test 'fires the persistently-critical advisory under a SIGNAL-engaged floor too (#9903)' exists solely for that change. With the signal arm the advisory first fires at round 5 on a signal-engaged PR; the doc's schedule-only model implies it cannot appear before round 7 (round-6 engagement plus the 'previous round posted under the same engaged floor' conjunct), so a maintainer reading this doc derives a first-appearance round two rounds later than shipped code, and any follow-up editing the signal arm or the advisory conjunct has no record that the two are coupled. Add a bullet under the compose-review.ts item recording that the advisory surfaces from the signal-engaged round, not the round the schedule first proves.
中文说明
[Suggestion] 实现大纲逐文件列出了改动,却从未提及同船交付的 #9410 残余风险建议的行为变化:其 floor 激活合取项现在读取调用方包含信号的执行状态(compose-review.ts:3514–3520 替换了旧的仅时间表重推导),而 CLI 胶水测试 'fires the persistently-critical advisory under a SIGNAL-engaged floor too (#9903)' 正是为该变化而存在。有了信号臂,该建议在信号激活的 PR 上第 5 轮即可首次触发;而文档的仅时间表模型暗示它不可能早于第 7 轮出现(第 6 轮激活加上"上一轮在同一已激活 floor 下发布过"的合取项),读者按本文档推导出的首次出现轮次比实际代码晚两轮,后续任何修改信号臂或建议合取项的跟进都没有记录表明二者耦合。建议在 compose-review.ts 条目下补一条:该建议自信号激活轮起即可出现,而非时间表首次证明的轮次。
— qwen3.8-max via Qwen Code /review (v0.22.0)
| * explicit `critical` floor at any round, `auto` at round ≥ 6, or `auto` | ||
| * with the flat-trend streak at its bar (#9903) — always with the round | ||
| * knowable. Everything else fails OPEN exactly as the posture itself does — |
There was a problem hiding this comment.
[Suggestion] R2-1: The rewrite lifts "with the round knowable" out of the auto-only clause it occupied before and re-attaches it as "— always with the round knowable" to the whole firing list, but the explicit-critical arm fires regardless of contextUnavailable — floorResolvesCritical's first branch is the ungated if (floor === 'critical') return 'explicit';. The pre-existing test 'an explicit critical floor enforces even when the round is unknowable' (compose-review.test.ts:10898, predates this diff) pins floorEnforced [1, 2] under contextUnavailable: true with an explicit critical floor — falsifying the documented contract as naturally read. The same paragraph's fail-open list names context-unavailable only under the auto arms, contradicting its own firing list. A maintainer or model loading this docstring as context would conclude explicit-critical fails open in the context-unavailable state; a future "fix" aligning the code with the doc — plausible under the paragraph's own "a posting bar in doubt posts" doctrine — would silently start posting deferred-grade Suggestions during every GitHub outage under an operator-set critical floor.
| * explicit `critical` floor at any round, `auto` at round ≥ 6, or `auto` | |
| * with the flat-trend streak at its bar (#9903) — always with the round | |
| * knowable. Everything else fails OPEN exactly as the posture itself does — | |
| * explicit `critical` floor at any round, or `auto` at round ≥ 6 or `auto` | |
| * with the flat-trend streak at its bar (#9903) — the `auto` arms only with | |
| * the round knowable. Everything else fails OPEN exactly as the posture itself does — |
中文说明
[Suggestion] 本次改写把"with the round knowable"(轮次可知)从原先所在的仅 auto 子句中抽出,重新以"— always with the round knowable"(——始终要求轮次可知)挂到整个激活列表上,但显式 critical 臂的触发并不受 contextUnavailable 约束——floorResolvesCritical 的第一个分支就是无门控的 if (floor === 'critical') return 'explicit';。早于本 diff 的既有测试 'an explicit critical floor enforces even when the round is unknowable'(compose-review.test.ts:10898)钉住了:显式 critical floor 下 contextUnavailable: true 时 floorEnforced [1, 2]——按自然阅读,成文契约被该测试证伪。同一段落的失败打开清单只在 auto 臂下列出 context-unavailable,与自身的激活列表自相矛盾。把该 docstring 作为上下文加载的维护者或模型会得出"显式 critical 在 context-unavailable 状态下失败打开"的结论;未来一次让代码对齐文档的"修复"(在该段落自身"存疑时照常发布"的教义下完全可能发生)会在每次 GitHub 故障期间、在操作者设定的 critical floor 下悄悄开始发布延后级别的 Suggestion。
— qwen3.8-max via Qwen Code /review (v0.22.0)
…9903) Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
|
🤖 Addressed the latest review feedback (round 2/100). What changed, and what I pushed back on: · 已处理最新评审反馈(第 2/100 轮)。改动内容与我反驳保留之处如下: Address review round — PR #9938Commit: This round was prose-only: one code comment and one design-doc sentence cluster. No guards, branches, or behavior were added, so no mutation probes apply; no settings source changed, so no schema regeneration; the change is not behavior exercised only through the bundled CLI, so no integration run was required. Feedback dispositions[rc:3847401926] R1-9 — [Suggestion] design doc omits the co-shipped #9410 advisory behavior change → RESOLVED. [rc:3847401940] R2-1 — [Suggestion] [rv:5012134038], [rv:5012452448] — "This run could not certify that any of this diff was reviewed" → no action. [rv:5012476598] — "Reviewed — no blockers. Suggestions are inline." → no action on its deferred list. ConflictNone ( VerificationCommands actually run this round, in order:
中文说明处理评审轮次 — PR #9938提交: 本轮仅涉及文字改动:一处代码注释和一处设计文档的句子群。未新增任何守卫、分支或行为,因此不适用变异探针;未改动任何配置源(settings source),因此无需重新生成 schema;该改动也不是仅通过打包后的 CLI 才能验证的行为,因此无需运行集成测试。 反馈处理结论[rc:3847401926] R1-9 — [Suggestion] 设计文档遗漏了同船交付的 #9410 建议行为变化 → 已解决。 [rc:3847401940] R2-1 — [Suggestion] [rv:5012134038]、[rv:5012452448] — "本次运行无法认证该 diff 的任何部分已被评审" → 无需处理。 [rv:5012476598] — "已审查——无阻断问题。建议见行内评论。" → 对其延后清单不做处理。 冲突无( 验证本轮实际运行的命令(按顺序):
Base-conflict check · 基分支冲突检查: no conflict with main. · 与 main 无冲突。 Re-review when you have a moment. After round 100 this bot stops and leaves the PR for a human. · 有空请复审;第 100 轮后本 bot 停止并将 PR 交给人工。 🧠 Handled by Qwen Code · model/模型 |
doudouOUC
left a comment
There was a problem hiding this comment.
Re-review of the latest commit f609c370
The latest commit aligns the design docs with the shipped behavior, addressing the two deferred docs-only findings from the previous round:
- R1-9 (design doc implementation outline): Added the missing bullet about the #9410 residual-risk advisory's floor-engagement conjunct reading the caller's signal-inclusive enforcement state.
- R2-1 (docstring scope): Restructured the
floorEnforcedReroutedocstring to clarify that theautoarms only fire with the round knowable, rather than attaching the qualifier to the whole firing list.
The changes are minimal (+5 design doc, +6/-6 code comment), purely documentary, and correctly match the shipped behavior. No new issues found.
Verdict: APPROVE — the two standing items are resolved, and the diff carries no new concerns.
— qwen3.8-max via Qwen Code /review (v0.22.0)
doudouOUC
left a comment
There was a problem hiding this comment.
Not explored to full depth (tool budget reached): You are review agent test-matrix — Test coverage matrix (whole-diff).: none.** I examined every production code hunk in the diff and verified its test pairing.; chunk 4: None. I traced every code path in my territory..
中文说明
未探索到全部深度(达到工具调用预算):You are review agent test-matrix — Test coverage matrix (whole-diff).:none.** I examined every production code hunk in the diff and verified its test pairing.;chunk 4:None. I traced every code path in my territory.。
— deepseek-v4-flash via Qwen Code /review (v0.21.10)
qwen-code-ci-bot
left a comment
There was a problem hiding this comment.
Reviewed — no blockers. Suggestions are inline.
Deferred under the convergence posture (round 3, not a blocker) — recorded, not requested in this round:
packages/cli/src/commands/review/compose-review.ts:1581 — [probe] floorIsAuto measurement gate restates criticalFloorKind's absent-floor→auto fold instead of sharing one predicate (drift risk)packages/cli/src/commands/review/compose-review.ts:1581 — [probe] no test combines a missing/non-literal severityFloor with a streak-carrying side file; two mutants survivepackages/cli/src/commands/review/compose-review.ts:4590 — [probe] the early-engagement sentence is interpolated into both the enforcement note and the deferral header, publishing twicepackages/cli/src/commands/review/compose-review.ts:554 — [review] the auto floor's operator-facing contract text (settingsSchema.ts / settings.md) is left schedule-only (round 6)docs/design/2026-08-24-signal-driven-early-floor.md:89 — [review] design doc states the flatRounds clamp as the churn round-clamp, but both parse sites clamp to max(round−2, 0)packages/cli/src/commands/review/compose-review.ts:2590 (+2 locations) — [review] the two deferral-licence comments still enumerate only two floor triggers, missing the signal armpackages/cli/src/commands/review/compose-review.ts:2346 — [probe] the floor-letter derivation note omits the flat-trend streak as a resolving input and rounds 4–5 as a transitionpackages/cli/src/commands/review/compose-review.ts:2510 — [review] the flatRounds option docstring says "Read only by the deferral header" but both the enforcement note and header read itpackages/cli/src/commands/review/compose-review.ts:3566 — [probe] the prevPostedSuggestion rationale comment says the stamp/enforcement gap exists only "on a round >= 6", missing rounds 4–5packages/cli/src/commands/review/compose-review.ts:4712 — [probe] the postureNotEngaging rationale says its first two terms hold "from 6 on", understating the signal rounds 4–5
Convergence: round 3 posted 1 inline comment(s), 1 of them reported for the first time; the previous round posted 2 (1 new). Findings keep coming back to the same files: docs/design/2026-08-24-signal-driven-early-floor.md (findings in round 1; 1 more now). The rate of new findings is not falling. A cluster that keeps producing siblings usually means the fixes are treating instances of a shared root cause — triaging that cause before the next round, or splitting an independent cluster into its own pull request, tends to end the loop faster than fixing them one at a time. Batching the remaining fixes and verifying them before the next push, or dropping this PR's reviews to --severity-floor critical, keeps the loop from re-deriving the same set. No Critical finding is open on this round, so merging and moving the remaining Suggestion threads to a follow-up issue is available as an ending — a merged pull request cannot diverge further. (Observation only — nothing was withheld from this review because of this observation.)
中文说明
已审查——无阻断问题。 建议见行内评论。
收敛姿态下延后(第 3 轮,非阻断)——已记录,本轮不要求修改:共 10 条(原文未翻译,列表见上方英文部分)。
收敛情况:第 3 轮发布了 1 条行内评论,其中 1 条是首次提出;上一轮发布了 2 条(其中 1 条首次提出)。发现反复回到同一批文件:docs/design/2026-08-24-signal-driven-early-floor.md(第 1 轮已出过发现,本轮又有 1 条)。新发现的产出速度没有下降。一个不断再生兄弟发现的簇,通常意味着逐条修复只在处理同一根因的实例——先定位并处理该根因,或把独立的簇拆成单独的 PR,通常比逐条修复更快结束循环。把剩余修复攒成一批、验证后再推送,或将本 PR 的评审降到 --severity-floor critical,可以避免循环反复推导同一组发现。本轮没有未决的 Critical,因此"合入后把剩余 Suggestion 线程转到后续 issue"是一个可选的结束方式——已合入的 PR 不会继续发散。(仅为观察——本轮评审未因此扣留任何内容。)
— qwen3.8-max via Qwen Code /review (v0.22.0)
| caller's signal-inclusive enforcement state (`floorEnforcementEngaged`), | ||
| not a schedule-only re-derivation: it surfaces from the signal-engaged | ||
| round, not the round the schedule first proves (round 5, not round 7, |
There was a problem hiding this comment.
[Suggestion] This bullet says the residual-risk advisory "surfaces from the signal-engaged round", but its own parenthetical — round 5 — is one round after the signal-engaged round. The "Engagement and latch" section above fixes engagement at round 4 in this scenario, and convergenceAssessment requires the predecessor round to have posted under the engaged floor (recorded floor not o, no Suggestion left in its work-list), so the advisory structurally cannot surface on the engaging round itself: first possible surfacing is engagement+1 — round 5 for the signal, round 7 for the schedule, exactly the parenthetical's numbers. As written, a maintainer predicting the advisory's timing from this bullet expects it at round 4, observes it at round 5, and goes hunting for a one-round delay bug that is the mechanism's documented design. Reword the clause to the proven-round vocabulary the schedule half already uses.
| caller's signal-inclusive enforcement state (`floorEnforcementEngaged`), | |
| not a schedule-only re-derivation: it surfaces from the signal-engaged | |
| round, not the round the schedule first proves (round 5, not round 7, | |
| caller's signal-inclusive enforcement state (`floorEnforcementEngaged`), | |
| not a schedule-only re-derivation: it surfaces from the first round the | |
| signal-engaged floor can prove — never the engaging round itself (round 5, not round 7, |
中文说明
[建议] 该条目称残余风险建议项"从信号激活轮起出现"(surfaces from the signal-engaged round),但其自身括号里的数字——第 5 轮——是信号激活轮之后的一轮。上文"Engagement and latch"一节把本场景的激活定在第 4 轮,而 convergenceAssessment 要求前一轮已在生效的 floor 下发布(记录的 floor 不为 o、工作清单中不含 Suggestion),因此该建议项在结构上不可能在激活当轮出现:最早出现轮为激活+1——信号路径第 5 轮、时间表路径第 7 轮,恰为括号中的两个数字。按现有措辞,依据此条目预测建议项出现时点的维护者会预期第 4 轮、实际观察到第 5 轮,进而追查一个并不存在的"延迟一轮" bug——而这一轮差正是该机制的设计行为。建议把该从句改为与时间表部分一致的"可证明轮"措辞。
— qwen3.8-max via Qwen Code /review (v0.22.0)
|
@qwen-code /triage |
|
Sandboxed verification: ✅ passed — merge-ready (agent verdict) - workflow run Ran the PR in an isolated, token-free container: A/B against the base build, mock-free harness assertions, targeted gates. Advisory evidence for human reviewers — not a review, an approval, or a CI check. Scripted assertions: 5172 passed · 0 failed · 5172 total Flakiness gate: ✅ 5 changed test file(s) x 5 identical rounds, no divergence 中文 — 判定:✅ 通过 · 可合入(agent 判定)沙箱验证在隔离、无凭证的容器中执行了该 PR 的代码(与 base 构建 A/B 对照、无 mock harness 断言、定向门禁)。仅作为评审证据,不构成评审、批准或 CI 检查。 脚本断言:5172 通过 · 0 失败 · 5172 总计 抖动门:✅ 5 changed test file(s) x 5 identical rounds, no divergence Verification reportPR #9938 deep verification — signal-driven early severity floor (#9903)Verdict: The central claim is proven load-bearing by A/B: at round 4, with a previous ledger carrying Assertion sources: A/B harness 57 (head) + 45 (base control) + 57 (transform-fidelity control); targeted gate 中文摘要结论: A/B 结论:中心主张经 A/B 证实为承载性变更。第 4 轮、侧文件带 Findings:无阻断项。唯一观察到的行为分裂(floor 缺省时「报表读折成 auto、强制执行读失败打开」,即 marker 记 变异矩阵:5 个守卫(侧文件钳制、marker 解析钳制、 未覆盖:逐提交归属(浅克隆 depth 2,3 个提交仅 head 可达;已用 M5 变异钉住第 2 个提交的主张,第 3 个提交纯文档、逐条对照代码核验);仓库级门与 core 包测试(core 侧 diff 仅 SKILL.md 文档);真实 GitHub 回路(无网络);模型侧路由散文仅读验。 Central claim and A/B proofCentral claim. Under the default Control construction. A/B cell table (all cells scripted in
End-to-end through the CLI entrypoint (PR Reviewer Test Plan step 2 shape, witness
Secondary claims — trust seams. All three routes a stranger's streak can ride are clamped or stripped, verified both behaviorally (C10, C11, C13) and by mutation (M1, M2, M3 below): the side-file read clamps to the honest maximum CorrectionsNone (first verification round; no prior claims found inaccurate). FindingsNo blocking findings. One pre-existing observation, explicitly not attributable to this PR: when Mutation matrix (vacuity)Unmutated filtered baselines green (exit 0) first; each mutant is a one-hunk revert of the PR's own lines in the head source, run through the package's vitest, restored afterwards (
No survivors. The two clamp hunks defend the same hazard from two routes but each single-hunk revert already turns its own dedicated tests red, so there is no layered-guard masking to disambiguate. M4 is the positive control landed in the same file as the mechanism — the collector provably exercises the mutated module. (A first matrix run with a verdict-parsing bug in my harness reported "SURVIVED" while listing the failing names; the canonical Targeted gate
Not covered
MethodologyEnvironment: the CI verify container ( Flakiness gate logEvidence imagesHarness scripts and raw logs are in the workflow run artifacts (7-day retention). — Qwen Code · sandboxed verification |
qwen-code-ci-bot
left a comment
There was a problem hiding this comment.
LGTM, looks ready to ship. ✅
|
🤖 Addressed the latest review feedback (round 3/100). What changed, and what I pushed back on: · 已处理最新评审反馈(第 3/100 轮)。改动内容与我反驳保留之处如下: Autofix review round — PR #9938 (address-review)One commit this round: Feedback points and dispositions[rc:3848933063]
|
|
Released in v0.22.2. |





What this PR does
When a
/reviewloop keeps producing first-time findings at a non-falling rate, the convergence diagnosis already prints the remedy — "drop this PR's reviews to--severity-floor critical" — but nothing acted on it: under the defaultautoposture the critical posting floor engaged on a fixed round-6 schedule, so rounds 3–5 kept posting Suggestions inline at full cost while re-deriving the same root-cause cluster.This PR makes the trigger signal-driven. A new cross-round telemetry field records how many consecutive rounds the first-time-finding rate has not fallen; when the count reaches two, the critical floor engages on that very round — ahead of the round-6 schedule — with the same code-side enforcement and deferral channel the schedule uses. The engagement latches for the rest of the PR's loop, the posted body discloses why the floor engaged early (naming the streak that armed it), and the model-side posture prose routes on the same recorded streak. The new posture is named as its own resolution kind everywhere the floor's kind is read back, so an early engagement never presents as an unexplained posture change. The signal reads only genuinely new findings — carried re-posts of still-standing entries are the steady state and never advance the streak — and every fail-open arm the schedule has applies to it: an unknowable round disengages it, and an explicit
--severity-floor suggestionoverride turns the posture off regardless of the streak.Why it's needed
Issue #9903 measured the cost: on a diverging loop the clustering signal was visible from round 3, but the floor only dropped at round 6 — two to three extra multi-hour review legs spent re-deriving the same sibling set. The issue's own triage verdict accepted the narrower shape this PR implements: a signal-driven early trigger at the existing posture transition (the diagnosis keeps its advisory role; the floor policy — the layer that already decides what posts — consumes the signal), with a conservative consecutive-rounds bar and mandatory disclosure of the drop. Two consecutive rounds is the same argument the existing non-convergence streak already uses: one flat round is a step, two is the shortest window in which "not falling" is an observation.
Reviewer Test Plan
The behavior lives in the review compose path and is exercised end to end by unit tests that drive the real function with real side files; there is no TUI surface.
How to verify
cd packages/cli && npx vitest run src/commands/review— expect all green. The block named "the signal-driven early floor (/review: act on the convergence/root-cause-clustering signal earlier (auto-drop to --severity-floor critical) instead of only printing it #9903)" walks the whole state machine: first firing round advances the streak with the floor still open; the second consecutive firing round engages the floor, reroutes drafted Suggestions to the deferral channel, and discloses "the floor engaged early: the first-time-finding rate has not fallen for 2 consecutive round(s)" in both the enforcement note and the deferral header; a quiet round past the bar stays engaged (the latch); a falling rate resets; carried re-posts alone never arm the trigger; an explicitsuggestionfloor overrides the latch; a context-unavailable round fails open; and the round-6 schedule still wins when both arms fire.flatRounds: 1and a round whose first-time-finding rate did not fall,qwen review compose-reviewmoves every drafted Suggestion to the deferral list, prints the engagement disclosure, and stamps the round's own marker withflatRounds: 2and floorc— a round that previously posted those Suggestions inline now posts zero.Evidence (Before & After)
N/A (non-UI change; the body disclosure strings above are the user-visible artifact and are covered by tests).
Tested on
Environment (optional)
Unit suites plus a bundled-CLI compose invocation (
npm run build && npm run bundle, thennode dist/cli.js review compose-reviewagainst crafted state/side files).Risk & Scope
--severity-floor suggestiondisengages at any round.flatRoundsand read as zero; the engagement cannot fire before round 4 (round 3 is the earliest a trend can exist), and nothing changes at round 6 or under explicit floors.Linked Issues
Fixes #9903
中文说明
这个 PR 做了什么
当
/review循环以不下降的速率持续产出首次发现时,收敛诊断早已把解法打印了出来——"把本 PR 的评审降到--severity-floor critical"——但没有任何机制据此行动:默认auto姿态下,critical 发布下限按固定的第 6 轮时间表生效,于是第 3–5 轮继续以全量成本行内发布 Suggestion,反复推导同一根因簇。本 PR 把触发器改为信号驱动。新增一个跨轮遥测字段,记录首次发现速率连续多少轮未下降;计数达到 2 时,critical floor 就在当轮生效——先于第 6 轮的既定时间表——走与时间表完全相同的代码侧强制执行与延后通道。激活状态对本 PR 的剩余循环锁存,正文披露下限为何提前生效(写明武装它的连续轮数),模型侧的姿态规则也按同一记录值路由。新的姿态在一切读取下限类型的地方都以独立的解析类型命名,提前生效永远不会呈现为无法解释的姿态突变。信号只统计真正的新发现——对未修复条目的 carried 重发是稳态而非发散,永不推进计数——并且时间表拥有的每个失败打开臂同样适用于它:轮次不可知时不生效,显式
--severity-floor suggestion无论计数多少都关闭姿态。为什么需要
Issue #9903 记录了代价:在一个发散循环里,聚类信号第 3 轮即可见,但 floor 直到第 6 轮才降——多出的两三轮、每轮数小时的评审腿,都在重复推导同一批兄弟发现。该 issue 自己的 triage 结论接受了本 PR 实现的更窄形态:在既有姿态切换处加信号驱动的提前触发器(诊断保持建议角色,由已经掌握发布决策权的 floor 策略层消费信号),配保守的连续轮数阈值与强制披露。连续 2 轮与既有非收敛 streak 使用的论证相同:一轮持平只是一个步子,两轮才是"未下降"成为观察结论的最短窗口。
评审测试计划
行为位于 review compose 路径,由直接用真实侧文件驱动真实函数的单元测试做端到端覆盖;无 TUI 界面。
如何验证
cd packages/cli && npx vitest run src/commands/review,预期全绿。名为 "the signal-driven early floor (/review: act on the convergence/root-cause-clustering signal earlier (auto-drop to --severity-floor critical) instead of only printing it #9903)" 的块走完整个状态机:第一次触发只推进计数、floor 保持 open;第二次连续触发激活 floor、把起草的 Suggestion 改道延后通道,并在强制执行注记与延后清单头部同时披露 "the floor engaged early: the first-time-finding rate has not fallen for 2 consecutive round(s)";达标后的安静轮保持激活(锁存);速率回落则重置;仅 carried 重发永不武装触发器;显式suggestionfloor 覆盖锁存;context-unavailable 轮失败打开;两臂同时命中时第 6 轮时间表仍然优先。flatRounds: 1,本轮首次发现速率未下降时,qwen review compose-review把全部起草的 Suggestion 移入延后清单、打印激活披露,并在本轮 marker 盖上flatRounds: 2与 floorc——原先行内发布这些 Suggestion 的轮次现在发布 0 条。证据(前后对比)
N/A(非 UI 变更;上述正文披露串即用户可见产物,已有测试覆盖)。
测试环境
运行方式(可选)
单元测试套件 + 打包 CLI 的 compose 调用(
npm run build && npm run bundle后用node dist/cli.js review compose-review对构造的 state/侧文件执行)。风险与范围
--severity-floor suggestion在任何轮次解除。flatRounds,读作零;趋势最早第 3 轮才可能存在,因此激活不会早于第 4 轮;第 6 轮行为与显式 floor 下均无变化。关联 Issue
Fixes #9903