You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
#9129 (shipped in #9206) made a duplicate-only gate failure hold instead of close. The hold path moves the escalated blockers into warnings so the panel still shows them:
warnings: [...gateWarnings, ...blockers],
But gateWarnings is every warning-severity finding, and duplicate_pr_risk is authored severity: "warning" — so it is already in that set. Appending the blocker unfiltered lists the identical finding twice. The failure path immediately below has always excluded them (!blockers.includes(finding)); the hold path does not.
Verified against the built engine (one rival PR, duplicatePrGateMode: block):
Present in both twins: src/rules/advisory.ts (the hold branch under DUPLICATE_ONLY_BLOCKER_CODES) and packages/loopover-engine/src/advisory/gate-advisory.ts.
Second, separate fallout from the same change: the engine workspace's own suite has been red on main since #9206 — 7 failures across iterate-loop.test.ts (5) and self-review-adapter.test.ts (2). #9206 updated the host's golden fixtures but not these:
Exclude already-present blockers from the hold path's warning spread, in both twins, keeping them in lock-step for the live-gate-parity contract.
A regression test asserting a duplicate-only hold lists the held finding exactly once, and that an unrelated warning alongside it is still carried exactly once (both arms of the new filter).
Context
#9129 (shipped in #9206) made a duplicate-only gate failure hold instead of close. The hold path moves the escalated blockers into
warningsso the panel still shows them:But
gateWarningsis every warning-severity finding, andduplicate_pr_riskis authoredseverity: "warning"— so it is already in that set. Appending the blocker unfiltered lists the identical finding twice. The failure path immediately below has always excluded them (!blockers.includes(finding)); the hold path does not.Verified against the built engine (one rival PR,
duplicatePrGateMode: block):Present in both twins:
src/rules/advisory.ts(the hold branch underDUPLICATE_ONLY_BLOCKER_CODES) andpackages/loopover-engine/src/advisory/gate-advisory.ts.Second, separate fallout from the same change: the engine workspace's own suite has been red on
mainsince #9206 — 7 failures acrossiterate-loop.test.ts(5) andself-review-adapter.test.ts(2). #9206 updated the host's golden fixtures but not these:openPr(...)) has nochangedFiles, so under orb(gate): any contributor can force-close a rival's PR by citing the same issue number — breaker-exempt, default-on, and it has already closed 2 PRs #9129's new corroboration rule it now raises the always-advisoryduplicate_pr_risk_unconfirmedinstead of the blockingduplicate_pr_risk— the "genuinely blocked" scenarios stopped being blocked and the miner loop hands off instead of continuing/abandoning.conclusion: "failure"where orb(gate): any contributor can force-close a rival's PR by citing the same issue number — breaker-exempt, default-on, and it has already closed 2 PRs #9129 deliberately producesneutral(the same change the host's golden corpus recorded when it renamedduplicate-block-mode-fails→duplicate-block-mode-holds).Requirements
changedFiles, and the held verdict assertsneutral+ the finding present once inwarnings.Expected outcome
npm run test --workspace @loopover/engineis green onmainagain, and a held duplicate renders one finding instead of two.