Release notes

Draft Omen 0.5.0

Released on .

  • Player-facing text now calls set profiles “ratings”. The desktop status banner and Settings, the TUI, plain watch and the README use the new word. Code, URLs, manifest keys, cache paths and CLI commands keep “profile”. (#820)

  • Add Reality Fracture (FRA) card data and early Premier, Traditional and Pick-Two profiles. Scryfall has no Arena ids for FRA yet, so this one-time export takes the 280 FRA Arena ids from 17Lands ratings and matches them to Scryfall prints by name. The 10 Special Guests cards are left out, as in other sets, and so are basic lands, because 17Lands does not rate them. The daily refresh keeps this file until it is invalid, so a later re-export with Scryfall’s own ids is a manual step.

  • The README, PRD, website and Store listing now describe Quick, Premier, Traditional and Pick-Two drafts instead of Quick Draft only. The README has a format table and names the limits of human drafts, including that Traditional drafting has no real Arena log sample yet. The log-format document covers format detection from event metadata, the 1-based human-draft coordinates, picks with one or two cards and the UTC_Log thread prefix. Pick scoring and audit documents explain the ratings fallback table and how a Pick-Two pick counts against the recommendation. The package, Windows app and draftomen-tui --help descriptions now read “draft assistant”. A new rule in AGENTS.md and the README forbids committing or publishing raw Arena logs, anonymised third-party samples or player-identifying data. (#264)

  • A human draft whose log skips a pick submission now saves Arena’s full CardPool from DraftCompleteDraft as its pool, so a Pick-Two draft with one missing request keeps all 42 cards instead of 40. The missing pick stays empty. The pool updates when the CardPool arrives after the draft already completed, and replay and plain watch print a second “Draft complete” line that counts the added cards. A CardPool that lacks a recorded card leaves the saved pool unchanged and logs a warning. (#800)

  • Mocked Draft can run a Pick-Two draft with a 4-seat pod and two cards per pick, chosen separately from Manual and Auto. The Mocked Draft dialog has a Format selector, and a manual Pick-Two pick stages the first card before the second press submits both. Quick Draft keeps its 8-seat pod and one card per pick. The test-draft command takes --format quick or --format pick_two, and a Pick-Two trace line lists both cards. Premier and Traditional are not offered, because bots would only relabel a Quick Draft. (#658)

  • Premier, Traditional and Pick-Two drafts are supported end to end, checked on real Arena logs in plain watch, the TUI and the desktop app. The parser now reads the “Entering table draft queue” scene line, for example MSH_Premier_Draft or HOB_PickTwo_Draft, as the draft event when a log has no EventJoin line. An EventJoin for the same set and format keeps its dated event name. scripts/verify_real_logs.py prints the format, packs, logical picks, cards, gaps and completion of each local private log without card IDs or UUIDs. (#779)

  • Add hand-written synthetic fixtures for a complete Premier, Traditional and Pick-Two draft, each running from ingestion to plain watch and replay output. Pick-Two ends with 21 logical picks and 42 cards, the one-card formats with 42 picks and 42 cards. Tests derive the variants from these fixtures: thread prefix, missing first notify, missing submission, failed pick response, repeated notify, truncated last line, and completion with and without DraftCompleteDraft. (#778)

  • The desktop live view names the detected draft format and shows pack and pick progress from the draft rules, for example “Pack 1 of 3 · Pick 4 of 7 · take 2 cards” in Pick-Two. The recent picks gallery lists every card of a logical pick. The pre-draft view and the waiting status no longer mention Quick Draft: they read “Ready for your next draft” and “Waiting for a draft.”, and name the format once it is known. (#777)

  • The desktop GUI adapter state gains a draft_progress block with the draft format name, pack and pick coordinates, and the pack count, picks per pack and cards per pick from the active rules. An unknown format publishes a neutral block with every value empty. The pool gains recent_logical_picks, which groups recent picks by logical pick so a Pick-Two pick lists both cards. Existing state keys are unchanged. (#776)

  • The TUI names the detected draft format in the waiting title, the detected title, and the status bar, and opens with a neutral “Waiting for a draft” state. The pack title shows progress from the draft rules, for example “Pack 1 of 3, Pick 4 of 7, take 2 cards” in Pick-Two. The pool summary shows the last pick with every card, and Pick-Two pool counts read “8 cards from 4 picks”. Quick Draft counts stay unchanged. (#775)

  • watch --plain names the draft format in each pick status line and shows pack and pick progress from the draft rules, for example “Pack 1 of 3, Pick 4 of 7, take 2 cards” in Pick-Two. A Pick-Two pick prints both cards on one “Chosen cards” line. Watch opens with a neutral “Waiting for a draft.” line, and a Quick Draft start adds a format summary line. (#774)

  • Backtest uses the draft rules for logical pick counts and scores Pick-Two selections against the top recommendation. Reports show both selected cards, and scoring keeps the saved pool before each pick. Quick Draft output stays unchanged. (#773)

  • Replay names the draft format and uses its rules for pick counts. Pick-Two selections keep both cards at one coordinate. Audit records include the format and count how many of the top two cards in the active ranking were selected. Quick replay intentionally gains a format header. (#772)

  • Live draft progress and pool ledger totals follow the active draft rules. Pick-Two records 21 logical picks and 42 cards, and pending recovery keeps its format, coordinates and selected cards. Mocked Draft keeps its 13 or 15 picks per pack. (#771)

  • Live Premier, Traditional and Pick-Two drafts load card data on the first offered pack, so recommendations and watch --plain scored rows appear without a restart. The load permits networking as Quick Draft detection does, then later packs and retries use local data only. (#801)

  • The live session now loads set profiles and ratings for the detected draft format instead of always asking for QuickDraft. Quick uses QuickDraft, Premier uses PremierDraft, Traditional tries TradDraft then PremierDraft, and Pick-Two tries PickTwoDraft then PremierDraft. The local cache and the hosted refresh both follow that order, and an exact profile replaces a fallback one when it appears. Snapshots expose the detected format, and the contextual evidence status reports a fallback. Rating labels name the format that supplied the rating, such as Trad, and add * to a fallback, such as Premier*, so Quick Draft cards now read Quick instead of Profile. An augmented model is used only when it was trained on the draft’s own format or on PremierDraft; otherwise Augmented Intelligence reports it as unavailable for that format. (#770)

  • The log parser now reads human-draft picks and completion for Premier, Traditional and Pick-Two drafts. Each successful EventPlayerDraftMakePick request becomes one pick with 0-based pack and pick numbers, holding one card or two for Pick-Two. A rejected pick is dropped, and a repeated request or response counts once. A pick with no logged response is still recorded. The draft completes once, from the last pick response or from DraftCompleteDraft, with the picks the parser recorded. A missing pick stays a gap. The card pool Arena reports is only compared with those picks, and a mismatch writes a warning to the log. Human-draft packs now carry the pool picked so far, so the pool store accepts them. Malformed or unknown human-draft lines are ignored. (#259)

  • Live Draft keeps the two-column layout on laptop screens such as 1352x799. The card details column shrinks from 550 px to 350 px before the view switches to stacked tabs, and the card preview gives up height before the pool summary, so the whole mana curve stays visible. Windows narrower than about 1240 px or shorter than about 770 px still use stacked tabs. (#242)

  • Errors the live session shows, such as a failed ratings or card data download, a failed deck build or a failed backtest, are now written to ~/.draftomen/logs/draftomen.log with their code, id and message. Each error is logged once when it first appears. Recoverable errors log at WARNING and others at ERROR. (#796)

  • Settings has a Troubleshooting card with an “Open logs folder” button. It creates ~/.draftomen/logs if it is missing and opens it in the file manager. If the folder cannot be opened, Settings shows the folder path in an error message. The README now has a Troubleshooting section that lists the files to attach to a bug report and where they live on macOS and Windows. (#792)

  • Draft Omen now writes a rotating application log to ~/.draftomen/logs/draftomen.log. The desktop app and draftomen-tui share the file. Each run starts with a line holding the app version, the OS and the Python version. The log records unhandled exceptions from the main thread and worker threads with their tracebacks, Qt warnings, and the errors the desktop app also prints to stderr. The file rotates at 1 MB and keeps three older files. If the logs folder cannot be created, the app still starts and prints the reason to stderr. The log never copies Player.log lines. (#791)

  • The draft audit log now records multi-card picks. choice_made records store a selected_grp_ids list in place of chosen_grp_id, and the audit schema moves to version 2. recommendation_followed is true when the recommended card is one of the selected cards. Existing schema 1 logs stay readable without being rewritten, and a rescan does not duplicate their choices. docs/draft-audit-log.md describes the schema 2 record. (#783)

  • Windows releases now ship only through the Microsoft Store. Stable GitHub Releases and the rolling development prerelease no longer publish the unsigned Windows .exe, and their checksum files list only the macOS DMGs. The Windows job still builds and smoke-tests the executable and the MSIX, and uploads both as Actions artifacts for testing and Store submission. The README, release guide, desktop bundle guide and release skills now point Windows users to the Store listing. docs/microsoft-store.md adds a table for the manual install and update check on a Windows 11 device. (#330)

  • docs/microsoft-store.md now explains how to publish each release to the Microsoft Store by hand in Partner Center. Store updates stay manual because the Store Developer CLI needs a Microsoft Entra tenant, and Microsoft’s tenant sign-up does not finish without a payment card. (#329)

  • The website’s Windows button now opens the Microsoft Store listing in place of the unsigned .exe release asset, and the install note says Windows installs come from the Store. The home page shows one button per platform: macOS for Apple Silicon and Windows for the Store. The Intel macOS build moves to a text link below the buttons. The release output check fails if the Windows button points anywhere else or if any page links to a .exe. (#761)

  • Draft Omen 0.4.2 is live in the Microsoft Store: https://apps.microsoft.com/detail/9NPCD3VLZQMX. docs/microsoft-store.md records the published package, its checksum and the certification history. (#328)

  • Draft state files now store each pick’s cards as a selected_grp_ids list, so a Pick-Two pick keeps both cards at one pack/pick coordinate and adds both to the pool once. The state schema moves to version 2. Version 1 files load through a migration and are saved as version 2 on the next change. Replaying the same pick is a no-op, and a different selection at the same coordinate raises the existing conflict error. DraftState gains selected_card_count beside the logical chosen_pick_count. Backtest reports skip multi-card picks with the reason multi-card pick. Quick Draft output is unchanged. (#769)

  • PickMadeEvent now carries selected_grp_ids, a non-empty tuple of Arena grpIds, in place of chosen_grp_id, so one event can describe a Pick-Two pick. The Quick Draft parser and the Mocked Draft adapter emit a one-card tuple. The pool state still stores one card per pick and raises an error for a pick with more cards. Quick Draft replay, audit and backtest output is unchanged. (#768)

  • The log parser now reads human drafts. A new draftomen/draft_format.py defines the pack rules for Quick, Premier, Traditional and Pick-Two drafts and maps the QuickDraft_, PremierDraft_, TradDraft_, PickTwoDraft_ and PickTwoTradDraft_ event prefixes to them, longest prefix first. Draft.Notify lines become pack-offered events with 0-based coordinates, and a notify that Arena logs twice yields one event. A draft that starts at pack 1 pick 2 works. Unknown event prefixes and malformed notify lines are ignored. Lines that start with a [<thread>] prefix, as in Arena’s rotated UTC_Log files, parse like the plain lines. Quick and Mocked Draft parsing is unchanged. (#261)

  • Ruff now lints Python code with the F, E4, E7 and E9 rules. A pre-commit hook runs ruff check on staged files, and the nox ci session runs it on the whole repository. The 36 existing findings are fixed. Three tests that had lost their final assertions check their results again. (#750)

  • draftomen-tui build-augmented-set now reports progress while it checks the rows of the draft and game dumps. It prints a line at most every 10% of the file read or every 5 seconds, with the rows checked so far, and a final line with the total rows. A dump reused from the input cache shows the same lines. (#753)

  • Manual native bundle builds now keep Nuitka’s cache between runs, keyed by runner OS, architecture, Python version, Nuitka version and uv.lock. The macOS jobs install ccache, and the Windows job uses Nuitka’s clcache. Tag release builds skip the cache and always compile from scratch. (#736)

  • The MSIX package now holds a Nuitka standalone build, with DraftOmen.exe next to its DLLs, instead of the onefile executable. Antivirus engines, including the Microsoft Store malware scan, flagged the onefile build. (#764)