feat(KB-141): add dependency awareness to triage system prompt and task_get tool

- Add 'Dependency awareness' section to TRIAGE_SYSTEM_PROMPT instructing agent to call task_get on dependencies before writing specs
- Update task_get tool description to mention reading dependency task specs
- Add test verifying system prompt contains dependency awareness instructions
- Add test verifying task_get tool description mentions dependency specs
This commit is contained in:
Dustin Byrne
2026-03-28 00:06:45 -04:00
parent 65b958581f
commit 6d9700bc24
2 changed files with 73 additions and 1 deletions

View File

@@ -404,6 +404,73 @@ describe("buildSpecificationPrompt", () => {
});
});
describe("TRIAGE_SYSTEM_PROMPT and task_get tool", () => {
beforeEach(() => {
vi.clearAllMocks();
});
it("system prompt contains dependency awareness instructions", async () => {
const store = createMockStore();
mockedCreateHaiAgent.mockResolvedValue({
session: {
prompt: vi.fn().mockResolvedValue(undefined),
dispose: vi.fn(),
},
} as any);
const triage = new TriageProcessor(store, "/tmp/test");
await triage.specifyTask({
id: "KB-001",
title: "Test",
description: "Test",
column: "triage",
dependencies: [],
steps: [],
currentStep: 0,
log: [],
createdAt: new Date().toISOString(),
updatedAt: new Date().toISOString(),
});
const callArgs = mockedCreateHaiAgent.mock.calls[0][0];
const systemPrompt = callArgs.systemPrompt as string;
expect(systemPrompt).toContain("## Dependency awareness");
expect(systemPrompt).toContain("call `task_get` on that task ID to read its PROMPT.md");
});
it("task_get tool description mentions reading dependency specs", async () => {
const store = createMockStore();
mockedCreateHaiAgent.mockResolvedValue({
session: {
prompt: vi.fn().mockResolvedValue(undefined),
dispose: vi.fn(),
},
} as any);
const triage = new TriageProcessor(store, "/tmp/test");
await triage.specifyTask({
id: "KB-001",
title: "Test",
description: "Test",
column: "triage",
dependencies: [],
steps: [],
currentStep: 0,
log: [],
createdAt: new Date().toISOString(),
updatedAt: new Date().toISOString(),
});
const callArgs = mockedCreateHaiAgent.mock.calls[0][0];
const tools = callArgs.customTools as any[];
const taskGetTool = tools.find((t: any) => t.name === "task_get");
expect(taskGetTool).toBeDefined();
expect(taskGetTool.description).toContain("read dependency task specs");
});
});
function createEnoentError(path = "/fake/path"): NodeJS.ErrnoException {
return Object.assign(
new Error(`ENOENT: no such file or directory, open '${path}'`),

View File

@@ -130,6 +130,11 @@ If a task already covers the same work (even if worded differently), do NOT
write a PROMPT.md. Instead, write a single line to the output file:
\`DUPLICATE: {existing-task-id}\`
## Dependency awareness
When you plan to list a task in the \`## Dependencies\` section, first call \`task_get\` on that task ID to read its PROMPT.md.
Use what you learn — file scope, APIs, patterns, completion criteria — to make the new spec accurate: reference the right paths, avoid conflicting assumptions, and describe what the dependency must deliver before this task starts.
If the dependency task has no PROMPT.md yet (not yet specified), note that in the Dependencies section.
## Guidelines
- Read the project structure and relevant source files to understand context BEFORE writing
- Be specific — name actual files, functions, and patterns from the codebase
@@ -373,7 +378,7 @@ export class TriageProcessor {
label: "Get Task",
description:
"Get full details of a specific task including its PROMPT.md content. " +
"Use to verify whether a similar task is actually a duplicate.",
"Use to verify duplicates and to read dependency task specs before writing a new PROMPT.md.",
parameters: taskGetParams,
execute: async (_callId: string, params: Static<typeof taskGetParams>) => {
try {