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

+7
View File
@@ -288,12 +288,16 @@ def update_trace_status(
error: str | None = None,
result: Any | None = None,
device_serial: str | None = None,
*,
expected_status: str | None = None,
) -> dict[str, Any] | None:
"""Updates specific fields of the status.json for a given trace_id.
The read-modify-write cycle holds a cross-process lock so concurrent
updates from the daemon, MCP tools, and worker processes do not lose each
other's fields.
When expected_status is supplied, apply the update only if it still matches
inside the lock; a late worker transition must not revive a terminal task.
"""
path = get_status_path(trace_id)
with _status_lock(path):
@@ -306,6 +310,9 @@ def update_trace_status(
)
return None
if expected_status is not None and data.get("status") != expected_status:
return data
# "success" is a legacy alias for the canonical "completed" terminal
# status and must never be persisted into status.json.
if status == "success":