fix: prevent agents from duplicating delegated subagent work

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
This commit is contained in:
YeonGyu-Kim
2026-03-11 17:42:42 +09:00
parent 70edea2d7f
commit e4fd29ac8b
18 changed files with 547 additions and 33 deletions
+10 -6
View File
@@ -21,6 +21,7 @@ import {
buildAntiPatternsSection,
buildParallelDelegationSection,
buildNonClaudePlannerSection,
buildAntiDuplicationSection,
categorizeTools,
} from "../dynamic-agent-prompt-builder";
@@ -319,7 +320,7 @@ task(subagent_type="explore", run_in_background=true, load_skills=[], descriptio
// Reference Grep (external)
task(subagent_type="librarian", run_in_background=true, load_skills=[], description="Find JWT security docs", prompt="I'm implementing JWT auth and need current security best practices to choose token storage (httpOnly cookies vs localStorage) and set expiration policy. Find: OWASP auth guidelines, recommended token lifetimes, refresh token rotation strategies, common JWT vulnerabilities. Skip 'what is JWT' tutorials — production security guidance only.")
task(subagent_type="librarian", run_in_background=true, load_skills=[], description="Find Express auth patterns", prompt="I'm building Express auth middleware and need production-quality patterns to structure my middleware chain. Find how established Express apps (1000+ stars) handle: middleware ordering, token refresh, role-based access control, auth error propagation. Skip basic tutorials — I need battle-tested patterns with proper error handling.")
// Continue working immediately. System notifies on completion — collect with background_output then.
// Continue only with non-overlapping work. If none exists, end your response and wait for completion.
// WRONG: Sequential or blocking
result = task(..., run_in_background=false) // Never wait synchronously for explore/librarian
@@ -327,11 +328,14 @@ result = task(..., run_in_background=false) // Never wait synchronously for exp
### Background Result Collection:
1. Launch parallel agents → receive task_ids
2. If you have DIFFERENT independent work → do it now
3. Otherwise → **END YOUR RESPONSE.**
4. System sends \`<system-reminder>\` on completion → triggers your next turn
5. Collect via \`background_output(task_id="...")\`
6. Cleanup: Cancel disposable tasks individually via \`background_cancel(taskId="...")\`
2. Continue only with non-overlapping work
- If you have DIFFERENT independent work → do it now
- Otherwise → **END YOUR RESPONSE.**
3. System sends \`<system-reminder>\` on completion → triggers your next turn
4. Collect via \`background_output(task_id="...")\`
5. Cleanup: Cancel disposable tasks individually via \`background_cancel(taskId="...")\`
${buildAntiDuplicationSection()}
### Search Stop Conditions
+10 -6
View File
@@ -37,6 +37,7 @@ import {
buildOracleSection,
buildHardBlocksSection,
buildAntiPatternsSection,
buildAntiDuplicationSection,
buildNonClaudePlannerSection,
categorizeTools,
} from "../dynamic-agent-prompt-builder";
@@ -233,7 +234,7 @@ ${librarianSection}
<tool_method>
- Fire 2-5 explore/librarian agents in parallel for any non-trivial codebase question.
- Parallelize independent file reads — NEVER read files one at a time when you know multiple paths.
- When delegating AND doing direct work: do both simultaneously.
- When delegating AND doing direct work: do only non-overlapping work simultaneously.
</tool_method>
Explore and Librarian agents are background grep — always \`run_in_background=true\`, always parallel.
@@ -246,11 +247,14 @@ Each agent prompt should include:
Background result collection:
1. Launch parallel agents → receive task_ids
2. If you have DIFFERENT independent work → do it now
3. Otherwise → **END YOUR RESPONSE.**
4. System sends \`<system-reminder>\` on completion → triggers your next turn
5. Collect via \`background_output(task_id="...")\`
6. Cancel disposable tasks individually via \`background_cancel(taskId="...")\`
2. Continue only with non-overlapping work
- If you have DIFFERENT independent work → do it now
- Otherwise → **END YOUR RESPONSE.**
3. System sends \`<system-reminder>\` on completion → triggers your next turn
4. Collect via \`background_output(task_id="...")\`
5. Cancel disposable tasks individually via \`background_cancel(taskId="...")\`
${buildAntiDuplicationSection()}
Stop searching when: you have enough context, same info repeating, 2 iterations with no new data, or direct answer found.
</explore>`;