Skip to content

Commit aaa1aa8

Browse files
fix(engine): honor no-issue rationale in predicted preflight
Restore predicted/live parity for missing_linked_issue by applying the same hasClearNoIssueRationale exemption the live gate uses in engine.ts. Closes #6628 Co-authored-by: Cursor <cursoragent@cursor.com>
1 parent a47d1c3 commit aaa1aa8

2 files changed

Lines changed: 20 additions & 1 deletion

File tree

packages/loopover-engine/src/signals/predicted-gate-engine.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -412,7 +412,7 @@ export function buildPreflightResult(
412412
action: maintainerAuthored ? "No action." : "Refresh registry data or choose a registered active repo.",
413413
});
414414
}
415-
if (linkedIssues.length === 0 && lane.lane !== "issue_discovery") {
415+
if (linkedIssues.length === 0 && lane.lane !== "issue_discovery" && !hasClearNoIssueRationale({ title: input.title, body: input.body })) {
416416
findings.push({
417417
code: "missing_linked_issue",
418418
severity: "warning",

test/unit/predicted-gate-engine-coverage.test.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -360,6 +360,25 @@ describe("predicted-gate engine module coverage (#2283)", () => {
360360
expect(observed.findings.some((f) => f.code === "missing_linked_issue")).toBe(true);
361361
});
362362

363+
it("REGRESSION (#6628): predicted preflight honors a clear no-issue rationale like the live gate", () => {
364+
const docsOnly = buildPreflightResult(
365+
{ repoFullName: REPO.fullName, title: "docs-only: fix typo", body: "", linkedIssues: [] },
366+
REPO,
367+
[],
368+
[],
369+
);
370+
expect(docsOnly.lane.lane).not.toBe("issue_discovery");
371+
expect(docsOnly.findings.some((finding) => finding.code === "missing_linked_issue")).toBe(false);
372+
373+
const unexplained = buildPreflightResult(
374+
{ repoFullName: REPO.fullName, title: "Fix upload behavior", body: "", linkedIssues: [] },
375+
REPO,
376+
[],
377+
[],
378+
);
379+
expect(unexplained.findings.some((finding) => finding.code === "missing_linked_issue")).toBe(true);
380+
});
381+
363382
it("exercises gate holds, readiness score branches, and linked-issue advisory paths", () => {
364383
const advisory = buildPullRequestAdvisory(REPO, PR, { requireLinkedIssue: true, confirmedNoOpenLinkedIssue: true, linkedIssueAuthorLogins: ["miner1"] });
365384
expect(advisory.findings.some((f) => f.code === "missing_linked_issue")).toBe(true);

0 commit comments

Comments
 (0)