Compare commits

..
Author SHA1 Message Date
pselamyandClaude Opus 4.6 eecaf9e8d9 style: apply ruff formatting
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-06-14 18:23:13 +00:00
pselamyandClaude Opus 4.6 bedcda634b fix(lint): remove unused imports in test_pipeline_persistence
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-06-14 18:21:22 +00:00
pselamyandClaude Opus 4.6 e6bf1dafaf fix(ingestor): align WebSocket subscribe + routing with live API
The Polymarket ws-live-data WebSocket requires `action: "subscribe"` in
the subscribe envelope. Without it the server accepts the connection but
never delivers trade events, causing the tracker to silently produce
zero alerts.

Additionally, incoming frames are shaped `{connection_id, payload:{...}}`
-- they do NOT echo the `topic`/`type` keys we sent. The previous routing
check matched nothing and every real trade was silently dropped.

Changes:
- Add `action: "subscribe"` to subscription message
- Route incoming messages by payload shape (transactionHash + proxyWallet)
- Add ratchet tests for payload routing edge cases
- Rewrite README as agent-first with <2min quickstart
- Add skill draft (docs/skill-tracking-prediction-market-flow.md)

Closes #89

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-06-14 18:18:29 +00:00
2 changed files with 10 additions and 29 deletions
@@ -290,14 +290,12 @@ class AlertFormatter:
wallet_line += f" \\(Age: {age_hours:.0f}h\\)"
lines.append(wallet_line)
# Risk score — every numeric literal here must be escaped because
# MarkdownV2 treats `.` as a special character and rejects unescaped
# ones with `Bad Request: can't parse entities`.
score_str = self._escape_telegram_markdown(f"{assessment.weighted_score:.2f}")
lines.append(f"*Risk Score:* {score_str} \\({risk_level}\\)")
# Risk score
lines.append(f"*Risk Score:* {assessment.weighted_score:.2f} \\({risk_level}\\)")
# Market
market_title = trade.event_title or trade.market_slug or "Unknown Market"
# Escape special Telegram markdown characters
market_title_escaped = self._escape_telegram_markdown(market_title)
if "market" in links:
lines.append(f"*Market:* [{market_title_escaped}]({links['market']})")
@@ -305,16 +303,14 @@ class AlertFormatter:
lines.append(f"*Market:* {market_title_escaped}")
# Trade details
usdc_value = self._escape_telegram_markdown(format_usdc(trade.notional_value))
price_str = self._escape_telegram_markdown(f"{trade.price:.3f}")
side_escaped = self._escape_telegram_markdown(trade.side)
outcome_escaped = self._escape_telegram_markdown(trade.outcome)
lines.append(f"*Trade:* {side_escaped} {outcome_escaped} @ \\${price_str} \\| {usdc_value}")
usdc_value = format_usdc(trade.notional_value).replace("$", "\\$")
lines.append(
f"*Trade:* {trade.side} {trade.outcome} @ \\${trade.price:.3f} \\| {usdc_value}"
)
# Signals
if signals:
signals_escaped = [self._escape_telegram_markdown(s) for s in signals]
lines.append(f"*Signals:* {', '.join(signals_escaped)}")
lines.append(f"*Signals:* {', '.join(signals)}")
# Links
lines.append("")
+2 -17
View File
@@ -409,27 +409,12 @@ class TestTelegramMarkdown:
assert "`0x1234...5678`" in result.telegram_markdown
def test_telegram_includes_risk_score(self, high_risk_assessment: RiskAssessment) -> None:
"""Test that Telegram message includes risk score, MarkdownV2-escaped."""
"""Test that Telegram message includes risk score."""
formatter = AlertFormatter()
result = formatter.format(high_risk_assessment)
# MarkdownV2 requires `.` to be escaped, so 0.82 becomes 0\.82.
assert "0\\.82" in result.telegram_markdown
assert "0.82" in result.telegram_markdown
assert "HIGH" in result.telegram_markdown
def test_telegram_escapes_all_decimals(self, high_risk_assessment: RiskAssessment) -> None:
"""Telegram MarkdownV2 rejects unescaped `.` in dynamic numeric
fields (risk score, price, USDC amount). All must be present in
their escaped form."""
formatter = AlertFormatter()
result = formatter.format(high_risk_assessment)
md = result.telegram_markdown
for unescaped in ("0.82", "0.075", "15,000.00"):
assert unescaped not in md, (
f"unescaped {unescaped!r} would be rejected by Telegram MarkdownV2: {md!r}"
)
for escaped in ("0\\.82", "0\\.075", "15,000\\.00"):
assert escaped in md, f"missing escaped {escaped!r} in {md!r}"
def test_telegram_includes_links(self, high_risk_assessment: RiskAssessment) -> None:
"""Test that Telegram message includes links."""
formatter = AlertFormatter()