{
  "date": "2026-10-10",
  "experiment": "deterministic teaching fixture",
  "frame_time_teaching_data": {
    "values_ms": [
      10,
      12,
      null,
      14,
      16
    ],
    "valid_count": 4,
    "missing_count": 1,
    "valid_mean_ms": 13,
    "incorrect_zero_fill_mean_ms": 10.4
  },
  "model_calls": 0,
  "csv": {
    "rows": 4,
    "issues": [
      {
        "line": 3,
        "rule": "prefix",
        "field": "name"
      },
      {
        "line": 4,
        "rule": "duplicate",
        "field": "name"
      },
      {
        "line": 5,
        "rule": "empty",
        "field": "name"
      },
      {
        "line": 5,
        "rule": "empty",
        "field": "path"
      }
    ]
  },
  "schema_error": "missing columns: kind",
  "regression": {
    "before": [
      false
    ],
    "after": [
      true
    ]
  },
  "logits": [
    3.0,
    2.0,
    1.0
  ],
  "temperature": {
    "0.5": [
      0.866813,
      0.11731,
      0.015876
    ],
    "1.0": [
      0.665241,
      0.244728,
      0.090031
    ],
    "2.0": [
      0.50648,
      0.307196,
      0.186324
    ]
  },
  "scripted_tool_trace": [
    {
      "step": 1,
      "actor": "scripted_fixture",
      "decision": "inspect missing file",
      "tool": "inspect_csv",
      "path": "[本地路径]",
      "result": "FileNotFoundError",
      "executed": true
    },
    {
      "step": 2,
      "actor": "scripted_fixture",
      "decision": "use explicit sample path",
      "tool": "inspect_csv",
      "result": {
        "rows": 4,
        "issues": [
          {
            "line": 3,
            "rule": "prefix",
            "field": "name"
          },
          {
            "line": 4,
            "rule": "duplicate",
            "field": "name"
          },
          {
            "line": 5,
            "rule": "empty",
            "field": "name"
          },
          {
            "line": 5,
            "rule": "empty",
            "field": "path"
          }
        ]
      }
    },
    {
      "step": 3,
      "actor": "validator",
      "decision": "accept report",
      "evidence": "four issues match expected line/rule pairs"
    }
  ],
  "context_inputs": [
    {
      "case": "question_only",
      "input": "解释资产命名检查脚本。",
      "model_run": false
    },
    {
      "case": "with_code",
      "input": "解释 inspect_csv 的输入、规则和输出。\n代码：\ndef inspect_csv(path):\n    with path.open(encoding='utf-8-sig', newline='') as f:\n        reader = csv.DictReader(f)\n        required = {'name', 'path', 'kind'}\n        missing = required - set(reader.fieldnames or [])\n        if missing:\n            raise ValueError('missing columns: ' + ','.join(sorted(missing)))\n        rows = list(reader)\n    problems, seen = [], set()\n    for line, row in enumerate(rows, 2):\n        for field in sorted(required):\n            if not (row.get(field) or '').strip():\n                problems.append({'line':line,'rule':'empty','field':field})\n        name = (row.get('name') or '').strip()\n        if name:\n            if name in seen: problems.append({'line':line,'rule':'duplicate','field':'name'})\n            seen.add(name)\n            prefix = {'texture':'T_', 'mesh':'SM_'}.get(row.get('kind',''))\n            if prefix and not name.startswith(prefix):\n                problems.append({'line':line,'rule':'prefix','field':'name'})\n    return {'rows':len(rows),'issues':problems}\n",
      "model_run": false
    },
    {
      "case": "with_code_and_data",
      "input": "解释 inspect_csv，使用以下样本逐行指出问题；不重命名资产。\n代码：\ndef inspect_csv(path):\n    with path.open(encoding='utf-8-sig', newline='') as f:\n        reader = csv.DictReader(f)\n        required = {'name', 'path', 'kind'}\n        missing = required - set(reader.fieldnames or [])\n        if missing:\n            raise ValueError('missing columns: ' + ','.join(sorted(missing)))\n        rows = list(reader)\n    problems, seen = [], set()\n    for line, row in enumerate(rows, 2):\n        for field in sorted(required):\n            if not (row.get(field) or '').strip():\n                problems.append({'line':line,'rule':'empty','field':field})\n        name = (row.get('name') or '').strip()\n        if name:\n            if name in seen: problems.append({'line':line,'rule':'duplicate','field':'name'})\n            seen.add(name)\n            prefix = {'texture':'T_', 'mesh':'SM_'}.get(row.get('kind',''))\n            if prefix and not name.startswith(prefix):\n                problems.append({'line':line,'rule':'prefix','field':'name'})\n    return {'rows':len(rows),'issues':problems}\n\nCSV：\nname,path,kind\nT_Rock,资产/岩石/T_Rock.png,texture\nRock,资产/岩石/Rock.PNG,texture\nT_Rock,资产/副本/T_Rock.png,texture\n,,mesh\n",
      "model_run": false
    }
  ]
}