Unit Data Schema — Topic 01: Core Unit/Card Entity — Omega War

Stage 2 · per-topic review · topic 01 of 6 · cycle unit-data-schema · page created 2026-06-14 · revised 2026-06-14 (topic-01 review pass)

alignment_status: review — Stage 2 of 3, per-topic research review.
This page reviews topic 01 only — the core card entity, its field table, enum value sets, and the veterancy/trait-tag field shapes — compiled from the working doc research/unthinkable/_working/unit-data-schema/01-core-unit-card-entity.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 — entities, fields, enums, relationships, and a few clearly-marked illustrative rows. It assigns no combat stats, prices, exact counts, trait buff/debuff magnitudes, veterancy level magnitudes, or balance. Phase/era split (UD-A2): match-phase A/B/C (phase_band) and campaign era-band E0/E1/E2 (era_band) are two separate required fields, never conflated; the detailed semantics belong to topic 03 — topic 01 only records that the card carries both.
Stage-1 scope-approval record (read-only) — the unit-data-schema cycle scope was approved at Stage 1 on the hub page unit-data-schema-omega-war.html: deliverable shape-not-values-spec; input sources, entity set, and assumptions (UD-A1UD-A7) all approved; post-confirm route tactical-vertical-slice-spec. A process addition (UDQ1 approve-with-additions) decomposed Stage 2 into six per-topic docs reviewed one by one — this page is the topic-01 review.
Revision — 2026-06-14 topic-01 review pass

This page was revised from the topic-01 compiled YAML. Three edits, each badged Changed / Updated on the affected block below:

  1. Dropped Confidence (enums revision). The reliability field and the Confidence enum are removed — source quality is already carried by zone / plausibility_tier / source_ref, so no replacement field. (§2 field table, §3.6, enums gate.)
  2. Resolved CardClass (was the headline open fork). The full closed vehicle/heavy leaf set is authored this pass — no longer deferred to synthesis. (§3.1, §7 illustrative row, §8 open questions, §9 register, cardclass-open gate.)
  3. Clarified card-vs-instance (json vs db). Authored card = static definition layer; unit instance = runtime state; the storage medium (content files vs DB) is deferred to the tactical vertical-slice spec under UD-A1. (§1 callout.)

The cycle stays in review — no canonical artifact, no glossary output. After this pass the route gate proceeds to topic 02 (equipment & variants).

1. Purpose & scope of this topic — card-vs-instance

Define the unit/card entity — the single most-referenced object in the schema. Every other topic hangs off it: equipment & variants (02) attach to it, the phase/era split (03) are two of its fields, the deck/band/card-roster (04) references it, the To&E proportions (05) count it by class, and CP/wonder governance (06) constrains which instances deploy when.

Card vs unit instance. In this game a card is the deck-builder unit of selection and a unit is its battlefield instantiation. The arsenal §4A taxonomy is card-level ("WARNO-card style"); divisions §4 counts card-classes. This topic treats card as the schema's primary entity and unit instance as a thin runtime projection of it (an instance carries live state — position, current veterancy progress, suppression — none of which is authored here). The schema authors the card; the engine spawns unit instances.

Static vs runtime, and where bytes live Updated 2026-06-14. The authored card is the static definition layer (content/JSON-authored — the field set in §2); the unit instance is runtime/live state (position, veterancy progress, suppression). The storage medium — whether authored cards live in content files or DB tables, and where instance state is persisted — is an implementation choice deferred to the tactical vertical-slice spec under UD-A1. This topic fixes the field set, not where the bytes live.

2. The card entity — field table Changed 2026-06-14 — dropped reliability

Field types use a deliberately small vocabulary: enum (closed value set defined in §3), string, bool, ref<Entity> / ref<Entity>[] (relationship, resolved in the named topic), ordinal-enum (ordered tiers), deferred (a slot whose value is intentionally not authored this cycle — UD-A1). In the Req? column, required chips mark the authored-required set; optional chips mark optional/attachable fields.

FieldTypeReq?Shared vs per-factionSourceNotes
idstring (stable key)requiredsharedschemaStable internal identifier; never a display name.
display_namestringrequiredper-faction§4A cellsThe historical name shown on the card (e.g. "Rifle Squad '45").
card_classenum CardClassrequiredshared§4AThe accepted taxonomy class. Value set in §3.1.
factionref<Faction>requiredn/a§3Owning faction; Faction entity modeled in topic 04/synthesis.
categoryenum Categoryrequiredshared§3Coarse arm/role grouping (infantry / armor / support / …). Value set in §3.2. Distinct from card_class (finer).
era_bandenum EraBandrequiredshared§4Campaign availability axis E0/E1/E2. Full treatment in topic 03.
phase_bandenum PhaseBandrequiredshared§4In-match escalation axis A/B/C, authored per card. Topic 03. Never conflated with era_band (UD-A2).
zoneenum Zonerequiredshared§4BPlausibility/provenance dial: baseline / stretch / what-if. Value set in §3.4. Page copy must never blend zones (§4B rule).
plausibility_tierenum Tieroptionalshared§2/§3T1–T4 evidence tier where one is recorded; pairs with zone. Value set in §3.5.
veterancy_trackref<VeterancyTrack>requiredsharedgenre §3Which in-battle veterancy ladder this card uses. Ladder shape in §4. Persists into campaign (persistence hook only; refit economy deferred, UD-A5).
transport_optionsref<Card>[]optionalper-faction§4A.1Nested transport selection (config pattern). Relationship detail in topic 02.
trait_tagsref<TraitTag>[]optionalshared cataloguegenre §3Identity buff/debuff tags. Catalogue + magnitudes deferred (Prototype, UD-A4). Tag shape in §5.
variantsref<Variant>[]optionalper-faction§4A.1Separate-card variants / upgrade packages. Modeled in topic 02.
equipmentref<EquipmentItem>[]optionalper-faction§3The kit the card fields. Modeled in topic 02 (separate-entity vs attribute decision lives there).
framing_notestringoptionalper-faction§4BProvenance/what-if framing surfaced in UI (e.g. "Soviet trophy"). Carries the §4B "never lie about provenance" discipline.
source_refstringoptionalper-factionallCitation/claim anchor (e.g. "Claim 4.10").

Every field here is static authored data on the card. No runtime/instance state (position, current veterancy progress, suppression) appears in this table — that lives on the unit instance (§1), and its storage is deferred to the vertical-slice spec.

Required-set rationale. A card cannot be authored, placed in a band, or counted in a To&E without id, display_name, card_class, faction, category, both band axes (era_band, phase_band), zone, and a veterancy_track. Everything else is optional/attachable.

Gate — card-model required

Approve the card-as-primary-entity vs unit-instance split (§1) and the field table + required set (§2)?

3. Enum value sets (these are shape, not values)

Enumerating allowed members is schema shape, not balance. Magnitudes attached to these members (cost, stats) stay deferred. Five enum sets follow.

3.1 CardClass — accepted §4A taxonomy Resolved 2026-06-14 — closed set

Closed enum. The §4A table enumerates the infantry/team classes verbatim:

line_squadassault_eliteengineermg_teammortar_teamat_teamflame_teamsniperreconcommand_logspecialistrecovery

The vehicle/heavy leaves were resolved this review pass — no longer deferred to synthesis — grounded in arsenal §3 category headings, §4A.1 named types, the SD2 nine-tab deck calibration, and the explicitly-added "+4" (spaag / recovery / command / sniper):

GroupCardClass leaves
Armor / direct-firetank_medium, tank_heavy, tank_light, assault_gun, tank_destroyer
Anti-tank (towed)at_gun
Artilleryartillery_towed, artillery_self_propelled, rocket_artillery
Air defenseaa_gun (towed), spaag
Transport / logisticstransport (halftrack/APC/truck kit; command_log already covers command+supply cards)
Airaircraft (fighter / ground-attack / bomber sub-roles flagged as a synthesis refinement)
Reconciliation note (resolved record)

This closed set is reconciled against arsenal §4A. recon (scouts, incl. light-vehicle recon) and recovery (ARV) from the infantry-12 are the vehicle-recon and recovery classes — not duplicated in the vehicle/heavy group above. Air sub-roles (fighter / ground-attack / bomber) may split at synthesis but are one aircraft leaf here. The earlier "synthesis must reconcile" fork (gate cardclass-open) is now resolved in place.

3.2 Category — coarse arm/role grouping

Proposed members (shape; final set confirmed at synthesis against §3/§4A):

infantryarmorreconsupportanti_tankanti_airartillerycommand_logisticsrecoveryair

support = MG/mortar/engineer/flame. category is the SD2-tab-style coarse grouping; card_class is the finer leaf. A card has exactly one of each.

3.3 Band axes — EraBand / PhaseBand

EnumMembersMeaning
EraBandE0, E1, E2Early / Mid / Late campaign availability axis.
PhaseBandA, B, CVanguard / Main Body / Commitment in-match escalation axis.

Two separate required fields, never conflated (UD-A2). Topic 03 owns the detailed semantics, worked example, and the strong-weapons-locked-out-of-A rule; topic 01 only records that the card carries both.

3.4 Zone — provenance dial (§4B, ADOPTED)

3.5 Tier — plausibility evidence tier

Changed 2026-06-14 The former §3.6 Confidence enum was dropped — source quality is already carried by zone / plausibility_tier / source_ref, so it was redundant.

EnumMembersMeaning
Zone (required)baseline, stretch, what_ifAdopted three-zone dial: baseline = documented in-window at scale; stretch = documented capacity + mobilization argument (flagged); what_if = explicit fiction lever, never on by default, UI-labeled counterfactual. Every roster item "sits in exactly one zone."
Tier (optional)T1, T2, T3, T4Plausibility evidence tier (arsenal §2 ARQ2 adopted). Where present it refines zone. The tier→zone interaction (e.g. T4 paper at in-window date) is a synthesis note, not authored here.

Gate — enums required

Approve the enum value sets (Category, the band axes, Zone, Tier) as defined? (Confidence was dropped this pass; CardClass is now resolved in §3.1 — see the resolved record below.)

Gate cardclass-open — RESOLVED 2026-06-14 resolved record

The prior pass gated the vehicle/heavy CardClass rows as a defer-or-resolve fork. The reviewer's note ("I don't understand this question") was resolved with the user by resolving it now: the full closed vehicle/heavy leaf set is authored above in §3.1, reconciled against arsenal §4A category headings + §4A.1 named types. No longer a synthesis deferral and no longer a live gate — this block is a read-only record of the decision.

4. Entity-relationship diagram

The card entity and its relationships
Green = related-entity shape resolved here in topic 01. Orange = field carried on the card now, related entity deferred to the named topic.
card entity — relationships (topic 01) card primary entity faction → topic 04 / synthesis equipment item → topic 02 variant → topic 02 transport options → topic 02 CP / wonder slot → topic 06 division / To&E → topic 05 deck / card-roster → topic 04 trait tag resolved here · §5 veterancy track resolved here · §4

5. Veterancy field (genre §3 — must-have, in-battle, persists)

Veterancy is a must-have in-battle mechanic that persists into the campaign as a persistence surface; the refit/upgrade economy is a campaign-layer deferral (UD-A5). Shape:

Entity / fieldTypeNotes
VeterancyTrackentityid; levels: VeterancyLevel[] (ordered).
VeterancyLevel.rankordinal indexOrder within the ladder.
VeterancyLevel.labelstringe.g. rookie / trained / veteran / elite — illustrative, count not fixed here.
VeterancyLevel.modifiersdeferredNo buff numbers — UD-A1/UD-A4.
card.veterancy_trackref<VeterancyTrack>Which ladder this card uses.
(unit instance) progressruntime-onlyLives on the unit instance, not the authored card; survives the battle (campaign-persistence hook).

The number of levels and any per-level magnitude are values, not shape — deferred. The schema fixes only that a track is an ordered list of levels with a deferred modifier slot, and that progress is instance state that survives the battle (the campaign-persistence hook).

6. Trait-tag field (genre §3 — Prototype)

Prototype trait_tags: ref<TraitTag>[] on the card. The catalogue and magnitudes wait for the Prototype-tier balance pass (UD-A4). The TraitTag entity shape:

FieldTypeNotes
idstringStable key.
namestringe.g. shock / commando / militia / leader — illustrative catalogue from genre §3, full catalogue deferred (UD-A4).
polarityenum {buff, debuff, mixed}A tag confers buffs, debuffs, or both — shock=buff, militia=debuff, leader=aura/buff, commando=buff.
effectdeferredNo magnitude, no stacking rules this cycle.

So the schema fixes that a card holds zero-or-more trait-tag references and that a tag declares a polarity, while the catalogue membership and all numbers wait for the Prototype-tier balance pass.

Gate — veterancy-traits required

Approve the veterancy-track field shape (§5, ordered ladder with a deferred modifier slot) and the trait-tag field shape (§6, polarity declared) with magnitudes and catalogue deferred (UD-A4/UD-A5)?

7. Illustrative filled rows (shape demonstration only — NO values) Updated 2026-06-14

Two rows, marked illustrative. They show field population, not balance — no costs, no stats.

iddisplay_namecard_classfactioncategoryera_bandphase_bandzonetrait_tagsframing_note
us_rifle_squad_45Rifle Squad '45line_squadUSinfantryE0Abaseline
de_elefant_wonderElefant (Soviet trophy)tank_destroyerUSSRarmorE2Cwhat_if"two Berlin survivors, Soviet-captured (Claim 4.10)"

The second row exercises a heavy-vehicle card (tank_destroyer — Elefant = heavy TD) from the now-closed §3.1 set, plus the zone=what_if + framing_note provenance discipline. Changed 2026-06-14 — was (vehicle class — see §3.1 OPEN).

8. Open questions carried to synthesis Updated 2026-06-14

resolved The former item 1, "Full CardClass membership", is resolved — the closed set is now authored in §3.1 (see the cardclass-open resolved record).

  1. open Category final set (§3.2) — confirm the coarse grouping list and the class→category mapping against §3/§4A. (CardClass is now closed; only the coarser Category set remains open.)
  2. open Equipment as entity vs attribute — resolved in topic 02; topic 01 leaves equipment as a ref list pending that decision.
  3. open card vs unit instance boundary — confirm at synthesis that authored fields (this doc) and runtime state (position, veterancy progress, suppression) stay cleanly separated, and that the storage medium lands in the vertical-slice spec.
  4. open Air sub-roles (§3.1) — whether aircraft splits into fighter / ground-attack / bomber leaves is a synthesis refinement.
  5. open Veterancy level count & labels — values; deferred but flagged so the prototype pass knows the shape expects an ordered ladder.

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 §8 open questions (they carry to synthesis unless you direct otherwise in notes).

9. Deferred-values register (this topic)

DeferredWhyWhere it lands
Combat stats / costs on any cardUD-A1 shape-not-valueslater balance pass
Veterancy per-level modifiersUD-A1/UD-A5prototype + campaign economy
Trait-tag effect magnitudes & catalogueUD-A4 Prototypeprototype balance pass
Per-division card countsarsenal §4A / divisions §4 explicitly deferdivisions/To&E (topic 05)

Changed 2026-06-14 The "Vehicle-class enum rows" row was removed from this register — those leaves are now authored in §3.1, not deferred.

10. Source log (topic 01)

This is a design-synthesis topic over already-approved internal sources — "evidence" here is the source-section → schema mapping below, not external research.

11. 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.