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

@@ -123,6 +123,7 @@ async def test_acceptance_timeout_finishes_with_unknown_verdict(tmp_path, monkey
)
assert data["task_status"] == "completed"
assert data["test_result"]["status"] == "inconclusive"
assert "总预算已用尽(0.01 秒)" in data["test_result"]["reason"]
@@ -155,6 +156,23 @@ async def test_disabled_acceptance_does_not_call_a_model_or_claim_pass(
)
check.assert_not_called()
assert data["test_result"]["status"] == "inconclusive"
assert data["test_result"]["verification_skipped"] is True
assert "未做 AI 判定" in data["test_result"]["reason"]
@pytest.mark.asyncio
async def test_skipping_review_does_not_hide_execution_failure(tmp_path, monkeypatch):
check = AsyncMock()
monkeypatch.setattr(flash, "run_final_check", check)
data = await flash.settle_flash_outcome(
context(tmp_path, disable_final_check=True),
"任务",
{"status": "failed", "explanation": "设备断开"},
)
check.assert_not_called()
assert data["task_status"] == "blocked"
assert data["test_result"]["status"] == "blocked"
assert not data["test_result"].get("verification_skipped")
@pytest.mark.asyncio