score_signal
Score arbitrary text for buying-intent / competitor-mention / churn / noise.
Use this when your agent encounters content from any channel it has
access to — email, Slack, Discord, Telegram, LinkedIn, WhatsApp, a
YouTube comment, a blog post — and you want to know whether it's a
real signal worth acting on, before drafting a reply.
SignalPipe doesn't connect to the source channel. Your agent reads
the text (via whatever plugin gives it that access) and passes the
text here. We run the same scoring engine the scout uses on Reddit
and HN: keyword gate, multilingual semantic scoring (EN/ES/FR/DE/PT/FI),
3-judge swarm pattern, sarcasm detection, and competitor-intent
classification.
Returns: score (0-100), role (closer/advisor/educator), classification
(buying_intent / competitor_mention / borderline / noise), sub-scores
(urgency, specificity, keyword_density), competitor info if matched,
and a `drafting_context` block when the score is high enough to act
on.
When the borderline band triggers a panel review you also get
`swarm_ran: true` and a `swarm` block: each judge's stance
("convinced" / "on the fence" / "unconvinced") and `split: true` when
they disagreed materially. A split panel is worth flagging to the
operator — it usually means the post is genuinely ambiguous rather
than clearly a lead or clearly noise. You write the reply yourself using the context — same pattern as
`draft_mission`, no server-side LLM call required.
⚠️ CHECK `degraded` BEFORE YOU TRUST A LOW SCORE. There is a per-tenant
daily budget for panel reviews. `degraded: true` means this text WAS
borderline but the panel did not get to judge it — either the budget ran
out (`swarm_skipped: "daily_cap_reached"`) or the panel errored
(`"panel_failed"`). The score you are holding is the content-only score,
which is exactly the score the panel exists to correct: it under-reads
real buyers as `noise`. Do NOT tell the operator a `degraded` post is not
a lead. Say the verdict is provisional and offer to re-score it later.
`degraded: false` with `swarm_skipped: "not_borderline"` is the normal,
healthy case — the text was clear-cut and did not need a panel. That
verdict is trustworthy.
`swarm_budget_remaining` tells you how many panel reviews are left today.
If you are scoring in bulk, watch it and pace yourself rather than
spending the budget on obvious noise.
`panel_verdict` says what the judges concluded: "kept", "rejected", or
"not_run". The judges can raise a score but never lower it, so a post they
rejected can still read "borderline". Treat `panel_verdict: "rejected"` as
not a lead, whatever the score.
Scoring a reply or comment? Pass the post or thread it answers as
`context`. The judges see it as background, and the score stays about the
reply's own author.
Presentation: if classification is `buying_intent` or
`competitor_mention`, surface the lead to the operator with score,
role, classification, and the drafting context. If classification is
`noise` or `borderline`, mention it briefly so the operator knows you
looked but don't bother them with a draft.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | The content to score: an email body, chat message, comment or post excerpt. Up to 4,000 characters are used. | |
| context | No | Optional. The post, thread or email the text replies to (up to 2,000 characters). The judges see it as background; the score stays about the text's own author. | |
| product_id | Yes | The product to score against, from get_products. | |
| source_hint | No | Optional channel label, such as "gmail", "slack", "discord", "telegram", "linkedin", "whatsapp", "facebook" or "youtube_comment". It tunes the tone of the drafting context and never changes the score. |