---
type: reference
title: "Pokémon TCG — Submissions and Elo Lineages"
description: "Model/deck identity, local and remote submissions, and independent rating layers."
tags: [pokemon-tcg, submissions, elo, models, decks, cards, kaggle]
timestamp: "2026-08-15T17:12:00-03:00"
---

# Pokémon TCG — Submissions and Elo Lineages

## August 14 evidence boundary

The live database now contains 128 tournament summaries, 1,621 matchup
summaries, 8,055 submission observations and source-separated remote/local
tables. These counts describe the current local catalog, not a single
submission's competitive rating. The cross-cohort tournament results and the
uncertainty about replay-row retention are recorded in
[[pokemon_tcg_aug14_ablations_tournaments]] and
[[pokemon_tcg_aug14_data_etl_database_audit]].

The next read-only revalidation of the same source snapshot reports 139,783
matches, 3,065,706 match steps, 1,117 agents, 948 decks, 28,745 daily agent
Elo rows, 10,742 daily deck-Elo rows, 9,350 daily card-Elo rows, 128
tournament summaries and 1,621 matchup summaries. The match split is 138,023
remote and 1,760 local. These are database observations at the inspected
endpoint, not proof that all archived JSON members were ingested or that all
tournament cohorts share one reset boundary. The unresolved archive/database
count delta remains recorded in [[pokemon_tcg_aug14_data_etl_database_audit]].

## Identity

A model is a stable identity with immutable artifact revisions. A deck family is renameable with immutable composition revisions. A submission points to one concrete model revision and one concrete deck revision. The same model with several decks therefore produces several submissions without pretending the model changed.

The current implementation has partial submission identity: `teams`,
`submissions`, and `submission_decks` exist, and a submission can reference
multiple observed decks. Exact model/model-revision identity and submission
lifecycle events are still planned.

## Local policy

The same model/deck pair is one persistent local submission lineage across synchronous arena runs. A new pair starts at Elo 600. Local card ratings accumulate evidence across submissions.

## Remote policy

Each new Kaggle submission starts its own remote rating lineage at 600, even if the model is unchanged or only the deck changed. Local and remote evidence remain separate.

## Rating layers

Submission, model, deck and card ratings are separate. Submission ratings represent a concrete competitive pairing. Model and deck ratings aggregate their relevant populations. Card ratings aggregate card-level match evidence. A deck rating is an outcome-based composition rating, not a simple average of its cards.

The current code computes deck Elo and card Elo per source. Submission Elo,
model Elo, rating policies, epochs, and append-only rating events remain target
scope rather than implemented behavior.

## Current invariant-deck calculation

The live `ResultsDB.get_invariant_deck_elo` path is a deck-level calibration
surface, not a universal submission or model rating. For a deck with `N` games
and `W` wins, the current implementation clips `W/N` to `[0.02, 0.98]`, applies
the Bradley-Terry-style inversion around `R0 = 600`, shrinks it toward 600 with
`N0 = 10`, and adds a weighted local-to-remote translation estimated over
overlapping decks. The translation weights are exponential in local game
volume with `tau = 20`, capped for numerical stability.

The code currently uses `wins / games_played` for this invariant calculation.
Stored draws are not converted to half-wins in that path, even though the
ordinary online Elo update uses a 0.5 draw score. That difference is an
implementation detail and an open interpretation point, not a reason to call
the two ratings equivalent. The formula, assumptions and research boundary
are expanded in [[pokemon_tcg_elo_pagerank_invariance]].

The current local probe gives deck `633` an invariant Elo of approximately
`412.21` over 420 games and deck `251` approximately `577.39` over 420 games;
both satisfy the MD10 completeness flag. These values are source/database
observations from the inspected snapshot. They do not replace the
deck-conditioned win rates in [[pokemon_tcg_aug14_ablations_tournaments]], and
they should not be compared across reset or source boundaries without a
cohort label.

## Provenance of the rating lineage

The rating surface evolved in layers rather than arriving as one atomic
feature:

| Project history | Documentation meaning |
|---|---|
| `876ce34` and `8cfe68d` (2026-07-26) | Enforced source-separated card/deck Elo and changed the bootstrap from 1000 to 600 |
| `5beaac9` (2026-07-29) | Rebuilt the normalized SQLite database shape that carries day/source-partitioned ratings |
| `f90ac1e` (2026-08-11) | Added curriculum sweep orchestration and atomic Elo updates |
| `86aa528` and `89deb7d` (2026-08-12) | Added the Stage 3 tournament/rating changes and later local-Elo direction |
| `dbf298a` (2026-08-13) | Separated bulk Elo recomputation from ETL synchronization and recorded the idempotency boundary |
| `936d301` (2026-08-14) | Added the PageRank/Abelian graph-invariance monograph and updated the master RFC |

This sequence is why the project has several legitimate rating vocabularies:
ordinary daily Elo, source-separated deck/card Elo, invariant deck calibration,
and the proposed graph-theoretic bridge. They share lineage but are not one
metric.

## Related

[[pokemon_tcg_ladder_and_research]] · [[pokemon_tcg_deck_strategy]] · [[pokemon_tcg_physical_schema]] · [[pokemon_tcg_dashboard_and_tournament]] · [[pokemon_tcg_local_platform_status]]

[[pokemon_tcg_elo_pagerank_invariance]] · [[pokemon_tcg_sqlite_schema_current]] · [[pokemon_tcg_current_state_reconciliation]] · [[pokemon_tcg_empirical_ablation_monograph]]
