mtg_python_deckbuilder/docs/user_guides/include_exclude.md
mwisnowski ac6c9f4daa
Some checks failed
CI / build (push) Has been cancelled
docs: documentation overhaul - archive, user guides, env parity (#62)
* docs: archive CLI runner scripts and Windows Docker guide, update web runner scripts

* docs: overhaul README and DOCKER.md, add 10 user guides

- README: Budget Mode section, corrected Further Reading links, theme badge descriptions, diagnostics expansion
- DOCKER.md: Windows path note, Budget Mode + Include/Exclude sections, env table additions
- docs/user_guides/: 10 new feature guides covering budget mode, include/exclude, locks/replace/permalinks, batch build, theme browser, random build, owned cards, partner mechanics, bracket compliance, quick build & skip controls

* fix: map PriceTimeoutError→503, add budget exceptions to status map; update error_handling.md

* docs: env var parity — add missing vars to .env.example and README table
2026-03-23 22:00:50 -07:00

89 lines
2.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Include / Exclude Lists
Pin specific cards into every build or permanently block them from selection.
---
## Overview
The Include / Exclude feature (also called "Must-Haves") lets you control card selection at the individual card level, outside the normal theme and pool logic.
- **Must Include**: cards are always added to the deck, before pool selection runs.
- **Must Exclude**: cards are never added, regardless of theme, bracket, or pool filtering.
Requires `ALLOW_MUST_HAVES=1` (default: on).
---
## Enabling the UI Controls
The include/exclude buttons are hidden by default to keep the Step 5 interface clean. To show them:
```
SHOW_MUST_HAVE_BUTTONS=1
```
When enabled, each card row in Step 5 gains a Must Include (+) and Must Exclude () button. You can also manage lists via the quick-add input at the top of the section.
---
## Adding Cards
### Via Step 5 UI
1. Enable `SHOW_MUST_HAVE_BUTTONS=1`.
2. In Step 5, click **+** on a card to add it to Must Include, or **** to add it to Must Exclude.
3. Use the quick-add input at the top to add cards by name without scrolling.
### Via JSON Config
Supply lists in your deck config file:
```json
{
"must_include": ["Sol Ring", "Arcane Signet"],
"must_exclude": ["Thassa's Oracle"]
}
```
Both keys accept an array of card names. Names are matched case-insensitively.
---
## Priority Order
When include/exclude interacts with other filters, this order applies:
1. **Must Exclude** — always wins; card is never selected.
2. **Must Include** — card is always added, before pool selection.
3. **Budget filter** — applied to the remaining pool after Must Include cards are inserted.
4. **Bracket filter** — applied after budget.
Must Include cards are inserted directly and are not subject to budget pool filtering. They may appear as over-budget in the summary if they exceed the ceiling, and they may trigger bracket warnings if they violate bracket rules.
---
## Multi-Copy Archetypes
If a card is in Must Include and the builder detects it supports multi-copy (e.g., Relentless Rats), a count picker dialog appears. Set the desired copy count before confirming.
---
## Conflict Resolution
| Scenario | Behavior |
|----------|----------|
| Card is in both Must Include and Must Exclude | A conflict dialog prompts you to resolve before building. Exclude wins if unresolved. |
| Must Include card not in color identity | Build silently skips the card (does not hard-fail). Verify color identity before including. |
| Must Include card violates bracket rule | Card is added; bracket compliance report flags it. Resolve in Step 5 or adjust bracket. |
---
## Headless / CLI
Set include and exclude lists in the JSON config. Environment variable overrides are not supported for per-card lists; use the config file.
```json
{
"must_include": ["Swiftfoot Boots"],
"must_exclude": ["Demonic Tutor"]
}
```