No description
- Python 88.4%
- C# 8.7%
- Shell 2.9%
Turn the data we already have into an open, educational dataset, so the trace we are about to start collecting has somewhere to go. `migrate.py` produces: * runs.jsonl 37 runs with outcome, killer, seed and final deck * decisions.jsonl 1052 decisions, each with its own outcome attached * states_index.jsonl 346 unique observations * states/ content-addressed gzipped blobs Content addressing matters: measured, only 56% of captures are unique, so 44% of storage is duplicates. 3.28 MB raw -> 0.42 MB stored. The card-reward rows keep the REJECTED options, so this is a ranking dataset rather than a classification one, and the per-fight `damage_taken` / `turns_taken` pair is the dense reward signal a combat policy is judged on. What it deliberately does NOT do: reconstruct per-step combat state/action pairs. The session logs record the action but not the observation, and captures exist only for combat, so a step has a state with no action or an action with no state -- never both. Inventing them would poison the corpus. The gap is declared in manifest.json instead, and collect.py will close it going forward. Integrity checking is a separate entry point (`--check-only`) because `--verify` alone rebuilds first and so can only ever see data that is correct by construction -- a smoke test pretending to be a check. All six invariants were verified by deliberately breaking the dataset and confirming the checker fails. |
||
|---|---|---|
| capture | ||
| dataset | ||
| docs | ||
| utils | ||
| vendor | ||
| .gitignore | ||
| ab_card_skip.sh | ||
| brain.py | ||
| capture.py | ||
| eval_batch.sh | ||
| facts.py | ||
| jev.py | ||
| migrate.py | ||
| run.py | ||
| sts2.py | ||
| test_brain.py | ||
| test_facts.py | ||
| test_run.py | ||