From d487326ada6d6c70b3842ed0e6288e36ba2f8540 Mon Sep 17 00:00:00 2001 From: sqlrush Date: Fri, 5 Jun 2026 19:41:25 +0800 Subject: [PATCH] test(skills): add BuildSkillRoots plugin-sort determinism test MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 补 spec-2.2 R-fix 漏 stage 的测试(codex PREC-HIGH-01 验证):cross-plugin precedence 按 sorted PluginID 而非入参序,两种输入序结果一致。fix 已在 PR #93,本 commit 补其回归测。 Spec: spec-2.2-skill-discovery.md --- internal/bootstrap/skills_test.go | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/internal/bootstrap/skills_test.go b/internal/bootstrap/skills_test.go index 2739c2f..91da467 100644 --- a/internal/bootstrap/skills_test.go +++ b/internal/bootstrap/skills_test.go @@ -99,6 +99,33 @@ func TestBuildSkillRoots_Plugins(t *testing.T) { } } +// TestBuildSkillRoots_PluginsSortedByID — cross-plugin precedence is by sorted +// PluginID regardless of input order (locked Q8; codex PREC-HIGH-01). +func TestBuildSkillRoots_PluginsSortedByID(t *testing.T) { + t.Parallel() + base := SkillPathInputs{HomeDir: "/h", CWD: "/c"} + forward := base + forward.PluginDirs = []PluginDir{{ID: "alpha", Dir: "/p/alpha"}, {ID: "beta", Dir: "/p/beta"}} + reverse := base + reverse.PluginDirs = []PluginDir{{ID: "beta", Dir: "/p/beta"}, {ID: "alpha", Dir: "/p/alpha"}} + + precOf := func(in SkillPathInputs, dir string) int { + for _, r := range BuildSkillRoots(in, config.PluginsConfig{}).Roots { + if r.Dir == dir { + return r.Precedence + } + } + return -1 + } + // alpha < beta by sorted ID, in BOTH input orders. + if precOf(forward, "/p/alpha") >= precOf(forward, "/p/beta") { + t.Error("alpha should outrank-less beta (forward order)") + } + if precOf(reverse, "/p/alpha") >= precOf(reverse, "/p/beta") { + t.Error("plugin precedence flipped with input order (not sorted by ID)") + } +} + func TestBuildSkillRoots_DisabledPassthrough(t *testing.T) { t.Parallel() opts := BuildSkillRoots(SkillPathInputs{HomeDir: "/h", CWD: "/c"},