Signal Triggers
Signal is the condition category for real-time social and event-driven triggers:
X/Twitter Postmaps to EQLsource: "tweet"semantic matching.Telegram Channelmaps to EQLsource: "telegram"semantic matching.Eventmaps to EQLsource: "news"semantic matching.
Use Signal when you care about what was said (semantic meaning), not only market price movement.
Why Agents Use Signal
- React when a specific monitored account posts, instead of polling sentiment indirectly.
- Capture breaking events by meaning (for example ETF approval, exploit, sanctions), not brittle keyword exact-match.
- Pair Signal triggers with
webhook,notify,telegram_bot, orllmactions for immediate handoff.
Selection Policy
Choose the Signal source by intent:
- Use
tweet(X/Twitter Post) when the trigger is anchored to a specific account/handle. - Use
telegram(Telegram Channel) when the trigger is anchored to a monitored public Telegram channel. - Use
news(Event) when the trigger is a world event and is not pinned to a specific account. - Use
sec, notnews, when the trigger is an official SEC filing for an issuer CIK. - Prefer
tweet/telegram/newsoverllmwhen the trigger is plausibly expressed in X/Twitter, Telegram, or news content. - Use
llmas a last resort for world-state questions that are not naturally represented as post/event matching.
Examples:
Alert me if @cz_binance posts that Binance Alpha is listing a new token->tweetAlert me if a monitored public Telegram channel posts about a new Binance listing rumor->telegramAlert me if spot ETH ETF approval happens->newsAlert me when Alphabet files a new 8-K->sec
Event Semantics
Signal conditions are event-driven:
tweet,telegram, andnewsevaluate when relevant mention events arrive.- They are not driven by recurring schedule polling intervals.
- You can still combine Signal conditions with other condition types using
AND/OR.
Condition Contracts
X/Twitter Post (tweet.semantic)
Arguments:
username: string(required)text: string(required)minConfidence: integerin[0,100](required)
Important behavior:
usernameshould be provided without@.- At create-time, Auto resolves
usernameto an active monitored account; if unresolved, validation/create fails. - Semantic verification passes only when confidence is
>= minConfidence.
Default condition form:
{
"source": "tweet",
"args": {
"username": "cz_binance",
"text": "Binance Alpha is listing a new token",
"minConfidence": 80
}
}
Telegram Channel (telegram.semantic)
Arguments:
chatUsername: stringand/orchatId: string(at least one required)text: string(required)minConfidence: integerin[0,100](required)
Important behavior:
- Telegram Signal triggers support monitored public Telegram channels.
- Shorthand authoring requires exactly one identifier. Full
telegram.semanticconditions may carry both; if both are present, they must resolve to the same monitored channel. - Prefer
chatUsernamewithout@ort.me/when you know the public channel username. - Use
chatIdonly when it came from tooling or an existing plan. - At create-time, Auto resolves the Telegram channel; if unresolved or unmonitored, validation/create fails.
- Semantic verification passes only when confidence is
>= minConfidence.
Default condition form:
{
"source": "telegram",
"args": {
"chatUsername": "<monitored_public_channel_username>",
"text": "new Binance listing rumor",
"minConfidence": 80
}
}
Event (news.semantic)
Arguments:
text: string(required)minConfidence: integerin[0,100](required)
Important behavior:
- Event matches are evaluated against mentions from news-tagged sources.
- Semantic verification passes only when confidence is
>= minConfidence.
Default condition form:
{
"source": "news",
"args": {
"text": "SEC approves a spot ETH ETF",
"minConfidence": 80
}
}
Text Authoring Constraints (High Impact)
For tweet, telegram, and news, args.text quality is the biggest determinant of match quality.
- Keep
textatomic: one event/theme per condition. - Phrase
textas what the post should say/report, not as a monitoring command. - Avoid broad umbrella wording in a single condition.
- For
tweet, do not restate account identity intext;usernamealready scopes publisher identity. - For
telegram, do not restate channel identity intext;chatUsernameorchatIdalready scopes the source. - If intent has alternatives (
A or B), split into multiple Signal conditions and combine withOR. - If intent requires co-occurrence (
A and B), split into multiple Signal conditions and combine withAND.
Design recommendation:
- Prefer splitting event-driven Signal intents and schedule-driven (
cron.every) intents into separate queries for clearer semantics and easier debugging.
Match Description Quality (Good vs Bad)
For X/Twitter Post, Telegram Channel, and Event, keep text as a short factual claim.
X/Twitter Post examples:
- bad:
Bearish vibes-> good:Opens a short position on oil - bad:
Something bullish-> good:Announces a new stake in TSLA - bad:
Bullish on a coin-> good:Posts that they're bullish on $HYPE and $SOL
Telegram Channel examples:
- bad:
Alpha group update-> good:new Binance listing rumor - bad:
Team news-> good:team confirms mainnet launch - bad:
Whale chatter-> good:large OTC buyer interest
Event examples:
- bad:
Market crash-> good:Major DeFi protocol suffers a $200M exploit - bad:
War conflict-> good:US imposes new sanctions on Russia - bad:
Big news-> good:SEC approves a spot ETH ETF
Confidence Tuning
- Start with
minConfidence: 80. - Raise to
85-90to reduce false positives. - Lower to
70-75if you are missing relevant matches and can tolerate more noise.
Validation Notes
Common errors:
minConfidencemust be an integer from0to100.tweetusernamemust be non-empty and resolvable to a monitored active account.telegrammust includechatUsernameorchatId, and the channel must resolve to a monitored public Telegram channel. Shorthand requires exactly one identifier; full conditions may carry both if they agree.