diff --git a/src/signals/onboarding-pack.ts b/src/signals/onboarding-pack.ts index c36fb904f1..4d7b34ed95 100644 --- a/src/signals/onboarding-pack.ts +++ b/src/signals/onboarding-pack.ts @@ -1,4 +1,5 @@ import { isFocusManifestPublicSafe, type FocusManifestPolicy } from "./focus-manifest"; +import { labelPolicyNote } from "./repo-policy-compiler"; import { nowIso } from "../utils/json"; export type RepoPolicyContributionLane = { @@ -99,6 +100,7 @@ export function focusManifestPolicyToCompilerOutput(policy: FocusManifestPolicy) preferredLabels: policy.publicSafe.labelPolicy.preferredLabels, requiredLabels: [], discouragedLabels: [], + note: labelPolicyNote(policy.publicSafe.validation.linkedIssuePolicy), }, validationExpectations: policy.publicSafe.validation.expectations, readinessWarnings: policy.publicSafe.readinessWarnings, diff --git a/src/signals/repo-policy-compiler.ts b/src/signals/repo-policy-compiler.ts index 3de715f1f7..14a896b714 100644 --- a/src/signals/repo-policy-compiler.ts +++ b/src/signals/repo-policy-compiler.ts @@ -112,7 +112,7 @@ function issueDiscoverySummary(preference: FocusManifestLanePreference, summary: return "Issue discovery is optional; confirm maintainer scope before filing new issues."; } -function labelPolicyNote(linkedIssuePolicy: string): string { +export function labelPolicyNote(linkedIssuePolicy: string): string { if (linkedIssuePolicy === "required") return "Link a tracked issue before opening a pull request."; if (linkedIssuePolicy === "preferred") return "Link a tracked issue when one exists."; return "Use labels to explain accepted scope, not to promise outcomes."; diff --git a/test/unit/onboarding-pack.test.ts b/test/unit/onboarding-pack.test.ts index a4d6be41d5..ed58617893 100644 --- a/test/unit/onboarding-pack.test.ts +++ b/test/unit/onboarding-pack.test.ts @@ -5,10 +5,11 @@ import { } from "../../src/services/repo-onboarding-pack"; import { createTestEnv } from "../helpers/d1"; import { upsertRepositoryFromGitHub } from "../../src/db/repositories"; -import { parseFocusManifestContent } from "../../src/signals/focus-manifest"; +import { parseFocusManifestContent, compileFocusManifestPolicy, parseFocusManifest } from "../../src/signals/focus-manifest"; import { compileRepoPolicyCompilerOutput } from "../../src/signals/repo-policy-compiler"; import { buildRepoOnboardingPackPreview, + focusManifestPolicyToCompilerOutput, isRepoOnboardingPackPublicSafe, type RepoPolicyCompilerOutput, } from "../../src/signals/onboarding-pack"; @@ -60,6 +61,20 @@ const POLICY_COMPILER_FIXTURE: RepoPolicyCompilerOutput = { ], }; +describe("focusManifestPolicyToCompilerOutput (#5943)", () => { + it("matches compileRepoPolicyCompilerOutput's labelPolicy.note for the same manifest", () => { + const repoFullName = "octo/widgets"; + const manifest = parseFocusManifest({ wantedPaths: ["src/"], linkedIssuePolicy: "required" }); + const generatedAt = "2026-01-01T00:00:00.000Z"; + const viaCompiler = compileRepoPolicyCompilerOutput({ repoFullName, manifest, generatedAt }); + const viaAdapter = focusManifestPolicyToCompilerOutput( + compileFocusManifestPolicy(repoFullName, manifest, { generatedAt }), + ); + expect(viaAdapter.labelPolicy?.note).toBe(viaCompiler.labelPolicy?.note); + expect(viaAdapter.labelPolicy?.note).toBe("Link a tracked issue before opening a pull request."); + }); +}); + describe("buildRepoOnboardingPackPreview", () => { it("cross-links policy compiler output into onboarding pack inputs for issue 248", () => { const preview = buildRepoOnboardingPackPreview(POLICY_COMPILER_FIXTURE); diff --git a/test/unit/registration-readiness.test.ts b/test/unit/registration-readiness.test.ts index d82da7076c..4d5e0dd2d6 100644 --- a/test/unit/registration-readiness.test.ts +++ b/test/unit/registration-readiness.test.ts @@ -305,6 +305,7 @@ describe("buildRegistrationReadiness", () => { expect(report.onboardingPackPreview?.previewOnly).toBe(true); expect(report.onboardingPackPreview?.repoFullName).toBe("octo/manifest"); expect(report.onboardingPackPreview?.contributionLanes.length).toBeGreaterThan(0); + expect(report.onboardingPackPreview?.labelPolicy.note).toBe("Link a tracked issue before opening a pull request."); expect(JSON.stringify(report.onboardingPackPreview)).not.toMatch(FORBIDDEN_PUBLIC_LANGUAGE); });