feat: release 2.1.0 with optional Flash final AI review

Default Flash final review to off and persist the setting across the UI,
MCP, SDK and queued tasks. Keep execution separate from test verdicts.

Bundle UI fonts and licenses to remove Google Fonts from startup builds.
Align backend/frontend versions and document installation and upgrades.
This commit is contained in:
chenmingxuan committed 2026-10-23 12:36:56 +08:00
1 parent b584dae80a
commit 83bcfd54d5
52 files changed
+898 -33

No files matched your search

+19
View File
@@ -44,6 +44,25 @@ def test_completed_execution_and_failed_test_are_independent():
assert resolve_trace_suffix("completed", outcome("failed")) == "_TESTFAIL"
def test_skipped_review_metadata_survives_reload_without_changing_model_schema(tmp_path):
result = CaseTestResult(
status="inconclusive", reason="执行完成 · 未做 AI 判定", verification_skipped=True
)
directory = tmp_path / "task-skipped"
directory.mkdir()
(directory / "run_outcome.json").write_text(
json.dumps({"task_status": "completed", "test_result": result.model_dump()}),
encoding="utf-8",
)
loaded = read_case_result("task-skipped", "completed", root=tmp_path)
assert loaded == result.model_dump()
assert loaded["verification_skipped"] is True
assert "verification_skipped" not in CaseTestResult.model_json_schema()["properties"]
assert (
"verification_skipped" not in CaseTestResult(status="blocked", reason="失败").model_dump()
)
@pytest.mark.parametrize("status", ["failed", "cancelled", "interrupted", "skipped"])
def test_incomplete_execution_does_not_inherit_a_pass(status):
result = resolve_case_result(outcome(), status, "环境初始化失败")