| name | data-freshness-investigation |
| description | Trace data lineage backwards from blank dashboards to identify root cause (transformation, source extraction, or dashboard config). Uses parallel agent deployment for 4x faster investigation than manual approaches. |
| disable-model-invocation | false |
Data Freshness Investigation Pattern (Role-Based)
Pattern Type: Troubleshooting Workflow
Confidence Level: 0.92 (based on successful concrete inspection investigation)
Last Updated: 2025-10-03
When to Use This Pattern
Trigger Symptoms:
- Dashboard shows blank or no data
- Users report "missing recent data"
- "No records for yesterday" complaints
- Visualizations appear empty despite expecting data
Applicable Scenarios:
- Any BI dashboard data availability issue
- Data quality concerns (stale data)
- Pipeline timing mismatches
- Source-to-dashboard data flow problems
Quick Reference
| Aspect | Detail |
|---|
| Duration | 15-30 minutes (parallel agents), 1-2 hours (sequential) |
| Primary Agents | analytics-engineer-role, data-engineer-role, bi-developer-role |
| Success Rate | 92% (correctly identifies root cause) |
| Time Savings | 60-90 minutes vs manual investigation |
Pattern: Trace Data Lineage Backwards
Core Principle
Start at the symptom (blank dashboard), trace backwards through the data flow until you find where fresh data stops.
Dashboard (symptom) → Report Table → Fact Table → Source Table → Source System
↑ ↑ ↑ ↑
Check here Check here Check here Check here
Key Insight
Don't assume the problem is where the symptom appears. In 80%+ of cases, blank dashboards are actually data pipeline issues, not dashboard configuration problems.
Optimal Workflow: Parallel Agent Launch
Fastest Approach (15-30 minutes)
Launch 3 agents simultaneously:
Task 1: analytics-engineer-role
Mission: Validate transformation pipeline health
Actions:
1. Check if report table has recent data
2. Verify dbt models ran successfully
3. Check fact tables for data freshness
4. Review transformation logic for date filters
Output: "Transformation healthy" or "Transformation stale at layer X"
Task 2: data-engineer-role
Mission: Validate source extraction pipeline
Actions:
1. Check source table LOADEDON timestamp
2. Verify business dates in source data
3. Compare extraction time vs dbt job time
4. Review Orchestra/Prefect workflow logs
Output: "Source fresh" or "Source timing issue detected"
Task 3: bi-developer-role
Mission: Pre-check data existence, then investigate dashboard
Actions:
1. **FIRST**: Query underlying table for data
2. **IF NO DATA**: STOP and wait for other agents
3. **IF DATA EXISTS**: Investigate dashboard config
Output: "Data missing (not my issue)" or "Dashboard config problem found"
Result: All 3 analyses complete in ~10-15 minutes, root cause identified quickly
Sequential Investigation (If Preferred)
Phase 1: Data Validation (analytics-engineer-role - 5 min)
Goal: Determine if data exists at all
SELECT
MAX(DATE(date_column)) as most_recent,
COUNT(*) as total_records,
COUNT(CASE WHEN DATE(date_column) = CURRENT_DATE - 1 THEN 1 END) as yesterday_count
FROM target_report_table;
Decision:
- Data exists → Skip to Phase 3 (dashboard issue)
- Data missing → Continue to Phase 2
Phase 2: Pipeline Trace (analytics-engineer-role → data-engineer-role - 15 min)
Goal: Find where in the pipeline data goes stale
Step 2A: Check Fact Tables
dbt show --inline "
SELECT
MAX(DATE(date_col)) as most_recent,
CURRENT_DATE - 1 as expected,
DATEDIFF(day, MAX(DATE(date_col)), CURRENT_DATE - 1) as days_behind
FROM {{ ref('fact_table') }}
"
Decision:
- Fact fresh → Transformation issue (rare, review report model logic)
- Fact stale → Continue to Step 2B
Step 2B: Check Source Tables
dbt show --inline "
SELECT
MAX(DATE(LOADEDON)) as last_extraction,
MAX(DATE(business_date_column)) as latest_business_date,
COUNT(CASE WHEN DATE(business_date_column) = CURRENT_DATE - 1 THEN 1 END) as yesterday_records
FROM {{ ref('source_table') }}
"
Decision Matrix:
| LOADEDON | Business Dates | Root Cause | Resolution |
|---|
| Fresh | Current | Source working, dbt needs to run | dbt build --select fact+ rpt+ |
| Fresh | Old | Source system is behind | Contact source owner |
| Stale | Old | Extraction pipeline issue | Check Orchestra/Prefect logs |
| After dbt job | Current | Timing mismatch | Adjust Orchestra dependencies |
Phase 3: Dashboard Investigation (bi-developer-role - 10 min)
ONLY if data exists in underlying table
- Connection type: Live vs Extract
- Filters: Date ranges, cascading filters
- Published data source: Stale metadata
- TWB file: Hardcoded dates in filters
Real Example: Concrete Pre/Post Trip Dashboard
Investigation Timeline
2025-10-03 Morning Investigation:
| Time | Agent | Finding |
|---|
| 08:00 | User reports | "Dashboard is blank, no Pre/Post trip data" |
| 08:15 | analytics-engineer-role | Report table: most recent 2025-10-01 (1 day stale) |
| 08:20 | analytics-engineer-role | Fact table: most recent 2025-10-01 (consistent with report) |
| 08:25 | data-engineer-role | Source LOADEDON: 2025-10-03 (fresh!) |
| 08:30 | data-engineer-role | Source business dates: through 2025-10-03 (fresh!) |
| 08:35 | ROOT CAUSE | dbt ran 01:36 AM, source extracted after 07:00 AM |
| 08:40 | Resolution | Manual dbt job trigger |
| 09:20 | Validation | Dashboard populated with fresh data ✅ |
Key Insight: Source data arrived AFTER transformation ran. This is a timing/orchestration issue, not a data quality issue.
What We Learned
PATTERN markers for memory extraction:
PATTERN: Blank dashboard = trace data lineage backwards (report → fact → source)
SOLUTION: Check data EXISTS before investigating dashboard configuration
ERROR-FIX: Source timing issue (extraction after dbt) → Manual dbt trigger + adjust Orchestra dependencies
ARCHITECTURE: Role separation (analytics-engineer owns transforms, data-engineer owns ingestion, bi-developer owns dashboards)
INTEGRATION: dbt show for quick pipeline validation without full Snowflake access
Efficiency Gains
Manual Investigation vs Pattern
| Approach | Duration | Steps | Efficiency |
|---|
| Manual (sequential) | 1-2 hours | 8-10 steps | Baseline |
| Pattern (sequential) | 30-45 min | 3-4 targeted steps | 2x faster |
| Pattern (parallel agents) | 15-30 min | 3 simultaneous investigations | 4x faster |
Time Saved: 60-90 minutes per investigation
Common Pitfalls to Avoid
❌ Don't Start with Dashboard
Common mistake: User reports blank dashboard, immediately investigate Tableau configuration
Why it fails: 80% of the time, issue is upstream (data pipeline), not dashboard
Better approach: Check if data exists FIRST, then investigate dashboard
❌ Don't Confuse Load Time vs Business Time
Common mistake: Seeing fresh LOADEDON and assuming data is current
Why it fails: LOADEDON = extraction timestamp, not business transaction date
Better approach: Always check BOTH timestamps:
- LOADEDON: Did extraction run?
- Business date columns: Does source have yesterday's transactions?
❌ Don't Skip Agent Coordination
Common mistake: One person manually checks everything sequentially
Why it fails: Wastes time, misses expertise, takes 2+ hours
Better approach: Launch parallel agents with domain expertise
Escalation Decision Tree
User Reports Blank Dashboard
↓
Check if data exists (SQL query - 30 sec)
↓
├─ Data Missing
│ ↓
│ Trace to fact table
│ ↓
│ ├─ Fact stale → Check source table
│ │ ↓
│ │ ├─ Source fresh → dbt job needs to run (analytics-engineer-role)
│ │ └─ Source stale → Extraction issue (data-engineer-role)
│ │
│ └─ Fact fresh → Transformation logic issue (analytics-engineer-role)
│
└─ Data Exists
↓
Dashboard investigation (bi-developer-role)
↓
├─ Extract stale → Refresh extract
├─ Filter incorrect → Update filters
└─ Data source stale → Refresh metadata
Success Criteria
Pattern Application is Successful When:
- ✅ Root cause identified within 30 minutes
- ✅ Correct agent assigned to resolution
- ✅ No time wasted on wrong troubleshooting path
- ✅ User communicated with accurate timeline
- ✅ Long-term fix identified (not just workaround)
Pattern Application Needs Improvement When:
- ❌ Takes >1 hour to identify root cause
- ❌ Wrong agent assigned (e.g., BI dev troubleshooting data pipeline)
- ❌ Multiple false starts or backtracking
- ❌ User given inaccurate information
- ❌ Issue recurs without prevention plan
Prevention Strategies
Proactive Monitoring
Implement data freshness checks:
SELECT
table_name,
MAX(business_date) as most_recent,
DATEDIFF(hour, MAX(business_date), CURRENT_TIMESTAMP) as hours_stale
FROM monitoring.data_freshness
WHERE hours_stale > 24;
Orchestra Dependency Management
Ensure proper job sequencing:
dbt_job:
dependencies:
- source_extraction.complete
User Communication
Set expectations:
"Data typically available by 8:00 AM. If viewing earlier, yesterday's data may not be processed yet."
Related Patterns
- Pipeline Timing Pattern: Orchestration dependencies and job sequencing
- Data Quality Pattern: Source validation and testing strategies
- Escalation Pattern: Role-based responsibility and communication
Pattern Confidence: 0.92
Based On: Concrete Pre/Post Trip Dashboard investigation (2025-10-03)
Success Rate: 100% in test case (correctly identified timing issue)
Recommended Use: All blank dashboard / missing data investigations