Industrial Genome Platform

Commercial Engine

A self-reinforcing data flywheel: field data in → signal engine → investment signals, data insights, expert matching, consumer intelligence, agent API out.
April 2026 commercial/ · migrations/004
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

# Activate venv first: source .venv/bin/activate
# Or prefix with: .venv/bin/python3 -m

# Generate report + outreach for one company (dry-run, no DB)
python -m commercial.orchestrator.cli single --company "Carrier Global" --industry hvac --no-persist

# Full pipeline with contact and email (dry-run send)
python -m commercial.orchestrator.cli single --company "Parker Hannifin" --industry heavy_equipment --target "KKR" --contact "John" --email john@kkr.com

# Report only (no outreach)
python -m commercial.orchestrator.cli report --company "Caterpillar" --industry heavy_equipment --full

# Batch cycle (5 pending companies, dry-run)
python -m commercial.orchestrator.cli run --max 5

# Batch cycle LIVE (actually sends emails — requires GENOME_EMAIL_LIVE=1)
python -m commercial.orchestrator.cli run --max 5 --live

# Add a PE firm target
python -m commercial.orchestrator.cli targets add --name "KKR" --type pe_firm --aum 500 --industries "industrial,manufacturing"

# List all targets
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