Phase 3: Data Synthesis & Cross-Reference
Added the Synthesizer module to cross-reference data across all extractors, detect conflicts, identify data gaps, and generate a unified view of company metrics with confidence scores.
Changelog - 2025-11-26 (#7)
Phase 3: Data Synthesis & Cross-Reference
Overview
Added the Synthesizer module to cross-reference data across all extractors, detect conflicts, identify data gaps, and generate a unified view of company metrics with confidence scores.
New Feature: Dataroom Synthesizer
Purpose
Cross-reference extracted data to identify inconsistencies, missing information, and build a unified, confidence-scored view of company metrics.
Implementation
Created src/agents/dataroom/synthesizer.py (~450 lines):
def synthesize_dataroom(analysis: DataroomAnalysis) -> Dict[str, Any]:
"""Main entry point for dataroom synthesis."""
def detect_conflicts(analysis: DataroomAnalysis) -> List[DataConflict]:
"""Detect conflicts between data extracted from different sources."""
def identify_data_gaps(analysis: DataroomAnalysis) -> List[Dict[str, Any]]:
"""Identify missing critical information for investment analysis."""
def cross_reference_data(analysis: DataroomAnalysis) -> Dict[str, Any]:
"""Build cross-referenced unified view of company data."""
def generate_synthesis_report(...) -> str:
"""Generate a markdown synthesis report."""Conflict Detection
Checks for inconsistencies between data sources:
| Conflict Type | Sources Compared | Threshold |
| ARR Mismatch | Financial vs Traction | >10% difference |
| Headcount Mismatch | Financial vs Team | >5 person difference |
| Customer Count | Total vs Named | Count mismatch |
| Ownership Sum | Cap Table | Not ~100% |
| Team Classification | Founders vs Leadership | Duplicate names |
Hydden Results
ARR Conflict (High): $3M (pitch deck) vs $58M (financial projections) - 94.8% diff
Customer Count (Low): 3 reported vs 4 named
Data Gap Identification
Identifies missing critical data for investment memos:
Critical (High Priority)
ARR/Revenue
Monthly Burn Rate
Runway (months)
Cap Table / Ownership
Customer Count
Current ARR
Founder Backgrounds
Important (Medium Priority)
Gross Margin
Option Pool Size
Customer Retention Rate
Competitive Landscape
Key Differentiators
Hydden Results
Critical Gaps: Burn rate, Runway
Medium Gaps: Gross margin, Retention rate
Cross-Reference Engine
Builds unified metrics with confidence scores:
{
"company_metrics": {
"arr": 57953000,
"headcount": 17,
"customer_count": 3,
"founder_ownership_pct": 54.8,
"competitor_count": 8
},
"confidence_scores": {
"arr": "high",
"headcount": "high",
"customer_count": "high",
"founder_ownership_pct": "high",
"competitor_count": "medium"
},
"data_sources": {
"arr": ["Financial Model"],
"headcount": ["Team Document"],
...
}
}Confidence Levels:
🟢 High: Primary source available (financial model, cap table)
🟡 Medium: Secondary source only (pitch deck, battlecards)
🔴 Low/None: No reliable source
Output Structure Update
The dataroom analyzer now outputs 7 numbered artifact files:
output/Company-v0.0.1/
├── 0-dataroom-inventory.json/md # Document inventory
├── 1-competitive-analysis.json/md # Competitive landscape
├── 2-cap-table.json/md # Ownership structure
├── 3-financial-analysis.json/md # Financial projections
├── 4-traction-analysis.json/md # Customers & metrics
├── 5-team-analysis.json/md # Team profiles
└── 6-synthesis-report.json/md # Cross-reference & gapsSynthesis Report Format
The markdown report includes:
Executive Summary
Unified metrics table with confidence indicators
Data quality summary (gap/conflict counts)
Data Conflicts
Each conflict with sources, values, and resolution
Severity indicators (🔴 high, 🟡 medium, 🟢 low)
Data Gaps
Grouped by priority (high, medium, low)
Recommendations for filling gaps
Cross-Reference Insights
Financial & traction alignment check
Headcount consistency check
Cap table completeness check
Integration Updates
analyze_dataroom() Updated
Now includes Phase 3 synthesis step:
Scan documents
Classify documents
Run extractors
Run synthesis (NEW)
Save artifacts
save_dataroom_analysis_artifacts() Updated
Added
synthesis_resultsparameterSaves
6-synthesis-report.jsonwith structured dataSaves
6-synthesis-report.mdwith human-readable report
Files Changed Summary
New Files (1)
| File | Size | Purpose |
src/agents/dataroom/synthesizer.py | ~450 lines | Cross-reference, conflicts, gaps |
Modified Files (1)
| File | Changes | Purpose |
src/agents/dataroom/analyzer.py | +30 lines | Integration with synthesizer |
Phase 3 Complete
All Synthesis Features Done
Conflict detection (ARR, headcount, customers, ownership, team)
Data gap identification (critical + medium priority)
Cross-reference engine (unified metrics + confidence)
Synthesis report generation (markdown + JSON)
Full Hydden Test Results
Complete analysis in 281.0 seconds:
| Artifact | Key Findings |
| Inventory | 20 documents classified |
| Competitive | 8 competitors |
| Cap Table | 54.8% founder ownership |
| Financial | $60K → $62.6M ARR projections |
| Traction | $3M ARR, 3 customers |
| Team | 2 founders, 4 leaders, 17 FTE |
| Synthesis | 2 conflicts, 4 gaps, 5 unified metrics |
Usage
# Activate virtual environment
source .venv/bin/activate
# Run dataroom analyzer (now includes synthesis)
python -m src.agents.dataroom.analyzer "data/Secure-Inputs/Hydden Dataroom" "Hydden"
# Output includes:
# 🔄 Synthesizing dataroom data...
# Checking for data conflicts...
# Found 2 conflicts
# Identifying data gaps...
# Found 4 gaps (2 critical)
# Cross-referencing data sources...
# Unified 5 metrics
# Generating synthesis report...Next Steps: Phase 4 - Memo Integration
Generate memo section drafts from extracted data
Map extractor outputs to memo template sections
Integrate with main investment memo orchestrator
Auto-populate sections with dataroom findings
Contributors
Implementation by Claude Code (Anthropic) with user guidance.