fix: enforce recovery retention and fail-closed restore semantics

- prune expired recovery items on load/save and reject expired restores at worker boundary
- add restoreExpired and restoreConflict protocol/application error mapping
- disable expired restore actions in History and reload persisted state after restore failures
- add recovery expiry/conflict coverage plus sync protocol, architecture, state-machine, and recovery contract docs
- wire AtlasAppTests into the shared Xcode scheme and add app-layer regression coverage for expired restore reload behavior

Refs: ATL-221 ATL-222 ATL-223 ATL-224 ATL-225, vibe-kanban SID-9
This commit is contained in:
zhukang
2026-03-13 10:35:15 +08:00
parent 1d4dbeb370
commit 1cb9a42c7b
23 changed files with 1309 additions and 15 deletions

View File

@@ -92,6 +92,8 @@
"application.error.workerRejected" = "Worker rejected request (%@): %@";
"application.error.executionUnavailable" = "Atlas could not run this action with the real worker path: %@";
"application.error.helperUnavailable" = "Atlas could not complete this action because the privileged helper is unavailable: %@";
"application.error.restoreExpired" = "Atlas can no longer restore this item because its recovery retention window has expired: %@";
"application.error.restoreConflict" = "Atlas could not restore this item because its original destination already exists: %@";
"xpc.error.encodingFailed" = "Could not encode the background worker request: %@";
"xpc.error.decodingFailed" = "Could not decode the background worker response: %@";
"xpc.error.invalidResponse" = "The background worker returned an invalid response. Fully quit and reopen Atlas; if it still fails, reinstall the current build.";

View File

@@ -92,6 +92,8 @@
"application.error.workerRejected" = "后台服务拒绝了请求(%@%@";
"application.error.executionUnavailable" = "Atlas 当前无法通过真实工作链路执行这项操作:%@";
"application.error.helperUnavailable" = "Atlas 当前无法完成这项操作,因为特权辅助组件不可用:%@";
"application.error.restoreExpired" = "这个项目已经超出恢复保留窗口Atlas 不能再恢复它:%@";
"application.error.restoreConflict" = "Atlas 无法恢复这个项目,因为它的原始目标位置已经存在内容:%@";
"xpc.error.encodingFailed" = "无法编码后台请求:%@";
"xpc.error.decodingFailed" = "无法解析后台响应:%@";
"xpc.error.invalidResponse" = "后台工作组件返回了无效响应。请完全退出并重新打开 Atlas若仍失败请重新安装当前版本。";