mirror of
https://github.com/jaxperro/winning-wallet-finder.git
synced 2026-07-28 00:07:47 +00:00
research: surgebot A2 — measurement arm relaunch (every-trigger $100 FAKs + attempts stream + offline virtual-book replay)
v1's cash-gated book halted at its pre-registered -50% line; post-mortem showed the ~2% cash-gated subsample was adversely selected (-$9/fill vs +$41/fill full-signal, same day). A2 samples every trigger and replays bankroll specs offline (surge_book_replay.py -> surge_book.json). Signal semantics verbatim; grades to surge_meas_ledger.jsonl. See #19. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
+45
-18
@@ -1,12 +1,15 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Nightly chain-truth grading of the surge paper harness (wwf-surgebot).
|
||||
"""Nightly chain-truth grading of the surge measurement harness (A2).
|
||||
|
||||
Pulls /data/surge_state.json off the box (read-only — never writes back),
|
||||
re-grades every settled entry with CTF payout vectors (payouts.truth; the
|
||||
harness's provisional CLOB winner flags lie on operator-resolved markets,
|
||||
[[polymarket-resolution-truth]]), and appends one row per settle to
|
||||
research/surge_paper_ledger.jsonl (keyed asset+ts, idempotent). Also emits
|
||||
the running paper-book summary the #16 sprint decision reads."""
|
||||
Pulls /data/surge2_state.json AND /data/surge_attempts.jsonl off the box
|
||||
(read-only — never writes back), re-grades every settled entry with CTF
|
||||
payout vectors (payouts.truth; provisional CLOB winner flags lie on
|
||||
operator-resolved markets), and appends one row per settle to
|
||||
research/surge_meas_ledger.jsonl (keyed asset+ts, idempotent). The pulled
|
||||
copies are KEPT on disk for surge_book_replay.py (virtual bankroll specs).
|
||||
|
||||
v1 history is closed: surge_paper_ledger.jsonl and /data/surge_state.json
|
||||
are frozen audit artifacts of the halted cash-gated book (2026-07-22)."""
|
||||
import json
|
||||
import os
|
||||
import shutil
|
||||
@@ -14,33 +17,53 @@ import subprocess
|
||||
import sys
|
||||
|
||||
HERE = os.path.dirname(os.path.abspath(__file__))
|
||||
LEDGER = os.path.join(HERE, "surge_paper_ledger.jsonl")
|
||||
TMP = os.path.join(HERE, ".surge_state.pull.json")
|
||||
LEDGER = os.path.join(HERE, "surge_meas_ledger.jsonl")
|
||||
STATE_PULL = os.path.join(HERE, ".surge2_state.pull.json")
|
||||
ATT_PULL = os.path.join(HERE, ".surge_attempts.pull.jsonl")
|
||||
FLYCTL = shutil.which("flyctl") or "/opt/homebrew/bin/flyctl"
|
||||
|
||||
|
||||
def sftp(remote, local):
|
||||
subprocess.run([FLYCTL, "ssh", "sftp", "get", remote, local + ".new",
|
||||
"-a", "wwf-surgebot"], capture_output=True,
|
||||
timeout=600, stdin=subprocess.DEVNULL)
|
||||
if os.path.exists(local + ".new") and os.path.getsize(local + ".new") > 0:
|
||||
os.replace(local + ".new", local) # keep last good pull on failure
|
||||
return True
|
||||
try:
|
||||
os.remove(local + ".new")
|
||||
except FileNotFoundError:
|
||||
pass
|
||||
return False
|
||||
|
||||
|
||||
def main():
|
||||
r = subprocess.run([FLYCTL, "ssh", "sftp", "get", "/data/surge_state.json",
|
||||
TMP, "-a", "wwf-surgebot"], capture_output=True,
|
||||
timeout=300, stdin=subprocess.DEVNULL)
|
||||
if not os.path.exists(TMP) or os.path.getsize(TMP) == 0:
|
||||
ok = sftp("/data/surge2_state.json", STATE_PULL)
|
||||
sftp("/data/surge_attempts.jsonl", ATT_PULL)
|
||||
if not ok:
|
||||
print("[grade_surge] box unreachable or no state yet — skip")
|
||||
return 0
|
||||
st = json.load(open(TMP))
|
||||
os.remove(TMP)
|
||||
st = json.load(open(STATE_PULL))
|
||||
sys.path.insert(0, os.path.join(HERE, "..", "live"))
|
||||
import payouts
|
||||
have = set()
|
||||
ledger_rows = 0
|
||||
try:
|
||||
for ln in open(LEDGER):
|
||||
try:
|
||||
d = json.loads(ln)
|
||||
have.add((d["asset"], d["ts"]))
|
||||
ledger_rows += 1
|
||||
except Exception:
|
||||
pass
|
||||
except FileNotFoundError:
|
||||
pass
|
||||
settled = st.get("settled", [])
|
||||
total_settles = st.get("counters", {}).get("settled_total", 0)
|
||||
if total_settles > ledger_rows + len(settled):
|
||||
print(f"[grade_surge] ⚠ TAPE LOSS: {total_settles} lifetime settles "
|
||||
f"but only {ledger_rows} graded + {len(settled)} in state — "
|
||||
f"raise SETTLED_TRIM or grade more often")
|
||||
new = [s for s in settled if (s["asset"], s["ts"]) not in have]
|
||||
if new:
|
||||
payouts.ensure(sorted({s["cond"] for s in new if s.get("cond")}))
|
||||
@@ -67,11 +90,15 @@ def main():
|
||||
except FileNotFoundError:
|
||||
pass
|
||||
c = st.get("counters", {})
|
||||
ev = pnl_sum / total if total else None
|
||||
print(f"[grade_surge] +{graded} settles ({flips} provisional flips) · "
|
||||
f"book: {total} settled {wins}W · chain P&L ${pnl_sum:+.2f} · "
|
||||
f"cash ${st.get('cash', 0):.2f} · open {len(st.get('open', {}))} · "
|
||||
f"lifetime trig {c.get('triggers')} fill {c.get('fills')} "
|
||||
f"measurement: {total} settled {wins}W · chain P&L ${pnl_sum:+.2f}"
|
||||
f"{f' (${ev:+.2f}/fill)' if ev is not None else ''} · "
|
||||
f"open {len(st.get('open', {}))} · lifetime trig {c.get('triggers')} "
|
||||
f"att {c.get('attempts')} fill {c.get('fills')} "
|
||||
f"crater {c.get('craters')}")
|
||||
print("[grade_surge] capturability read — NOT the #16 verdict "
|
||||
"(forward_ledger is); bankroll reads come from surge_book_replay")
|
||||
return 0
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user