from __future__ import annotations import json import sys from pathlib import Path ROOT = Path(__file__).resolve().parents[1] if str(ROOT) not in sys.path: sys.path.insert(0, str(ROOT)) from app_kit.app import PACK_ROOT, load_pack_with_trace from app_kit.demo_pack import list_demo_packs from app_kit.eval import evaluate_pack def _first_pack_name() -> str: return list_demo_packs(PACK_ROOT)[0].name def test_load_pack_ui_emits_trace_artifact(tmp_path): pack_name = _first_pack_name() status, manuals, sections, jobs, update, info, trace_path = load_pack_with_trace( pack_name, db_path=tmp_path / 'ui.sqlite3', artifact_dir=tmp_path / 'artifacts', ) assert status assert trace_path.exists() trace = json.loads(trace_path.read_text(encoding='utf-8')) assert trace['kind'] == 'app-load' assert trace['pack_name'] == pack_name assert trace['trace_path'] == str(trace_path) assert trace['timestamp'] assert trace['inputs'] assert 'parsed_outputs' in trace assert trace['model_name'] assert info['pack_name'] == pack_name def test_eval_runner_emits_trace_artifact(tmp_path): report = evaluate_pack( PACK_ROOT, db_path=tmp_path / 'eval.sqlite3', artifact_dir=tmp_path / 'artifacts', ) trace_path = Path(report['trace_path']) assert trace_path.exists() trace = json.loads(trace_path.read_text(encoding='utf-8')) assert trace['kind'] == 'eval' assert trace['trace_path'] == str(trace_path) assert trace['scenario_count'] == report['scenario_count']