iterative-retrieval — Claude skill: context for subagents
This skill lays out a four-phase loop that narrows context retrieval so a subagent gets the files it needs instead of the whole repo. Useful when an agent reports missing context.
npx skills add affaan-m/ECC --skill iterative-retrieval -a claude-codeWhat iterative-retrieval does
Subagents start with limited context and cannot tell which files matter until they begin working. The skill describes a cycle of four phases: DISPATCH, EVALUATE, REFINE, LOOP. A broad query goes out first, using glob patterns and keywords. Each file that comes back gets a relevance score between 0 and 1, then the search criteria are updated and the cycle runs again.
Inside you get the pattern with JavaScript examples: retrieveFiles, evaluateRelevance, refineQuery, iterativeRetrieve. The scoring scale is spelled out: 0.8-1.0 means the file directly implements the target functionality, 0.5-0.7 covers related patterns, anything under 0.2 is dropped. The loop stops after three cycles, or sooner if three files score 0.7 or higher and no critical gaps remain.
Two worked examples ship with it: fixing an authentication token expiry bug and adding rate limiting to API endpoints. The second one shows why the passes matter. The first cycle returns nothing because the codebase calls it throttle, not rate limit. Install this if you run multi-agent workflows and keep hitting context limits. For a single-file task, three retrieval passes just add steps.
What it helps with
- find the right files for a subagent that does not know the repo layout
- stay inside the context limit without dumping the whole codebase
- locate code when the project uses its own terminology
- filter out irrelevant files with a relevance score
- assemble context for a multi-agent pipeline across several passes
Example prompts for the agent
- Retrieve context for the task "Fix the authentication token expiry bug" using iterative-retrieval
- Gather files for the subagent: start broad, refine the criteria, max 3 cycles
- Score the retrieved files and return only those with relevance >= 0.7
How to install iterative-retrieval
1Skills CLI (Vercel)
npx skills add affaan-m/ECC --skill iterative-retrieval -a claude-code2Manually: put the files in place
~/.claude/skills/iterative-retrieval/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/iterative-retrieval/
1Skills CLI (Vercel)
npx skills add affaan-m/ECC --skill iterative-retrieval -a codex2Manually: put the files in place
.agents/skills/iterative-retrieval/SKILL.mdFor all projects use ~/.agents/skills/
1Skills CLI (Vercel)
npx skills add affaan-m/ECC --skill iterative-retrieval -a cursor2Manually: put the files in place
.cursor/skills/iterative-retrieval/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install affaan-m/ECC iterative-retrieval2Manually: put the files in place
.github/skills/iterative-retrieval/SKILL.md1Skills CLI (Vercel)
npx skills add affaan-m/ECC --skill iterative-retrieval -a gemini-cli2Platform CLI
gemini skills install https://github.com/affaan-m/ECC --path skills/iterative-retrievalManually: put the files in place
.devin/skills/iterative-retrieval/SKILL.mdThe legacy .windsurf/skills/ path still works
Skills CLI (Vercel)
npx skills add affaan-m/ECC --skill iterative-retrieval -a opencodeClaude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
From the same set146
The whole set →Similar
Questions about iterative-retrieval
How do I install iterative-retrieval in Claude?
Run npx skills add affaan-m/ECC --skill iterative-retrieval -a claude-code. The skill lands at ~/.claude/skills/iterative-retrieval/SKILL.md.
What does iterative-retrieval do?
It defines a DISPATCH to EVALUATE to REFINE to LOOP cycle that progressively tightens context retrieval for a subagent. It stops after three cycles or once enough relevant files are found.
How many retrieval cycles does it run?
Three at most. It can exit earlier when at least three files score 0.7 or higher and no critical gaps are left.
Source text
SKILL.md · MIT
---
name: iterative-retrieval
description: Pattern for progressively refining context retrieval to solve the subagent context problem. Use when a subagent lacks the context it needs and retrieval must be refined across passes.
metadata:
origin: ECC
---
# Iterative Retrieval Pattern
Solves the "context problem" in multi-agent workflows where subagents don't know what context they need until they start working.
## When to Activate
- Spawning subagents that need codebase context they cannot predict upfront
- Building multi-agent workflows where context is progressively refined
- Encountering "context too large" or "missing context" failures in agent tasks
- Designing RAG-like retrieval pipelines for code exploration
- Optimizing token usage in agent orchestration
## The Problem
Subagents are spawned with limited context. They don't know:
- Which files contain relevant code
- What patterns exist in the codebase
- What terminology the project uses
Standard approaches fail:
- **Send everything**: Exceeds context limits
- **Send nothing**: Agent lacks critical information
- **Guess what's needed**: Often wrong
## The Solution: Iterative Retrieval
A 4-phase loop that progressively refines context:
```
┌─────────────────────────────────────────────┐
│ │
│ ┌──────────┐ ┌──────────┐ │
│ │ DISPATCH │─────│ EVALUATE │ │
│ └──────────┘ └──────────┘ │
│ ▲ │ │
│ │ ▼ │
│ ┌──────────┐ ┌──────────┐ │
│ │ LOOP │─────│ REFINE │ │
│ └──────────┘ └──────────┘ │
│ │
│ Max 3 cycles, then proceed │
└─────────────────────────────────────────────┘
```
### Phase 1: DISPATCH
Initial broad query to gather candidate files:
```javascript
// Start with high-level intent
const initialQuery = {
patterns: ['src/**/*.ts', 'lib/**/*.ts'],
keywords: ['authentication', 'user', 'session'],
excludes: ['*.test.ts', '*.spec.ts']
};
// Dispatch to retrieval agent
const candidates = await retrieveFiles(initialQuery);
```
### Phase 2: EVALUATE
Assess retrieved content for relevance:
```javascript
function evaluateRelevance(files, task) {
return files.map(file => ({
path: file.path,
relevance: scoreRelevance(file.content, task),
reason: explainRelevance(file.content, task),
missingContext: identifyGaps(file.content, task)
}));
}
```
Scoring criteria:
- **High (0.8-1.0)**: Directly implements target functionality
- **Medium (0.5-0.7)**: Contains related patterns or types
- **Low (0.2-0.4)**: Tangentially related
- **None (0-0.2)**: Not relevant, exclude
### Phase 3: REFINE
Update search criteria based on evaluation:
```javascript
function refineQuery(evaluation, previousQuery) {
return {
// Add new patterns discovered in high-relevance files
patterns: [...previousQuery.patterns, ...extractPatterns(evaluation)],
// Add terminology found in codebase
keywords: [...previousQuery.keywords, ...extractKeywords(evaluation)],
// Exclude confirmed irrelevant paths
excludes: [...previousQuery.excludes, ...evaluation
.filter(e => e.relevance < 0.2)
.map(e => e.path)
],
// Target specific gaps
focusAreas: evaluation
.flatMap(e => e.missingContext)
.filter(unique)
};
}
```
### Phase 4: LOOP
Repeat with refined criteria (max 3 cycles):
```javascript
async function iterativeRetrieve(task, maxCycles = 3) {
let query = createInitialQuery(task);
let bestContext = [];
for (let cycle = 0; cycle < maxCycles; cycle++) {
const candidates = await retrieveFiles(query);
const evaluation = evaluateRelevance(candidates, task);
// Check if we have sufficient context
const highRelevance = evaluation.filter(e => e.relevance >= 0.7);
if (highRelevance.length >= 3 && !hasCriticalGaps(evaluation)) {
return highRelevance;
}
// Refine and continue
query = refineQuery(evaluation, query);
bestContext = mergeContext(bestContext, highRelevance);
}
return bestContext;
}
```
## Practical Examples
### Example 1: Bug Fix Context
```
Task: "Fix the authentication token expiry bug"
Cycle 1:
DISPATCH: Search for "token", "auth", "expiry" in src/**
EVALUATE: Found auth.ts (0.9), tokens.ts (0.8), user.ts (0.3)
REFINE: Add "refresh", "jwt" keywords; exclude user.ts
Cycle 2:
DISPATCH: Search refined terms
EVALUATE: Found session-manager.ts (0.95), jwt-utils.ts (0.85)
REFINE: Sufficient context (2 high-relevance files)
Result: auth.ts, tokens.ts, session-manager.ts, jwt-utils.ts
```
### Example 2: Feature Implementation
```
Task: "Add rate limiting to API endpoints"
Cycle 1:
DISPATCH: Search "rate", "limit", "api" in routes/**
EVALUATE: No matches - codebase uses "throttle" terminology
REFINE: Add "throttle", "middleware" keywords
Cycle 2:
DISPATCH: Search refined terms
EVALUATE: Found throttle.ts (0.9), middleware/index.ts (0.7)
REFINE: Need router patterns
Cycle 3:
DISPATCH: Search "router", "express" patterns
EVALUATE: Found router-setup.ts (0.8)
REFINE: Sufficient context
Result: throttle.ts, middleware/index.ts, router-setup.ts
```
## Integration with Agents
Use in agent prompts:
```markdown
When retrieving context for this task:
1. Start with broad keyword search
2. Evaluate each file's relevance (0-1 scale)
3. Identify what context is still missing
4. Refine search criteria and repeat (max 3 cycles)
5. Return files with relevance >= 0.7
```
## Best Practices
1. **Start broad, narrow progressively** - Don't over-specify initial queries
2. **Learn codebase terminology** - First cycle often reveals naming conventions
3. **Track what's missing** - Explicit gap identification drives refinement
4. **Stop at "good enough"** - 3 high-relevance files beats 10 mediocre ones
5. **Exclude confidently** - Low-relevance files won't become relevant
## Related
- [The Longform Guide](https://x.com/affaanmustafa/status/2014040193557471352) - Subagent orchestration section
- `continuous-learning` skill - For patterns that improve over time
- Agent definitions bundled with ECC (manual install path: `agents/`)
© affaan-m · MIT · affaan-m/ECC