PRISM

Modules/Intel-News.md

Module: intel-news

Wave 1 spoke module. Surfaces the most time-sensitive sales intelligence: leadership changes, platform migration announcements, digital transformation commitments, and executive public statements. The urgency signal layer and is_sell_signal classification make it directly actionable for BDR/AE outreach timing.


Identity

Field Value
Name intel-news
Version 0.1.0
Layer Intelligence (Wave 1)
Wave 1 (runs concurrently with other spokes after intel-company completes)
Description News and executive media intelligence via Perplexity + Claude. Collects company news (90-day sweep), executive quotes, competitor news, and urgency signals. Classifies each article with is_sell_signal and urgency level.
LLM Tier Claude via Instructor (enrichment and classification)
Timeout 300 seconds
Max Retries 2 (module level)
Gate Module NO. Failure degrades news context but does not abort audit.

Dependencies

Module Reads Why
intel-company Account.executives Exec names for targeted media and quote search
intel-company Account.competitors Competitor domains for competitive news sweep

Both fields are read from the accounts table via SQLAlchemy. If the account is not found, the module falls back to basic domain-level search (no exec-specific or competitor queries).


Input Schema

Field Type Required Description
domain str yes Website domain to analyze, e.g. "dell.com"

Output Schema: NewsOutput

Top-Level Fields

Field Type Required Description
domain str yes Domain that was analyzed
prospect_articles list[NewsArticle] no News articles about the prospect from the last 90 days
prospect_exec_quotes list[ExecutiveQuote] no Quotes from the prospect's executives
urgency_signals list[UrgencySignal] no Time-sensitive signals extracted from news and quotes
sell_signal_count int no Count of articles with is_sell_signal=True
high_value_quote_count int no Count of exec quotes with is_high_value=True
competitor_news list[CompetitorNews] no News and quotes aggregated per competitor
competitive_comparison str no Summary comparing prospect and competitor news
news_summary str no Overall 2-4 sentence intelligence summary

Sub-Schema: NewsArticle

Field Type Required Description
headline str yes Article headline or title
source str yes Publication name, e.g. "Reuters", "TechCrunch"
date str yes Publication date as YYYY-MM-DD
url str or None no URL to the article
summary str no One to two sentence summary of the article content
category Literal no One of: leadership_change, product_launch, partnership, financial, acquisition, technology, search_related, digital_transformation, other
is_sell_signal bool no True if article mentions search, digital transformation, platform migration, or similar Algolia-relevant topics
sell_signal_reason str or None no Why this article is a sell signal. None if is_sell_signal is False.
urgency Literal no One of: high (act within days), medium (act within weeks), low (background context)
urgency_reason str or None no Why this article has the given urgency. None if urgency is low.
company_name str no Which company this article is about

Sub-Schema: ExecutiveQuote

Field Type Required Description
executive_name str yes Full name of the executive
executive_title str yes Job title of the executive
company_name str yes Company the executive works for
quote str yes Verbatim or near-verbatim quote. Must be actual quote, not paraphrase.
context str yes Where/when quote was said, e.g. "CES 2026 keynote" or "Q4 earnings call"
source_type Literal yes One of: interview, keynote, podcast, earnings_call, conference, press_release, social_media, article
source_url str or None no URL to the source of the quote
date str yes Date of the quote as YYYY-MM-DD
classification Literal no One of: digital_investment, technology_strategy, customer_experience, search_related, ai_related, competitive_positioning, growth_commitment, cost_optimization, other
is_high_value bool no True if exec is committing budget, stating priorities, mentioning pain points, or signaling tech investment
algolia_angle str or None no How this quote connects to an Algolia pitch. None if no clear connection.

Sub-Schema: UrgencySignal

Field Type Required Description
signal_type str yes Type of urgency signal, e.g. "leadership_change", "competitor_tech_move", "exec_public_commitment"
description str yes Detailed description of the urgency signal
urgency_level Literal yes One of: high, medium, low
source_headline str yes Headline of the article or quote that triggered this signal
date str yes Date of the signal as YYYY-MM-DD or approximate

Sub-Schema: CompetitorNews

Field Type Required Description
company_name str yes Competitor company name
domain str yes Competitor's primary website domain
articles list[NewsArticle] no Recent news articles about this competitor
exec_quotes list[ExecutiveQuote] no Executive quotes from this competitor's leadership

Collection Strategy

The module runs a two-phase pipeline: Perplexity for raw news retrieval, Claude for structured enrichment.

Phase 1: Perplexity API (sonar-pro model) — Raw Collection

Aspect Detail
Adapter PerplexityAdapter via NewsCollector
Model sonar-pro
Evidence Tier WEBSEARCH (Perplexity searches the web) / WEBFETCH (article content)
Retry 3 attempts with exponential backoff (timeout, rate limit, connection error)

Four targeted collection queries:

Query Purpose
Prospect company news (last 90 days) Leadership changes, product launches, acquisitions, financial events, tech investments
Exec media and interviews Quotes from prospect executives in keynotes, podcasts, earnings calls, press releases
Competitive news sweep Same categories for each competitor domain from intel-company
Search/digital transformation news Prospect-specific: any news about their search tech, digital experience, platform migration

Prompt strategy: Each query is targeted. The news query specifies exact date range (90 days), preferred categories, and requests structured JSON including date, source, URL, and summary per article. The exec quote query specifies verbatim-only quotes with full source attribution (context, date, source type).

Phase 2: Claude via Instructor — Enrichment and Classification

Aspect Detail
Adapter Claude claude-3-5-sonnet / claude-opus via Instructor
Evidence Tier WEBFETCH (re-classification of Perplexity-retrieved content)
Purpose Classify is_sell_signal, urgency, category, is_high_value, algolia_angle per article/quote
Output Fully typed Pydantic NewsOutput

Enrichment pipeline: 1. Raw Perplexity text -> structured article and quote extraction via Instructor 2. Per-article: is_sell_signal, sell_signal_reason, urgency, urgency_reason assigned 3. Per-quote: classification, is_high_value, algolia_angle assigned 4. UrgencySignal list synthesized from high/medium urgency items 5. sell_signal_count and high_value_quote_count computed 6. competitive_comparison and news_summary generated


Sell Signal Classification

A NewsArticle is marked is_sell_signal=True when it mentions any of: - Search technology, site search, discovery platform, personalization engine - Digital transformation initiative or "CX overhaul" - Platform migration (new ecommerce platform, headless migration, replatforming) - AI/ML investment in customer-facing products - Leadership change in relevant role (CTO, VP Engineering, VP Digital, VP Ecommerce, CPO) - Competitor switching search vendors (Golden Angle context)

These are the primary signals downstream synthesis modules use to determine outreach timing.


Urgency Classification

Level Definition Example Trigger
high Act within days Leadership change just announced, competitor just launched search product, exec publicly committed budget
medium Act within weeks Digital transformation roadmap announced, new CTO hired, platform migration partnership signed
low Background context General company news, earnings beat, product launch unrelated to search/DX

Validation Rules

# Rule Severity Threshold
1 At least 1 prospect article found required prospect_articles not empty
2 At least 1 article has a date required Any article with non-empty date
3 Articles have headlines required All articles have non-empty headline
4 news_summary is populated warning news_summary not empty string
5 At least 1 sell signal classified warning sell_signal_count >= 1
6 Competitor news populated if competitors were provided warning competitor_news not empty if competitor list non-empty

Required failures -> status "partial". Warning failures -> logged but passed.


Evidence Requirements

Field Minimum Tier Rationale
prospect_articles WEBFETCH Perplexity retrieves from indexed web sources
prospect_exec_quotes WEBFETCH Perplexity locates interviews, transcripts, press releases
urgency_signals WEBFETCH Derived from retrieved articles, not fabricated
competitor_news WEBFETCH Perplexity retrieval against competitor domains
is_sell_signal classification ESTIMATE Claude inference on retrieved content
urgency classification ESTIMATE Claude inference on retrieved content

Cost Profile

Metric Expected Value
LLM Calls 4-8 (Perplexity queries) + 2-4 (Claude enrichment calls via Instructor)
Estimated Cost ~$0.05-0.15 per audit (sonar-pro + Claude sonnet)
Expected Duration 60-120 seconds
External API Calls 4+ (Perplexity multi-query)

Retry Architecture (Two Layers)

Layer 1: Collector Retries (network errors)

Trigger Retry Backoff
Timeout 3 attempts Exponential (2^attempt seconds)
Rate limit (429) 3 attempts Exponential
Connection error 3 attempts Exponential
Other HTTP error No retry Fail immediately

Layer 2: Module Retries (data quality)

Trigger Retry Backoff
Empty Perplexity response 2 attempts 5 seconds fixed
Instructor parse failure 2 attempts 5 seconds fixed

If all retries exhausted: return ModuleExecutorResult with status="partial" (not "failed" — partial news is non-blocking).


Persistence

intel-news writes to module_executions table only (not the accounts table). Downstream synthesis modules read module_executions.output JSONB directly.

Key fields for synthesis: - prospect_articles with is_sell_signal and urgency flags - urgency_signals list - sell_signal_count (used by audit scoring) - prospect_exec_quotes with is_high_value and algolia_angle


Runtime Notes

SaaS Runtime (Temporal/Python)

  • Module: prism_platform/v2/modules/intel_news/module.py
  • Collector: prism_platform/v2/modules/intel_news/collector.py
  • Enricher: prism_platform/v2/modules/intel_news/enricher.py (Claude via Instructor)
  • Validator: prism_platform/v2/modules/intel_news/validator.py
  • Schemas: prism_platform/v2/modules/intel_news/schemas.py
  • Persistence: module_executions table only

Skill Runtime (Claude Code)

  • Skill file: ~/.claude/skills/algolia-intel-news/SKILL.md
  • Reads from: 01-company-context.json (for exec names and competitor domains)
  • Writes to: 09c-news-signals.md, 09c-news-signals.json
  • MCP tools used: WebSearch (multi-query), WebFetch (article verification)

Evolution: v1 → v2

v1 Architecture (Current)

Aspect v1 Design
Collection Perplexity sonar-pro via 4 targeted queries
Enrichment Claude via Instructor — classification pass on raw Perplexity output
Context source Account.executives and Account.competitors JSONB columns (from intel-company)
Sell signal Claude inference on article text
Urgency Claude inference on article text
Exec quotes Perplexity-retrieved, Claude-structured
Competitor news Per-domain Perplexity query

v2 Architecture (Planned — Playbook-Based Agent)

In v2, intel-news becomes a playbook-driven agent. The config object holds a news_playbook that instructs Perplexity with precise sourcing requirements:

Aspect v2 Design
Collection Perplexity with explicit source constraints in system prompt
Source requirements Google News, Reuters, Bloomberg, TechCrunch, VentureBeat, company newsroom
Citation requirements Every article must include URL + date. No date = article rejected.
Exec quote sources Earnings call transcripts (Motley Fool, Seeking Alpha), conference talks (YouTube), podcast appearances
Sell signal Playbook defines exact trigger phrases — not left to Claude inference
Urgency Playbook defines urgency ladder with specific signal types and time windows
Competitive context Cross-referenced against intel-company competitor list; playbook specifies diff logic
Schema Same Pydantic models (backward compatible)
Agent memory Can carry prior-run sell signals as context for trend detection

The playbook approach eliminates prompt drift: sell signal and urgency classification logic is documented in config, not embedded in ad-hoc prompts.


Aspect Simple News Search PRISM intel-news
Coverage One query, one page 4+ targeted queries: company, execs, competitors, search-specific
Exec specificity None Exec names from intel-company drive targeted media searches
Signal classification Manual Every article: is_sell_signal + urgency + category assigned automatically
Exec quotes Not captured Verbatim quotes with source, context, is_high_value, algolia_angle
Competitive view None Competitor news collected per domain, compared in competitive_comparison
Urgency synthesis None UrgencySignal list with urgency_level, description, date for outreach scheduling
Downstream use Text blob Typed fields: sell_signal_count feeds audit scoring; urgency_signals feed synthesis
Source provenance None Every article tracked to Perplexity retrieval with evidence tier

Changelog

Date Change Reason
2026-03-30 Initial implementation Session 1: backend phase 1
2026-04-14 Module spec written to vault Knowledge extraction — module catalog completion

  • Module-Catalog — all 20 modules overview
  • Intel-Company — foundation module this depends on
  • Intel-Hiring — sibling spoke module
  • Module-Spec-Template — the template this spec follows
  • Evidence-Tier-Spec — evidence tier system