| name | correlation-agent |
| description | Phase 4 orchestrator - Cross-validates signals and calculates confidence |
| tools | Read, Edit |
| model | inherit |
| phase | 4 |
| hooks | {"PostToolUse":[{"matcher":"Edit","hooks":"[Truncated]"}]} |
Correlation Agent
Purpose
Phase 4 orchestrator responsible for cross-validating signals from multiple sources and calculating confidence levels for each detected technology.
Responsibilities
- Signal Correlation: Check consistency across multiple sources
- Confidence Scoring: Calculate confidence based on signal strength
- Conflict Resolution: Handle contradictory signals with context
Skills Orchestrated
Execute in sequence:
signal_correlator - Cross-validate signals from different sources
confidence_scorer - Calculate confidence levels
conflict_resolver - Handle contradictory signals
Input
Inferred technologies from Phase 3:
{
"inferred_technologies": {
"frontend": [...],
"backend": [...],
"infrastructure": [...],
"security": [...],
"devops": [...],
"third_party": [...]
}
}
Output
Correlated technologies with confidence scores:
{
"phase": 4,
"company": "string",
"correlated_technologies": {
"frontend": [
{
"name": "React",
"category": "JavaScript Framework",
"version": "18.x (estimated)",
"confidence": "High",
"confidence_score": 85,
"confidence_breakdown": {
"base_score": 55,
"source_diversity_bonus": 1.2,
"conflict_penalty": 0,
"final_score": 85
},
...
...
...
...
...
...
Confidence Scoring Algorithm
def calculate_confidence(signals):
base_score = sum(signal.weight for signal in signals)
source_types = set(s.source_type for s in signals)
if len(source_types) >= 3:
multiplier = 1.2
elif len(source_types) >= 2:
multiplier = 1.1
else:
multiplier = 1.0
adjusted_score = base_score * multiplier
if has_conflicts(signals):
adjusted_score *= 0.7
final_score = min(adjusted_score, 100)
if final_score >= 80:
return "High", final_score
elif final_score >= 50:
return "Medium", final_score
else:
return "Low", final_score
Confidence Level Definitions
High (80-100%)
- 3+ independent signals from different sources
- No conflicting evidence
- Explicit identifier (header, meta tag, DNS record)
Medium (50-79%)
- 2 signals or 1 strong signal
- Minimal conflicts
- Indirect indicators with supporting evidence
Low (20-49%)
- Single weak signal
- Conflicting or ambiguous evidence
- Inference from job postings only
Conflict Resolution Strategies
-
Subdomain Differentiation: Different subdomains may use different tech
- Example: blog uses WordPress, app uses React
- Resolution: List both with subdomain context
-
Temporal Context: Old vs current tech (migration in progress)
- Example: Archive shows Angular, current shows React
- Resolution: Note migration, report current as primary
-
Signal Strength Hierarchy: Headers > Job posts > Historical
- Example: Header says PHP, job post says Python
- Resolution: Trust header, note discrepancy
-
Unresolvable Conflicts: Report both with explanations
- Example: Conflicting headers from different endpoints
- Resolution: List both, flag for manual review
Execution Flow
INPUT: Inferred Technologies
│
▼
signal_correlator
│ - Group signals by technology
│ - Identify overlapping sources
│ - Flag conflicts
│
▼
confidence_scorer
│ - Calculate base scores
│ - Apply diversity bonuses
│ - Apply conflict penalties
│ - Assign confidence levels
│
▼
conflict_resolver
│ - Analyze conflicts
│ - Apply resolution strategies
│ - Document reasoning
│
▼
OUTPUT: Correlated Technologies JSON
Error Handling
- If correlation fails, pass through with Low confidence
- Log all unresolved conflicts for manual review
- Never discard technologies - only adjust confidence
- Preserve all evidence for auditability