CoolFace
Datasetpublic

build-small-hackathon/mind-of-tashi-selfplay

The Mind of Tashi — self-play traces Self-play data for SFT of a small reasoning model that plays The Mind of Tashi — a simultaneous-commit ritual fighting game where the opponent's <think> block is the game (surfaced to the player as the "mind-scroll"). Two LLMs duel each other under the game's blind-commit contract (each side sees only the match history, never the opponent's pending move); we keep the opponent side's full <think> + {move, taunt} as the SFT target. Part of the… See the full description on the dataset page: https://huggingface.co/datasets/build-small-hackathon/mind-of-tashi-selfplay.

sourceHugging Facecc-by-sa-4.0updated 4mo agoView on Hugging Face
0likes42downloads
Dataset Card

The Mind of Tashi — self-play traces

Self-play data for SFT of a small reasoning model that plays The Mind of Tashi — a simultaneous-commit ritual fighting game where the opponent's <think> block is the game (surfaced to the player as the "mind-scroll"). Two LLMs duel each other under the game's blind-commit contract (each side sees only the match history, never the opponent's pending move); we keep the opponent side's full <think> + {move, taunt} as the SFT target.

Part of the six-artifact submission for the Build Small Hackathon, Track Two: An Adventure in Thousand Token Wood (game Space, this dataset, SFT model + GGUF, OpenEnv gym, GRPO model + GGUF).

Configs

Two configs, each a single merged Parquet (no day-wise files):

ConfigFileShapeOne example =
sft (default)sft/train.parquetsingle-turn TRL conversationalone AI turn (history block summarises prior rounds)
sft_multiturnsft_multi/train.parquetmulti-turn TRL conversationalone whole match (model sees the full conversation across rounds)

Both are generated from the same self-play harvest by tools/prep_sft.py --shape {single,multi} and merged with tools/merge_dataset_parquet.py. They're complementary: single-turn rows densely teach format + register; multi-turn rows teach long-range pattern reading. Train on either, or datasets.concatenate_datasets([sft, sft_multiturn]) to combine.

Row schema

Each row has two columns:

  • —`messages` — TRL conversational list. sft: [system, user, assistant]. sft_multiturn: [system, user₁, asst₁, user₂, asst₂, …] across the match. The assistant content is the full <think>…</think> then one JSON line {"move": …, "taunt": …}.
  • —`_meta` — provenance + signal: persona id, teacher provider/model, bilingual_hits (count of normalised IAST lexicon matches in the thinking), turn/outcome reward, match length.

Role contract (the asymmetry)

The live game is asymmetric: the human commits a move only; the AI emits <think> + JSON move + taunt. Self-play mirrors that — player rows are move-only stand-ins (<think>/taunt stripped, is_sft_target=false) and are not included in these SFT configs; only the opponent side (the side we train) is kept here as [system, user, assistant] triples.

Bilingual register

<think> is targeted as English + IAST Hindi/Sanskrit code-switched (prahār, rakṣā, prāṇa, dṛṣṭi, abhyāsa, …) so the cognitive surface matches the game's Himalayan surface. _meta.bilingual_hits lets downstream training stratify on register; English-only rows are kept but down-weighted.

Provenance

Generated by tools/selfplay.py rotating across a pool of free-tier inference providers (Gemini family, Mistral, Sarvam, OpenRouter free models) with per-spec daily quota tracking, then quality-filtered (drop parse_reply-fallback rounds, matches < 3 turns, English-only <think>). Each row carries its teacher provider/model in _meta for traceability.

Quality filter

  • —Rounds where the model's reply didn't parse to valid JSON (engine fell back to GUARD) are dropped.
  • —Matches shorter than 3 turns are dropped.
  • —Combo-aware: harvested under the engine's hidden-combo rules, so the corpus is aligned with the deployed game.