The cache's won (curPrice>=0.5 at pull) counts 50/50 refunds as wins for
BOTH sides — 521 of 2,128 chain-checked follow-set markets (24%) were
refunds, which is where the whales' 92-100% displayed win rates came from.
- live/payouts.py: resolutions table in cache.duckdb, filled from the CTF
contract's payout vectors (batched+paced JSON-RPC, ~12 calls/s free tier;
resolved rows immutable, unresolved recheck 6h, RPC failures never cached).
truth(cond, asset) -> 1/0/0.5/None; refunds need no asset side.
- validate_timing: every displayed stat (conv/conv30/all-time/realized/copy
replay) settles at truth; refunds count as neither W nor L, P&L is
size*(wp-p)/p; new conv_ref/conv30_ref/all_ref feed fields.
- trust.conviction_record: optional truthfn — the selection gates
(trust_wr/trust_roi) no longer select on refund inflation.
- portfolio.py: replay pays wp (refunds 0.5/share, was 1.0).
- conviction_scan: documented as the (refund-inflated) candidate layer;
final selection re-judges against truth downstream.
Validation: 0x4bFb-whale conv 174-16 91.6% $1.61M -> 34-16 +140ref 68%
$214k, and truth-adjusted all-time P&L now sits within ~16% of lb-api's
PM P&L (was 7x apart); LSB1 (0 refunds) byte-identical, its P&L matches
PM P&L to 0.07%.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* per-trade Discord pings removed everywhere: copybot placement/settle/startup
alerts silenced (engine.webhook forced off), webhook_receiver.py archived,
Procfile removed. The ONLY Discord output is now live/discord_daily.py at the
end of the daily pipeline: one embed listing every watch_sharps wallet with a
Polymarket profile link + 30D conviction win% / record / P&L.
* trust.py fixes found on the first scheduled run (sharp list collapsed 25->7):
- Polymarket rewrites endDate after resolution, so freshly re-pulled wallets'
corrected res_t stopped matching the stale cross-wallet consensus
(374/454 of iohihoo's rows wrongly distrusted). v2 rows with resolved=TRUE
are now self-certifying (resolved=TRUE implies endDate-based res_t observed
post-end) — consensus only gates legacy rows.
- daily.sh invalidates watchlist wallets by DELETING their pulled row; a
transiently failed re-pull then dropped the wallet's entire history from
the trusted set (the 0x73afc816 whale vanished). Legacy rows of wallets
missing from pulled now fall back to trusting markets resolved >=14d ago.
Re-run: 85 conviction wallets, 34 copy-positive sharps — whale/iohihoo/
Stavenson/LSB1/Kruto all recovered.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Two data bugs were hiding the best copy targets (FINDINGS 'The holder
blind spot'):
* live/trust.py (new): only score rows whose res_t matches the market's
consensus resolution time across >=2 wallets, pulled after resolution,
resolved != False. Kills the res_t=ts fallback poison that let scalpers
masquerade as 99%-win holders (ArbTraderRookie's rows were 100% this).
* conviction_scan.py: trusted rows only; p80 conviction cutoff from the
train window only (look-ahead leak); new gates z_all>2 (whole-book z,
~doubles pooled forward copy-ROI) and median conviction stake >=$50
(dust filter). 55 wallets selected, forward 30/38 profitable, +21.4%
pooled (was 284 selected, +16.0%).
* validate_timing.py: the held-edge gates now read the trailing-90d
trusted conviction record via trust.conviction_record instead of the
replay's held leg, which is structurally ~all-unresolved for week-lead
holders (whale 0x73afc816 showed 'held 0-0, 21 unresolved' and was
rejected at 100% fwd win). 25 copy-positive holders now, including
Stavenson (51-0), the whale (112-4) and iohihoo (98-10).
* cache.py: query() helper so trust.py shares the single in-process
connection instead of fighting the single-writer lock.
* README: gotcha 8 (fake res_t/won) + candidate next data sources
(Goldsky pipelines, PolymarketData order books, Pinnacle CLV,
Polysights); FINDINGS: dated section correcting the iohihoo/ArbTrader
scalper-trap verdicts as winner=False-bug artifacts.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>