--- title: "MLB The Show Companion Automation — 2026.3.31" description: "Fix gold exchange navigation, add grind harness for automated buy→exchange loops, CLI cleanup." type: reference domain: gaming tags: [release-notes, deployment, mlb-the-show, python, automation] --- # MLB The Show Companion Automation — 2026.3.31 **Date:** 2026-03-31 **Repo:** `cal/mlb-the-show-market-tracker` on Gitea **Branch:** `main` (merge commit `ea66e2c`) **Deploy method:** Local script — `uv run scripts/grind.py` ## Release Summary Major fixes to the companion app automation (`grind.py`). The gold exchange navigation was broken — the script thought it had entered the card grid when it was still on the exchange selection list. Added a new `grind` command that orchestrates the full buy→exchange loop with multi-tier OVR rotation. ## Changes ### Bug Fixes - Fixed `_is_on_exchange_grid()` to require `Exchange Value` card labels, distinguishing the card grid from the Exchange Players list page (`d4c038b`) - Added retry loop (3 attempts, 2s apart) in `ensure_on_exchange_grid()` for variable load times - Added `time.sleep(2)` after tapping into the Gold Exchange grid - Removed low-OVR bail logic — the grid is sorted ascending, so bail fired on first screen before scrolling to profitable cards - Fixed buy-orders market scroll — retry loop attempts up to 10 scrolls before giving up (was 1) (`6912a7e`). Note: scroll method itself was still broken (KEYCODE_PAGE_DOWN); fixed in 2026.4.01 release. - Restored `_has_low_ovr_cards` fix lost during PR #2 merge (`c29af78`) ### New Features - **`grind` command** — automated buy→exchange loop with OVR tier rotation (`6912a7e`) - Rotates through OVR tiers in descending order (default: 79, 78, 77) - Buys 2 tiers per round, then exchanges all available dupes - Flags: `--ovrs`, `--rounds`, `--max-players`, `--max-price`, `--budget`, `--max-packs` - Per-round and cumulative summary output - Clean Ctrl+C handling with final totals ### CLI Changes - Renamed `grind` → `exchange` (bulk exchange command) - Removed redundant single-exchange command (use `exchange 1` instead) - `grind` now refers to the full buy→exchange orchestration loop ## Known Issues - Default price gates (`MAX_BUY_PRICES`) may be too low during market inflation periods. Current gates: 79→170, 78→140, 77→125. Use `--max-price` to override. - No order fulfillment polling — the grind loop relies on natural timing (2 buy rounds ≈ 2-5 min gives orders time to fill)