Investment Signals
Conviction API · multi-horizon · agent subscriptions
Data Insights
Sector briefings · PE diligence · constraint maps
Expert Matching
Constraint → expert → execution → transaction fee
Consumer (Civy)
Retail audience · TikTok/Instagram · simplified signals
Agent API
Autonomous signal consumers · no human required
Pipeline operational (dry-run mode). Full end-to-end flow working: report generation → message generation (Ollama) → email stub → response parser. Live email send requires SendGrid key. LLM quality improves with a paid API key (Anthropic/OpenAI).
Pipeline Overview
Step 1
Target PE Firm
PE firm or M&A advisor added to targets table with industry focus and AUM.
targeting/service.py
Step 2
Select Companies
Portfolio or target companies sequenced by status (pending → sequenced).
targeting/service.py
Step 3
Genome Report
Full fingerprint + judgment pipeline. Extracts lead implication, time horizon, severity.
reporting/service.py
Step 4
Generate Message
LLM generates insight-led email grounded in report data. 6 sentences max.
outreach/service.py
Step 5
Send Email
Dry-run by default. Live send via SendGrid guarded by GENOME_EMAIL_LIVE=1.
outreach/sender.py
Step 6
Parse Response
Inbound replies classified by LLM: interested / not_now / unsubscribe / referral.
outreach/response_parser.py
Components — What's Built
Targeting Service Done
commercial/targeting/service.py
- load_targets() — list PE firms by status
- add_target() — add firm with industry focus + AUM
- enrich_target() — attach portfolio companies
- select_companies() — pick pending companies to sequence
Reporting Service Done
commercial/reporting/service.py
- generate_report() — full fingerprint + judgment, no DB
- save_report() — persist to genome_reports table
- _extract_lead() — pulls best insight hook from judgment
- Lead implication, time horizon, severity extracted
Outreach Service Done
commercial/outreach/service.py
- generate_message() — LLM-generated email from report
- save_message() — persist to outreach_messages
- mark_sent() — update status + sent_at timestamp
- LLM: Ollama llama3.2:3b (local free fallback)
Email Sender Done
commercial/outreach/sender.py
- send_email() — dry-run by default
- Returns {"status": "dry_run"} unless GENOME_EMAIL_LIVE=1
- SendGrid integration stubbed, ready to wire
- from_email defaults to GENOME_FROM_EMAIL env var
Response Parser Done
commercial/outreach/response_parser.py
- parse_response() — LLM classifies inbound reply
- Classifications: interested|not_now|unsubscribe|referral|no_signal
- signal_strength 0–1, sentiment, next_action
- Persists to outreach_responses, marks message as replied
Orchestrator Done
commercial/orchestrator/engine.py + cli.py
- run_single() — full pipeline for one company
- run_cycle() — batch mode, respects max_daily_sends
- update_strategy() — adjusts strategy_state from metrics
- CLI: run / single / report / targets list+add
CLI Reference
python -m commercial.orchestrator.cli single --company "Carrier Global" --industry hvac --no-persist
python -m commercial.orchestrator.cli single --company "Parker Hannifin" --industry heavy_equipment --target "KKR" --contact "John" --email john@kkr.com
python -m commercial.orchestrator.cli report --company "Caterpillar" --industry heavy_equipment --full
python -m commercial.orchestrator.cli run --max 5
python -m commercial.orchestrator.cli run --max 5 --live
python -m commercial.orchestrator.cli targets add --name "KKR" --type pe_firm --aum 500 --industries "industrial,manufacturing"
python -m commercial.orchestrator.cli targets list
Message Generation Guardrails
All outreach messages are generated with hard constraints built into the system prompt. The goal is credibility over volume — a peer perspective, not a vendor pitch.
System Prompt Constraints
Allowed
- Specific observable patterns from the report
- Archetype and trajectory as the hook
- Low-friction ask ("happy to send a snapshot")
- Direct, peer-to-peer tone
- 6 sentences maximum in the body
Disallowed
- Claims not grounded in report data
- Promises of outcomes or ROI
- Invented data or extrapolation
- Bullet points (prose only)
- Exclamation marks / ALL CAPS in subject
Current Blockers
⚠
LLM API key — all paid APIs at quota
Anthropic key in .env returns 401 (may be rotated). Both OpenAI keys out of quota. Gemini free tier exhausted. Currently using Ollama llama3.2:3b locally — functional but lower quality output.
⚠
Email sender not wired (SendGrid)
sender.py has SendGrid integration stubbed and commented. Needs SENDGRID_API_KEY + GENOME_FROM_EMAIL env vars + GENOME_EMAIL_LIVE=1 to activate. All sends are dry-run until set.
⚠
No targets seeded — PE firm list is empty
targets table exists but has no rows. Run: python -m commercial.orchestrator.cli targets add --name "KKR" --type pe_firm --aum 500
Build Plan
Phase 1 — Complete
Pipeline Foundation
- Done Commercial schema (004)
- Done Targeting service
- Done Reporting service
- Done Outreach service (Ollama)
- Done Response parser
- Done Orchestrator + CLI
- Done Dry-run end-to-end
Phase 2 — Next
Live Outreach
- Blocked Fix Anthropic API key
- Planned Wire SendGrid sender
- Planned Seed initial PE firm targets (KKR, Warburg, etc.)
- Planned Add portfolio companies per firm
- Planned First live send batch
- Planned Response tracking loop
Phase 3 — Later
Learning + Scale
- Planned SEC EDGAR financial signals
- Planned Learning agent (update_strategy auto)
- Planned A/B subject line testing
- Planned Follow-up sequence automation
- Planned CRM-style pipeline view in Studio
- Planned Inbound webhook (email provider)
Target Profile
Who the commercial engine is designed to reach and why.
Primary — PE Firms
Industrial-focused PE firms doing buy-and-build or operational improvement plays. The Genome fingerprint gives them a view of operational health before or during diligence — faster than a 100-day plan, grounded in observable signals not management presentations.
AUM target: $500M+
Industry focus: hvac, heavy_equipment, ag_equipment, industrial_conglomerate
Hook: archetype + trajectory as pre-diligence signal
Secondary — M&A Advisors
Investment banks and boutique advisors running sell-side mandates for industrial companies. Genome gives them differentiated sell-side diligence materials — a behavioral fingerprint that complements traditional financial analysis.
Profile: sector-specialist boutiques
Hook: sell-side diligence differentiation
Use case: constraint and trajectory pre-packaged for CIM