v0.2.0

Commits since v0.1.0:
- feat: publish a GitLab Release described by its changelog section
- docs: retone the 0.2.0 entry
- docs: 0.2.0 release notes
- fix: decide cache ownership the same way on either host
- ci: gate next, add MR pipelines, and make CHANGELOG the version authority
- docs: file the Card flat-scalar consolidation refactor (#768)
- feat: separate complexity ceilings from perf ceilings in plan debt
- chore: sync DSK plan checkboxes after the kernel wave
- docs: trim the spell-cast cost spec to the unbuilt choose-or-reveal arm
- docs: file the phantom-kernel-spec pattern at merge
- chore: clear two phantom kernel specs and sync the DSK plan
- chore: sync DSK plan checkboxes from the registry
- docs: file the castProfile staged-cost misclassification
- fix: bun run test builds the wasm kernel first, as dev and build already do
- docs: retire the issue-based plan vocabulary the plan-file migration left behind
- docs: state the UX carve-out in the FINDINGS preamble
- docs: keep UX work in GitLab issues, out of the dev worklist
- chore: delete the landed door-unlock-timestamp kernel spec
- docs: restore the /play sim-support-status spike (#164) to FINDINGS
- test: pin newest-wins on the layer-7b group base-P/T grant
- fix: guard tap_other_count on the activation family, test the cost-arm lints
- test: pin the lock's characteristics bump with a static that must retire
- chore: delete the untap-during-each-other-untap-step kernel spec
- fix: filter Alchemy (A-) variants out of the set meters
- chore: regenerate manifest
- docs: record LegalActionsMutatedState as a second signature of the torn-hash flake
- chore: regenerate manifest
- chore: sync DSK plan checkboxes after integrating next
- chore: regenerate manifest
- chore: regenerate manifest
- chore: regenerate manifest
- chore: regenerate manifest
- chore: regenerate manifest
- chore: regenerate manifest
- chore: regenerate manifest
- chore: regenerate manifest
- chore: regenerate manifest
- chore: regenerate manifest
- chore: regenerate manifest
- chore: regenerate manifest
- chore: migrate the open issue queue into the repo worklist
- docs: skills + AGENTS.md for the lean worklist
- feat: cut plan.ts to the lean core — no issues, no milestones, no claims
- fix: charge the granted alternate cost's use, and lint its pairings
- fix: key the whole look-top window off its acting player
- fix: restore the Pilots doc comment RolloutPolicy displaced
- fix: bound convoke and delve fan-out from the charging funnel
- fix: scope the untap restriction and give the untap step one writer
- fix: address review on Room door unlock timestamps
- docs: record the turned-face-up scope escape, test the Inspector's own flip
- fix: address the !431 sendback — say what plan block actually is
- feat: exclude granted {0} casts from the convoke grant
- chore: generate the DSK plan file from the open card-issue queue
- docs: rewrite coverage skills + AGENTS.md for plan-file waves
- feat: plan-file card worklists + batch MRs, retire claim/watch ceremony
- fix: classify the combat damage window counters as unhashed by design
- fix: rebase onto next and clear the doubled-apostrophe artifacts
- fix: address the !444 sendback — planeswalker attacks, docs, timestamp divergence
- feat: add the continuous group base-P/T grant and Dollmaker's Shop // Porcelain Gallery
- fix: pin Roaring Furnace's burn to the cards in hand
- docs: document the door-lock kernel in CARDS.md
- fix: pin Fear of Failed Tests to the damage dealt
- fix: pin the staged cost arm in the position hash, and document the funnel
- fix: enforce the combat-damage dispatch pair, assert its window, retire the old idiom
- fix: hold at fire time in Kona's never-triggered test
- feat: add non-controller manifest dread and Unwanted Remake
- test: pin Chainsaw's printed damage magnitude in both directions
- test: pin Rampaging Soulrager's static to its source
- feat: comptime-lint .target_player and document it in the consumption map
- fix: pin Intruding Soulrager's opponent-only damage and draw count
- test: pin Glimmer Seeker's draw count and controller constraint
- fix: assert the printed mana amount in Enduring Vitality grant test
- chore: regenerate manifest
- feat: Chainsaw
- chore: regenerate manifest
- chore: regenerate manifest
- fix: refuse dead off-battlefield statics, assert target-walk zones, collapse the fixture zone walker
- chore: regenerate manifest
- feat: add HandSizeStatic.face and Roaring Furnace // Steaming Sauna
- feat: Uncharted Haven
- feat: Floodpits Drowner
- feat: Patched Plaything
- chore: regenerate manifest
- feat: Enduring Vitality
- fix: refuse a zig build whose cache belongs to another checkout
- chore: regenerate manifest
- chore: regenerate manifest
- chore: regenerate manifest
- chore: regenerate manifest
- chore: regenerate manifest
- chore: regenerate manifest
- chore: regenerate manifest
- chore: regenerate manifest
- fix: plan handoff is verified, and only draft MRs rank as resumable
- feat: Glimmer Seeker
- fix: restore the release branch on every plan merge exit
- chore: correct the #734 serialization rationale in build.zig
- feat: Intruding Soulrager
- chore: add per-binary test steps and record the #734 isolation result
- feat: Rampaging Soulrager
- feat: Kona, Rescue Beastie
- chore: regenerate manifest
- chore: regenerate manifest
- feat: add cross-zone static subtype grant and Leyline of Transformation
- fix: address the !439 sendback — kind-aware /play label, scope correction
- chore: regenerate manifest
- chore: regenerate manifest
- feat: Get Out
- chore: regenerate manifest
- fix: address the !449 sendback — both clones, optionals, and a probe that could disable itself
- chore: regenerate manifest
- chore: regenerate manifest
- chore: regenerate manifest
- fix: correct Ticket Booth's printing to DSK #158
- fix: correct Moldering Gym's printing to DSK #190
- feat: Ripchain Razorkin
- chore: regenerate manifest
- fix: a sent-back MR re-enters the queue immediately
- chore: regenerate manifest
- chore: regenerate manifest
- chore: regenerate manifest
- feat: Fear of Falling
- feat: Fear of Being Hunted, with a printed must-be-blocked static
- chore: regenerate manifest
- fix: run the three Zig test binaries one at a time
- feat: Ticket Booth // Tunnel of Hate
- feat: Underwater Tunnel // Slimy Aquarium
- feat: Leyline of Resonance
- feat: Painter's Studio // Defaced Gallery
- feat: Moldering Gym // Weight Room
- feat: Fear of Failed Tests
- feat: add Room door unlock timestamps
- fix: hash StagedObjectCost.kind
- fix: clone and hash draw_cause, and gate the hand-listed enumerations
- feat: granted alternate mana cost for spells you cast, with Leyline of Mutation
- wip: granted alternate mana cost for spells you cast
- feat: batch "one or more creatures deal combat damage" per damage step
- feat: untap during each other player's untap step, with Seedborn Muse
- feat: add the staged tap-N spell cost and Fear of Exposure
- perf: cap convoke enumeration at the spell mana value
- chore: regenerate manifest
- feat: the sacrificing player chooses which creature, everywhere
- feat: Leyline of Hope
- chore: regenerate manifest
- feat: Fear of Immobility
- feat: Tribute to Hunger asks the opponent which creature to sacrifice
- chore: regenerate manifest
- chore: regenerate manifest
- feat: raise the default turn limit to 50
- feat: return-a-permanent additional cost, with Fear of Isolation
- feat: plan block — a blocked issue stays open and leaves the queue
- feat: add door locking and Keys to the House
- feat: continuous spell keyword grant, with Chief Engineer
- chore: regenerate manifest
- chore: regenerate manifest
- feat: add the granted-cast zone/payment axes and Charred Foyer // Warped Space
- feat: classify draws by cause instead of one loopAborts number
- chore: regenerate manifest
- chore: regenerate manifest
- chore: regenerate manifest
- feat: add batched leave-the-graveyard trigger and Defiled Crypt // Cadaver Lab
- chore: regenerate manifest
- chore: regenerate manifest
- feat: widen the granted-cast descriptor with zone and per-turn axes
- chore: regenerate manifest
- chore: regenerate manifest
- docs: record the evaluateRollout terms that were measured and rejected
- feat: Derelict Attic // Widow's Walk
- chore: regenerate manifest
- feat: Fear of the Dark
- chore: regenerate manifest
- chore: regenerate manifest
- feat: Central Elevator // Promising Stairs
- chore: regenerate manifest
- chore: regenerate manifest
- feat: Bottomless Pool // Locker Room
- feat: Sporogenic Infection
- feat: Cryptid Inspector
- feat: Osseous Sticktwister
- feat: Twitching Doll
- chore: regenerate manifest
- feat: Diversion Specialist
- chore: regenerate manifest
- chore: regenerate manifest
- feat: Omnivorous Flytrap
- feat: selectable MCTS playout policy, measured, default unchanged
- feat: Popular Egotist
- feat: The Swarmweaver
- chore: regenerate manifest
- chore: regenerate manifest
- chore: regenerate manifest
- chore: regenerate manifest
- feat: Silent Hallcreeper
- chore: regenerate manifest
- chore: regenerate manifest
- chore: regenerate manifest
- feat: Valgavoth's Faithful
- feat: Ragged Playmate
- chore: regenerate manifest
- chore: regenerate manifest
- feat: Meathook Massacre II
- feat: Piggy Bank
- feat: Drag to the Roots
- perf: skip the search when one representative survives filtering
- chore: regenerate manifest
- feat: Overgrown Zealot
- feat: add sized token creation and move both X/X token cards onto it
- feat: Rite of the Moth
- chore: regenerate manifest
- chore: regenerate manifest
- feat: Unholy Annex // Ritual Chamber
- feat: Balustrade Wurm
- chore: regenerate manifest
- feat: task becomes a real label instead of the absence of one
- chore: regenerate manifest
- chore: regenerate manifest
- chore: regenerate manifest
- chore: regenerate manifest
- chore: regenerate manifest
- fix: arrange-top write-back addresses cards by id, not library position
- chore: regenerate manifest
- chore: regenerate manifest
- chore: regenerate manifest
- chore: regenerate manifest
- chore: regenerate manifest
- chore: regenerate manifest
- chore: regenerate manifest
- chore: regenerate manifest
- chore: regenerate manifest
- chore: regenerate manifest
- chore: regenerate manifest
- fix: pick the discarded card at resolution, not at announcement
- chore: regenerate manifest
- chore: regenerate manifest
- chore: regenerate manifest
- chore: regenerate manifest
- chore: regenerate manifest
- chore: regenerate manifest
- feat: Surgical Suite // Hospital Room
- chore: regenerate manifest
- chore: regenerate manifest
- feat: Funeral Room // Awakening Hall
- refactor: collapse eight two-spec multi-condition triggers to one ability
- feat: Glassworks // Shattered Yard
- feat: add the batched dies event and Vengeful Townsfolk
- refactor: ladder tunes on repo decks, not the bench fixtures
- chore: regenerate manifest
- feat: Meat Locker // Drowned Diner
- fix: drop parallel last_known_finality_counter
- feat: Break Down the Door
- chore: regenerate manifest
- chore: regenerate manifest
- feat: Dissection Tools
- chore: regenerate manifest
- chore: regenerate manifest
- feat: Conductive Machete
- feat: add noncombat_damage_to_player and fix self-inflicted damage triggers
- feat: add the OTJ Mercenary token and Prickly Pair
- chore: regenerate manifest
- feat: Savior of the Small
- feat: Cursed Windbreaker
- chore: regenerate manifest
- feat: Shrewd Storyteller
- chore: regenerate manifest
- chore: regenerate manifest
- feat: Cynical Loner
- feat: add whole-hand-to-bottom ordering and Teferi's Puzzle Box
- chore: regenerate manifest
- chore: regenerate manifest
- feat: House Cartographer
- chore: regenerate manifest
- feat: Overlord of the Balemurk
- feat: per-seat pilot selection and the head-to-head strength ladder
- feat: Defiant Survivor
- feat: Unwilling Vessel
- feat: Overlord of the Boilerbilges
- feat: Overlord of the Mistmoors
- feat: add the loyalty-planeswalker back face and Nicol Bolas, the Ravager
- chore: regenerate manifest
- chore: regenerate manifest
- chore: regenerate manifest
- chore: regenerate manifest
- feat: Victor, Valgavoth's Seneschal
- chore: regenerate manifest
- feat: Infernal Phantom
- chore: regenerate manifest
- chore: regenerate manifest
- fix: measure a spell on the stack at the X its caster chose
- feat: Stalked Researcher
- chore: regenerate manifest
- feat: Skullsnap Nuisance
- feat: add player experience counters and Mizzix of the Izmagnus
- feat: Scrabbling Skullcrab
- feat: Dashing Bloodsucker
- feat: Gremlin Tamer
- feat: Undead Sprinter
- feat: Erratic Apparition
- feat: Entity Tracker
- fix: one entry per color grant so a set effect cannot resurrect a wiped one
- fix: lint the emblem granted-activated surface and pin Koth's sickness ruling
- feat: add the owner's library-destination choice and migrate its two consumers
- chore: regenerate manifest
- chore: regenerate manifest
- fix: spend restrictions survive an explicit mana float
- chore: regenerate manifest
- feat: add proliferate and Yawgmoth, Thran Physician
- feat: add emblem group activated-ability grants and Koth of the Hammer
- feat: add the two-color devotion gate, the first-draw reveal, and Keranos, God of Storms
- chore: regenerate manifest
- chore: regenerate manifest
- feat: Broodspinner
- fix: wire color grants into the fungibility class key
- feat: add Hammer of Bogardan, the upkeep-window representative
- chore: regenerate manifest
- feat: add the upkeep step and its priority window
- chore: regenerate manifest
- feat: Malevolent Chandelier
- feat: Haunted Screen
- chore: regenerate manifest
- chore: regenerate manifest
- chore: regenerate manifest
- feat: Bear Trap
- refactor: split the agent skills into routers plus on-demand references
- feat: bound the captured targets a resolution choice carries, and document the pool
- feat: add additive layer-5 color and subtype grants, and Possessed Goat
- feat: add the target-player hand choice pool and re-author Deep-Cavern Bat and Cracked Skull
- chore: regenerate manifest
- chore: regenerate manifest
- chore: regenerate manifest
- docs: record the mirror-mana surface and pin it inside the mana memo
- feat: add QueryCtx.sourceEnteredThisTurn and Shardmage'"'"'s Rescue
- feat: Grab the Prize
- feat: add the mirror-mana ability and Exotic Orchard
- chore: regenerate manifest
- chore: regenerate manifest
- chore: regenerate manifest
- feat: add cast-target-shape narrowing, the event-spell permanent reader, and Dack Fayden
- test: ratchet LookTopChoice under the widest staged variant
- feat: Demonic Counsel
- docs: name #588 at the exile-return Aura gap
- fix: enter a look-top Aura attached to a chosen host
- chore: regenerate manifest
- feat: add fixed-count graveyard-exile spell cost and Abhorrent Oculus
- chore: regenerate manifest
- chore: regenerate manifest
- feat: wire the entering-Aura host pick through the pilots, prompt, and docs
- fix: reject the activation-only graveyard-exile arm in a spell cost
- feat: add reveal-top-play, the entering-Aura host pick, and Chaos Warp
- chore: regenerate manifest
- chore: regenerate manifest
- feat: Vanish from Sight
- chore: regenerate manifest
- chore: regenerate manifest
- feat: Cackling Slasher
- docs: cite the discard rule that exists in the pinned CR
- docs: fold the hand-size family into one consumption-map row
- feat: add the all-players hand-size static and Anvil of Bogardan
- chore: regenerate manifest
- chore: regenerate manifest
- chore: regenerate manifest
- feat: add the look-top hand fallback and Wickerfolk Thresher
- feat: Impossible Inferno
- chore: regenerate manifest
- chore: regenerate manifest
- docs: record the overload surface and its consumption map row
- chore: regenerate manifest
- feat: add overload and Cyclonic Rift
- feat: Patchwork Beastie
- feat: add Warren-Scourge Elf
- feat: Beastie Beatdown
- feat: add protection from a subtype
- chore: regenerate manifest
- chore: regenerate manifest
- test: pin the granted-ability invariant arm for all three kinds
- chore: regenerate manifest
- feat: Hand That Feeds
- feat: Peer Past the Veil
- docs: record the grantable-ability surface, and keep the mana gate to a compare
- chore: regenerate manifest
- feat: add grantable activated/mana abilities and Urza's Saga
- chore: regenerate manifest
- feat: Disturbing Mirth
- chore: regenerate manifest
- chore: regenerate manifest
- feat: Spineseeker Centipede
- feat: Stay Hidden, Stay Silent
- docs: record the cost-exile link and the cost-pick cast fan-out
- feat: add the CR 607.2q cost-exile link and Fear of Abduction
- chore: regenerate manifest
- chore: regenerate manifest
- feat: Unnerving Grasp
- docs: when a look-top tail is the wrong home for a printed sentence
- feat: Under the Skin
- chore: regenerate manifest
- chore: regenerate manifest
- feat: add GroupManaGrant.face and Greenhouse // Rickety Gazebo
- fix: wire cant_be_turned_face_up through the static scans and the hash
- chore: regenerate manifest
- chore: regenerate manifest
- feat: add the until-your-next-turn grant duration and Rootwise Survivor
- docs: record the retrieval half of the source-linked exile
- feat: let a becomes-body declare its types additively, and Unable to Scream
- chore: regenerate manifest
- test: pin the exile-link incarnation scope on the count reader too
- chore: regenerate manifest
- feat: add card-facing retrieval over the source-linked exile and Helvault
- fix: warn before reclaiming a claim, and refuse to resume a live one
- chore: regenerate manifest
- chore: regenerate manifest
- docs: record the two arms of life-gain denial
- fix: redact hidden-zone target ids from the per-viewer stack view
- feat: add the per-player life-gain lock and Screaming Nemesis
- chore: regenerate manifest
- fix: plan sendback and claim verify the state they report
- fix: gate a Room's Card surface with an allowlist, not a denylist
- chore: regenerate manifest
- docs: document discardHandCard in the discard family and the consumption map
- feat: add discard-by-handle and Cracked Skull
- chore: regenerate manifest
- docs: face-down addressability and the effect-side turn-up in CARDS.md
- feat: Hauntwoods Shrieker
- feat: add modal activated abilities and Insidious Fungus
- feat: Threats Around Every Corner
- chore: regenerate manifest
- feat: add the face-down query predicate and the effect-side turn-face-up funnel
- chore: regenerate manifest
- chore: regenerate manifest
- feat: add non-modal resolution-time "A or B" choice and Ghostly Dancers
- chore: regenerate manifest
- feat: add Adjustment.add_types and Jump Scare
- feat: add the once-ever trigger limiter and Acrobatic Cheerleader
- feat: add the source-linked exile tag and Veteran Survivor
- chore: regenerate manifest
- refactor: delete the bench baseline file and its ratchet
- chore: regenerate manifest
- refactor: spell out zbuild.ts and clean-zig-cache.ts
- chore: regenerate manifest
- fix: script invocations that name a renamed verb
- refactor: namespace sim commands under sim:, tag becomes release
- chore: regenerate manifest
- docs: perf is reviewed at set boundaries, not at every landing
- chore: regenerate manifest
- chore: regenerate manifest
- fix: no raw NUL byte in the untrusted test
- chore: regenerate manifest
- chore: regenerate manifest
- docs: land tokens and the shared token entry funnel
- fix: enforce the counter-kind checklist the Counters doc denied existed
- chore: regenerate manifest
- feat: add the Everywhere land token and Overlord of the Hauntwoods
- feat: add resolution-effect door unlocking and Ghostly Keybearer
- refactor: streamline the script surface, drop the deck coverage meter
- docs: AGENTS.md triage-set row matches the tool
- refactor: triage-set reports coverage, stops guessing feature families
- chore: regenerate manifest
- chore: regenerate manifest
- feat: render GitLab-sourced text as data, not instructions
- chore: update build-chain deps to clear 13 advisories
- fix: zbuild retries a crashed test step once instead of blocking every merge
- fix: triage-set stops counting shipped mechanics as keyword gaps
- fix: pin every graveyard_scan_events entry with a dispatch tripwire
- chore: regenerate manifest
- chore: regenerate manifest
- docs: record the graveyard-sourced trigger surface in the consumption map
- feat: add mana-spend purpose vocabulary and Creeping Peeper
- feat: add graveyard-sourced battlefield-event triggers and Fear of Infinity
- fix: zclean drops the whole .zig-cache, not part of it
- fix: refuse Card-level continuous abilities on a Room
- feat: add StaticSpec.face and Restricted Office // Lecture Hall
- feat: add finality counters and Resurrected Cultist
- chore: regenerate manifest
- chore: regenerate manifest
- fix: zclean must drop h/ and b/ with o/
- feat: add look-top window tails and Killer's Mask
- feat: add Twist Reality and the modal look-top window composition
- chore: regenerate manifest
- feat: add the turned-face-up trigger event and Growing Dread
- chore: regenerate manifest
- chore: regenerate manifest
- fix: label both main phases in the /play phase bar
- docs: describe the damage event boundary in ENGINE.md
- perf: acknowledge the ~14% MCTS cost of impending's new counter kind
- feat: add impending (alternative cast cost, time counters, conditional type suppression) and Overlord of the Floodpits
- docs: map the permanent-damaged event and its funnel in CARDS.md
- feat: add the permanent-damaged trigger event and Hornet Nest, Mortal Wound
- feat: drop the Zig object cache when a unit is claimed
- chore: regenerate manifest
- chore: regenerate manifest
- feat: add multi-condition trigger events and Balemurk Leech
- fix: drop the gallery sort control
- fix: drop gallery export status line, reorder header actions
- chore: meter leads with FULL/TOTAL
- feat: add the postcombat main phase, CR 603.4 intervening-if, and Cautious Survivor
- chore: regenerate manifest
- chore: regenerate manifest
- fix: reclassify WrongHandleKind as an engine defect, not a rules fizzle
- chore: regenerate manifest
- chore: regenerate manifest
- fix: count phyrexian pips in every devotion reader
- chore: regenerate manifest
- feat: Unsettling Twins
- chore: regenerate manifest
- feat: add Rooms (CR 709.5) and Grand Entryway // Elegant Rotunda
- chore: regenerate manifest
- chore: regenerate manifest
- feat: Bashful Beastie
- feat: escalations, a `now` lever, and kernels-first ranking
- feat: Innocuous Rat
- chore: regenerate manifest
- feat: Orphans of the Wheat
- chore: regenerate manifest
- feat: Duskmourn's Domination
- chore: regenerate manifest
- docs: record the delirium card-type count in CARDS.md
- chore: regenerate manifest
- feat: add delirium card-type count and Violent Urge, Wildfire Wickerfolk
- feat: Midnight Mayhem
- chore: regenerate manifest
- chore: regenerate manifest
- feat: Arabella, Abandoned Doll
- feat: anchor the turn-face-up choice on the permanent in /play
- chore: regenerate manifest
- fix: a permanent under a characteristic overlay is not a Saga
- feat: Living Phone
- chore: regenerate manifest
- feat: Seized from Slumber
- chore: regenerate manifest
- docs: face-down permanents, manifest dread, and the turn-face-up special action
- chore: regenerate manifest
- feat: Enduring Curiosity
- perf: settle overlay presence in one battlefield walk
- feat: Enduring Courage
- feat: add face-down permanents, manifest dread, and Manifest Dread
- chore: regenerate manifest
- feat: Cathartic Parting
- chore: regenerate manifest
- chore: regenerate manifest
- feat: Coordinated Clobbering
- chore: regenerate manifest
- docs: refresh the About page against the current app
- chore: drop the .gemini skills mirror
- chore: stop tracking .DS_Store
- feat: Irreverent Gremlin
- chore: regenerate manifest
- feat: Attack-in-the-Box
- chore: regenerate manifest
- chore: regenerate manifest
- feat: Don't Make a Sound
- chore: regenerate manifest
- chore: regenerate manifest
- chore: regenerate manifest
- feat: Clockwork Percussionist
- feat: the whole lint header toggles the panel
- feat: the app's filled buttons are accent blue; --live stays on the board
- fix: the deck header's filled action uses the accent, not the board's gold
- fix: light-mode warn goes burnt orange, and the status fills are picked not mixed
- feat: status chips carry their hue on the fill, and buttons get a real edge
- feat: gate Play on sim coverage, tidy the header, retune the light theme
- fix: stat chips wear the tier of the finding they'd raise
- fix: sim chip goes last and never red, and P/T fits a 15/15
- fix: an illegal mainboard size reads as a defect at any margin
- feat: one switch for lint — findings list and row highlights together
- feat: flag an oversized sideboard, and tint every linted row by its tier
- fix: lead the mana column with the percentage, scroll lint findings to their row
- feat: collapse the lint panel's info tier behind a toggle
- feat: render the full lint findings list and split the mana readouts
- feat: lint findings get a row tint and their own section, not a banner
- feat: move deck-row chrome to trailing columns and banners into the toolbar
- feat: Slavering Branchsnapper
- feat: Shepherding Spirits
- chore: regenerate manifest
- feat: Daggermaw Megalodon
- chore: regenerate manifest
- feat: Bedhead Beastie
- chore: regenerate manifest
- chore: regenerate manifest
- feat: Razorkin Needlehead
- chore: regenerate manifest
- chore: regenerate manifest
- chore: regenerate manifest
- feat: Splitskin Doll
- feat: Vengeful Possession
- feat: Commune with Evil
- feat: Live or Die
- chore: regenerate manifest
- feat: Thornspire Verge
- chore: regenerate manifest
- feat: Hushwood Verge
- chore: regenerate manifest
- feat: Gloomlake Verge
- chore: regenerate manifest
- feat: Floodfarm Verge
- chore: regenerate manifest
- feat: Blazemire Verge
- chore: regenerate manifest
- feat: Boilerbilges Ripper
- chore: regenerate manifest
- chore: regenerate manifest
- feat: Valgavoth's Lair
- feat: add staged multi-permanent sacrifice costs and Westvale Abbey
- chore: target coverage MRs at the next integration branch
- chore: regenerate manifest
- chore: regenerate manifest
- chore: regenerate manifest
- chore: regenerate manifest
- feat: add staged multi-card discard activation costs and Nezahal, Primal Tide
- feat: Commander's Sphere
- feat: Wharf Infiltrator
- feat: add targeted card-draw triggers and Niv-Mizzet, the Firemind
- chore: regenerate manifest
- fix: pruned-result stub must carry the re-verify rule
- fix: bound the assistant live provider history
- chore: regenerate manifest
- fix: card-db mock must keep the real module's other exports
- chore: regenerate manifest
- ci: give test:ts the kernel wasm it needs to load the app
- chore: regenerate manifest
- ci: install git in test:ts, which lint-imports needs
- feat: add gauntlet favicon
- chore: regenerate manifest
- fix: give the edit delta its own column so the qty steppers stay aligned
- chore: regenerate manifest
- feat: import a pasted or uploaded decklist from anywhere
- chore: regenerate manifest
- feat: general per-deck undo/redo, replacing the Tutor-only undo
- chore: regenerate manifest
- feat: highlight what the last Tutor edit changed
- chore: regenerate manifest
- feat: /optimize replaces the cuts and upgrades chips
- chore: regenerate manifest
- test: pin distinct labels for discard-additional-cost casts
- chore: regenerate manifest
- ci: gate the TypeScript half in CI and at merge
- chore: regenerate manifest
- refactor: deck archive as a boundary-delimited text format
- chore: regenerate manifest
- fix: collapse a run of draws into one log line
- chore: regenerate manifest
- feat: export and import all local decks as one file
- chore: regenerate manifest
- feat: gallery tabs, a Starred section, and per-deck stars
- chore: regenerate manifest
- feat: import names implemented cards whose Oracle text changed
- chore: regenerate manifest
- feat: cache every printed face of a two-faced card
- chore: regenerate manifest
- fix: set paths.base to the deploy root so the SPA fallback boots
- chore: regenerate manifest
- fix: a skipped mana-health signal renders as a dash, not a blank
- chore: regenerate manifest
- fix: parseDeck stores the canonical section name, not the raw header
- chore: regenerate manifest
- refactor: one issue per card, tracked by title
- chore: regenerate manifest
- fix: make a plan merge 405 diagnosable instead of generic
- chore: regenerate manifest
- fix: an empty card checklist is never "landed" in plan sync
- chore: regenerate manifest
- fix: plan next takes --limit and names what it dropped
- chore: regenerate manifest
- docs: record the run_gauntlet single-matchup decision in the tool
- chore: regenerate manifest
- docs: drop the BYOK design sketch
- chore: regenerate manifest
- fix: group the deck header actions by intent
- fix: bring /play into the design system
- refactor: put the deck side of the app on the tokens
- feat: give the app a token layer and shared controls
- fix: let form controls inherit the page's type
- chore: regenerate manifest
- fix: stop the opening-hand row clipping a card's hover ring
- fix: explain the deck grouping toggle on hover
- chore: sort imports in hero-card test
- feat: pick how deck cards group by type
- chore: regenerate manifest
- docs: trim sim/README to what it uniquely documents
- docs: add a roadmap to the README and tighten the prose
- docs: rewrite the README around what it does; add CONTRIBUTING
- docs: license first-party source under PolyForm Noncommercial 1.0.0
- chore: regenerate manifest
- fix: hover preview shows the same face as the board
- fix: transformed permanents image their printed back face
- fix: plan targets main, not the deleted zig-kernel branch
- chore: regenerate manifest
- chore: consistent page titles, explicit hero for Sagas
- fix: resolve card images from reactive card info where it exists
- refactor: complete the card-id index instead of filling it lazily
- fix: two defects found reviewing this session's work
- feat: rebrand to Gauntlet, add an About page, split the legal footer
- fix: skip art crops that can't fill a landscape tile
- feat: art view — deck galleries fronted by their hero card
- feat: cache the card artist for art attribution
- fix: serve card images from the CDN, not the 2/second API
- perf: gallery resolve drops from ~2s to ~300ms cold, ~2ms warm
- fix: commanders lead a commander deck's key cards
- feat: gallery view toggle drives both deck sections
- feat: gallery search, sort, and a table for your own decks
- fix: raise per-turn caps so a from-scratch build completes
- chore: open #324 turn-caps branch
- docs: BYOK.md reflects the shipped assistant
- refactor: sim dot moves to its own column ahead of the card name
- feat: playtest starter chip
- fix: give the agent the real opponent deck list
- feat: persist assistant threads in localStorage
- fix: count face-name deck entries against the copy limit
- chore: open #321 assistant UX branch
- chore: regenerate manifest
- feat: run_gauntlet playtests the open deck in a worker
- feat: headless match exports in the WASM kernel
- feat: render mana symbols in chat replies
- feat: @ card and / shortcut completion in the composer
- feat: empty-state starter chips over a shortcut registry
- feat: edit_deck tool with per-edit undo
- docs: record the prompt-shortcut design and the landed analysis split
- feat: lint_deck tool over the shared deck analysis
- refactor: split pure deck analysis out of the lint CLI
- feat: gate the Tutor panel on a stored API key
- feat: render mana symbols in oracle text and rulings
- fix: sim badge label was painted in its own background color
- docs: BYOK phase 1 shipped, phase 2 in progress
- feat: name the assistant Tutor
- fix: rail offsets match the 1.5rem body padding
- fix: style the format-select popup via Chromium customizable select
- fix: resolve double-faced cards by face name in get_card and click-to-pin
- feat: dock the assistant rail on the right
- feat: per-deck clear-conversation button
- fix: pool caching, warmup, and touch preview race; extract card-ref parser
- feat: hoverable card refs in assistant replies, click pins in-deck cards
- fix: search chips show all filter params; zero-hit name lookups probe the full pool
- feat: teach search_cards creature subtypes; double the turn tool budget
- feat: raise the tool-call cap to 20 and add a Continue button on limit stop
- fix: hide the card detail pane scrollbar
- fix: structured tool-result truncation instead of JSON string slicing
- fix: round-trip Gemini 3 thought signatures on function-call parts
- fix: current Gemini model defaults (2.5-flash 404s for new users)
- fix: flatten the assistant composer into one dark strip
- fix: pin the assistant rail to the viewport instead of sticky-in-grid
- feat: BYOK assistant phase 1 — chat + search panel on the deck page
- docs: BYOK assistant design sketch
- fix: push the version tag past the LFS pre-push hook
- chore: drop the release pipeline, keep version tagging, fix the pages build
- fix: install glab from a pinned asset and drop the release checkout dance
- chore: regenerate manifest
- fix: contain MCTS rollout dead-ends instead of drawing the live game (#311)
- chore: regenerate manifest
- fix: follow the card DBs to data/ in .gitattributes (LFS)
- chore: sweep code and docs to the data/ layout (#304)
- chore: move reference data under data/, unify source metadata (#304)
- chore: regenerate manifest
- chore: regenerate manifest
- feat: rules freshness gate for the dev skill
- chore: regenerate manifest
- fix: infer repo deck formats from contents, not folder (#300)
- feat: Cultivator Colossus with repeat-loop object picks (#290)
- chore: regenerate manifest
- fix: alternate-cost cast labels read as gerund payment phrases (#288)
- feat: command-zone lite - slot, tax, cast source, death-return choice, 40 life (#302)
- fix: gate the drain-mismatch diagnostic off the freestanding target
- fix: audit game-state-derived std.debug.assert in engine paths (#301)
- fix: x-divided-evenly casts enumerate canonical, budgeted variants (#289)
- fix: drifted-empty pending trigger choice fizzles per CR 603.3d (#298 #296)
- fix: stack creature-form invariant applies to spell items only (#298)
- fix: negative token counts create nothing instead of asserting (#299)
- feat: look-top choices stage at resolution; staleness campaign staging complete (#297)
- feat: surveil stages at resolution on every surface; window tails via surveil_then (#297)
- feat: look-top splits stage at resolution, not cast enumeration (#297)
- chore: retire the flip-gate concept; issue bodies get a house style
- feat: trigger pump parks behind open choice windows (#291)
- fix: wildcard pool takes are solver-gated; a partial any-one take keeps its batch
- fix: payability models fodder contention — each activation claims distinct fodder
- feat: committed-pick staleness contracts — one accessor family, counted and surfaced
- fix: bench WASM smoke follows the sim/wasm -> sim/kernel relocation
- fix: staged divided casts carry their originating action; ward-unpayable picks are not offered
- fix: mana payment must not eat the outer payment's reserved permanents as fodder
- fix: the last two staleness holdouts — look-top split and exile-top pick degrade
- fix: payability-invariant mana payment — atomic entry gate + step-gated source picks
- fix: Role tokens skip stale hosts; colored pips prefer dedicated sources
- fix: three more staleness crashes — exile-until links and entry-ability targets
- fix: two more resolution-staleness crashes from the MCTS sweep
- fix: six MCTS-surfaced crashes across combat, casts, and resolution choices
- feat: default bun run gauntlet to the MCTS pilot
- fix: pay mana before battlefield-consuming cost arms; raise attacker cap
- fix: surface every committed pick in kernel choice ids, payloads, and labels
- chore: regenerate manifest
- docs: past-tense the flip status in CHARTER / sim README / CHANGELOG
- feat: delete the TS sim engine; sim CLI on the Zig binary (flip gate)