From 912dcfbc2b796e9e9bfba5ce4ef8c113ecbaef18 Mon Sep 17 00:00:00 2001 From: Vincent Koc Date: Wed, 22 Apr 2026 23:08:08 -0700 Subject: [PATCH] test(plugins): guard startup-gated hook wiring --- .../contracts/boundary-invariants.test.ts | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/plugins/contracts/boundary-invariants.test.ts b/src/plugins/contracts/boundary-invariants.test.ts index 35e0db36877..02f0f2ec697 100644 --- a/src/plugins/contracts/boundary-invariants.test.ts +++ b/src/plugins/contracts/boundary-invariants.test.ts @@ -66,6 +66,13 @@ const BUNDLED_LIVE_CONFIG_HOOK_GUARDS = { "api.runtime.config?.loadConfig?.() ?? api.config", ], } as const satisfies Record; +const BUNDLED_STARTUP_GATED_HOOK_FORBIDDEN_SNIPPETS = { + "extensions/memory-lancedb/index.ts": ["if (cfg.autoRecall)", "if (cfg.autoCapture)"], + "extensions/skill-workshop/index.ts": [ + "if (!startupConfig.enabled)", + 'if (startupConfig.autoCapture && startupConfig.reviewMode !== "off")', + ], +} as const satisfies Record; type FileFilter = { excludeTests?: boolean; @@ -248,4 +255,16 @@ describe("plugin contract boundary invariants", () => { ); expect(missingGuards).toEqual([]); }); + + it("keeps long-lived bundled hook handlers off startup-only registration gates", () => { + const offenders = Object.entries(BUNDLED_STARTUP_GATED_HOOK_FORBIDDEN_SNIPPETS).flatMap( + ([file, forbiddenSnippets]) => { + const source = readRepoSource(file); + return forbiddenSnippets + .filter((snippet) => source.includes(snippet)) + .map((snippet) => `${file}: ${snippet}`); + }, + ); + expect(offenders).toEqual([]); + }); });