# Signal Pipeline

> Use when the user says "buying signals", "intent data", "trigger events", "job change alerts", "we get signals and nothing happens", "is this intent data worth it", "signal monitoring", "hiring triggers". Builds a signal taxonomy with decay windows, dedup, severity thresholds, and an explicit signal-to-play routing table. Includes the backfill discrimination test for vendor renewal. Writes workspace/data/signal-taxonomy.csv.

- Skill: `guerrilla2799/signal-pipeline` (Agent Skill)
- Install (CLI): `npx skillmds@latest add guerrilla2799/signal-pipeline`
- Raw SKILL.md: https://api.skillmd.com/api/skills/guerrilla2799/signal-pipeline/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: DevOps & Infra
- Author: guerrilla2799 (https://skillmd.com/u/guerrilla2799)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/guerrilla2799/signal-pipeline

---


# Signal Pipeline

Turn events into timed actions. A signal without a decay window and a routing destination is a notification, and notifications get ignored.

## When to use
- Setting up trigger-based outreach
- Signals fire and nothing happens, or everything happens
- Evaluating or renewing an intent data contract
- Reps say the alerts are noise

## Inputs
- Reads: `workspace/data/object-model.md`, `workspace/data/scoring-model.md`
- Needs from user: current signal sources and cost, what happens today when a signal fires, and last year's closed-won and closed-lost lists for the backfill test

## Workflow

### 1. Build the taxonomy with four properties per signal

A signal is not usable until all four are filled in. Use `templates/signal-taxonomy.csv`.

| Property | Why |
|---|---|
| **Decay window** | How long it stays actionable. A signal with no window is permanent, which means meaningless |
| **Severity** | How strongly it predicts a conversation. Drives the threshold |
| **Play** | Exactly what happens. Not "notify the rep" |
| **Owner** | Who acts, by name or by role |

Reference windows, adjust to your motion:

| Signal | Decay window | Severity |
|---|---|---|
| Champion changed jobs to a target account | 30 to 60 days | High |
| New executive hired in the buying function | 90 days | High |
| Funding round announced | 90 days | Medium |
| Hiring for roles that imply your problem | 60 days | Medium |
| Competitor mentioned in a public posting | 45 days | Medium |
| Pricing page or high-intent content visit | 7 to 14 days | High |
| Technology added or removed from their stack | 90 days | Medium |
| Leadership change outside the buying function | 60 days | Low |
| Generic third-party intent surge | 14 to 30 days | Low until tested |

**A job-change signal actioned at day 45 is a cold call with extra steps.** The window is the value.

### 2. Dedup before routing

The same underlying event arrives from three sources with three timestamps. Without dedup, one event becomes three alerts and the rep learns to ignore all of them.

```
Dedup key:  account + signal type + rolling window
Rule:       first occurrence wins, later duplicates suppressed and counted
```

Count the suppressions. A high suppression rate against one source means you are paying twice for the same event.

### 3. Set the severity threshold

Not every signal deserves an action. If everything fires, nothing does.

```
High severity     → immediate play, same day
Medium            → enters the weekly queue
Low               → increments the intent score only, no alert
Below threshold   → logged, not surfaced
```

The tell that the threshold is too low: signal-to-action rate under 30%. Reps are triaging on your behalf, badly, and silently.

### 4. Write the routing table

The step that makes the difference between a signal system and a notification system.

```
Signal type + severity + account tier → specific play, specific owner, specific timeframe
```

"Notify the rep in Slack" is not a play. "Send the champion-move sequence, three touches over five days, owner is the account owner" is a play.

### 5. Run the backfill discrimination test before any renewal

For every paid signal source, sixty days before renewal.

```
Take last year's closed-won accounts     → was the signal flagged?
Take last year's closed-lost accounts    → was the signal flagged?
Compare the flag rates
```

If flagged accounts converted at roughly the same rate as unflagged ones, the source has no discriminating power and you are paying for noise. This test has killed real contracts. Run it while there is still time to act, not the week of renewal.

### 6. Instrument the pipeline

Four numbers weekly: volume, signal-to-action rate, precision (actioned signals that became a real conversation), and decay compliance. A sudden volume change means a source broke or a filter changed, and that is worth knowing the same week rather than the next quarter.

## Output
- Writes: `workspace/data/signal-taxonomy.csv`, `workspace/data/signal-routing.md`
- Uses: `templates/signal-taxonomy.csv`
- Prints: the taxonomy with all four properties filled, dedup and suppression counts, the threshold, the routing table, and any backfill test results

## Rules & quality bar
- **Every signal has a decay window.** No exceptions
- **Every signal has a named play and a named owner.** "Notify" is not a play
- **Dedup across sources before routing**
- **A severity threshold exists,** and low-severity signals only move the score
- **Backfill test before every renewal,** sixty days out
- **Never buy a broad intent feed without testing it against your own history first**

## Related skills
- Feeds: the intent axis in `icp-scoring-engine`
- Hands off to: `lifecycle-and-routing`
- See also: `docs/stack.md` on signal sources, `docs/metrics.md` on signal health

