fix: prevent agents from duplicating delegated subagent work

Addresses user reports where Sisyphus/Hephaestus would delegate tasks
to explore/librarian subagents but then immediately perform the same
search/work themselves, wasting context and defeating the purpose of
delegation.

Changes:
- Add Anti-Duplication section to dynamic-agent-prompt-builder with
  clear rules: once you delegate, do NOT manually re-do the same search
- Update all agent prompts (sisyphus, hephaestus, sis-junior gemini/gpt)
  to use 'non-overlapping work' instead of 'keep working' after delegation
- Add buildAntiDuplicationSection() with explicit examples of forbidden
  vs allowed behavior after delegation
- Add 'Delegation Trust Rule' to explore section
- Add 'Delegation Duplication' to anti-patterns list

Atlas fixes:
- Add AUTO-CONTINUE POLICY to all Atlas variants (default, gemini, gpt)
  preventing the 'should I continue?' confirmation loop between plan steps
- Fix plan file path in default atlas (.sisyphus/tasks/ -> .sisyphus/plans/)
- Update GPT atlas uncertainty section to only ask questions during initial
  plan analysis, not during execution

Fixes: subagent delegation duplication, Atlas continuation prompting
This commit is contained in:
YeonGyu-Kim
2026-03-09 12:26:15 +09:00
parent 5137df72d8
commit 21ddd55162
14 changed files with 445 additions and 10 deletions
@@ -118,6 +118,8 @@ export function buildExploreSection(agents: AvailableAgent[]): string {
Use it as a **peer tool**, not a fallback. Fire liberally.
**Delegation Trust Rule:** Once you fire an explore agent for a search, do **not** manually perform that same search yourself. Use direct tools only for non-overlapping work or when you intentionally skipped delegation.
**Use Direct Tools when:**
${avoidWhen.map((w) => `- ${w}`).join("\n")}
@@ -308,6 +310,7 @@ export function buildAntiPatternsSection(): string {
"- **Search**: Firing agents for single-line typos or obvious syntax errors",
"- **Debugging**: Shotgun debugging, random changes",
"- **Background Tasks**: Polling `background_output` on running tasks — end response and wait for notification",
"- **Delegation Duplication**: Delegating exploration to explore/librarian and then manually doing the same search yourself",
"- **Oracle**: Delivering answer without collecting Oracle results",
]
@@ -409,3 +412,52 @@ export function buildUltraworkSection(
return lines.join("\n")
}
// Anti-duplication section for agent prompts
export function buildAntiDuplicationSection(): string {
return `<Anti_Duplication>
## Anti-Duplication Rule (CRITICAL)
Once you delegate exploration to explore/librarian agents, **DO NOT perform the same search yourself**.
### What this means:
**FORBIDDEN:**
- After firing explore/librarian, manually grep/search for the same information
- Re-doing the research the agents were just tasked with
- "Just quickly checking" the same files the background agents are checking
**ALLOWED:**
- Continue with **non-overlapping work** — work that doesn't depend on the delegated research
- Work on unrelated parts of the codebase
- Preparation work (e.g., setting up files, configs) that can proceed independently
### Wait for Results Properly:
When you need the delegated results but they're not ready:
1. **End your response** — do NOT continue with work that depends on those results
2. **Wait for the completion notification** — the system will trigger your next turn
3. **Then** collect results via \`background_output(task_id="...")\`
4. **Do NOT** impatiently re-search the same topics while waiting
### Why This Matters:
- **Wasted tokens**: Duplicate exploration wastes your context budget
- **Confusion**: You might contradict the agent's findings
- **Efficiency**: The whole point of delegation is parallel throughput
### Example:
\`\`\`typescript
// WRONG: After delegating, re-doing the search
task(subagent_type="explore", run_in_background=true, ...)
// Then immediately grep for the same thing yourself — FORBIDDEN
// CORRECT: Continue non-overlapping work
task(subagent_type="explore", run_in_background=true, ...)
// Work on a different, unrelated file while they search
// End your response and wait for the notification
\`\`\`
</Anti_Duplication>`
}