Agent skill
signal-scanner
Detect buying signals across TAM companies and watchlist personas.
Filed under Prospecting and list building.
From edupegoretti/fluidz-skills · 116 skills · 0 · pushed 2026-03-11
What it does when it runs
Detect buying signals across TAM companies and watchlist personas. Three-phase architecture: (1) free diff-based signals from existing data (headcount growth, tech stack changes, funding rounds), (2) Apify-powered signals (job postings, LinkedIn content analysis, profile changes), and (3) post-processing with dedup, scoring, and lead status updates. Writes signals to Supabase signals table for downstream activation.
Read from the skill and the 3 files bundled beside it. A skill’s own description is written to be selected by an agent, so it describes the job and not the dependencies.
- Keys and connectors you must supply
- ANTHROPIC_API_KEY
- APIFY_TOKEN
- SUPABASE_SERVICE_ROLE_KEY
- Hosts it reaches
- api.anthropic.com
- api.apify.com
- Tool permissions it declares
- No
allowed-toolsin the frontmatter. It does act, so it runs under whatever permissions your session already grants. - Actions present in the files
- shell
Install it
View source on GitHub ↗git clone --depth 1 --filter=blob:none --sparse https://github.com/edupegoretti/fluidz-skills.git /tmp/fluidz-skills git -C /tmp/fluidz-skills sparse-checkout set "skills/capabilities/signal-scanner" mkdir -p ~/.claude/skills/signal-scanner cp -R "/tmp/fluidz-skills/skills/capabilities/signal-scanner/." ~/.claude/skills/signal-scanner/
Picked up without a restart. A project skill of the same name is shadowed by your personal one. For one repository only, swap ~/.claude/skills for .claude/skills. Claude Code docs ↗
The folder is the same in every client that implements the format — 46 of them — so if yours is not above, only the destination changes.
Before you install: this skill will not complete its job on a bare agent. It needs ANTHROPIC_API_KEY, APIFY_TOKEN, SUPABASE_SERVICE_ROLE_KEY, which you have to obtain separately.
The skill
Source on GitHub ↗Reproduced in full from edupegoretti/fluidz-skills/blob/a2cf697e2e8ec2ea517d85496e2d5c7f5dc44cd3/skills/capabilities/signal-scanner/SKILL.md, which is licensed MIT (repository). 735 words, 20 headings.
Signal Scanner
Scheduled scanner that detects buying signals on TAM companies and watchlist personas, writes them to the signals table, and sets up downstream activation.
When 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
Prerequisites
SUPABASE_URL+SUPABASE_SERVICE_ROLE_KEYin.envAPIFY_TOKENin.env(for Phase 2 signals)ANTHROPIC_API_KEYin.env(optional, for LLM content analysis)- TAM companies populated via
tam-builder - Watchlist personas created for Tier 1-2 companies
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 |
Config Format
See configs/example.json for full schema. Key sections:
client_name— which client's TAM to scansignals.*— enable/disable each signal type with thresholdsscan_scope— filter by tier, status, lead_status
Database Write Policy
CRITICAL: Never write signals or update lead statuses without explicit user approval.
The signal scanner writes to multiple tables: signals (insert), enrichment_log (insert), companies (patch snapshots), and people (patch lead_status). These writes affect downstream outreach decisions — bad signals lead to bad outreach timing.
Required flow:
- Always run
--dry-runfirst to detect signals without writing to the database - 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
lead_statuschanges frommonitoringtosignal_detectedare hard to undo across many records- Snapshot updates affect future signal diffs — bad snapshots cascade into future scans
- Enrichment log entries track Apify credit spend
The agent must NEVER pass --yes on a first run. The --yes flag is only for pre-approved scheduled scans where the user has already validated the signal detection logic.
Usage
# Dry 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
# 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
# Test mode (5 companies max)
python skills/capabilities/signal-scanner/scripts/signal_scanner.py \
--config configs/example.json --test --dry-run
# Free signals only (skip Apify)
# Set all Apify signals to enabled: false in config
Flags
| Flag | Effect |
|---|---|
--config PATH | Path to config JSON (required) |
--test | Limit to 5 companies, 3 people |
--yes | Auto-confirm Apify cost prompts. Only use for pre-approved scheduled scans. |
--dry-run | Detect signals but don't write to DB. Always run this first. |
--max-runs N | Override Apify run limit (default 50) |
Output
Signals table writes
Each signal includes: client_name, company_id, person_id, signal_level (company or person), signal_type, signal_source, strength, signal_data (JSON), activation_score, detected_at, acted_on, run_id.
Other database writes
- Person
lead_statusupdated tosignal_detectedwhen activation_score >= threshold - Company
metadata._signal_snapshotupdated for next diff cycle - Person
raw_data._signal_snapshotupdated for next diff cycle enrichment_logentries withtool='apify',action='search'or'enrich', pluscredits_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.7
Connects To
- Upstream:
tam-builder(provides companies + people) - Downstream:
cold-email-outreach(acts on signals)
File Structure
signal-scanner/
├── SKILL.md
├── configs/
│ └── example.json
└── scripts/
└── signal_scanner.py
Files bundled with it
These load only when the skill asks for them, so they cost nothing until it runs.
Other skills for the same job
Different authors, same problem. Matched on the words in the skill name, across every library in the catalogue except this one.
- signal-scanner by Othmane-Khadri · 55
- personal-strategic-signal-intelligence by ericosiu · 3,449
- signal-monitor by janskuba · 199
- buying-signal-amplification by louisblythe · 136
- crm-hygiene-scanner by Othmane-Khadri · 55
- niche-signal-discovery by getaero-io · 54
- signal-scout by julienamorgan · 9
- signal-scout by julienamorgan · 9
Need help setting it up?
This page tells you what signal-scanner does and what it needs. Cheetah builds the agent setup it runs inside: data, CRM, sequencing and the guardrails.
Book a call →The directory stays free. There is nothing gated behind this.