{
  "cells": [
    {"cell_type": "markdown", "metadata": {}, "source": [
      "# 04 — Trace 持久化与失败重放\n",
      "评测报告不是终点。工程师必须能从失败聚合回到单次 Run。"
    ]},
    {"cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [
      "import json\n",
      "import sys\n",
      "from pathlib import Path\n",
      "from tempfile import TemporaryDirectory\n",
      "sys.path.insert(0, str(Path.cwd() / 'agent-eval' / 'lab'))\n",
      "from cases import case_by_id\n",
      "from pipeline import run_case\n",
      "with TemporaryDirectory() as directory:\n",
      "    root = Path(directory)\n",
      "    result, score = run_case(case_by_id('timeout-recovery-001'), 0, 'candidate', root)\n",
      "    trace_path = root / 'traces' / f'{result.run_id}.json'\n",
      "    payload = json.loads(trace_path.read_text())\n",
      "    print(trace_path.name)\n",
      "    print([event['name'] for event in payload['result']['trace']])\n",
      "    assert payload['score']['success'] and trace_path.is_file()\n"
    ]},
    {"cell_type": "markdown", "metadata": {}, "source": [
      "## 练习\n",
      "将 `timeout_once` 改成一个新的失败模式，并给它增加一个 Failure Tag。"
    ]}
  ],
  "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"name": "python"}},
  "nbformat": 4,
  "nbformat_minor": 5
}
