Status: ready-for-human # 15 — H1: Commutative forfeit event ordering (deferred) ## What to build Define deterministic ordering when `forfeit`, `charge`, and `payout` events replicate concurrently. Forfeit snapshots amount at creation (~287) but apply order can desync pending balances under gossip. **Code refs:** - `packages/tracker/meshnet_tracker/billing.py` — `forfeit_pending` (~280–292), `_apply_locked` forfeit branch (~345–349) - `packages/tracker/meshnet_tracker/billing.py` — `_pending_since.setdefault` (~324), wallet bind direct overwrite (~351) ## Acceptance criteria - [ ] Documented commit order: charges before forfeit before payout for same wallet epoch - [ ] Forfeit events carry pending snapshot or `(term, index)` for tie-break - [ ] `setdefault` replaced with explicit merge rules on out-of-order apply - [ ] Property tests under shuffled event delivery ## ADR links - [ADR-0019](../../docs/adr/0019-money-path-consistency-multi-tracker.md) §4 ## Blocked by - `13-c3-c4-consensus-gated-settlement.md`