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`
