{"data":{"protocol":{"package":"@cambridge-tcg/sku","resolver":"resolveOracle(sku, anchors) → OracleResolution","doctrine":"/methodology/oracle-policies","audit_command":"pnpm --filter @cambridge-tcg/sku test"},"counts":{"stripped":13,"passcode":2,"diverged":2,"single-lang":4,"total":21},"policies":[{"game":"op","name":"One Piece TCG","publisher":"Bandai","languages":["ja","en","zh","ko"],"pattern_kind":"stripped","rationale":"JP-first, EN-parallel; same set codes across language tracks.","oracle_id_form":"<game>-<set>-<number>[-<variant>] (language tail dropped)","required_anchors":[],"confirmed":true},{"game":"pkm","name":"Pokémon TCG","publisher":"TPCi","languages":["en","ja","zh","ko","fr","de","es","it","pt"],"pattern_kind":"diverged","rationale":"JP-track (s4, sv1, sm12a) and EN-track (swsh4, sv01, sma) have different set codes and partial reprint overlap; no upstream equivalence anchor. Requires manual equivalence curation (pkm_equivalence table).","oracle_id_form":"null (no upstream anchor; manual equivalence required)","required_anchors":[],"confirmed":true},{"game":"mtg","name":"Magic: The Gathering","publisher":"Wizards","languages":["en","ja","zh","ko","fr","de","es","it","pt","ru"],"pattern_kind":"stripped","rationale":"Same numbering across 10 languages; (game,set,number) is the anchor.","oracle_id_form":"<game>-<set>-<number>[-<variant>] (language tail dropped)","required_anchors":[],"confirmed":true},{"game":"ygo","name":"Yu-Gi-Oh!","publisher":"Konami","languages":["en","ja","zh","ko","fr","de","es","it"],"pattern_kind":"passcode","rationale":"Konami passcode (8-digit) is the global cross-language anchor; SKU set/lang are derivative.","oracle_id_form":"<game>-<passcode>[-<variant>] (set+number+lang dropped; requires anchor)","required_anchors":["ygo_passcode"],"confirmed":true},{"game":"dbs","name":"Dragon Ball Super CCG","publisher":"Bandai","languages":["en","ja"],"pattern_kind":"stripped","rationale":"Bandai legacy: same set codes across JP/EN.","oracle_id_form":"<game>-<set>-<number>[-<variant>] (language tail dropped)","required_anchors":[],"confirmed":true},{"game":"dbf","name":"Dragon Ball Super Fusion World","publisher":"Bandai","languages":["en","ja"],"pattern_kind":"stripped","rationale":"Bandai pattern: same set codes across JP/EN.","oracle_id_form":"<game>-<set>-<number>[-<variant>] (language tail dropped)","required_anchors":[],"confirmed":true},{"game":"wei","name":"Weiß Schwarz","publisher":"Bushiroad","languages":["ja","en"],"pattern_kind":"stripped","rationale":"Bushiroad pattern: JP-primary, EN-parallel where shipped.","oracle_id_form":"<game>-<set>-<number>[-<variant>] (language tail dropped)","required_anchors":[],"confirmed":true},{"game":"vng","name":"Cardfight!! Vanguard","publisher":"Bushiroad","languages":["en","ja"],"pattern_kind":"stripped","rationale":"Bushiroad pattern: same set codes across JP/EN.","oracle_id_form":"<game>-<set>-<number>[-<variant>] (language tail dropped)","required_anchors":[],"confirmed":true},{"game":"dmw","name":"Digimon Card Game","publisher":"Bandai","languages":["en","ja"],"pattern_kind":"stripped","rationale":"Bandai pattern: JP-first, EN-parallel, same set codes.","oracle_id_form":"<game>-<set>-<number>[-<variant>] (language tail dropped)","required_anchors":[],"confirmed":true},{"game":"bsr","name":"Battle Spirits Saga","publisher":"Bandai","languages":["en","ja"],"pattern_kind":"stripped","rationale":"Bandai pattern: same set codes across JP/EN.","oracle_id_form":"<game>-<set>-<number>[-<variant>] (language tail dropped)","required_anchors":[],"confirmed":true},{"game":"lcg","name":"Living Card Game","publisher":"various","languages":["en","ja"],"pattern_kind":"stripped","rationale":"LCG umbrella covers multiple games; per-product adapter still needed for cross-product oracles.","oracle_id_form":"<game>-<set>-<number>[-<variant>] (language tail dropped)","required_anchors":[],"confirmed":true},{"game":"fab","name":"Flesh and Blood","publisher":"LSS","languages":["en"],"pattern_kind":"single-lang","rationale":"Flesh and Blood ships in English only; cross-language siblings do not exist.","oracle_id_form":"<game>-<set>-<number>[-<variant>] (same as stripped; game ships in one language)","required_anchors":[],"confirmed":true},{"game":"lgr","name":"Disney Lorcana","publisher":"Ravensburger","languages":["en","fr","de"],"pattern_kind":"stripped","rationale":"Simultaneous global release in EN/FR/DE; matched numbering.","oracle_id_form":"<game>-<set>-<number>[-<variant>] (language tail dropped)","required_anchors":[],"confirmed":true},{"game":"swu","name":"Star Wars Unlimited","publisher":"Fantasy Flight Games","languages":["en","fr","de","es","it"],"pattern_kind":"stripped","rationale":"Simultaneous EN/FR/DE/ES/IT release; matched numbering.","oracle_id_form":"<game>-<set>-<number>[-<variant>] (language tail dropped)","required_anchors":[],"confirmed":false},{"game":"sor","name":"Sorcery: Contested Realm","publisher":"Erik Olofsson","languages":["en"],"pattern_kind":"single-lang","rationale":"Sorcery: Contested Realm ships in English only.","oracle_id_form":"<game>-<set>-<number>[-<variant>] (same as stripped; game ships in one language)","required_anchors":[],"confirmed":false},{"game":"alt","name":"Altered TCG","publisher":"Equinox","languages":["en","fr"],"pattern_kind":"stripped","rationale":"Simultaneous EN/FR release; matched numbering.","oracle_id_form":"<game>-<set>-<number>[-<variant>] (language tail dropped)","required_anchors":[],"confirmed":false},{"game":"rft","name":"Riftbound","publisher":"Riot Games","languages":["en"],"pattern_kind":"single-lang","rationale":"Riftbound (Riot, 2025+) launches English-only; revise on confirmation.","oracle_id_form":"<game>-<set>-<number>[-<variant>] (same as stripped; game ships in one language)","required_anchors":[],"confirmed":false},{"game":"rsh","name":"Yu-Gi-Oh! Rush Duel","publisher":"Konami","languages":["ja","en"],"pattern_kind":"passcode","rationale":"Rush Duel uses the YGO passcode system; same anchor model.","oracle_id_form":"<game>-<passcode>[-<variant>] (set+number+lang dropped; requires anchor)","required_anchors":["ygo_passcode"],"confirmed":false},{"game":"pkp","name":"Pokémon Pocket","publisher":"TPCi","languages":["en","ja","zh","ko","es","fr","de","it"],"pattern_kind":"diverged","rationale":"Mobile-derived catalog; per-region differences expected; status confirmed on first ingest.","oracle_id_form":"null (no upstream anchor; manual equivalence required)","required_anchors":[],"confirmed":false},{"game":"gen","name":"Genshin Impact TCG","publisher":"HoYoverse","languages":["en","zh","ja","ko"],"pattern_kind":"stripped","rationale":"Publisher TBD; default to stripped pending first ingest confirmation.","oracle_id_form":"<game>-<set>-<number>[-<variant>] (language tail dropped)","required_anchors":[],"confirmed":false},{"game":"tst","name":"Test","publisher":"(internal)","languages":["en"],"pattern_kind":"single-lang","rationale":"Internal test game; English-only by convention.","oracle_id_form":"<game>-<set>-<number>[-<variant>] (same as stripped; game ships in one language)","required_anchors":[],"confirmed":true}],"conventions":{"pattern_kinds":"stripped (multi-language same-numbering — MTG, OP, Lorcana, SWU, Bandai games, Bushiroad games) / passcode (Konami's 8-digit anchor — YGO, Rush Duel) / diverged (different language-track set codes; no upstream anchor — Pokémon, Pokémon Pocket) / single-lang (game ships in one language only — FaB, Sorcery, Riftbound). Adding a new pattern = adding a new enum value + a switch arm in resolveOracle().","variant_handling":"Variant tail (foil, alt-art, 1st, etc.) is preserved on the oracle. Foil-EN and foil-JA share an oracle; foil-EN and non-foil-EN do NOT. Substrate-honest: variant is a structural dimension orthogonal to language.","cross_language_query":"Given a SKU, resolveOracle() returns the oracle_id. To find cross-language siblings, query card_set_cards.oracle_id (K2 schema migration). For diverged-pattern games, query pkm_equivalence (K2 operator-curated table) instead.","federation":"Per-source upstream cross-language ids (scryfall_oracle_id, cardmarket_id_metacard, ygo_passcode, tcgplayer_product_id) populate independent columns on card_set_cards (K2). The federation primitive at /api/v1/federation/identify/[hash] will be extended to accept per-source ids (post-K2)."}},"_meta":{"spec_version":"1","endpoint":"/api/v1/oracle-policies","retrieved_at":"2026-05-13T18:56:02.749Z","as_of":"2026-05-13T18:56:02.749Z","sources":["ctcg-derived"],"freshness_seconds":86400,"license":"CC0-1.0","request_id":"req_a62e4c13-998","deprecation":null,"next_link":null,"self_reference":{"this_endpoint":"/api/v1/oracle-policies","contains_self":true}}}