From fe655febf64682ab9ffb71107583287d1c631d07 Mon Sep 17 00:00:00 2001 From: yangyitao <17801025312@sina.cn> Date: Fri, 13 Mar 2026 15:14:38 +0000 Subject: [PATCH] test(skills): add regression test for global-value restore on skill release Covers the P1 scenario: session A holds SHARED_KEY via global env, session B overrides it with a per-skill value. After B reverts, process.env.SHARED_KEY must revert to 'global-value' (not remain as the skill value). After A reverts, the key must be cleaned up entirely. --- .../env-overrides.skills-global-env.test.ts | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/src/agents/skills/env-overrides.skills-global-env.test.ts b/src/agents/skills/env-overrides.skills-global-env.test.ts index 9f0ad1889be..ee5613ded06 100644 --- a/src/agents/skills/env-overrides.skills-global-env.test.ts +++ b/src/agents/skills/env-overrides.skills-global-env.test.ts @@ -187,6 +187,40 @@ describe("skills global env", () => { expect(process.env["SHARED_KEY"]).toBeUndefined(); }); + it("restores global value after last skill override releases (concurrent sessions)", () => { + // Session A: holds SHARED_KEY via global env only. + const configA = makeConfig({ + skills: { env: { SHARED_KEY: "global-value" } }, + }); + const revertA = applySkillEnvOverrides({ + skills: [makeSkillEntry("skill-a")], + config: configA, + }); + expect(process.env["SHARED_KEY"]).toBe("global-value"); + + // Session B: overrides SHARED_KEY with a per-skill value. + const configB = makeConfig({ + skills: { + env: { SHARED_KEY: "global-value" }, + entries: { "skill-b": { env: { SHARED_KEY: "skill-b-value" } } }, + }, + }); + const revertB = applySkillEnvOverrides({ + skills: [makeSkillEntry("skill-b")], + config: configB, + }); + expect(process.env["SHARED_KEY"]).toBe("skill-b-value"); + + // B reverts: A still holds a global reference, so the key must revert to + // "global-value" rather than staying as "skill-b-value". + revertB(); + expect(process.env["SHARED_KEY"]).toBe("global-value"); + + // A reverts: no more owners, key must be cleaned up entirely. + revertA(); + expect(process.env["SHARED_KEY"]).toBeUndefined(); + }); + it("applySkillEnvOverridesFromSnapshot injects global env for a skill with no entries config", () => { const config = makeConfig({ skills: {