Contract 6.5.0
Deck archetypes (docs/reviews/2026-09-20-DECK-ARCHETYPES-DESIGN.md; Jamie, 2026-09-20: players talk about decks by name, and Elixir has to name a deck and know what a name means). Every deck object now carries archetype - the deck's family (beatdown, control, cycle, bait, bridge_spam, siege; unclassified when no card carries a cost), its win condition(s) with form, a descriptive label composed as <win condition(s)> <family> ("Evo Royal Hogs bridge spam", "Hog Rider cycle", "Lava Hound Balloon beatdown"; the bare family when no attested win condition is in the deck), the average elixir, the basis, and two versions: the grammar's and the vocabulary's. A label is a noun, never a verdict: no matchup, no expected advantage, no quality claim, and none coming.
archetyperidesbattles_query(every rendered deck and duel round),battles_decks,battles_meta_decks(decks[]andunfieldable[]),cards_card.decksandplayers_summary(top_deck,best_deck), with one note per response saying what a label is and is not.battles_meta_decksandbattles_deckstakearchetype: a family, a composed label, or a community name (LavaLoon, Log Bait, 2.6 Hog, Hog EQ, Splashyard, PEKKA Bridge Spam...). Resolved alias first, then family, then label (card names as typed,pekkaincluded; an evo/hero prefix ignored);applied.archetypeechoes the resolution and a note names it; an unknown name is refused with the vocabulary in the hint. Applied over the rows the call would return (the meta reader labels its top 2,000 by the sort), denominators unchanged.- Grammar in code, vocabulary in data: the rules are in the contract package (
classifyDeck,resolveArchetypeName,GRAMMAR_VERSION,CYCLE_MAX); which cards are win conditions, bait units and bridge partners is cr-agent-api-docsdata/card-roles.jsonanddata/deck-aliases.json, one public source per entry, imported at deploy (card_role,deck_alias,card_role_version; migration 0147) and versioned by the file's commit time. A card absent from the file is not a win condition; the docs page names the unattested cards and the domain's research agent keeps the file. Not bound to the season: history is relabelled when the vocabulary improves. - The docs page
archetypescarries the families with their sources, the grammar, the cycle bound and how it is measured, and the resolution rules; thearchetype_censusoperator read runs the grammar over every recorded deck (family distribution, the unclassified share, the top labels, the average-elixir histogram per win condition, the unattested queue).
Additive.