Files
winning-wallet-finder/live/daily.sh
T
jaxperro 8b1ccb93fc live: commit dashboard.html each daily run (keep tree clean)
The daily run regenerates dashboard.html but the publish step never
committed it, leaving it perpetually modified. Add it to the publish git
add list and commit the current snapshot.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-23 12:46:20 -06:00

78 lines
3.8 KiB
Bash
Executable File

#!/bin/bash
# Daily skilled-wallet refresh, cache-backed:
# 1) discover — enumerate traders of markets resolved in the last ~14 days,
# merged into the accumulating candidate pool
# 2) freshen — force a re-pull of the current watchlists (skilled + sharps,
# for forward tracking), then top up the cache (collect re-pulls
# only new + >14d-stale wallets, so it's cheap after the first run)
# 3) re-score — the 5-gate skill funnel, instant from cache -> watch_skilled.json
# 4) sharps — conviction-profile scan + last-minute timing gate ->
# conviction_wallets.json + watch_sharps.json (the set the live
# trading dashboard reads via raw.githubusercontent)
# 5) dashboard — regenerate + snapshot for auditable forward history
# 6) publish — commit + push the refreshed outputs so the live dashboard
# (jaxperro.com/trading) picks up the new sharp list
#
# Schedule with launchd/cron (Mac must be awake). Logs to daily.log.
set -u
cd "$(dirname "$0")"
echo "[daily] $(date '+%F %T') 1/6 discover (enumerate last 14d)"
python3 enumerate.py 14
echo "[daily] $(date '+%F %T') 2/6 freshen cache (watchlists forced + new wallets)"
python3 -c "import json,os,cache
wl=[]
for f in ('watch_skilled.json','watch_sharps.json'):
if os.path.exists(f):
wl += [w['wallet'] for w in json.load(open(f))]
if wl:
cache.invalidate(wl)" 2>/dev/null || true
python3 collect.py
echo "[daily] $(date '+%F %T') 3/6 re-score skilled (cache-backed, instant)"
python3 skill.py
echo "[daily] $(date '+%F %T') 4/6 sharps: conviction scan + last-minute timing gate"
python3 conviction_scan.py
python3 validate_timing.py
echo "[daily] $(date '+%F %T') 5/6 dashboard"
python3 dashboard.py
mkdir -p history && cp watch_skilled.json "history/watch_$(date '+%Y%m%d').json" 2>/dev/null
echo "[daily] $(date '+%F %T') 6/6 publish (commit + push refreshed outputs)"
PUBLISH="no changes"
git add watch_skilled.json watch_sharps.json conviction_wallets.json dashboard.html 2>/dev/null
if git diff --cached --quiet 2>/dev/null; then
echo "[daily] no output changes to publish"
elif git commit -q -m "live: daily refresh — skilled + sharp wallets [skip ci]"; then
# sync first so a diverged remote (e.g. a manual commit) doesn't wedge the
# auto-push permanently; abort a conflicting rebase and retry next run.
git pull --rebase -q origin main 2>/dev/null || git rebase --abort 2>/dev/null || true
if git push -q origin main; then
echo "[daily] pushed refreshed sharp list"; PUBLISH="pushed"
else
echo "[daily] push failed — committed locally, will retry next run"; PUBLISH="push failed (committed locally)"
fi
fi
echo "[daily] $(date '+%F %T') done -> watch_sharps.json + dashboard.html"
# ping Discord (webhook kept in gitignored ../config.json -> daily_webhook)
PUBLISH="$PUBLISH" python3 - <<'PY'
import json, os, ssl, time, urllib.request
try: # cwd is live/ (daily.sh cd's there); config is repo-root
hook = json.load(open("../config.json")).get("daily_webhook")
except Exception:
hook = None
if hook:
try:
n = len(json.load(open("watch_sharps.json")))
except Exception:
n = "?"
msg = (f"✅ Sharp pipeline finished {time.strftime('%Y-%m-%d %H:%M')} — "
f"{n} copyable sharps · feed {os.environ.get('PUBLISH','?')}")
data = json.dumps({"content": msg}).encode()
req = urllib.request.Request(hook, data=data,
headers={"Content-Type": "application/json", "User-Agent": "Mozilla/5.0"}) # Discord 403s w/o UA
try:
urllib.request.urlopen(req, timeout=15, context=ssl._create_unverified_context())
print("[daily] discord pinged")
except Exception as e:
print("[daily] discord ping failed:", e)
PY