Agent Workflow Patterns with Knowledge Base Integration
Proven patterns and strategies for AI agents to effectively leverage the Coditect knowledge base in their workflows.
Table of Contents
- Core Workflow Patterns
- Query Strategy Patterns
- Multi-Agent Collaboration Patterns
- Learning and Contribution Patterns
- Performance Optimization
- Anti-Patterns to Avoid
Core Workflow Patterns
Pattern 1: Context-Before-Code (CBC)
Intent: Always retrieve historical context before implementing new features or fixing bugs.
Implementation:
async function contextBeforeCode(task: Task) {
// Step 1: Extract searchable components
const keywords = extractKeywords(task.description);
const components = identifyComponents(task);
// Step 2: Search for direct matches
const historicalContext = await kb.search({
query: keywords.join(' '),
categories: task.categories,
contains_solution: true
});
// Step 3: If no direct match, broaden search
if (historicalContext.results.length === 0) {
const patterns = await kb.findPatterns({
pattern_type: task.type,
context: components.join(' ')
});
return planFromPatterns(patterns);
}
// Step 4: Validate approach against known issues
const issues = await kb.checkIssues({
component: components[0],
include_workarounds: true
});
return {
context: historicalContext,
issues: issues,
approach: adaptSolution(historicalContext.results[0])
};
}
Pattern 2: Progressive Enhancement (PE)
Intent: Start with known working solutions and progressively enhance them.
Implementation:
async function progressiveEnhancement(requirement: Requirement) {
// Start with proven foundation
const examples = await kb.getContext({
problem: requirement.description,
include_examples: true
});
// Select and implement base
const base = selectBestExample(examples);
let implementation = await implementBase(base);
// Test and iterate
while (!meetsRequirement(implementation, requirement)) {
const debugging = await kb.search({
query: `${getError(implementation)} solution`,
categories: ['debugging']
});
implementation = applyFix(implementation, debugging);
}
// Enhance with patterns
const enhancements = await kb.findPatterns({
pattern_type: 'implementation',
context: requirement.advancedFeatures
});
return enhanceImplementation(implementation, enhancements);
}
Pattern 3: Defensive Implementation (DI)
Intent: Proactively check for known issues and implement defensive measures.
async function defensiveImplementation(component: Component) {
// Check all known issues first
const knownIssues = await kb.checkIssues({
component: component.name,
include_workarounds: true,
active_only: false
});
// Build defensive measures
const defensiveMeasures = knownIssues.map(issue => ({
issue: issue.description,
prevention: issue.workaround || generatePrevention(issue),
validation: createValidation(issue)
}));
// Implement with guards
return implementWithGuards(component, defensiveMeasures);
}
Query Strategy Patterns
Pattern 1: Funnel Search
Intent: Start broad and progressively narrow search scope.
class FunnelSearch {
async search(problem: string, context: Context) {
const queries = [
// Level 1: Broad search
{
query: extractMainConcept(problem),
min_relevance: 0.6
},
// Level 2: Component-specific
{
query: `${context.component} ${problem}`,
categories: [context.category],
min_relevance: 0.7
},
// Level 3: Exact error/pattern
{
query: extractErrorSignature(problem),
contains_solution: true,
min_relevance: 0.8
},
// Level 4: Time-constrained recent
{
query: problem,
time_window_days: 7,
min_relevance: 0.9
}
];
for (const q of queries) {
const results = await kb.search(q);
if (results.results.length > 0) {
return this.rankResults(results, context);
}
}
return null;
}
}
Pattern 2: Cross-Reference Search
Intent: Validate findings by cross-referencing multiple search angles.
async function crossReferenceSearch(problem: Problem) {
// Search from multiple angles
const searches = await Promise.all([
// Direct problem search
kb.search({ query: problem.description }),
// Error pattern search
kb.search({ query: problem.errorMessage, categories: ['debugging'] }),
// Component issues
kb.checkIssues({ component: problem.component }),
// Similar sessions
kb.getSimilarSessions({
task_description: problem.context,
technologies: problem.techStack
})
]);
// Cross-reference and score
const crossReferenced = findCommonElements(searches);
return rankByFrequency(crossReferenced);
}
Pattern 3: Temporal Search
Intent: Leverage time-based relevance for evolving issues.
async function temporalSearch(issue: Issue) {
const timeWindows = [1, 7, 30, 90]; // days
const results = [];
for (const window of timeWindows) {
const windowResults = await kb.search({
query: issue.description,
time_window_days: window,
min_relevance: 0.8 - (window * 0.002) // Lower threshold for older
});
results.push({
window,
results: windowResults,
relevance: calculateTemporalRelevance(windowResults, window)
});
}
return synthesizeTemporalInsights(results);
}
Multi-Agent Collaboration Patterns
Pattern 1: Knowledge Relay
Intent: Agents pass enriched context through a workflow chain.
class KnowledgeRelay {
private relayContext: RelayContext = {
originalTask: null,
knowledgeChain: [],
decisions: [],
appliedSolutions: []
};
async startRelay(task: Task, firstAgent: Agent) {
this.relayContext.originalTask = task;
// First agent searches and enriches
const initialContext = await firstAgent.searchKnowledge(task);
this.relayContext.knowledgeChain.push({
agent: firstAgent.id,
findings: initialContext,
timestamp: Date.now()
});
return this.relayContext;
}
async passRelay(fromAgent: Agent, toAgent: Agent, additionalContext?: any) {
// Receiving agent builds on previous knowledge
const enrichedSearch = await toAgent.searchWithContext(
this.relayContext,
additionalContext
);
this.relayContext.knowledgeChain.push({
agent: toAgent.id,
findings: enrichedSearch,
timestamp: Date.now()
});
// Share back to knowledge base
if (this.isComplete()) {
await this.documentRelayLearning();
}
return this.relayContext;
}
}
Pattern 2: Consensus Building
Intent: Multiple agents verify solutions through independent searches.
class ConsensusBuilder {
async buildConsensus(problem: Problem, agents: Agent[]) {
// Each agent independently searches
const independentSearches = await Promise.all(
agents.map(agent =>
agent.searchKnowledge(problem, { independent: true })
)
);
// Find overlapping solutions
const commonSolutions = this.findCommonSolutions(independentSearches);
// Build consensus score
const consensus = {
solutions: commonSolutions,
confidence: this.calculateConfidence(commonSolutions, agents.length),
dissent: this.identifyDissent(independentSearches)
};
// High confidence = proceed
// Low confidence = escalate or research more
return consensus;
}
}
Pattern 3: Specialist Consultation
Intent: General agents consult specialist agents for domain-specific knowledge.
class SpecialistConsultation {
private specialists = {
'security': SecurityAgent,
'performance': PerformanceAgent,
'architecture': ArchitectureAgent,
'testing': TestingAgent
};
async consultSpecialists(task: Task, generalContext: Context) {
const relevantSpecialists = this.identifyRelevantSpecialists(task);
const consultations = await Promise.all(
relevantSpecialists.map(async (specialistType) => {
const specialist = this.specialists[specialistType];
// Specialist searches with domain focus
const specialistContext = await specialist.searchDomainKnowledge({
task: task,
generalContext: generalContext,
domainFocus: specialistType
});
return {
domain: specialistType,
insights: specialistContext,
recommendations: specialist.generateRecommendations(specialistContext)
};
})
);
return this.synthesizeConsultations(consultations);
}
}
Learning and Contribution Patterns
Pattern 1: Solution Documentation
Intent: Systematically document successful solutions for future use.
class SolutionDocumenter {
async documentSolution(problem: Problem, solution: Solution, process: Process) {
// Analyze what made this solution successful
const analysis = {
problemSignature: this.extractProblemSignature(problem),
solutionPattern: this.extractSolutionPattern(solution),
keyInsights: this.extractKeyInsights(process),
reusabilityScore: this.assessReusability(solution)
};
// Add to knowledge base with rich metadata
await kb.addLearning({
problem: problem.description,
solution: solution.implementation,
category: this.categorize(problem, solution),
complexity: this.assessComplexity(solution),
tags: [
...this.extractTags(problem),
...this.extractTags(solution),
...process.technologiesUsed
],
code_example: solution.code,
metadata: {
...analysis,
performance_metrics: process.metrics,
debug_steps: process.debugSteps,
decision_points: process.decisions
}
});
}
}
Pattern 2: Pattern Evolution
Intent: Track how patterns evolve over time and update knowledge accordingly.
class PatternEvolution {
async evolvePattern(patternId: string, newVariation: Variation) {
// Get existing pattern
const existingPattern = await kb.getPattern(patternId);
// Analyze variation
const evolution = {
originalPattern: existingPattern,
variation: newVariation,
improvements: this.identifyImprovements(existingPattern, newVariation),
tradeoffs: this.identifyTradeoffs(existingPattern, newVariation)
};
// Update pattern in KB
await kb.updatePattern(patternId, {
variations: [...existingPattern.variations, newVariation],
evolutionHistory: [...existingPattern.evolutionHistory, evolution],
currentBestPractice: this.selectBestPractice([
existingPattern,
newVariation
])
});
// Notify agents using old pattern
await this.notifyPatternUsers(patternId, evolution);
}
}
Pattern 3: Failure Learning
Intent: Learn from failures to prevent future occurrences.
class FailureLearning {
async learnFromFailure(failure: Failure) {
// Search for similar past failures
const similarFailures = await kb.search({
query: failure.errorSignature,
categories: ['debugging', 'failures']
});
// Analyze root cause
const rootCause = await this.analyzeRootCause(failure, similarFailures);
// Document anti-pattern
await kb.addLearning({
problem: failure.description,
solution: `ANTI-PATTERN: ${failure.approach}\n\nRoot Cause: ${rootCause}\n\nCorrect Approach: ${failure.resolution}`,
category: 'anti-patterns',
complexity: failure.complexity,
tags: ['failure', 'anti-pattern', ...failure.tags],
metadata: {
failure_mode: failure.mode,
impact: failure.impact,
prevention: this.generatePreventionStrategies(rootCause),
detection: this.generateDetectionStrategies(failure)
}
});
return rootCause;
}
}
Performance Optimization
Pattern 1: Intelligent Caching
Intent: Cache and reuse knowledge base queries intelligently.
class IntelligentCache {
private cache = new Map<string, CachedResult>();
private cacheStats = new Map<string, CacheStats>();
async query(params: QueryParams): Promise<QueryResult> {
const cacheKey = this.generateCacheKey(params);
// Check cache with intelligence
if (this.cache.has(cacheKey)) {
const cached = this.cache.get(cacheKey);
const stats = this.cacheStats.get(cacheKey);
// Determine if cache is still valid
if (this.isCacheValid(cached, stats, params)) {
stats.hits++;
return cached.result;
}
}
// Execute query
const result = await kb.search(params);
// Intelligent caching decision
if (this.shouldCache(result, params)) {
this.cache.set(cacheKey, {
result: result,
timestamp: Date.now(),
params: params
});
this.cacheStats.set(cacheKey, {
hits: 0,
createdAt: Date.now(),
relevanceDecay: this.calculateDecayRate(params)
});
}
return result;
}
private isCacheValid(cached: CachedResult, stats: CacheStats, params: QueryParams): boolean {
const age = Date.now() - cached.timestamp;
const decayedRelevance = 1.0 - (age / 1000 / 86400 * stats.relevanceDecay);
// Consider query specificity and cache hit rate
const cacheValue = decayedRelevance * (stats.hits / (stats.hits + 1));
return cacheValue > params.min_relevance;
}
}
Pattern 2: Batch Processing
Intent: Batch related queries for efficiency.
class BatchQueryProcessor {
private batchQueue: QueryBatch[] = [];
private batchTimeout: number = 100; // ms
async queueQuery(query: Query): Promise<QueryResult> {
return new Promise((resolve, reject) => {
this.batchQueue.push({
query,
resolve,
reject,
timestamp: Date.now()
});
if (this.batchQueue.length === 1) {
setTimeout(() => this.processBatch(), this.batchTimeout);
}
});
}
private async processBatch() {
const batch = [...this.batchQueue];
this.batchQueue = [];
// Group similar queries
const groups = this.groupSimilarQueries(batch);
// Execute grouped queries
const results = await Promise.all(
groups.map(group => this.executeGroupedQuery(group))
);
// Distribute results
this.distributeResults(batch, results);
}
}
Pattern 3: Predictive Prefetching
Intent: Prefetch likely next queries based on patterns.
class PredictivePrefetcher {
private queryPatterns = new Map<string, string[]>();
async queryWithPrefetch(query: Query): Promise<QueryResult> {
// Execute main query
const result = await kb.search(query);
// Predict next queries
const predictions = this.predictNextQueries(query, result);
// Prefetch in background
this.prefetchInBackground(predictions);
return result;
}
private predictNextQueries(query: Query, result: QueryResult): Query[] {
// Based on historical patterns
const historicalNext = this.queryPatterns.get(query.type) || [];
// Based on result content
const contentBased = this.analyzeResultsForNextQueries(result);
// Based on user's agent type
const agentBased = this.getAgentTypicalQueries(query.agentType);
return this.rankPredictions([
...historicalNext,
...contentBased,
...agentBased
]);
}
}
Anti-Patterns to Avoid
Anti-Pattern 1: Knowledge Base Flooding
Problem: Making too many similar queries without analyzing results.
// ❌ BAD: Flooding with variations
async function bad_flooding(error: string) {
const queries = [];
for (const word of error.split(' ')) {
queries.push(kb.search({ query: word }));
}
const results = await Promise.all(queries); // Too many queries!
}
// ✅ GOOD: Strategic querying
async function good_strategic(error: string) {
// Start with full error
let results = await kb.search({
query: error,
min_relevance: 0.8
});
// Only broaden if needed
if (results.results.length === 0) {
const keywords = extractKeywords(error);
results = await kb.search({
query: keywords.join(' '),
min_relevance: 0.7
});
}
return results;
}
Anti-Pattern 2: Ignoring Temporal Relevance
Problem: Using outdated solutions without considering recency.
// ❌ BAD: Ignoring time
async function bad_temporal(problem: string) {
const results = await kb.search({ query: problem });
return results.results[0]; // Might be years old!
}
// ✅ GOOD: Time-aware search
async function good_temporal(problem: string) {
// Try recent first
const recent = await kb.search({
query: problem,
time_window_days: 30
});
if (recent.results.length > 0) {
return recent.results[0];
}
// Fall back to older with caution
const older = await kb.search({ query: problem });
return {
solution: older.results[0],
warning: "Solution is older than 30 days, verify compatibility"
};
}
Anti-Pattern 3: Context Hoarding
Problem: Accumulating too much context without filtering.
// ❌ BAD: Hoarding everything
class BadContextHoarder {
private context: any[] = [];
async addContext(query: string) {
const results = await kb.search({ query });
this.context.push(...results.results); // Grows unbounded!
}
}
// ✅ GOOD: Intelligent context management
class GoodContextManager {
private context: PrioritizedContext[] = [];
private maxContextSize = 10;
async addContext(query: string, priority: number) {
const results = await kb.search({ query });
// Add with priority
const newContext = results.results.map(r => ({
...r,
priority: priority * r.relevance,
addedAt: Date.now()
}));
// Merge and maintain size limit
this.context = [...this.context, ...newContext]
.sort((a, b) => b.priority - a.priority)
.slice(0, this.maxContextSize);
}
}
Anti-Pattern 4: Learning Without Validation
Problem: Adding unverified solutions to knowledge base.
// ❌ BAD: Adding without validation
async function bad_learning(problem: string, solution: string) {
await kb.addLearning({
problem,
solution,
category: 'solution'
}); // No verification!
}
// ✅ GOOD: Validated learning
async function good_learning(problem: string, solution: string, validation: ValidationResult) {
if (!validation.success) {
console.warn("Solution not validated, not adding to KB");
return;
}
await kb.addLearning({
problem,
solution,
category: 'solution',
complexity: validation.complexity,
tags: [...validation.verifiedAspects],
metadata: {
validation_method: validation.method,
success_metrics: validation.metrics,
test_coverage: validation.coverage
}
});
}
Conclusion
These patterns represent battle-tested approaches for integrating the knowledge base into agent workflows. The key principles are:
- Context First: Always check what's been done before
- Progressive Refinement: Start broad, narrow strategically
- Collaborative Memory: Share and build on collective knowledge
- Continuous Learning: Document both successes and failures
- Performance Awareness: Optimize queries and caching
By following these patterns and avoiding the anti-patterns, agents can effectively leverage the full power of the 115,000+ lines of development history in the knowledge base.