| Scores ≠ probabilities | Always | Scenario scores are relative rankings (temperature-sharpened softmax), not calibrated probabilities. Present as "high/medium/low confidence" not as percentage likelihoods |
| Trajectory = evidence | Internal engine | Use "evidence suggests" / "development patterns indicate" framing |
| Adjacency is heuristic | Internal engine | The adjacency table reflects common patterns, not rules. Domain context overrides |
| Freshness check | Before synthesis | Stale data → stale forecasts. Verify recency via intel stats |
| Spurious correlations | Chains with support < 3 or low source diversity | Flag as lower confidence |
| Temporal artifacts | Chains where temporal_pattern = weekday_correlated or weekday_ratio > 0.7 | Likely a calendar cadence, not causal. weekday_ratio is always present for programmatic assessment. Discount unless you can identify a mechanism |
| Decay reveals staleness | decay_weighted_support ≪ support | Co-movement hasn't recurred recently (half-life = 14d) |
| Entropy = predictability | normalized_entropy > 0.8 | Target is bursty and less predictable; widen confidence window |
| CUSUM change points | Change point within last 7 days | History may not hold — always surface these prominently. Highest-priority signal |
| Signal quality | Scenario ranking | Scenarios rank by chain confidence × source diversity × trigger specificity, not just lift. Low-fanout triggers rank higher |
| Base rate noise | trigger_base_rate > 0.5 | Topic spikes most days — chains from it are less informative |
| Target base rate noise | target_base_rate > 0.8 | Target topic is omnipresent — predicting it will spike is trivially true. Pre-filtered when evidence is weak (no 'high' relevance) |
| Evidence relevance | evidence_relevance = low | Likely a classifier false positive (event tagged with 5+ topics). Weight scenario lower. Scenarios where ALL evidence is 'low' are pre-filtered out |
| Classifier over-tagging | High-volume topics (e.g. lang.typescript) | Topic classifier assigns these broadly — evidence titles may not be topically relevant even when marked high. Cross-check titles before citing. Scenarios with high target_base_rate (> 0.8) and no 'high'-relevance evidence are now pre-filtered. Volume inflation: over-tagged topics have inflated volume counts and chain support — discount both when evidence titles look off-topic |
| Co-movement ≠ causation | All chains and scenarios | Chains detect statistical co-occurrence (A spikes, then B spikes), not causal mechanisms. High lift means "more than random" but does not mean A causes B. Always frame as "associated with" or "tends to follow," never "causes" or "leads to." The weekday-ratio filter catches some calendar artifacts, but spurious correlation is an inherent limitation |
| Topic ≠ mechanism | Narrative construction from structural breaks | Enforced by step 5b in the external engine workflow. You MUST name the specific mechanism for each break in one sentence before constructing chains or scenarios. If the mechanism matches the "default" association (e.g., Iran = oil for a commodities break), explicitly search for at least one alternative mechanism. Use break-relative search windows (--since {days_ago + 4}d), not flat --since 7d. When --with-context is used, check break_titles for mechanism clues from around the break date — these surface events the regular titles (biased toward recent/high-score) may miss |
| Source bias | All forecasts | 128 sources skew toward developer communities (HN), vendor blogs (AWS/Azure/GCP), and financial news (Seeking Alpha, Yahoo Finance). Enterprise procurement signals, analyst reports behind paywalls (Gartner, Forrester, IDC), and non-English-language markets are underweighted. Treat coverage gaps as blind spots, not absence of activity |
| Attention ≠ fundamentals | Lifecycle phases, scenarios | "Accelerating" means more coverage and developer activity, not necessarily more revenue, better margins, or enterprise adoption. The system tracks technology momentum (where engineering attention is concentrating), not market fundamentals. Do not use lifecycle phases as investment or procurement signals without supplementary research |
| Accumulation freshness | Accumulation dynamics | Requires published_at in window. Backfill-only topics are excluded |
| HMM vs rule-based | Phase classification | HMM overrides rule-based when confidence is +0.15 higher. phase_probabilities only present when HMM was used |
| Transitive diversity | A→B→C chains | Per-prefix cap of 3 ensures diverse paths. If all top results share the same A→B prefix, lower-ranked cross-domain paths are more interesting |
| Transitive uncertainty | A→B→C chains | combined_lift is a product, min_support is the weakest link — uncertainty compounds. Use normalized_confidence (geometric mean of leg confidences, 0-1) for calibrated comparison |
| Cluster staleness | Internal engine | Low drift.ari_prev means cluster boundaries are shifting. Path-based analysis still valid |
| 120-day retention | All forecasts | System sees patterns within 120-day retention window with a 90d lifecycle timescale. Can detect quarterly trends and seasonal cycles within a single quarter, but cannot detect year-over-year patterns. Good at "what's happening now, what's about to happen, and how does the current quarter compare to the last." For longer-horizon questions, supplement with analyst reports and historical research |
| No fabrication | Always | Only use data returned by tools. Never invent scenarios or probabilities |
| No raw JSON | Output | Always synthesize through the output template |