From 006184456a4039342dc7facdfb30acfd1911f22f Mon Sep 17 00:00:00 2001 From: mastertyko <11311479+mastertyko@users.noreply.github.com> Date: Mon, 23 Mar 2026 18:46:44 +0100 Subject: [PATCH] fix(gsd): use explicit parameter syntax in skill activation prompts The skill activation block used positional-looking syntax `Call Skill('name')` which caused LLMs (especially non-Anthropic models) to pass `{name: "..."}` instead of the required `{skill: "..."}` parameter. This triggered tool validation failures and stuck dispatch loops in auto-mode. Change the prompt template to `Call Skill({ skill: 'name' })` which makes the parameter name explicit and matches the Skill tool schema. Update all 4 affected test assertions to match the new format. Closes #2224 --- src/resources/extensions/gsd/auto-prompts.ts | 4 +++- .../extensions/gsd/tests/skill-activation.test.ts | 8 ++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/resources/extensions/gsd/auto-prompts.ts b/src/resources/extensions/gsd/auto-prompts.ts index d683102dc..102aebb63 100644 --- a/src/resources/extensions/gsd/auto-prompts.ts +++ b/src/resources/extensions/gsd/auto-prompts.ts @@ -421,7 +421,9 @@ function resolvePreferredSkillNames( function formatSkillActivationBlock(skillNames: string[]): string { if (skillNames.length === 0) return ""; - const calls = skillNames.map(name => `Call Skill('${name}')`).join('. '); + // Use explicit parameter syntax so LLMs pass { skill: "..." } instead of { name: "..." }. + // Positional-looking `Skill('name')` caused validation failures — see #2224. + const calls = skillNames.map(name => `Call Skill({ skill: '${name}' })`).join('. '); return `${calls}.`; } diff --git a/src/resources/extensions/gsd/tests/skill-activation.test.ts b/src/resources/extensions/gsd/tests/skill-activation.test.ts index 673e8911c..312c078bf 100644 --- a/src/resources/extensions/gsd/tests/skill-activation.test.ts +++ b/src/resources/extensions/gsd/tests/skill-activation.test.ts @@ -75,7 +75,7 @@ test("buildSkillActivationBlock activates skills via prefer_skills when context prefer_skills: ["react"], }); - assert.match(result, /Call Skill\('react'\)/); + assert.match(result, /Call Skill\(\{ skill: 'react' \}\)/); assert.doesNotMatch(result, /swiftui/); } finally { cleanup(base); @@ -92,7 +92,7 @@ test("buildSkillActivationBlock includes always_use_skills from preferences usin always_use_skills: ["swift-testing"], }); - assert.equal(result, "Call Skill('swift-testing')."); + assert.equal(result, "Call Skill({ skill: 'swift-testing' })."); } finally { cleanup(base); } @@ -120,8 +120,8 @@ test("buildSkillActivationBlock includes skill_rules matches and task-plan skill skill_rules: [{ when: "prisma database schema", use: ["prisma"] }], }); - assert.match(result, /Call Skill\('accessibility'\)/); - assert.match(result, /Call Skill\('prisma'\)/); + assert.match(result, /Call Skill\(\{ skill: 'accessibility' \}\)/); + assert.match(result, /Call Skill\(\{ skill: 'prisma' \}\)/); } finally { cleanup(base); }