1. Caps retired: risk block mirrors the paper sentinels; sizing is the
paper bot's 4%-of-equity (class_pct 0.04/0.12), floored at the venue's
$1 min order (4% of a $22 book is $0.89 — sub-min stakes died at the
gate). bankroll rebased to the real $22.28 equity; spend tracker reset
(the confusing $35 is gone with the daily cap).
2. Price guard is now ABSOLUTE +0.05 (both books): 0.14→0.15 follows,
0.14→0.20 skips. The relative 5% blocked one-tick moves on cheap
in-play books.
3. Pending-order registry: in-play 'delayed' holds are no longer cancelled
at 20s — the executor hands them to state.pending_orders with full copy
context; the heartbeat resolver adopts the fill whenever it lands
(bets/my_pos/cash/ledger, TTL 600s → cancel + honest miss). Recovers
Rune-Eaters-class holds (+$7.50 forfeited by the old cancel).
5 stub-client paths pass incl. adopt + expire.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 09:10-13:14Z: six $5 in-play esports copies returned AcceptedOrder
status 'delayed' with zero matched; the executor read matched==0 as a
rejection, recorded honest misses, and forgot the orders — which then filled
at the exchange minutes later. Book went blind (6 untracked fills, ~$30 real
spend vs $5 booked), caps stopped binding, exits never mirrored. Net damage
contained by the CLOB's own balance checks: −$2.7 incl fees, two legs won.
Executor invariant now: NO order outlives _order() untracked. Zero-matched
acceptances poll get_order → cancel remainder → measure truth via the
exchange's CONDITIONAL balance diff; exception paths sweep open orders on
the token the same way. 5 stub-client unit paths pass.
State surgery (machine disarmed first): cash reset to chain ($10.03), six
fills adopted as bets (4 settled −$4.38 w/ fees, Aurora G2 open+won), spend
tracker set to the real $35/day, false miss rows purged, one documented
-0.59 adjustment (bank-vs-deposit + probe).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>