Unit Data Schema — Topic 04: Deck / Band / Card-Roster — Omega War
Stage 2 · per-topic review · topic 04 of 6 · cycle unit-data-schema · page created 2026-06-14
Topic 04 is approved (compiled YAML consumed; route set to proceed to topic 05; see the green approval record below) and this page is now frozen read-only. The cycle stays
review
pending the deferred synthesis of all six topics — no per-topic canonical write happens on approval.
This page reviews topic 04 only — the deck-authoring layer: the
Deck entity, the
deployment Band A/B/C (Vanguard / Main Body / Commitment), the CardRosterEntry deck × band × card
join, the CommandPost unlock surface, and the deck join that reconciles the
in-match phase_band with the deck-side deployment band — compiled from the working doc
research/unthinkable/_working/unit-data-schema/04-deck-band-card-roster.md. The cycle was
decomposed (at the user's direction) into six per-topic docs reviewed one by one; the
canonical artifact research/unthinkable/unit-data-schema.md is the later synthesis of all
six topics, not this page. This page authors no canonical artifact and
no glossary output, and it stays review.
Boundary (UD-A1): this topic defines shape, not values — the deck/band/roster entities, the join, and the deck-join relationship model. It assigns no magnitudes: no per-deck card counts, no command-post costs or unlock timings, no band capacities, no wonder-slot cost/cooldown numbers, no balance. The one-wonder-slot-per-playable-deck rule is authored as a structural constraint shape, not a tuned cap.
missing_required: [], section_feedback: []. The route approves topic 04 and proceeds
to topic 05. The deck-join-model answer used revise-deck-join, but the note explicitly
says this is not a schema revision: the two-gate phase_band +
deployment_band model stays intact, while catch-up / anti-snowball mechanics are deferred to a
later balancing and fun pass.
| Gate | Answer |
|---|---|
roster-shape | approve-roster-shape (the Deck, CardRosterEntry, CommandPost, and structural wonder-eligibility shape are approved) |
deck-join-model | revise-deck-join with note: no schema revision; defer catch-up / anti-snowball research to balancing and fun |
route | proceed-topic-05 (approve topic 04; proceed to division / To&E mapping) |
Verbatim compiled YAML (frozen):
phase_band A/B/C axis (player
labels Recon / Frontline / Breakthrough) and explicitly deferred the deck join to this topic:
whether the schema's phase_band and the roster's deployment-band + command-post unlock are the same
axis viewed from deck-side, or two related-but-distinct gates. Topic 04 owns that reconciliation (§6). No new
field is added to the card; the new entities are all deck-side.
1. Purpose & scope of this topic
Author the deck-authoring layer: the Deck entity (a faction's playable card
pool), the deployment Band A/B/C that groups a deck's cards by command-post tier, the
card-roster join that places each card into a band, and the command-post unlock
surface that opens a band in-battle. Then resolve the deck join topic 03 deferred: how the
deck-side deployment band relates to the in-match phase_band.
No new card field. Topic 01 authored the card; topic 03 authored
its phase_band. This topic builds the deck that selects cards and the
roster join that slots each card into a deployment band — all deck-side. Same UD-A1 discipline:
entities, enums, and the join relationship as shape, not values — no card counts, no costs, no unlock
timings, no balance.
2. The Deck entity — the deck-builder selection set
A deck is the player's faction-and-division-scoped pool of cards taken into a match — the
deck-builder unit of selection above the individual card. Source: roster §6.2 (per-deck card-roster
table, one row per playable deck) and §8 (every deck row states a status).
| Field | Type | Req? | Notes |
|---|---|---|---|
id | string (stable key) | required | Stable internal identifier (e.g. us_2nd_armored). |
display_name | string | required | Player-facing deck name (roster §6.2 deck column). |
faction | ref Faction | required | Owning faction; shared with topic 01's card.faction. Faction entity modeled in topic 04/synthesis. |
division | ref Division | optional (deferred) | To&E mapping — the division/deck identity link is topic 05; named here only as the slot. |
card_roster | ref CardRosterEntry[] | required | The deck's roster — the deck × card join entries (§4). |
status | enum DeckStatus | optional | Governance status (roster §8.1): slice / base / conditional-base / expansion-backlog / attachment-only / flavor-only / reject. |
A deck's size, its exact card list, and its release tier are content/balance values (§9). This topic fixes that a deck is a faction-scoped, status-tagged set of roster entries — not the entries' contents.
3. The DeploymentBand axis — the deck-side band
DeploymentBand ∈ {A, B, C} — the deck-authoring grouping that sorts a deck's cards by
which command-post tier unlocks them in battle. Source: roster §6.1 (band contract) — the
deck-side A/B/C ladder, named Vanguard / Main Body / Commitment.
| Member | Band name | Deck-authoring meaning (roster §6.1) | Command-post unlock surface |
|---|---|---|---|
A | Vanguard | Recon, scouts, forward detachments, light infantry, engineers, light armor, early team weapons. | Forward Command Post / Recon Post / Assembly Area — match start or earliest tier. |
B | Main Body | Line squads, standard tanks/assault guns, regular artillery, AT/AA, logistics. | Motor Pool / Field Workshop / Artillery Battery / Supply Dump. |
C | Commitment | Heavy armor, breakthrough artillery, elite reserves, air/strategic support, and the deck's required one wonder slot. | Advance Command Post upgrade / Fire Direction Center / Air Liaison / Army Group Liaison. |
Naming distinctness (cross-topic). This deck-side band's labels (Vanguard / Main Body /
Commitment) are deliberately kept distinct from topic 03's player-facing phase_band
labels (Recon / Frontline / Breakthrough). Both ladders run A/B/C underneath; the distinct names keep
the deck-authoring band and the in-match window visually separable (topic 03 §6).
4. The CardRosterEntry join + CommandPost unlock
The roster is not a bare list of card refs — each entry slots a card into a deployment band within a deck and records its eligibility flags. This is the join that makes "the deck × band × card" relationship explicit. Source: roster §6.2 (cards grouped by band per deck) + §6.3/§8 (wonder eligibility).
| Field | Type | Req? | Notes |
|---|---|---|---|
deck | ref Deck | required | The owning deck (back-reference; Deck.card_roster holds the forward set). |
card | ref card | required | The topic-01 card placed by this entry. |
deployment_band | enum DeploymentBand | required | Which band tier (A/B/C) the card sits in for this deck (§3). |
cp_unlock | ref CommandPost | optional (shape) | The command-post surface whose unlock opens this entry in-battle (§5 below). May be derived from deployment_band; modelled as a slot, resolution deferred. |
wonder_eligible | bool | required (default false) | Marks the Band-C entry that fills the deck's wonder slot; the one-wonder-slot rule (roster §6.3/§8.3) constrains exactly one true per playable deck. Shape only — which card and its cost are content. |
Deck-level invariant. For every playable Deck.status row, exactly one
Band-C CardRosterEntry must set wonder_eligible = true. Attachment-only,
flavor-only, and reject rows are outside this playable-deck obligation.
The same card can appear in different decks at different bands (a TD card that is Band B for an
armor deck but an attachment for an infantry deck), so band is a property of the entry, not of
the card. Card-level fields (era_band, phase_band, phase_min from topics
01/03) stay on the card; the entry adds the deck-scoped band placement on top.
CommandPost — the in-battle unlock surface
Command-post surfaces are the in-battle structures whose unlock opens a deployment band's cards. Source: roster §7.1 (naming — "Forward Command Post" as the umbrella, concrete wartime facility names beneath) and §7.2 (the unlock mapping).
| Field | Type | Req? | Notes |
|---|---|---|---|
id | string (stable key) | required | e.g. motor_pool, advance_command_post. |
display_name | string | required | Player-facing facility name (roster §7.1: Assembly Area, Motor Pool, Field Workshop, Artillery Battery, Fire Direction Center, Air Liaison, Army Group Liaison). |
unlocks_band | enum DeploymentBand | required | The band tier this surface opens (roster §7.2: Forward CP → Band A, Motor Pool → Band B armor, Advance CP → Band C). |
unlocks_scope | enum UnlockScope | optional (shape) | Coarse category opened (infantry / armor / artillery / air / logistics) — roster §7.2 design-intent column. Shape only; the exact card set is content. |
Gate — roster-shape required
Approve the deck-authoring shape: Deck (§2), DeploymentBand A/B/C (§3), the
CardRosterEntry deck × band × card join (§4), and the CommandPost unlock surface —
with exactly one Band-C wonder slot required per playable deck as a structural constraint (magnitudes deferred
under UD-A1)?
5. The deck join — phase_band vs deployment_band
The reconciliation topic 03 deferred. Two A/B/C ladders touch the same deck:
phase_band (topic 03, on the card) — the in-match escalation
window (Recon / Frontline / Breakthrough), a card-intrinsic property; and
deployment_band (this topic, on the CardRosterEntry) — the
deck-side grouping (Vanguard / Main Body / Commitment), a deck-scoped,
command-post-gated property.
| Axis | Lives on | Gated by | Scope |
|---|---|---|---|
phase_band (Recon/Frontline/Breakthrough) | the card (intrinsic) | match clock (timed/earned window) | identical in every deck that fields the card |
deployment_band (Vanguard/Main Body/Commitment) | the CardRosterEntry (per-entry) | player build choice (command-post unlock) | can differ between decks |
Model: two related-but-distinct gates that compose (logical AND). A card in a deck becomes
deployable when both (1) the match's phase window has reached the card's phase_band
(respecting its phase_min floor, topic 03 §2.1), and (2) the command-post surface for
the entry's deployment_band is unlocked in-battle. They are correlated — authors put
Recon-window cards in Vanguard and Breakthrough-window cards in Commitment, and CP escalation tracks phase
escalation — but not the same field: phase_band is intrinsic to the card and gated by
the match clock; deployment_band is per-entry and gated by a player build choice. Keeping them distinct
lets a card be phase_band A yet placed in a deck's Band B (gated behind the Motor Pool) — the two gates
compose rather than collapse.
The contract: (phase_band, deployment_band) compose as an AND of two gates;
neither replaces the other, and synthesis preserves both. Whether deployment_band is
stored on the entry or derived from phase_band + the deck's CP layout is an open
question (§7) — this topic fixes the relationship model, not the storage.
Gate — deck-join-model required
Approve resolving topic 03's deferred deck join as two related-but-distinct gates that compose
(AND) — the card-intrinsic phase_band (match clock) and the deck-scoped
deployment_band (command-post unlock) both gate deployment, rather than collapsing them into one
axis?
6. Illustrative filled rows (shape demonstration only — NO values)
Three roster entries showing the join populated, values-free — placement, not counts or costs.
| Deck | card | deployment_band | cp_unlock | wonder_eligible | Reading |
|---|---|---|---|---|---|
us_2nd_armored | us_cavalry_recon | A (Vanguard) | forward_command_post | false | Recon screen, opens at the Forward CP — Band A. Card's phase_band A composes with the Band-A unlock. |
us_2nd_armored | us_m26_pershing | C (Commitment) | advance_command_post | false | Heavy armor gated behind the Advance CP — Band C; its phase_band C window must also be reached. |
us_2nd_armored | us_super_pershing | C (Commitment) | advance_command_post | true | The deck's single wonder candidate (roster §6.3) — Band C, one-wonder-slot rule holds. |
Deck/card ids are illustrative shape, not a roster assertion. Sourced from roster §6.2 / §6.3 US 2nd Armored row — labels and placements, no counts or costs.
7. Open questions & route
- open
deployment_bandstorage vs derivation (§5) — whether the band is stored on eachCardRosterEntryor derived from the card'sphase_bandplus the deck's command-post layout is a synthesis decision. - open
cp_unlockmodelling (§4) — whether the command-post surface is a referenced entity, an enum, or a constraint derived fromdeployment_bandis open. - open Division ↔ deck identity (§2) — the
Deck.divisionlink and how To&E proportions shape a deck's roster is owned by topic 05; named here only as a slot. - open Faction entity —
Deck.faction/card.factionshare an unmodelledFactionentity; its full shape is a synthesis/topic-05 item. - open Campaign evolution of decks — roster §7.3's short-vs-long-campaign deck changes (replacements, cannibalization, rebuilds) are a campaign-economy layer, deferred (not authored here).
The disposition of these open questions is carried by the route gate below.
Gate — route required
How should the cycle proceed? This also disposes the §7 open questions (they carry to synthesis unless you direct otherwise in notes).
8. Deferred-values register (this topic)
| Deferred | Why | Where it lands |
|---|---|---|
| Per-deck card counts and exact card lists | UD-A1 shape-not-values; content | content/balance pass |
| Command-post unlock costs, build times, prerequisite chain | UD-A1; in-battle economy | prototype balance / campaign-economy pass |
| Wonder-slot card identity, cost / cooldown / one-use limits (the §6.3 gates) | UD-A1; content and balance; the slot itself is required per playable deck | content/balance pass |
| Band capacities (how many cards per band) | content (values) | balance/content pass |
| Campaign deck-evolution magnitudes (roster §7.3) | campaign economy | campaign-economy pass |
| Catch-up / anti-snowball mechanics for phase/deployment pressure | balancing and fun concern, not topic-04 schema shape | balancing and fun pass |
9. Source log (topic 04)
This is a design-synthesis topic over already-approved internal sources — "evidence" here is the source-section → schema mapping below, not external research.
proposed-divisions-and-decks-roster§6 (RDQ4) — the band contract (§6.1: Band A/B/C = Vanguard / Main Body / Commitment + command-post unlock surfaces), the per-deck card-roster table (§6.2), and wonder eligibility (§6.3) — theDeck,DeploymentBand, andCardRosterEntryshapes (placements only, no counts).proposed-divisions-and-decks-roster§7 (RDQ5) — command-post naming (§7.1) and the unlock mapping (§7.2: which surface unlocks which band/scope) — theCommandPostshape; campaign-evolution rules (§7.3) noted as deferred.proposed-divisions-and-decks-roster§8 (RDQ6) — governance: deck status set (§8.1), per-card zone (§8.2), the strict one-wonder-slot rule (§8.3) — theDeckStatusenum and thewonder_eligibleconstraint shape.01-core-unit-card-entity.md— thecardentity the roster join references.03-phase-vs-era-band.md— the in-matchphase_bandaxis (andphase_minfloor) this topic joins to the deck-sidedeployment_band(the deck join, §5).
10. Compile Responses
Answer the required gates above, add optional section feedback, then compile and copy the YAML into the next execution message. You may compile partial responses.