Repository navigation
Releases: andreagrandi/draftomen
Releases · andreagrandi/draftomen
Release list
v0.6.4
- Stable GitHub Releases and the rolling development prerelease publish the
unsigned Windows.exeagain next to the Microsoft Store listing. The
checksum files list it. - On Windows, replaying a Player.log that holds several drafts of the same
event no longer stops with "Could not append draft audit record". Draft ids
that Draft Omen makes up for these drafts no longer contain colons, and a
new draft whose id has a character Windows forbids in file names now fails
with a clear error. Drafts saved earlier keep loading. (#915) - On Windows, a draft that an earlier version saved with colons in its id
now records audit entries and shows pick recommendations again. Its audit
log file name uses underscores instead of colons. On macOS, an existing
audit log with colons in its name keeps receiving new records. - Dismissing an error that is already gone, such as with a second click on
the dismiss button, no longer logs "Unknown session error" or shows a
background work failure. - The website publishes the latest released version at
https://www.draftomen.com/version.json, so the desktop app can check for
updates. The release output check fails when the file is missing or out of
date. (#919) - Draft Omen can check
version.jsonon the website for a newer release on a
background thread. Network errors, HTTP errors, a bad response and an
unknown installed version log a warning and report no update. (#920) - The desktop app checks the website for a newer release when it starts. If
one exists, an "Update available" dialog names both versions and links to
the website, the Microsoft Store listing and the GitHub releases page. The
dialog appears at most once per launch, and the smoke and screenshot modes
skip the check. (#921) - Draft Omen now loads card data for a Quick Draft pack when the log has no
event join or course line for that draft. Before, those packs got no
recommendations, anddraftomen-tui watch --plainstopped with "Shared live
session did not score the offered pack". (#918)
v0.6.3
- Draft Omen no longer fails to start the live session when you have
completed the same event more than once. It now matches a replayed pack to
the saved draft that recorded it, or else to the most recently updated
one. If re-reading the Arena log at startup still fails, the app shows the
error and keeps following Arena and Moxgate drafts. (#909)
v0.6.2
- The Intel macOS app no longer hangs at startup with the Dock icon bouncing
on macOS 26. On Intel Macs Draft Omen now verifies HTTPS with its bundled
certificate file instead of the system trust store. (#905) - A release no longer updates the website. The release workflow stops checking
website/package.jsonand the news page. The website version and news page
move to a separate pull request merged after the GitHub Release is
published, so the site's macOS download links never point at a release that
does not exist yet.
v0.6.1
draftomen-tui replaynow scores a draft with the profile for its own
format, such as Pick-Two with a Premier fallback, instead of always the
cached Quick Draft profile. It fetches the hosted profile when needed. The
new--offline-profilesoption keeps it on the local cache. (#900)- Card data export now adds the basic lands that 17Lands
cards.csvlists
and Scryfall has no Arena id for. The newexport-set-data --cards-file
option reads a local copy instead of downloading it. The hosted Reality
Fracture card data now has its 25 basic lands, so they readBasicand
score 0 instead of showing as "Unknown card" with a neutral score. (#895) - Pick-Two and Traditional profiles now use PremierDraft ratings and pair
rates for cards and color pairs that have no usable data in their own
format, as Quick Draft profiles already did. Such cards no longer get the
neutral prior and now readPremier*. Older Draft Omen versions reject
these profiles and keep their cached Pick-Two or Traditional profile until
updated. (#896) - A draft played before Arena logs an account id, as happens after a saved-token
login, is now saved under the first account id that the same login reports.
Recovery, the audit log, backtest anddraftomen-tui replaynow see that
draft. A later login with another account does not take it over. (#894) - When Draft Omen is not running, the Moxgate popup now shows how to start it
from the desktop app, by choosing Moxgate in the draft source selector, as
well as thedraftomen-tui watch --source moxgatecommand. (#887) - The Moxgate extension has the Draft Omen icon in the Chrome toolbar and on
the extensions page. The popup shows the icon and name in a header, a green
or red dot for whether Draft Omen is running, and follows the system light or
dark appearance. (#885) - The Moxgate extension now sends the latest snapshot again every 2 seconds
while Draft Omen does not answer, so Draft Omen shows the current pack when
it starts after the draft page is already open. It stops once Draft Omen accepts or rejects
the snapshot, a newer snapshot replaces it, or the Moxgate page closes. The
popup shows that the pick is waiting for Draft Omen. (#886) - The app log now records the Arena log file being followed and, for each new
draft, the set, event and format. It also records where card data came from,
the cache or a download with the artifact checksum, and which ratings
version is in use. A card image host that keeps failing logs one warning and
a count of later failures. Preferences that cannot be loaded or saved log a
warning. (#880) - Fixed the macOS app failing to verify HTTPS certificates on Macs without
Homebrew OpenSSL. Card data, ratings, 17Lands data and card images could not
download there, because the bundled OpenSSL looked for its certificate file
in a Homebrew folder. The app now uses the system certificate store and falls
back to the certifi file it bundles. (#879) - The app log now says why a hosted download failed. Card data, the sets
manifest, ratings and the augmented model each log the URL and the cause,
such as an HTTP status or a certificate error. A ratings refresh that ends
with problems logs them in one line. The startup lines also say whether the
app runs as a bundle and which certificate file OpenSSL uses. An unexpected
error in a desktop app worker now writes its traceback to the log. (#878) - Draft Omen tells you when Arena's Detailed Logs are turned off. Arena still
writesPlayer.logwithout them, so before this change the app waited for a
draft that never showed up. It now reads the header Arena writes at startup,
shows a dialog with the steps to enable Detailed Logs (Plugin Support) and
restart Arena, and keeps the same guidance in the main window. The dialog
and the guidance clear once Arena restarts with the setting on. - The live draft view keeps the card list beside the card details and pool
panels when the window is short, as on a 14-inch laptop. The card list
scrolls, the pool panel shrinks and scrolls, and the view only switches to
the stacked layout when the window is too narrow. - Quick Draft uses the PremierDraft ratings when a set has no QuickDraft
profile yet, as Traditional and Pick-Two already do. Arena opens Quick Draft
weeks after a set releases, so Quick Drafts and Moxgate drafts of a new set
such as FRA showed neutral scores for every card. The ratings read
Premier*until a QuickDraft profile is published. When no format has a
profile, the ratings status says none are published yet instead of saying
the refresh failed. (#871) - Moxgate drafts no longer need a Scryfall bulk file. Draft Omen matches each
card by the Scryfall id in its hosted card data, or by name for other
printings, so sets such as FRA that Scryfall has no Arena ids for work on
release day. (#868) - When Draft Omen rejects a Moxgate snapshot, for example because a card is
unknown, the desktop app shows the reason under the Moxgate status and the
TUI shows it in the status line. The status stays on waiting until a
snapshot is accepted, and the next accepted snapshot clears the error.
(#869) - The app loads hosted card data files that contain fields it does not
know, so future card data can add fields without breaking this version.
Required fields are still checked, andexport-set-datastill rewrites
any file that is not exactly in the current format. Versions 0.6.0 and
earlier still reject unknown fields. (#867)
v0.6.0
scripts/patch_scryfall_arena_ids.pyadds Arena ids from 17Lands card
ratings to Scryfall default-cards data. Use its output with
export-set-data --bulk-filefor a set Scryfall has no Arena ids for.
docs/set-profiles.mddescribes the steps. (#861)- The daily profile refresh uses the committed card data for a set when
Scryfall has no Arena ids for it, so sets such as FRA no longer fail with
card-metadata-unavailable. The refresh summary lists the sets that used it. - Draft Omen keeps following a human draft after Arena restarts in the
middle of it. The parser picks the draft up from the in-progress course in
the EventGetCoursesV2 course list, so the packs after the restart show up.
Arena does not log the picks made before the restart. When Draft Omen saved
them before the restart, recommendations and the pool still use them, and
the full pool from DraftCompleteDraft fills any gap at the end. (#856) watchandreplayno longer fail in the middle of a human draft when
Arena answers a failed pick with the table state. The parser drops the
failed pick and records the card from the resubmitted request. Other
unknown pick response bodies are ignored. (#855)- Before the first draft arrives,
draftomen-tui watch --source moxgatesays
it is waiting for the Moxgate extension to send a draft instead of waiting
for Arena. (#851) - The desktop app no longer has a Mocked Draft button in the header. Mocked
Draft is now an option in the draft source selector next to Arena and
Moxgate, and choosing it opens the Mocked Draft dialog. With Moxgate
selected, the account shows asmoxgateand cannot be changed. (#850) - The TUI Moxgate snapshot test waits for the receiving phase as well as the
rendered pack. The pack can render before the phase changes, which failed
at random on a busy CI runner. draftomen-tui watch --source moxgateshows Moxgate drafts in the TUI.
--plainis no longer required. Quitting the TUI stops the receiver and
frees the port. (#833)- The TUI account-cycling tests wait for the ChooseAccount worker to finish
after pressing "a" instead of pausing once, which failed at random on a
busy CI runner. - The desktop app has a draft source selector next to Settings. Choosing
Moxgate starts the receiver on 127.0.0.1:47326 and shows whether it is
loading card data, waiting for the extension or receiving a draft. Choosing
Arena stops the receiver and frees the port. A port already in use shows an
error naming the port. Card data comes from the Mocked Draft Scryfall bulk
file set in Settings or passed with--scryfall-bulk-file. (#829) draftomen-tui watch --source moxgate --plainsaves Moxgate drafts under the
fixed account idmoxgateand prints a deck build sheet after "Draft
complete". Moxgate snapshots carry no account id, so these drafts were not
saved before. (#839)- The Qt adapter startup coalescing test waits for the post-start state to
arrive instead of reading the observed states as soon as the session is
ready, which failed at random in the parallel CIguijob. Theguinox
session now runs the Qt test files one at a time, because several of them
failed at random with parallel workers on the 4-core CI runner. Other tests
still run in parallel. - A Chrome extension in
extensions/moxgatereads the Moxgate draft page and
posts each pack and pool todraftomen-tui watch --source moxgate --plainon
127.0.0.1. Load it unpacked from chrome://extensions. Its popup shows whether
Draft Omen is running and what happened to the last snapshot. A newextension
CI job runs its tests. (#828) draftomen watch --source moxgate --plainstarts the Moxgate receiver
instead of following Player.log and shows recommendations for each pack the
browser extension posts.--moxgate-portoverrides the default port 47326.
Card data for all sets comes from one local Scryfall bulk file,--bulk-file
or the Mocked Draft download in the app dir, and watch fails at startup when
that file is missing. The Moxgate source needs--plainfor now. (#832)- Tests run in parallel with pytest-xdist by default. The full suite takes
about a quarter of the time it took before on a 10-core machine. Pass-n 0
to run tests one at a time. The Moxgate receiver also checks for shutdown
every 0.05 seconds instead of 0.5, so stopping it is faster. The CItests
job no longer runs the Qt test files, which theguijob already runs, and
a Qt adapter test now waits for each published state before reading it. - Add a loopback receiver for Moxgate snapshots. It listens only on a loopback
address, acceptsPOST /moxgate/snapshotfromchrome-extension://origins
that send theX-Draftomen-Moxgateheader, caps the body at 256 KiB and
answers a malformed snapshot with 400. Accepted snapshots go on a queue that
the session thread turns into draft events. Nothing starts the receiver yet.
(#831) - Add a Moxgate snapshot adapter that turns successive draft page snapshots
into the existing draft events. It derives each pick and its pack and pick
coordinates from the change between snapshots, and rejects out-of-order,
skipped or unresolvable snapshots with an error. (#826) - The website has a News page that shows the release notes of each version,
taken from this changelog. Releases now write the page with
scripts/write_release_news.py, and the release check fails if it is missing.
v0.5.0
- 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 theUTC_Logthread 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 --helpdescriptions now read "draft assistant". A new rule
inAGENTS.mdand 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
CardPoolfromDraftCompleteDraftas 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 theCardPoolarrives after the draft already
completed, and replay and plain watch print a second "Draft complete" line
that counts the added cards. ACardPoolthat 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. Thetest-draftcommand 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_DraftorHOB_PickTwo_Draft, as the draft event when a log
has noEventJoinline. AnEventJoinfor the same set and format keeps
its dated event name.scripts/verify_real_logs.pyprints 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 withoutDraftCompleteDraft. (#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_progressblock 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 --plainnames 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 andwatch --plainscored 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 usesQuickDraft,
Premier usesPremierDraft, Traditional triesTradDraftthen
PremierDraft, and Pick-Two triesPickTwoDraftthenPremierDraft. 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 asTrad, and
add*to a fallback, such asPremier*, so Quick Draft cards now read
Quickinstead ofProfile. 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 successfulEventPlayerDraftMakePick
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 fromDraftCompleteDraft,
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.logwith 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/logsif 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 anddraftomen-tuishare
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 copiesPlayer.log
lines. (#791) - The draft audit log now records multi-card picks.
choice_maderecords
store aselected_grp_idslist in place ofchosen_grp_id, and the audit
schema moves to version ...
v0.4.2
- Add
docs/microsoft-store.mdwith what the first Microsoft Store
submission needs: the Store listing text, runFullTrust justification,
certification notes, age rating guidance and a publication record to fill
in. Add Store screenshots rendered from a recorded MSH Quick Draft, two of
them without card art. (#328) - The Windows CI job now builds the MSIX with MakeAppx and zips it into a
.msixupload. It installs a test-signed copy, runs the mock smoke test from
the installed package, and removes the package. It then uploads the
.msixuploadand the SHA-256 of the.msixinside it as a CI artifact.
(#756) - Add the Microsoft Store MSIX package definition for the Windows app: a
manifest with the Partner Center identity, the Store logos, and
scripts/msix_package.py, which stages the package folder, mapsX.Y.Zto
X.Y.Z.0, and rejects a release version that does not increase. (#755) - WOE now has a published augmented model with a Card Pairs table. On held-out
PremierDraft picks, Pool Shape raises top-1 from 0.4912 to 0.5398 and MRR
from 0.6692 to 0.7110 over Basic DO. The Card Pairs test passed with a
held-out gap of +3.88 pp [+3.56, +4.26]. At the selected weight of 0.25,
pairs raise top-1 to 0.5424 and MRR to 0.7127. - When the Card Pairs correction moves a card up the ranking, the GUI card
preview and the TUI focused card details show "Pairs well with ". The
named card is the pool card with the largest pair score. Cards that pairs did
not move up show no line. (#745) - The TUI can now use Augmented Intelligence. The configuration opened with
chas an Augmented Intelligence switch, off by default and saved in
tui-preferences.json. When it is on, the TUI loads the set's model, from the
cache or the published manifest, and DO scores include its adjustment. (#745) - Pick scores now use the Card Pairs table to break close calls. Each offered
card gets the sum of its pair scores against the current pool, centered on
the pack average, times a weight, and clipped to ±8 points. The Card Pairs
and Pool Shape corrections together stay within ±8 points. The build picks
the weight with the best validation MRR, then top-1, where weight zero is
Pool Shape alone. It stores the weight in the table and prints it with
held-out top-1 and MRR with and without pairs. An artifact without a table, or with a table that
has no weight, scores as before. (#744) build-augmented-setnow also downloads the set's 17Lands game dump
through the checksummed draft dump cache. It builds a Card Pairs table from
games drafted before Model C's validation period and tests it on the later
games. The table is published under the artifact'strainingfield only
when decks with better pairs win more games than decks of equal card
strength in the same colours and player rank, with a 95% lower bound above
zero. A failed test publishes the model without a table. The build prints
the gap, its range and the result. Released clients still load the
artifact, because they accept any object undertraining. (#743)build-augmented-setnow matches pool columns to pack columns by card name,
so dumps such as WOE that list them in a different order load. It still
fails when the two column sets name different cards. (#741)- Add
scripts/compare_augmented_candidates.py, an offline spike that ranks
held-out picks with three candidate models next to Basic DO and Pool Shape,
the name now used for Model C. Card Pairs scores cards by how often they win
together in 17Lands game data. Player Picks learns the card players take
from the exact pack and pool, and Winner Picks does the same from 7-win
drafts only. The script uses Model C's chronological split and reports
top-1 and mean reciprocal rank with bootstrap ranges, a view limited to
7-win drafts, and the rank-adjusted win-rate gap of drafts that followed
each candidate. Its--games-onlymode tests the pair signal on held-out
17Lands games: whether decks with better pairs win more than decks of equal
card strength in the same colours and player rank. It reorders pool columns
for dumps such as WOE that list them in a different order. No app code
changes. (#717) - Show 17Lands card-rating counts in the Profile Refresh summary. Each
successful set and format pair lists the fetched rows, the rows accepted
into the profile, and the rejected rows grouped by reason. It also says
whether those counts add up and how many profile ratings came from other
formats. The static card-data counts are now labelled as set artifacts.
(#402) - Update the release skill for signed macOS releases: the new asset names, the
run time, and a check that a downloaded DMG is notarized and stapled. - Fix a segfault when the live adapter shuts down while its worker thread is
finishing.shutdown()now queues the stop through an adapter signal
instead of calling the worker, which the thread may be deleting. (#727)
v0.4.1
- Publish the signed macOS DMGs as
draftomen-vX.Y.Z-macos-arm64.dmgand
draftomen-vX.Y.Z-macos-x86_64.dmg, and the checksum file as
draftomen-vX.Y.Z-sha256sums.txt. The Windows executable keeps its
unsignedname. The website download buttons, the README and the release
docs use the new names. The README covers installing, Gatekeeper and
notarization troubleshooting, and uninstalling, anddocs/releasing.md
adds a post-release check that opens a browser-downloaded DMG on a Mac that
has never run Draft Omen. (#730) - Sign, notarize and staple the macOS DMGs in tag releases.
release.yml
callsnative-bundles.ymlwithsign_macos: true, and only the macOS jobs
of that call use themacos-releaseenvironment. Each job builds with
Nuitka's Developer ID signing, copies the verified app toDraft Omen.app
withdittoso the data-file signatures survive, signs and notarizes the
DMG, and runs the smoke test on the app inside the stapled DMG. An
always-run step deletes the temporary keychain and credential files.
The mounted smoke test now retries a busyhdiutil detachbefore forcing
it. Development builds stay unsigned. The release asset names still say
unsigneduntil #730 renames them. (#729) - Document the macOS signing credentials in
docs/releasing.md: the
Developer ID Application certificate, the App Store Connect Team API key,
the protectedmacos-releaseenvironment that onlyv*tags can use, the
secret and variable names, and how to rotate or revoke each credential.
(#728) - Stop publishing Draft Omen to PyPI and Homebrew. A tagged release now only
builds the native macOS and Windows bundles and attaches them to the GitHub
Release. The release workflow drops the wheel build, the wheel smoke tests,
the PyPI publish job, and the Homebrew job.homebrew.yml, the formula
template,scripts/render_homebrew_formula.py, andtests/package_smoke.py
are removed. Version 0.4.0 stays on PyPI and in the Homebrew tap but gets no
further updates. The README now points to the GitHub Release downloads. - Fix the Homebrew formula build.
bidict, a dependency of
python-socketio, builds withuv_build, which Homebrew compiles from
source with Rust. The formula now declaresrustas a build dependency.
v0.4.0
- Publish an Intel macOS DMG next to the Apple Silicon one. A second macOS
build job runs on themacos-15-intelrunner, and each macOS job fails when
lipo -archsreports the wrong architecture for the app executable. The
macOS release assets are now namedunsigned-macos-arm64.dmgand
unsigned-macos-x86_64.dmg, the checksum file lists both, and the website
offers both downloads. (#347) - Fix the Windows native build, which had two separate faults:
- Since #332 it failed its bundled-profile check. A Windows checkout
converted line endings in the HOB profile snapshot and the bundled
baseline profile, so their bytes no longer matched the recorded sizes and
SHA-256. A new.gitattributesturns off line-ending conversion for
profile-snapshots/anddraftomen/baseline_profiles/. - Since #555 the built executable failed to start because the
pyside6-deployspecs excludedQtTest, which removedQt6Test.dll
whileqt_gui.pyimportsPySide6.QtTest. The specs no longer exclude it.
- Since #332 it failed its bundled-profile check. A Windows checkout
- Add a Sets page to the website at
/sets/, linked from the navigation. It
lists the supported sets, those with card data and 17Lands ratings, and
marks the ones with an augmented model. A second list shows the sets that
have no 17Lands ratings yet. (#707) - Load per-set card data in the CLI
replay,build,backtest,
benchmark-picksandrefresh-structure-targetscommands, the same data
the desktop app uses. They no longer read~/.draftomen/carddb.json, and
ratings metadata recovery no longer writes it.--bulk-filestill
replaces the card data for fixtures and CI.refresh-datanow only prints
that card data downloads per set, and an existingcarddb.jsoncan be
deleted. (#706) - Keep pipeline caches out of the user data directory.
build-augmented-set
now caches draft dumps in.draftomen/corpus-cache/profile-input-cache, and
refresh-profile-datacaches 17Lands ratings in
.draftomen/corpus-cache/17lands, both relative to the working directory.
Both commands take--cache-dirto use another root, and
refresh-profile-datano longer accepts the hidden--app-diroption.
Nothing writes~/.draftomen/profile-input-cacheor
~/.draftomen/set-enrichmentany more, so both can be deleted.
~/.draftomen/17landsstays for the CLIbuild,replayandbacktest
ratings. (#705) - Check downloaded card data against the sets manifest. With network access,
the card-data client readssets/manifest.jsononce per client, rejects a
download whose SHA-256 differs from the manifest, and downloads again when a
cached file no longer matches it. A failed update keeps the valid cached
file, and an unreachable manifest leaves cached sets in use. (#704) - Publish
sets/manifest.jsonon the website. It lists every set with card
data, and gives each set's name, card-data URL, size and SHA-256, profile
formats with their maturity, and augmented model metrics.export-set-data,
build-augmented-setand the Profile Refresh publication regenerate it.
(#703) - Make
build-augmented-setreport its progress. It prints one line as each
stage starts, the dump download at most every 10% and 5 seconds, and how
many picks training and evaluation use. Basic DO scoring now reports in 25%
steps instead of once per 5,000 picks. (#710) - Publish the DFT PremierDraft augmented model. On 889,392 held-out picks it
raises Basic DO top-1 from 0.520 to 0.562 and mean reciprocal rank from
0.690 to 0.726. - Make
build-augmented-settrain against the set profile the website
publishes inwebsite/public/profiles, with its checksums verified. It used
to read only the local app cache and fall back to a generic profile without
ratings, which calibrated DFT against the wrong baseline and reported it
only after training. The build now stops before any download when the set
has no published profile with ratings, and stops before training when the
dump's format has none. - Let
build-augmented-settrain on draft dumps with bonus-sheet cards that
the set card data does not list, such as the 10 DFT Special Guests. Their
metadata comes from the local Scryfall bulk file, preferring an Arena
printing, and the set's own printing wins when both exist. (#715) - Raise the profile input cache limits to 300 MiB per entry and 1 GiB in
total. The DFT PremierDraft public draft dump is 205 MB, so the old 128 MiB
limit rejected it andbuild-augmented-set DFTtrained on the much smaller
TradDraft dump instead. - Let
build-augmented-setread 17Lands draft dumps that have nopick_2
column. 17Lands added that column for Pick Two Draft, so older dumps such
as DFT failed with "Draft dump is missing required columns: ['pick_2']".
Without the column, no row counts as a second pick. - Make the weekly historical profile refresh process at most 6 set and format
pairs per run, keeping each set whole, and skip pairs that already have a
published profile. The old run refreshed all 128 historical pairs at once,
17Lands stopped answering after about 105 requests, and the run published
nothing. A
historical pair with no 17Lands games, such as IKO TradDraft, is now listed
as skipped and no longer fails the run. (#709) - Close the Mocked Draft dialog once the draft started from it is under way,
so the live drafting view is visible. A failed start keeps the dialog open
with its error, and reopening the dialog during a draft to leave it keeps it
open. - Let Mocked Draft offer booster cards that the set card data does not list,
such as SPG, MUL, BIG, and OTP bonus-sheet cards and 32 KTK cards. A card
maps to another Arena printing of the same card when the set has none, and
its metadata comes from the local Scryfall bulk file, or from the card
fields Draftmancer sends when the printing never reached Arena. These cards
carry no ratings and score the neutral prior. (#696, #697) - Make the GUI replay smoke check wait for a pending hosted profile refresh
before it captures. A fast replay finished before the MSH profile download,
so the check showed fallback ratings even though the session adopts the
profile once it arrives. (#683) - Let Mocked Draft play Draftmancer packs that are not 14 cards. Pack events
carry the pack size, and the pick stage, remaining picks, and pool ledger use
it, so 15-card sets such as LCI and 13-card sets such as BLB draft all 45 or
39 picks and reach a deck build. Arena drafts keep 14-card packs. (#695,
#682) - Fix Mocked Draft booster cards that failed to map to an Arena card. The
Scryfall mapping now reads every set in the bulk file, uses the first face's
oracle id when the card has none, and picks the lowest Arena id when a card
has several Arena printings, such as the LCI Travel Poster basics. This fixes
booster decoding for LCI, M21, and SNC and startup for TDM and ECL. Booster
errors now name the card by name, set, and collector number. (#682) - Add a QML regression test showing that the Mocked Draft set selector keeps
the chosen set, such as LCI, through state updates and after Start, and that
Start sends that set. The fix shipped with the set picker in #688. (#681) - Make "Refresh hosted ratings" work during a Mocked Draft. The refresh now
uses the simulated set's profile client and updates only the Mocked Draft
session, so the Arena profile is never touched. If no hosted profile exists,
the ratings banner says so, and fallback scores stay active. (#687) - Remove the "DO recommendation" comparison sentence and the repeated
"Pack 1, pick 6." status line from the desktop Live Draft header in wide
and narrow layouts. The pack heading, ranked cards, and controls stay. (#655) - Remove the narrative score paragraph from the desktop Live Draft card
details in wide and compact layouts. The card image and the structured
score, win rate, grade, ALSA, and fit fields stay. (#654) - List every Draftmancer-supported set in the Mocked Draft picker by full name
and code, such as "The Hobbit (HOB)", in alphabetical name order. A set
without cached card data shows a "Download set card data" button, and Start
stays disabled until a validated download completes. A failed download shows
the set and the reason, and Start stays disabled. (#657) - Label the desktop card-detail score "Augmented DO Score" when a validated
per-set model adjusted it, in both wide and narrow layouts and in the
accessible description. Scores keep the plain "DO Score" label when the
switch is off or the set has no model. (#656) - Remove the unused role-profile compile, load, dump, and rebuild helpers and
theCompiledRoleProfiletype.resolve_card_rolesand
RoleClassifier.resolveno longer take aprofileargument and always use
the local classifier with reviewed overrides. (#680) - Republish the HOB and DFT profiles as clean schema-4 profiles and remove the
unusedenrichment-publications.jsonrecord. Retrain the HOB augmented model
against the clean Basic DO baseline. It passes both held-out gates on 274,932
picks: top-1 rises from 0.5489 to 0.5922 and mean reciprocal rank from 0.7115
to 0.7474. (#664) - Remove the
enrich-setandlist-enrichmentcommands, the offline
semantic-enrichment extraction, review, and projection code, and its
OpenRouter and guide clients. Profile publication and refresh no longer
retain enriched manifest entries or report enrichment conflicts. Card-data
export and ratings-based profile generation are unchanged. (#662) - Remove typed relationship scoring, pool-ledger support, and advice. Keep
empirical SetProfile scoring, local card-role classification, generic synergy,
and existing audit and draft-history readers. (#673) - Generate clean schema-4 SetProfiles. Ignore retired semantic fields when
reading schemas 1–3 and reject them in schema 4. Keep confirmed enrichment
artifacts standalone, treat oldsemantic-only...
Draft Omen v0.3.1 development build 2026-09-25 #10
Draft Omen v0.3.1 development build 2026-09-25 #10
- Build identifier:
v0.3.1-dev.20260925.10 - Source commit:
98713bd7a80b276620eb35c839259ec1c51d891c - Package version:
0.3.1 - UTC date:
2026-09-25 - Progressive run number: 10
- Warning: This is an unsigned native development build.
- Workflow run: https://github.com/andreagrandi/draftomen/actions/runs/36182054052
Changes since previous release
- Publish an Intel macOS DMG next to the Apple Silicon one. A second macOS
build job runs on themacos-15-intelrunner, and each macOS job fails when
lipo -archsreports the wrong architecture for the app executable. The
macOS release assets are now namedunsigned-macos-arm64.dmgand
unsigned-macos-x86_64.dmg, the checksum file lists both, and the website
offers both downloads. (#347) - Fix the Windows native build, which had two separate faults:
- Since #332 it failed its bundled-profile check. A Windows checkout
converted line endings in the HOB profile snapshot and the bundled
baseline profile, so their bytes no longer matched the recorded sizes and
SHA-256. A new.gitattributesturns off line-ending conversion for
profile-snapshots/anddraftomen/baseline_profiles/. - Since #555 the built executable failed to start because the
pyside6-deployspecs excludedQtTest, which removedQt6Test.dll
whileqt_gui.pyimportsPySide6.QtTest. The specs no longer exclude it.
- Since #332 it failed its bundled-profile check. A Windows checkout
- Add a Sets page to the website at
/sets/, linked from the navigation. It
lists the supported sets, those with card data and 17Lands ratings, and
marks the ones with an augmented model. A second list shows the sets that
have no 17Lands ratings yet. (#707) - Load per-set card data in the CLI
replay,build,backtest,
benchmark-picksandrefresh-structure-targetscommands, the same data
the desktop app uses. They no longer read~/.draftomen/carddb.json, and
ratings metadata recovery no longer writes it.--bulk-filestill
replaces the card data for fixtures and CI.refresh-datanow only prints
that card data downloads per set, and an existingcarddb.jsoncan be
deleted. (#706) - Keep pipeline caches out of the user data directory.
build-augmented-set
now caches draft dumps in.draftomen/corpus-cache/profile-input-cache, and
refresh-profile-datacaches 17Lands ratings in
.draftomen/corpus-cache/17lands, both relative to the working directory.
Both commands take--cache-dirto use another root, and
refresh-profile-datano longer accepts the hidden--app-diroption.
Nothing writes~/.draftomen/profile-input-cacheor
~/.draftomen/set-enrichmentany more, so both can be deleted.
~/.draftomen/17landsstays for the CLIbuild,replayandbacktest
ratings. (#705) - Check downloaded card data against the sets manifest. With network access,
the card-data client readssets/manifest.jsononce per client, rejects a
download whose SHA-256 differs from the manifest, and downloads again when a
cached file no longer matches it. A failed update keeps the valid cached
file, and an unreachable manifest leaves cached sets in use. (#704) - Publish
sets/manifest.jsonon the website. It lists every set with card
data, and gives each set's name, card-data URL, size and SHA-256, profile
formats with their maturity, and augmented model metrics.export-set-data,
build-augmented-setand the Profile Refresh publication regenerate it.
(#703) - Make
build-augmented-setreport its progress. It prints one line as each
stage starts, the dump download at most every 10% and 5 seconds, and how
many picks training and evaluation use. Basic DO scoring now reports in 25%
steps instead of once per 5,000 picks. (#710) - Publish the DFT PremierDraft augmented model. On 889,392 held-out picks it
raises Basic DO top-1 from 0.520 to 0.562 and mean reciprocal rank from
0.690 to 0.726. - Make
build-augmented-settrain against the set profile the website
publishes inwebsite/public/profiles, with its checksums verified. It used
to read only the local app cache and fall back to a generic profile without
ratings, which calibrated DFT against the wrong baseline and reported it
only after training. The build now stops before any download when the set
has no published profile with ratings, and stops before training when the
dump's format has none. - Let
build-augmented-settrain on draft dumps with bonus-sheet cards that
the set card data does not list, such as the 10 DFT Special Guests. Their
metadata comes from the local Scryfall bulk file, preferring an Arena
printing, and the set's own printing wins when both exist. (#715) - Raise the profile input cache limits to 300 MiB per entry and 1 GiB in
total. The DFT PremierDraft public draft dump is 205 MB, so the old 128 MiB
limit rejected it andbuild-augmented-set DFTtrained on the much smaller
TradDraft dump instead. - Let
build-augmented-setread 17Lands draft dumps that have nopick_2
column. 17Lands added that column for Pick Two Draft, so older dumps such
as DFT failed with "Draft dump is missing required columns: ['pick_2']".
Without the column, no row counts as a second pick. - Make the weekly historical profile refresh process at most 6 set and format
pairs per run, keeping each set whole, and skip pairs that already have a
published profile. The old run refreshed all 128 historical pairs at once,
17Lands stopped answering after about 105 requests, and the run published
nothing. A
historical pair with no 17Lands games, such as IKO TradDraft, is now listed
as skipped and no longer fails the run. (#709) - Close the Mocked Draft dialog once the draft started from it is under way,
so the live drafting view is visible. A failed start keeps the dialog open
with its error, and reopening the dialog during a draft to leave it keeps it
open. - Let Mocked Draft offer booster cards that the set card data does not list,
such as SPG, MUL, BIG, and OTP bonus-sheet cards and 32 KTK cards. A card
maps to another Arena printing of the same card when the set has none, and
its metadata comes from the local Scryfall bulk file, or from the card
fields Draftmancer sends when the printing never reached Arena. These cards
carry no ratings and score the neutral prior. (#696, #697) - Make the GUI replay smoke check wait for a pending hosted profile refresh
before it captures. A fast replay finished before the MSH profile download,
so the check showed fallback ratings even though the session adopts the
profile once it arrives. (#683) - Let Mocked Draft play Draftmancer packs that are not 14 cards. Pack events
carry the pack size, and the pick stage, remaining picks, and pool ledger use
it, so 15-card sets such as LCI and 13-card sets such as BLB draft all 45 or
39 picks and reach a deck build. Arena drafts keep 14-card packs. (#695,
#682) - Fix Mocked Draft booster cards that failed to map to an Arena card. The
Scryfall mapping now reads every set in the bulk file, uses the first face's
oracle id when the card has none, and picks the lowest Arena id when a card
has several Arena printings, such as the LCI Travel Poster basics. This fixes
booster decoding for LCI, M21, and SNC and startup for TDM and ECL. Booster
errors now name the card by name, set, and collector number. (#682) - Add a QML regression test showing that the Mocked Draft set selector keeps
the chosen set, such as LCI, through state updates and after Start, and that
Start sends that set. The fix shipped with the set picker in #688. (#681) - Make "Refresh hosted ratings" work during a Mocked Draft. The refresh now
uses the simulated set's profile client and updates only the Mocked Draft
session, so the Arena profile is never touched. If no hosted profile exists,
the ratings banner says so, and fallback scores stay active. (#687) - Remove the "DO recommendation" comparison sentence and the repeated
"Pack 1, pick 6." status line from the desktop Live Draft header in wide
and narrow layouts. The pack heading, ranked cards, and controls stay. (#655) - Remove the narrative score paragraph from the desktop Live Draft card
details in wide and compact layouts. The card image and the structured
score, win rate, grade, ALSA, and fit fields stay. (#654) - List every Draftmancer-supported set in the Mocked Draft picker by full name
and code, such as "The Hobbit (HOB)", in alphabetical name order. A set
without cached card data shows a "Download set card data" button, and Start
stays disabled until a validated download completes. A failed download shows
the set and the reason, and Start stays disabled. (#657) - Label the desktop card-detail score "Augmented DO Score" when a validated
per-set model adjusted it, in both wide and narrow layouts and in the
accessible description. Scores keep the plain "DO Score" label when the
switch is off or the set has no model. (#656) - Remove the unused role-profile compile, load, dump, and rebuild helpers and
theCompiledRoleProfiletype.resolve_card_rolesand
RoleClassifier.resolveno longer take aprofileargument and always use
the local classifier with reviewed overrides. (#680) - Republish the HOB and DFT profiles as clean schema-4 profiles and remove the
unusedenrichment-publications.jsonrecord. Retrain the HOB augmented model
against the clean Basic DO baseline. It passes both held-out gates on 274,932
picks: top-1 rises from 0.5489 to 0.5922 and mean reciprocal rank from 0.7115
to 0.7474. (#664) - Remove the
enrich-setandlist-enrichmentcommands, the offline
semantic-enrichment extraction, review, and projection code, and its
OpenRouter and guide clients. Profile publication and refresh no longer
retain enriched manifest entries or report enrichment conflicts. Card-data
export and ratings-based profile generation are unchanged. (#6...