diff --git a/src/lib/onboard/policy-resume-selection.test.ts b/src/lib/onboard/policy-resume-selection.test.ts index cde2b2f385b..ae7bcf77919 100644 --- a/src/lib/onboard/policy-resume-selection.test.ts +++ b/src/lib/onboard/policy-resume-selection.test.ts @@ -10,9 +10,9 @@ type Preset = { name: string; access?: string }; function policies( options: { applied?: string[]; custom?: string[]; customOwnsObservability?: boolean } = {}, ) { - const setupPresets = ["npm", "brave", "tavily", "observability-otlp-local"].map((name) => ({ - name, - })); + const setupPresets = ["npm", "brave", "tavily", "slack", "observability-otlp-local"].map( + (name) => ({ name }), + ); const customPresets = (options.custom ?? []).map((name) => ({ name })); return { setupPolicyPresetSupported: () => true, @@ -87,6 +87,21 @@ describe("preparePolicyPresetResumeSelection web search reconciliation", () => { }); }); +describe("preparePolicyPresetResumeSelection required preset reconciliation", () => { + it("marks an empty recording for reconciliation when Slack becomes required (#6042)", () => { + const result = preparePolicyPresetResumeSelection({ policies: policies() }, "alpha", { + recordedPolicyPresets: [], + enabledChannels: ["slack"], + agent: "openclaw", + webSearchConfig: null, + webSearchSupported: true, + }); + + expect(result.policyPresets).toEqual(["slack"]); + expect(result.recordedPolicyPresetsNeedReconcile).toBe(true); + }); +}); + describe("preparePolicyPresetResumeSelection tier-default preservation (#6844)", () => { // These exercise the real tiers.yaml through classifyPresetProvenance (no tier // stub): `brave` is a Balanced default, and Restricted lists no such default. diff --git a/test/onboard.test.ts b/test/onboard.test.ts index 669455f9f91..b929f1ef725 100644 --- a/test/onboard.test.ts +++ b/test/onboard.test.ts @@ -53,6 +53,7 @@ type OnboardTestInternals = { session: T, selectedAgentName: string, ) => T; + arePolicyPresetsApplied: (sandboxName: string, selectedPresets?: string[]) => boolean; pullAndResolveBaseImageDigest: () => { digest: string | null; ref: string } | null; createSetupInference: (overrides?: Partial) => SetupInference; SANDBOX_BASE_IMAGE: string; @@ -90,6 +91,7 @@ const { getResumeConfigConflicts, getResumeSandboxConflict, clearAgentScopedResumeState, + arePolicyPresetsApplied, createSetupInference, SANDBOX_BASE_IMAGE, } = onboardTestInternals; @@ -98,6 +100,10 @@ const createDirectSetupInferenceHarness = createDirectSetupInferenceHarnessFactory(createSetupInference); describe("onboard helpers", () => { + it("does not treat an empty policy preset selection as already applied (#6042)", () => { + expect(arePolicyPresetsApplied("unused", [])).toBe(false); + }); + it("adds host proxy variables to sandbox startup env args", () => { const envArgs = ["CHAT_UI_URL=http://127.0.0.1:18789"];