ADR-071: Agent-Task Matching Algorithm
Status
Accepted - January 13, 2026
Context
With 150+ CODITECT agents and 500+ atomic tasks, manual agent selection is:
- Time-consuming
- Inconsistent
- Unable to leverage historical performance data
Decision
Weighted Affinity Scoring
Calculate agent-task affinity using four weighted factors:
affinity_score = (
semantic_similarity * 0.4 +
historical_success_rate * 0.3 +
domain_expertise * 0.2 +
availability * 0.1
)
Factor Calculations
1. Semantic Similarity (40%)
Cosine similarity between task title embedding and agent capability embedding:
def semantic_similarity(task: AtomicTask, agent: str) -> float:
task_embedding = task.title_embedding # vector(1536)
agent_embedding = get_agent_capability_embedding(agent)
return cosine_similarity(task_embedding, agent_embedding)
2. Historical Success Rate (30%)
From agent_task_affinity table:
def historical_success(agent: str, task_type: str, domain: str) -> float:
affinity = get_affinity(agent, task_type, domain)
if affinity and affinity.total_executions >= 5:
return affinity.success_rate
return 0.5 # Default for insufficient data
3. Domain Expertise (20%)
Based on track-to-agent mapping:
DOMAIN_EXPERTS = {
'backend': ['senior-architect', 'backend-specialist'],
'frontend': ['frontend-react-typescript-expert'],
'devops': ['devops-engineer', 'cloud-architect'],
# ...
}
def domain_expertise(agent: str, domain: str) -> float:
experts = DOMAIN_EXPERTS.get(domain, [])
if agent in experts:
return 1.0 - (experts.index(agent) * 0.15)
return 0.3
4. Availability (10%)
Inverse of current workload:
def availability(agent: str) -> float:
active = count_active_tasks(agent)
return 1.0 / (1 + active * 0.2)
Selection Process
def select_agent(task: AtomicTask, top_k: int = 3) -> List[AgentRecommendation]:
candidates = get_candidate_agents(task.domain)
scored = []
for agent in candidates:
score = calculate_affinity_score(task, agent)
scored.append((agent, score))
return sorted(scored, key=lambda x: x[1], reverse=True)[:top_k]
Consequences
Positive
- Data-driven agent selection
- Continuous improvement via learning loop
- Transparent scoring breakdown
- Graceful degradation (defaults for new agents/tasks)
Negative
- Requires historical data to be effective
- Cold start problem for new agents
Mitigation
- Use domain expertise as primary factor for new agents
- Bootstrap with expert-defined agent capabilities
References
Local:
- ADR-069: Atomic Task Management System
- ADR-070: Task Dependency Graph
- ADR-072: Execution Tracking
- ADR-073: Learning Feedback Loop
External (coditect-core):
- ADR-068: Large Project Plan Token Economics
Decision Date: January 13, 2026 Implementation Priority: P1 (Core feature)