polymarket-nothing-ever-happens — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited polymarket-nothing-ever-happens (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Buy NO on standalone yes/no Polymarket markets priced below a configurable cap.
🚨 Framework, not a production trading system. Read DISCLAIMER.md before connecting to a wallet with real funds.
bundesliga, premier league, …). Political X vs Y stays eligible. Live is still tag/category.get_positions() omits the venue filter under replay (replay 422s on venue, same class as weather SIM-5484). A held market_id is not re-bought on later ticks.0.10. CONFIG_SCHEMA is the source of truth.limit=1000 (the whole tape slice), so sibling counting covers every market on the tape, and rows with no event_id are dropped rather than admitted. The remaining FIX caveat is only that the tape itself may omit a sibling Polymarket had.ensure_can_trade with a missing or non-numeric max_safe_size now refuses to trade (no uncapped MAX_BET_USD). Replay listings expose event_id; the skill drops events that have more than one row on the page (standalone = live Gamma len(markets)==1).event_id, or the listing page only shows one grouped leg, that row still enters. Tape volume stands in for both liquidity and 24h volume.simmer backtest (SIMMER_REPLAY=1) discovery, import, and the clock come from the existing replay harness — same SIMMER_REPLAY / SIMMER_REPLAY_NOW pattern as BTC up-down and weather. Live Gamma stays dark. Import accepts replay status=active. Sports still drop when tape tags are empty (question/slug tokens). Daily-spend uses the frozen tick, not wall clock.This is a template. The default logic buys NO on any non-sports standalone market where NO costs ≤10¢. Remix it with custom filters (minimum volume thresholds, specific categories, date ranges) or pair it with a signal to skip markets where YES might actually happen. The skill handles plumbing (discovery, import, fee checks, execution). You define which markets to trade.
Based on: sterlingcrispin/nothing-ever-happens
On most standalone binary prediction markets, the event resolves NO — nothing dramatic happens. Markets systematically overprice dramatic YES outcomes. When NO is trading at 3¢–5¢, you're getting 20–33x payout if you're right, and the base rate of "nothing happens" is often much higher than the implied 3–5%.
⚠️ Automated stop-losses cannot protect against gap-resolution. Many NO-fade targets, weather temperature buckets especially, do not decay toward their losing outcome. They gap: the price sits near your entry, then jumps straight to about 0 at resolution. A percentage stop has no intermediate price to trigger on and no liquidity to exit into once it is near zero, so it cannot cap your downside on these markets. Size every position for the full loss, not for the stop. See DISCLAIMER.md.
max_bet_usdWhen user asks to install or configure this skill:
pip install simmer-sdkSIMMER_API_KEYWALLET_PRIVATE_KEY# Scan for candidates (no trades)
python nothing_ever_happens.py --scan
# Dry run — show what would trade
python nothing_ever_happens.py
# Execute real trades
python nothing_ever_happens.py --live
# Quiet mode (for cron — only prints on trades/errors)
python nothing_ever_happens.py --live --quiet
# Show config
python nothing_ever_happens.py --config
# Update config
python nothing_ever_happens.py --set price_cap=0.03| Key | Env Var | Default | Description |
|---|---|---|---|
| — | TRADING_VENUE | polymarket | Venue to trade on. Set sim for $SIM paper trading on the Simmer venue (no wallet, no USDC). |
price_cap | SIMMER_NEH_PRICE_CAP | 0.10 | Max NO price to buy (0.10 = 10¢). Code (CONFIG_SCHEMA) is source of truth. |
max_bet_usd | SIMMER_NEH_MAX_BET_USD | 5.0 | USDC per trade |
max_trades_per_run | SIMMER_NEH_MAX_TRADES_PER_RUN | 3 | Max trades per execution |
daily_budget | SIMMER_NEH_DAILY_BUDGET_USD | 15.0 | Daily spend limit |
min_liquidity | SIMMER_NEH_MIN_LIQUIDITY | 500.0 | Min market liquidity (USDC) |
min_volume_24h | SIMMER_NEH_MIN_VOLUME_24H | 100.0 | Min 24h volume (USDC) |
candidate_pages | SIMMER_NEH_CANDIDATE_PAGES | 3 | Gamma API pages to scan |
Update via CLI: python nothing_ever_happens.py --set price_cap=0.03
The skill fetches active Polymarket events via the Gamma API, sorted by 24h volume. Under simmer backtest (SIMMER_REPLAY=1) it lists from the Simmer tape instead — live Gamma would be look-ahead. It only considers standalone events — events with exactly one market. Grouped events (e.g. "Who wins Iowa?" alongside "Who wins Florida?" in a presidential election group) are excluded because:
["Yes", "No"]For each candidate, the skill:
client.trade(side="no", amount=max_bet_usd)/events — Discover active Polymarket eventsPOST /api/sdk/import — Import market to Simmer (via client.import_market())GET /api/sdk/context/{market_id} — Fee rate and safeguardsPOST /api/sdk/trade — Trade executionGET /api/sdk/positions — Current positions (avoid doubling up)Reuse simmer backtest / SIMMER_REPLAY=1. Do not invent a second harness. Pinned path check:
python -m pytest skills/polymarket-nothing-ever-happens/tests/test_replay_plane.py -q| Verdict | What it means |
|---|---|
| FIX | Path is broken or the tape cannot evaluate the skill. Do not add capital. Repair: live Gamma under replay (look-ahead); Unexpected import status: active; wall-clock daily-spend; sports leak from empty tape tags (league/club tokens now drop; unnamed clubs with no listed token can still leak); listing 422 from tags/status; positions 422 from venue (already-holding must omit venue under replay). Replay standalone uses event_id over the whole tape slice (limit=1000); rows with no event_id are dropped. Only a tape that omits a sibling can still admit a grouped leg. Tape volume stands in for liquidity and 24h volume. |
| KILL | Pinned pytest fails, or a full-tape run has evals > 0 and the skill still cannot reach trade() on a tape cheap-NO, or P&L after costs is clearly ≤ 0 on honest (not live-Gamma) prices. No second-lane capital. |
| KEEP | Full-tape simmer backtest with evals > 0 and trades > 0 on tape prices and SIMMER_REPLAY_NOW. Pinned unit tests are a path check only — not KEEP. |
"No candidates below price cap" → All standalone non-sports markets have NO > cap. Lower price_cap (e.g. --set price_cap=0.08) or wait — cheap NO opportunities appear sporadically.
"Daily budget exhausted" → Hit daily limit. Adjust with --set daily_budget=30.
"Import failed" → The market may have already resolved, or the slug is incorrect. The skill skips and continues.
All candidates have fees → The fee filter is intentional — on a 5¢ NO position (p=0.05) the crypto taker fee runs ~6.6% of cost, eliminating most of the edge on cheap NO. By design. Zero-fee categories (e.g. Geopolitics) bypass this filter.
"gamma_api.py not found" → Copy gamma_api.py from the polymarket-ai-divergence skill into this skill's directory, or install both skills together.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.