signal-scanner
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseSignal Scanner
信号扫描器
Scheduled scanner that detects buying signals on TAM companies and watchlist personas, writes them to the table, and sets up downstream activation.
signals定时扫描工具,用于检测目标市场(TAM)公司及观察列表人物的购买信号,将其写入表,并为下游激活流程做准备。
signalsWhen to Use
使用场景
- After TAM Builder has populated companies and personas
- As a recurring scan (daily/weekly) to detect timing-based outreach triggers
- When you need to move from static lists to intent-driven outreach
- 在TAM Builder完成公司及人物数据填充后使用
- 作为周期性扫描(每日/每周),检测基于时间节点的触达触发条件
- 当你需要从静态列表转向基于意向的触达时使用
Prerequisites
前置条件
- +
SUPABASE_URLinSUPABASE_SERVICE_ROLE_KEY.env - in
APIFY_TOKEN(for Phase 2 signals).env - in
ANTHROPIC_API_KEY(optional, for LLM content analysis).env - TAM companies populated via
tam-builder - Watchlist personas created for Tier 1-2 companies
- 文件中配置
.env+SUPABASE_URLSUPABASE_SERVICE_ROLE_KEY - 文件中配置
.env(用于第二阶段信号检测)APIFY_TOKEN - 文件中配置
.env(可选,用于LLM内容分析)ANTHROPIC_API_KEY - 通过完成TAM公司数据填充
tam-builder - 为Tier 1-2公司创建观察列表人物
Signal Types
信号类型
| Priority | Signal | Level | Source | Cost |
|---|---|---|---|---|
| P0 | Headcount growth (>10% in 90d) | Company | Data diffs | Free |
| P0 | Tech stack changes | Company | Data diffs | Free |
| P0 | Funding round | Company | Data diffs | Free |
| P0 | Job posting for relevant roles | Company | Apify linkedin-job-search | ~$0.001/job |
| P1 | Leadership job change | Person | Apify linkedin-profile-scraper | ~$3/1k |
| P1 | LinkedIn content analysis | Person | Apify linkedin-profile-posts + LLM | ~$2/1k + LLM |
| P1 | LinkedIn profile updates | Person | Apify linkedin-profile-scraper | ~$3/1k |
| P2 | New C-suite hire | Company | Derived from person scans | Free |
| 优先级 | 信号 | 层级 | 来源 | 成本 |
|---|---|---|---|---|
| P0 | 员工人数增长(90天内增长>10%) | 公司 | 数据差异 | 免费 |
| P0 | 技术栈变更 | 公司 | 数据差异 | 免费 |
| P0 | 融资轮次 | 公司 | 数据差异 | 免费 |
| P0 | 相关岗位的招聘信息 | 公司 | Apify linkedin-job-search | ~$0.001/条招聘信息 |
| P1 | 领导层岗位变动 | 人物 | Apify linkedin-profile-scraper | ~$3/1000条 |
| P1 | 领英内容分析 | 人物 | Apify linkedin-profile-posts + LLM | ~$2/1000条 + LLM费用 |
| P1 | 领英资料更新 | 人物 | Apify linkedin-profile-scraper | ~$3/1000条 |
| P2 | 新C-suite高管招聘 | 公司 | 从人物扫描结果推导 | 免费 |
Config Format
配置格式
See for full schema. Key sections:
configs/example.json- — which client's TAM to scan
client_name - — enable/disable each signal type with thresholds
signals.* - — filter by tier, status, lead_status
scan_scope
完整配置 schema 请参考。核心配置项:
configs/example.json- — 要扫描的客户对应的TAM
client_name - — 启用/禁用各信号类型并设置阈值
signals.* - — 按层级、状态、潜在客户状态过滤
scan_scope
Database Write Policy
数据库写入规则
CRITICAL: Never write signals or update lead statuses without explicit user approval.
The signal scanner writes to multiple tables: (insert), (insert), (patch snapshots), and (patch lead_status). These writes affect downstream outreach decisions — bad signals lead to bad outreach timing.
signalsenrichment_logcompaniespeopleRequired flow:
- Always run first to detect signals without writing to the database
--dry-run - Present the dry-run results to the user: signal count, types, top signals, affected companies/people
- Get explicit user approval before running without
--dry-run - Only then run the actual scan that writes to the database
Why this matters:
- Signals drive outreach timing — incorrect signals trigger premature outreach
- changes from
lead_statustomonitoringare hard to undo across many recordssignal_detected - Snapshot updates affect future signal diffs — bad snapshots cascade into future scans
- Enrichment log entries track Apify credit spend
The agent must NEVER pass on a first run. The flag is only for pre-approved scheduled scans where the user has already validated the signal detection logic.
--yes--yes重要提示:未经用户明确批准,绝不能写入信号或更新潜在客户状态。
信号扫描器会写入多个表:(插入)、(插入)、(更新快照)、(更新lead_status)。这些写入操作会影响下游触达决策——错误的信号会导致触达时机不当。
signalsenrichment_logcompaniespeople必填流程:
- 务必先执行,检测信号但不写入数据库
--dry-run - 向用户展示试运行结果:信号数量、类型、顶级信号、受影响的公司/人物
- 获得用户明确批准后,再执行无的扫描
--dry-run - 只有此时才能运行实际写入数据库的扫描
为何这很重要:
- 信号驱动触达时机——错误信号会触发过早触达
- 从
lead_status变为monitoring后,大量记录的回滚操作难度大signal_detected - 快照更新会影响未来的信号差异检测——错误快照会导致后续扫描出现连锁问题
- enrichment log条目会跟踪Apify的积分消耗
智能体绝不能在首次运行时使用参数。标志仅适用于用户已验证过信号检测逻辑的预批准定时扫描。
--yes--yesUsage
使用方法
bash
undefinedbash
undefinedDry run first (ALWAYS DO THIS) — detect signals without writing to DB
先执行试运行(务必先做这一步)—— 检测信号但不写入数据库
python skills/capabilities/signal-scanner/scripts/signal_scanner.py
--config skills/capabilities/signal-scanner/configs/my-client.json --dry-run
--config skills/capabilities/signal-scanner/configs/my-client.json --dry-run
python skills/capabilities/signal-scanner/scripts/signal_scanner.py
--config skills/capabilities/signal-scanner/configs/my-client.json --dry-run
--config skills/capabilities/signal-scanner/configs/my-client.json --dry-run
Full scan (only after user reviews dry-run results and approves)
完整扫描(仅在用户查看试运行结果并批准后执行)
python skills/capabilities/signal-scanner/scripts/signal_scanner.py
--config skills/capabilities/signal-scanner/configs/my-client.json
--config skills/capabilities/signal-scanner/configs/my-client.json
python skills/capabilities/signal-scanner/scripts/signal_scanner.py
--config skills/capabilities/signal-scanner/configs/my-client.json
--config skills/capabilities/signal-scanner/configs/my-client.json
Test mode (5 companies max)
测试模式(最多5家公司)
python skills/capabilities/signal-scanner/scripts/signal_scanner.py
--config configs/example.json --test --dry-run
--config configs/example.json --test --dry-run
python skills/capabilities/signal-scanner/scripts/signal_scanner.py
--config configs/example.json --test --dry-run
--config configs/example.json --test --dry-run
Free signals only (skip Apify)
仅检测免费信号(跳过Apify)
Set all Apify signals to enabled: false in config
在配置中将所有Apify信号设置为enabled: false
undefinedundefinedFlags
命令行标志
| Flag | Effect |
|---|---|
| Path to config JSON (required) |
| Limit to 5 companies, 3 people |
| Auto-confirm Apify cost prompts. Only use for pre-approved scheduled scans. |
| Detect signals but don't write to DB. Always run this first. |
| Override Apify run limit (default 50) |
| 标志 | 作用 |
|---|---|
| 配置JSON文件路径(必填) |
| 限制为最多5家公司、3个人物 |
| 自动确认Apify成本提示。仅适用于预批准的定时扫描。 |
| 检测信号但不写入数据库。务必先执行此操作。 |
| 覆盖Apify的运行次数限制(默认50次) |
Output
输出
Signals table writes
写入signals表
Each signal includes: , , , (company or person), , , , (JSON), , , , .
client_namecompany_idperson_idsignal_levelsignal_typesignal_sourcestrengthsignal_dataactivation_scoredetected_atacted_onrun_id每个信号包含:、、、(公司或人物)、、、、(JSON格式)、、、、。
client_namecompany_idperson_idsignal_levelsignal_typesignal_sourcestrengthsignal_dataactivation_scoredetected_atacted_onrun_idOther database writes
其他数据库写入操作
- Person updated to
lead_statuswhen activation_score >= thresholdsignal_detected - Company updated for next diff cycle
metadata._signal_snapshot - Person updated for next diff cycle
raw_data._signal_snapshot - entries with
enrichment_log,tool='apify'oraction='search', plus'enrich'credits_used
- 当activation_score达到阈值时,将人物的更新为
lead_statussignal_detected - 更新公司的,用于下一轮差异检测
metadata._signal_snapshot - 更新人物的,用于下一轮差异检测
raw_data._signal_snapshot - 在中插入条目,包含
enrichment_log、tool='apify'或action='search',以及'enrich'credits_used
Console output
控制台输出
- Summary stats printed to stdout
- 汇总统计信息将打印到标准输出
Activation Score
激活评分
activation_score = strength * recency_multiplier * account_fit
Recency: <24h = 1.5, 1-3d = 1.2, 3-7d = 1.0, 1-2w = 0.8, 2-4w = 0.5
Account: Tier 1 = 1.3, Tier 2 = 1.0, Tier 3 = 0.7activation_score = strength * recency_multiplier * account_fit
时效性: <24小时 = 1.5, 1-3天 = 1.2, 3-7天 = 1.0, 1-2周 = 0.8, 2-4周 = 0.5
客户层级: Tier 1 = 1.3, Tier 2 = 1.0, Tier 3 = 0.7Connects To
关联模块
- Upstream: (provides companies + people)
tam-builder - Downstream: (acts on signals)
cold-email-outreach
- 上游: (提供公司+人物数据)
tam-builder - 下游: (根据信号执行操作)
cold-email-outreach
File Structure
文件结构
signal-scanner/
├── SKILL.md
├── configs/
│ └── example.json
└── scripts/
└── signal_scanner.pysignal-scanner/
├── SKILL.md
├── configs/
│ └── example.json
└── scripts/
└── signal_scanner.py