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.
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):
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. Theassistantcontent 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.
