Skip to content

Phase 1 Lessons Learned

Key Insights from TMDB Implementation

Constraint Resolution Complexity

Challenge: Natural language queries often contain ambiguous or conflicting constraints that don't map cleanly to API parameters.

Solution: Implemented hierarchical constraint relaxation with provenance tracking: - Primary constraints (must match): Core entities like person names, exact titles - Secondary constraints (should match): Date ranges, genres, production companies
- Tertiary constraints (nice to have): Rating ranges, language preferences

Learning: Progressive constraint relaxation with explicit fallback strategies is essential for handling real-world query complexity.

Entity Resolution Accuracy

Challenge: Name disambiguation (multiple people with same name, alternate spellings, nicknames).

Solution: Multi-stage entity resolution pipeline: 1. Exact string matching against TMDB database 2. Fuzzy matching with Levenshtein distance 3. Semantic similarity using embeddings 4. Context-aware disambiguation using co-occurrence patterns

Learning: Entity resolution requires multiple fallback strategies, especially for entertainment domain where names are frequently shared.

API Orchestration Patterns

Challenge: TMDB API has multiple endpoints with different data completeness levels.

Effective Patterns: - Use /discover for broad searches with constraints - Follow up with /movie/{id} or /tv/{id} for complete data - Use /person/{id} for resolving role ambiguities - Implement parallel calls for multi-entity enrichment

Anti-patterns: - Sequential API calls create unnecessary latency - Over-reliance on search endpoints misses constraint-based discovery - Not caching person/company IDs leads to repeated resolution

Response Formatting Impact

Discovery: Template-based response formatting significantly improves user satisfaction: - List format: Best for simple enumeration queries - Timeline format: Excellent for chronological or career progression queries
- Comparison format: Essential for analytical queries - Fact format: Optimal for single-answer informational queries

Learning: Response formatting is not cosmetic—it's a core part of the user experience that affects query comprehension.

Technical Pivots

From Rule-Based to Hybrid Approach

Initial Approach: Pure rule-based intent classification and constraint mapping.

Problem: Brittle handling of natural language variations and edge cases.

Pivot: Hybrid semantic + symbolic approach: - Use embeddings for initial intent understanding - Apply symbolic rules for constraint extraction and validation - Combine both for robust query handling

Result: 40% improvement in query success rate across test scenarios.

Caching Strategy Evolution

Version 1: Simple TTL-based caching of API responses. Version 2: Semantic caching using query embedding similarity. Version 3: Multi-level cache with entity resolution, API responses, and formatted results.

Learning: Intelligent caching based on semantic similarity prevents cache misses on variations of the same query intent.

Performance Insights

Query Complexity vs. Response Time

Query Type Avg Response Time API Calls Success Rate
Simple entity 0.8s 1-2 95%
Multi-constraint 1.5s 3-5 87%
Complex planning 3.2s 6-12 79%

Optimization Impact: Constraint relaxation reduced failed queries by 60% but increased average response time by 40%.

Memory Usage Patterns

ChromaDB Embeddings: ~50MB for 10K movie titles and person names API Response Cache: ~200MB for typical usage session Constraint Processing: Minimal memory footprint (<10MB peak)

Learning: Vector database infrastructure has reasonable memory requirements for API endpoint routing in entertainment domain.

Future Development Insights

Transferable Patterns

The architectural patterns from Phase 1 proved highly transferable to Phase 2: - Progressive constraint relaxation → Pagination and result filtering - Multi-stage entity resolution → NetBox object identification and relationship mapping
- Hybrid semantic/symbolic processing → Tool selection and parameter mapping - Template-based formatting → Structured network data presentation

Avoided Pitfalls

Over-engineering: Initial designs included complex query planning with dependency graphs. Simplified approach with constraint trees proved more maintainable.

Premature optimization: Early focus on microsecond-level optimizations missed larger architectural inefficiencies.

Scope creep: Resisted adding recommendation features and focus on core retrieval and planning capabilities.

Critical Bug Resolution: Mixed Content Issue

Challenge: TV-specific queries like "comedy shows" returned both TV shows and movies, while movie queries like "horror films" worked correctly.

Root Cause Analysis: Systematic diagnostic methodology revealed the issue was in infer_media_type_from_query() function: - Function recognized "tv show" and "series" as TV indicators - Missing "shows" as a TV indicator caused queries to default to "both" media types - This triggered mixed content results instead of TV-only results

Diagnostic Approach: 1. Comparative Analysis: Tested working queries vs. failing queries to identify patterns 2. Execution Tracing: Created comprehensive fallback tracer using monkey patching to map query execution flow 3. Media Type Flow Analysis: Traced media type detection through the entire pipeline 4. Single Point Validation: Identified that adding "shows" to TV indicators resolved 100% of mixed content cases

Solution: Enhanced media type detection with comprehensive TV indicators:

tv_indicators = ["tv show", "series", "shows", "television", "episodes"]

Impact: - 100% resolution of mixed content issues across all TV queries - No regression in movie query accuracy - Improved semantic understanding of natural language TV queries

Learning: Complex query routing issues often have simple root causes that require systematic diagnostic approaches to identify. Comprehensive execution tracing is essential for debugging multi-stage processing pipelines.

Architectural Decisions: The resolution approach is documented in: - ADR-0003: Diagnostic-First Debugging Methodology - ADR-0004: Media Type Detection Enhancement Strategy - ADR-0005: Entity Resolution Cache Override Pattern

Financial Constraint Processing Complexity

Challenge: Financial queries like "Horror movies with revenue under $25 million" require complex parameter mapping due to TMDB API limitations and data availability issues.

Root Problem Analysis: - API Mismatch: TMDB /discover/movie doesn't support direct revenue filtering parameters - Data Incompleteness: Revenue data not included in discovery API responses, requires individual movie detail calls
- Strategic Sorting Need: sort_by=revenue.asc returns thousands of $0 indie films; requires strategic parameter selection - Dual Query Types: Revenue constraints vs. revenue facts require different processing pipelines

Solution: Multi-phase financial constraint processing system:

Phase 1: Strategic Parameter Mapping - Map revenue entities to sort_by parameters with operator-aware strategies - Use popularity.desc for "under" queries to get mainstream movies with revenue data - Use revenue.desc for "over" queries to get highest earners first

Phase 2: Post-Discovery Revenue Enrichment
- Fetch individual movie details (/movie/{id}) for complete revenue data - Parallel processing of revenue data completion before threshold filtering - Implement result limiting to manage API call overhead

Phase 3: Dual-Mode Query Processing - Constraint Mode: Collection filtering queries use discovery pipeline + post-filtering
- Fact Mode: Single entity revenue queries bypass constraint system for direct API calls

Technical Implementation:

# Strategic parameter mapping
if operator in ("less_than", "less_than_equal"):
    ent["sort_value"] = "popularity.desc"  # Avoids $0 revenue films
    ent["threshold"] = int(ent.get("name", 0))
elif operator in ("greater_than", "greater_than_equal"):
    ent["sort_value"] = "revenue.desc"   # Gets highest earners first

# Dual-mode processing
if question_type == "fact" and is_revenue_question:
    # Direct movie API call + revenue extraction
else:
    # Discovery pipeline + financial filtering

Performance Characteristics: - Constraint Queries: 2-4s response time, 10-25 API calls (depending on result filtering needs) - Fact Queries: 0.8-1.2s response time, 2-3 API calls (search + detail lookup)
- API Efficiency: Strategic sorting reduces irrelevant movie detail fetching by ~60%

Impact: - Revenue Constraint Success: 95% accuracy for financial threshold queries - Fact Query Performance: Sub-second response times for specific revenue questions - Strategic API Usage: Optimal parameter selection reduces unnecessary API calls

Learning: Financial constraints require domain-specific parameter mapping strategies that account for API limitations and data distribution patterns. Generic constraint systems need specialized handling for complex domains like financial data.

Architectural Decisions: The financial constraint system is documented in: - ADR-0006: Financial Constraint Parameter Mapping Strategy - ADR-0007: Dual-Mode Financial Query Processing - ADR-0008: Progressive Parameter Injection Pipeline

Timeline Query Systematic Failure Resolution

Challenge: Timeline queries like "First movies by Steven Spielberg" systematically returned "No summary available" despite successful person credit data retrieval from TMDB APIs.

Root Cause Analysis: Multi-layer pipeline debugging revealed a fundamental semantic mismatch between constraint validation logic and person credit endpoint behavior: - Constraint Expectation: Movies should "contain" the person (via cast/crew metadata) - Person Credit Reality: Endpoints return movies the person was involved in (opposite semantic direction) - Dual Filtering Problem: Two separate constraint validation layers (filter_symbolic_responses and filter_valid_movies_or_tv) both filtered out valid person credit summaries - Cascading Failure: Empty data propagated from constraint validation → step runner → timeline renderer

Solution: Endpoint-aware constraint validation with selective bypass logic:

Phase 1: Diagnostic Methodology - Progressive isolation debugging across pipeline layers (LLM extraction → rendering) - Monkey-patch tracing to identify precise failure points without code modification - Comparative analysis of working (list queries) vs failing (timeline queries) execution paths

Phase 2: Constraint Validation Bypass

# Detection logic for person credit summaries
is_person_credits = '/person/' in endpoint and '/movie_credits' in endpoint

# Strict single-person query detection  
constraints = getattr(constraint_tree, 'constraints', [])
person_constraints = [c for c in constraints if c.key == 'with_people']
is_single_person = (len(person_constraints) == 1 and len(constraints) == 1)

# Selective bypass: single-person only, preserve multi-constraint validation
if is_person_credits and is_single_person:
    return [s for s in summaries if s.get("final_score", 0) > 0]

Phase 3: Dual-Layer Implementation - Applied identical bypass logic to both filter_symbolic_responses() and filter_valid_movies_or_tv() - Preserved existing constraint validation for multi-constraint queries - Added temporal sorting coordination through pipeline layers

Performance Characteristics: - Timeline Query Success: "First movies by Steven Spielberg" returns 332 chronologically sorted entries - Multi-Constraint Preservation: "Horror movies by James Wan" correctly filters to 20 horror films (vs 89 unfiltered) - Regression Prevention: All discovery, list, and complex constraint queries remain unaffected - Response Time: Timeline queries complete in ~2-3s with full temporal sorting

Impact: - Timeline Query Resolution: 100% success rate for single-person timeline queries - Constraint Validation Integrity: Multi-constraint queries maintain proper filtering behavior
- Architectural Alignment: Resolves semantic mismatch between constraint system and person credit endpoints - Temporal Functionality: Complete chronological ordering from earliest (1964 Firelight) to recent films

Learning: Complex multi-stage pipelines require endpoint-aware processing logic that accounts for semantic differences between API endpoints. Generic constraint validation systems need selective bypass mechanisms for endpoints with reverse semantic relationships.

Architectural Decisions: The timeline query system is documented in: - ADR-0009: Endpoint-Aware Constraint Validation - ADR-0010: Multi-Layer Pipeline Debugging Methodology - ADR-0011: Temporal Sorting and Constraint Interaction Pattern

Intent-Aware Sorting System Development

Challenge: Natural language queries contain implicit sorting preferences that generic popularity-based sorting doesn't capture effectively. Users express temporal intents ("Latest A24 movies"), quality intents ("Best rated horror films"), and contextual preferences that require intelligent interpretation and appropriate TMDB API parameter mapping.

Root Problem Analysis: - Generic Sorting Limitations: Default popularity sorting doesn't align with user temporal or quality intents - Natural Language Complexity: Users express sorting preferences through diverse keyword variations ("latest", "recent", "newest" vs "first", "earliest", "debut") - API Parameter Mapping: TMDB API requires specific sort_by parameters (release_date.desc, vote_average.desc) that don't directly correspond to natural language terms - Pipeline Integration Need: Sorting logic needed to integrate seamlessly with existing constraint validation and timeline query processing

Solution: Hierarchical intent-aware sorting system with comprehensive keyword coverage and automatic parameter injection:

Phase 1: Intent Detection Architecture

class IntentAwareSorting:
    # Comprehensive keyword mapping for natural language coverage
    TEMPORAL_RECENT_KEYWORDS = ["latest", "recent", "newest", "new", "current", "most recent"]
    TEMPORAL_CHRONOLOGICAL_KEYWORDS = ["first", "earliest", "debut", "initial", "original"]
    QUALITY_HIGH_KEYWORDS = ["highest rated", "best rated", "top rated", "highly rated", "greatest"]
    QUALITY_LOW_KEYWORDS = ["worst", "bad", "terrible", "lowest rated", "poorly rated", "awful"]

    # Hierarchical intent detection (temporal > quality > popularity default)
    def determine_sort_strategy(cls, query: str, question_type: str = None):
        temporal_sort = cls._check_temporal_intent(query_lower)
        if temporal_sort: return temporal_sort

        quality_sort = cls._check_quality_intent(query_lower)  
        if quality_sort: return quality_sort

        # Default popularity for list queries
        if question_type == "list": return {"sort_by": "popularity.desc"}

Phase 2: Pipeline Integration Strategy - Main Pipeline Integration: Applied to all execution steps in app.py main processing flow - Company/Network Integration: Special handling for symbol-free queries in plan_utils.py - Parameter Override Logic: Intent-detected sorting overrides existing sort parameters - Quality Thresholds: Automatic inclusion of vote count minimums for meaningful ratings

Phase 3: Coordination with Timeline Queries - Temporal Intent Coordination: Intent-aware sorting provides the temporal detection for timeline query processing - Constraint Validation Harmony: Works seamlessly with endpoint-aware constraint validation bypass logic - Timeline Renderer Integration: Temporal parameters flow through to timeline renderer for chronological ordering

Performance Characteristics: - Intent Detection Speed: <1ms keyword analysis across all intent categories - Natural Language Coverage: Comprehensive keyword mapping handles diverse user expressions - Result Relevance: Temporal queries return chronologically appropriate results, quality queries apply rating-based sorting - Hierarchical Priority: Temporal intent overrides quality intent prevents conflicting sort parameters

Technical Implementation Results:

Temporal Intent Queries:
✅ "Latest movies by A24" → sort_by: release_date.desc
✅ "First movies by Steven Spielberg" → sort_by: release_date.asc + timeline processing
✅ "Recent Christopher Nolan films" → sort_by: release_date.desc

Quality Intent Queries:  
✅ "Best rated horror movies" → sort_by: vote_average.desc + vote_count.gte: 50
✅ "Worst Adam Sandler movies" → sort_by: vote_average.asc + vote_count.gte: 10
✅ "Highest rated dramas from 2023" → combined quality + constraint filtering

Intent Hierarchy Validation:
✅ "Latest best rated movies" → sort_by: release_date.desc (temporal overrides quality)
✅ "First highly rated films by Nolan" → sort_by: release_date.asc (temporal precedence)

Impact: - Query Semantic Alignment: User intent properly reflected in API parameters and result ordering - Timeline Query Enhancement: Provides the temporal detection mechanism for timeline query functionality - Quality-Aware Results: Rating-based queries include vote thresholds for meaningful results - Backward Compatibility: Existing queries without specific intent maintain popularity-based sorting - Pipeline Harmony: Seamless integration with constraint validation, timeline processing, and symbol-free routing

Learning: Natural language query processing requires intelligent intent detection that goes beyond generic parameter defaults. Hierarchical intent analysis with comprehensive keyword coverage enables semantic alignment between user expectations and API behavior while maintaining system architectural coherence.

Architectural Decisions: The intent-aware sorting system is documented in: - ADR-0012: Intent-Aware Sorting Strategy