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);
}