iterative-retrieval
affaan-m/ecc
Progressively refine context retrieval in multi-agent workflows to solve the subagent context problem.
What is iterative-retrieval?
A 4-phase loop pattern (dispatch, evaluate, refine, loop) that iteratively gathers and filters relevant codebase context for subagents. Use this when spawning agents that cannot predict their context needs upfront, or when facing context-size or missing-information failures in multi-agent tasks.
- Dispatches broad initial queries to gather candidate files based on keywords and patterns
- Evaluates retrieved files for relevance on a 0–1 scale with explicit reasoning and gap identification
- Refines search criteria based on evaluation results, adding discovered terminology and patterns
- Loops up to 3 cycles to progressively narrow context until high-relevance files are found
- Stops early when sufficient context is gathered, avoiding token waste and context-limit overflows
How to install iterative-retrieval
npx skills add null --skill iterative-retrievalHow to use iterative-retrieval
- 1.Define an initial broad query with patterns, keywords, and exclusions based on the task intent
- 2.Dispatch the query to retrieve candidate files from the codebase
- 3.Evaluate each retrieved file for relevance (0–1 scale) and identify missing context gaps
- 4.Refine the query by adding discovered terminology, patterns, and focus areas from the evaluation
- 5.Repeat the dispatch–evaluate–refine cycle (max 3 times) until you have 3+ high-relevance files with no critical gaps
- 6.Return the high-relevance files (≥0.7 score) as context for the subagent
Use cases
- Fixing a bug when the subagent doesn't know which files contain the relevant code (e.g., authentication token expiry)
- Implementing a new feature by discovering codebase terminology and patterns first (e.g., rate limiting with 'throttle' instead of 'limit')
- Orchestrating multi-agent workflows where context is discovered incrementally rather than guessed upfront
- Optimizing token usage in agent tasks by retrieving only high-relevance files across multiple refinement cycles
- Building RAG-like retrieval pipelines for code exploration in large or unfamiliar codebases
- Multi-agent orchestration engineers
- AI agent developers building workflows with subagents
- Teams managing large codebases where context prediction is difficult
- Developers optimizing token usage in agent-based systems
iterative-retrieval FAQ
Use iterative retrieval when subagents cannot predict their context needs upfront, when context size exceeds limits, or when you want to optimize token usage. Send all context only if the codebase is small and the task is well-defined.
The pattern recommends a maximum of 3 cycles. Stop early if you have 3+ files with relevance ≥0.7 and no critical gaps identified.
High relevance (0.8–1.0) means the file directly implements the target functionality. Medium (0.5–0.7) contains related patterns. Aim to return files with ≥0.7 relevance.
During evaluation, explicitly check whether the retrieved files reference other files, types, or patterns not yet retrieved. These gaps drive the refinement step.
Yes. The pattern is agnostic to the retrieval mechanism—use keyword search, vector embeddings, or hybrid approaches. The key is the evaluate–refine loop.
Full instructions (SKILL.md)
Source of truth, from affaan-m/ecc.
name: iterative-retrieval description: Pattern for progressively refining context retrieval to solve the subagent context problem 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:
// 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:
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:
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):
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:
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
- Start broad, narrow progressively - Don't over-specify initial queries
- Learn codebase terminology - First cycle often reveals naming conventions
- Track what's missing - Explicit gap identification drives refinement
- Stop at "good enough" - 3 high-relevance files beats 10 mediocre ones
- Exclude confidently - Low-relevance files won't become relevant
Related
- The Longform Guide - Subagent orchestration section
continuous-learningskill - For patterns that improve over time- Agent definitions bundled with ECC (manual install path:
agents/)
Related skills
More from affaan-m/ecc and the wider catalog.
ito-basket-compare
Compare prediction-market baskets against your research, portfolio, and thesis—read-only gap analysis without trading.
ito-baskets
Agent skill from affaan-m/ecc.
ito-compute
Agent skill from affaan-m/ecc.
ito-data-atlas-agent
Design background Data Atlas agents for Itô basket research with human-in-the-loop review—architecture and workflow planning, not live trading.
ito-inference
Agent skill from affaan-m/ecc.
ito-market-intelligence
Research prediction-market events, venues, and liquidity without investment advice or live trading.