feat: release 2.2.0 with PC-only tests and execution reliability fixes

Unify task scheduling and queue state, fix Android input and observation recovery, preserve screenshot paths, and match final review criteria accurately. Add collapsible copyable results and publish the complete 2.1.0 upgrade notes. Validation: 3189 backend tests, 326 frontend tests, 24 client tests, production build and quality gates.
This commit is contained in:
chenmingxuan committed 2026-10-27 01:13:41 +08:00
1 parent fac4ccb760
commit be6e8c2abd
79 files changed
+2263 -277

No files matched your search

@@ -139,6 +139,42 @@ def test_empty_evidence_list_does_not_turn_an_unsupported_failure_into_evidence(
assert _normalize_report(report, []).verdicts[0].status == "inconclusive"
@pytest.mark.asyncio
@pytest.mark.parametrize("structured_response", [False, True])
async def test_display_labels_match_in_text_and_structured_verdict_paths(structured_response):
from artemis.agents.checker.checker import _normalize_report
from artemis.utils.plan_grammar import CheckItem
items = [
CheckItem(kind="verify", when="on_complete", text="截图保存成功", parent_key="p"),
CheckItem(kind="verify", when="on_complete", text="路径与回执一致", parent_key="p"),
CheckItem(kind="assert", when="at_end", text="没有交互动作", parent_key=None),
]
payload = {
"verdicts": [
{
"kind": i.kind,
"item_text": f"[{i.kind}] ({i.when}) {i.text}",
"status": "passed",
"evidence": "完整工具回执",
}
for i in items
],
"test_result": _result(),
}
llm, structured = _llm(CheckReport.model_validate(payload))
answer = "已检查,待结构化输出。" if structured_response else json.dumps(payload)
report = await _structured_report(llm, [AIMessage(content=answer)], items)
normalized = _normalize_report(report, items)
assert [v.item_text for v in normalized.verdicts] == [i.text for i in items]
assert [v.status for v in normalized.verdicts] == ["passed"] * 3
assert normalized.test_result.status == "passed"
if structured_response:
structured.ainvoke.assert_awaited_once()
else:
structured.ainvoke.assert_not_awaited()
def test_nested_json_string_result_is_decoded_and_still_validated():
result = _result()
assert (