From e20f91c1092683f3daa7134f5d7e177fe7153ff2 Mon Sep 17 00:00:00 2001 From: pr-relay Date: Sun, 16 Aug 2026 20:30:01 +0000 Subject: [PATCH] signals: use safe preferred labels in next step --- src/signals/focus-manifest.ts | 2 +- ...manifest-preferred-label-next-step.test.ts | 31 +++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 test/unit/focus-manifest-preferred-label-next-step.test.ts diff --git a/src/signals/focus-manifest.ts b/src/signals/focus-manifest.ts index 84bf6bdf3..696b824f1 100644 --- a/src/signals/focus-manifest.ts +++ b/src/signals/focus-manifest.ts @@ -816,7 +816,7 @@ export function buildFocusManifestGuidance(args: { detail: preferredLabelsDetail, action: "Consider applying a maintainer-preferred label so triage stays aligned.", }); - publicNextSteps.push(`Consider a maintainer-preferred label (${manifest.preferredLabels.slice(0, 3).join(", ")}).`); + publicNextSteps.push(`Consider a maintainer-preferred label (${safePreferredLabels.slice(0, 3).join(", ")}).`); } if (manifest.linkedIssuePolicy === "required" && linkedIssueCount === 0 && bodyObserved && !hasNoIssueRationale) { diff --git a/test/unit/focus-manifest-preferred-label-next-step.test.ts b/test/unit/focus-manifest-preferred-label-next-step.test.ts new file mode 100644 index 000000000..a32cda061 --- /dev/null +++ b/test/unit/focus-manifest-preferred-label-next-step.test.ts @@ -0,0 +1,31 @@ +import { describe, expect, it } from "vitest"; +import { buildFocusManifestGuidance, parseFocusManifest } from "../../src/signals/focus-manifest"; + +function guidance(preferredLabels: string[]) { + return buildFocusManifestGuidance({ + manifest: parseFocusManifest({ preferredLabels }), + changedPaths: ["src/example.ts"], + labels: [], + }); +} + +describe("preferred-label public next steps", () => { + it("keeps the safe preferred labels when the configured list also contains an unsafe label", () => { + const result = guidance(["bug", "reward payout", "good first issue"]); + const finding = result.findings.find((entry) => entry.code === "manifest_missing_preferred_label"); + const nextStep = result.publicNextSteps.find((entry) => entry.startsWith("Consider a maintainer-preferred label")); + + expect(finding?.detail).toBe("Maintainer prefers labels: bug, good first issue."); + expect(nextStep).toBe("Consider a maintainer-preferred label (bug, good first issue)."); + expect(nextStep).not.toMatch(/reward payout/i); + }); + + it("keeps all-safe preferred-label output unchanged", () => { + const result = guidance(["bug", "enhancement", "good first issue"]); + const finding = result.findings.find((entry) => entry.code === "manifest_missing_preferred_label"); + const nextStep = result.publicNextSteps.find((entry) => entry.startsWith("Consider a maintainer-preferred label")); + + expect(finding?.detail).toBe("Maintainer prefers labels: bug, enhancement, good first issue."); + expect(nextStep).toBe("Consider a maintainer-preferred label (bug, enhancement, good first issue)."); + }); +});