[
  {
    "change": "Normalize categorical evaluation probabilities entirely in float64",
    "before_sha256": "56d1fd21cc1609b7670a1dadf2f2cfa42b5a367d4402dd8bbd8adc087e8ccc4c",
    "after_sha256": "c8c4cb8d537c3313984096fc0a8ec696894a2dda99a37e80c66186922b49b35c",
    "reason": "Long-context smoke test found NumPy rejection from float64 numerator / float32 denominator",
    "timing": "Before any Dreamer evaluation; no final scores viewed; training functions unchanged",
    "training_source": "initial-source-hashes.json",
    "evaluation_source": "source-hashes.json"
  },
  {
    "change": "Add separate direct mixed-model tournament",
    "timing": "Before any baseline final evaluation; fixed all six trained checkpoints, no selection",
    "world_seeds": [
      16100000,
      16100043
    ],
    "lineup": [
      "Lana100",
      "Lana1000",
      "MuZero100",
      "MuZero1000",
      "Dreamer4-100",
      "Dreamer4-1000",
      "five untrained Lana"
    ],
    "placement": "four complete seat rotations",
    "limits": "One training seed; five untrained entries per game are a group, not one comparable opponent. Shared-opponent benchmark remains separate."
  },
  {
    "change": "Evaluate Lana on same GPU/backend as baselines for primary comparison",
    "reason": "Avoid confounding numerical backend differences; CPU audit preserved in full",
    "timing": "Before baseline evaluation and before any GPU Lana scores; fixed snapshots and seeds unchanged",
    "rule": "Use GPU results consistently regardless of outcome, never select the better backend",
    "cpu_audit": "Lana10023/44, Lana100015/44, untrained3/44; retained as audit, no tuning"
  }
]