Skip to content

脚本更新:新增统一自动恢复与持久备份回滚机制 - #1916

Merged
youngslin merged 29 commits into
AUTO-MAS-Project:devfrom
youngslin:fix/script-update-auto-recovery-core
Nov 10, 2026
Merged

youngslin merged 29 commits into
AUTO-MAS-Project:devfrom
youngslin:fix/script-update-auto-recovery-core

Conversation

@youngslin

@youngslin youngslin commented Nov 10, 2026 •

Copy link
Copy Markdown

背景与取舍

#1900 已关闭且未合并。放弃 BetterGI 单独弹窗 / WS 选择,改为纯后端自动恢复。#1900 中有价值的「识别安装目录之外启动的 BetterGI 官方安装器」进程检查已迁入本 PR;不迁移弹窗与前端组件。

公共收束入口与持久备份

  • 公共 run_managed_script_install 入口收发检查、安装、回退和恢复结果;专项仅提供 inspect / acknowledge / install / ensure_idle / after_rollback 适配器。
  • script_install_backup 在同磁盘工作区保存原版完整快照、哈希清单与跨任务持久状态;不能覆盖未结算的备份。新安装在确认成功且停写后删除备份。
  • 安装器明确失败:确认停写,再回退到经哈希校验的原版;回退并验证成功后可继续任务,但在结束摘要报告该次失败。
  • 首次安装超时/状态不明:保留快照并禁止直接覆盖;下轮先做只读健康检查,若完整成功则确认并删除备份,否则重试安装;重试失败/超时,在再次确认完全停写后才允许回滚旧版并继续。
  • 恢复时反复下载失败(下载来源与受控错误原因),即使成功回滚旧版继续运行,也会在整轮任务结束时经 ScriptUpdateSession 统一写入后端日志、current.recovery_summary 和 task.notice,专项不再单独弹窗。
  • 备份、安装确认、版本及原生事务记录检查出现异常,统一 fail-closed;保留现场,禁止使用半安装版本。安装锁由调用方持有直到事务收束结束。

范围和后续

本 PR 提供公共备份/恢复决策能力与 BetterGI 安装器外部进程保护,但尚未把新的通用事务入口接到每个脚本的真实安装器。后续需要按脚本的原生 pending、资源布局、数据保护目录、官方安装器停写约束分别接入。不能因为公共测试通过就宣称所有脚本已经自动修复。

历史 UI 尚未消费新 recovery_summary 字段;目前可从任务结束通知和后端日志看到汇总。对外类型生成及历史界面回看需另行完成。

测试

新增持久快照、已确认失败回滚、首次超时后下轮重试与清理、下载反复失败最终汇总、安装器仍在写入时拒绝回滚、跨配置恢复、哈希损坏保护、目录交换中断续做和通用报告等回归测试。CI 以最新提交为准;未运行真实游戏或上游官方安装器。

@github-actions github-actions Bot added 模块: 更新 按更新日志碎片自动设置 类型: 修复 按更新日志碎片自动设置 labels Nov 10, 2026
Comment thread app/core/script_update_recovery.py Outdated
inspect/acknowledge/reinstall 的调用方持有原脚本安装锁。acknowledge
自己核验同一记录并清除、复核;出现竞态应抛错并保留或恢复原标记。
"""
before = await inspect()

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Bug: Unguarded inspect() and acknowledge() calls in reconcile_installation propagate exceptions without emitting a blocked RecoveryIncident, resulting in missing incidents in recovery summaries.
Severity: LOW

Suggested Fix

Wrap inspect() and acknowledge() invocations in try...except blocks within reconcile_installation, emitting a blocked RecoveryIncident before re-raising the exception or handling it appropriately.

Prompt for AI Agent
Review the code at the location below. A potential bug has been identified by an AI
agent. Verify if this is a real issue. If it is, propose a fix; if not, explain why it's
not valid.

Location: app/core/script_update_recovery.py#L77

Potential issue: In `reconcile_installation`, calls to initial `inspect()`,
`acknowledge()`, and the final `inspect()` are unguarded by error handling. If an
exception is raised during these calls—such as `acknowledge()` raising due to a race
condition—the error propagates without calling `emit('blocked', ...)`. As a result, no
`RecoveryIncident` is recorded, causing `current.recovery_summary` and the queue summary
to omit reporting this blocked-start case.

Did we get this right? 👍 / 👎 to inform future reviews.

Copy link
Copy Markdown
Contributor

总体结论:修改后合并

AUTO-MAS-Project/AUTO-MAS #1916

宝宝,这次把“是否能继续”交给公共决策层、把安装细节留给适配器,范围说清楚啦。dot酱没有确认半安装被放行或取消变成旧版回退的缺陷;目前挡住合并的是实际 CI 格式失败,另有两处低风险问题值得补齐喵。

公共入口依据适配器提供的健康证据作决定,ScriptUpdateSession 收集结果,ScriptExpander 等预下载收尾后统一发通知。现有安装锁仍由适配器持有,本 PR 尚未接入具体专项,不能把这份公共能力当作各脚本已经自动修复成功。

合并前处理

当前格式检查明确失败于 Ruff:

  • app/core/script_update.py:123 的条件换行。
  • tests/core/test_script_update_recovery.py:239、264 附近的空行及两处 inspection 参数排版。

请使用仓库锁定版本的 Ruff 格式化这两份文件,并确认重跑通过。不是安装逻辑失败,但这盏红灯现在确实还亮着,先别把构建通过当全绿啦。

规范

[规范 · P3,非阻断] 新增对外字段尚未同步生成客户端

TaskItem.Current:369–371新增 recovery_summary,TaskTreeData 从它派生,字段确实会进入任务查询和完成包。但当前生成文件 TaskItem_current.ts仍没有它。请按项目的 API 契约规则重新生成客户端,不要手改生成文件。这里是类型契约没有同步,不是后端把字段丢了。

当前真正会显示汇总的是既有 task.notice;前端 完成消息处理还没有保存这个字段用于回看。后端最近终态缓存会保留它,所以也不能说“任务结束就丢了”。本 PR 可以保持公共后端范围,但说明中应分清“完成包已携带”与“历史界面已展示”,回看接入还要留给后续啦。

模块归属和遥测未确认新增阻断项。自动检查与重试沿用已有脚本/任务终态观察;摘要里的安装目录和业务身份未被加入匿名统计,不需要为这些内部步骤另发一套完成事件。

规格

[逻辑 · P3,非阻断] 确认或复核抛错时,汇总漏掉这次阻断

位置:reconcile_installation:101–102、141–146。

公共契约明确允许 acknowledge 在记录变化时抛错;健康检查读取安装文件,也可能因文件损坏或 I/O 失败抛错。但这几个 await 位于只包住 reinstall 的异常记录范围之外。比如首次检查返回“有残留、完整且新安装已确认”,随后 acknowledge 拒绝清除变化的记录,异常会正确阻止启动,却没有生成 blocked 事件。队列结束的恢复汇总因此遗漏这一项;若只有这一次恢复事件,汇总甚至为空。

请在确认和复核失败的边界记录固定、脱敏的 blocked 原因,再原样抛出;取消继续向上传播,不能改成恢复失败或旧版继续。沿现有公共入口补一组“acknowledge/复核抛错 → 异常仍传播、汇总含 blocked”的检查就够啦。与现有机器人提示是同一个问题,dot酱核对后只记一次,且不把报告缺项夸大为安全放行。

验证情况

已核对 ContextVar 随任务及预下载继承、结束时重置、预下载收敛后汇总、同轮去重,以及旧版放行同时要求“无 pending、healthy、previous_confirmed”。未确认新增 P1/P2,规范和规格各 1 项非阻断 P3。

读取了当前提交的实际 CI 日志:Windows pytest 1817 通过、2 跳过;Ubuntu 1778 通过、40 跳过,Windows 验证包构建通过。格式工作流在 Python 步骤失败,后续前端 lint/typecheck/format、单测和词条检查均被跳过,不能算通过。

新增测试能证明公共决策和延后通知,但使用了检查/安装回调及任务替身,不能证明真实安装完整性、真实任务树提交或断线后的界面回看。dot酱未执行项目代码、测试、安装器或游戏任务;专项适配和真实恢复效果仍需后续各自验证。

—— dot酱核过公共恢复边界敬上 🐾

Copy link
Copy Markdown
Contributor

总体结论:修改后合并

AUTO-MAS-Project/AUTO-MAS #1916

宝宝,上轮提到的检查、确认异常漏汇总已经补上啦。不过这次新增了整目录备份和自动回滚,不能沿用上轮“未确认 P1/P2”的判断:dot酱发现一条回滚中断后会再次覆盖旧版的路径,得先修好喵。当前格式检查也仍未通过。

这版由公共入口决定安装、重试和回滚,备份服务负责保存和移动目录,专项提供健康证据与停写确认。职责可以保持这个分工;问题出在上层没有接上底层已有的回滚续做能力,不需要再加一套框架。

规格:必须处理

[逻辑 · P2,阻断] 回滚中断后被当成安装重试,可能改坏唯一完整旧版

位置:retry_previous:272–283、ManagedInstallBackup._restore:155–173。

沿新公共入口静态推演,以下是实现自身能留下的状态,不需要外部篡改记录:

  1. 安装明确失败后开始回滚,先写入 restoring,把失败安装移到 failed-install,再把 snapshot 移回安装目录。
  2. 在移动完成、写入 restored 之前崩溃,或取消使接下来的哈希检查中断。此时记录仍为 restoring,snapshot 已不存在,安装目录是唯一完整旧版。
  3. 下次进入 retry_previous,只将 restored 分流到继续回滚。对于正常的旧版检查结果 healthy=True、updated_confirmed=False,代码会改写为 retrying,再调用 install。
  4. 如果第二次安装改写文件后失败,再次恢复会因“snapshot 不存在,且阶段已不是 restoring”而拒绝继续。原本能恢复的旧版可能已被这次安装改坏,failed-install 保存的则是第一次失败现场,不能替代原备份。

安装锁、停写确认和 worker 收尾都不能补回已经被第二次安装覆盖的旧版;它们解决的是并发与退出,不是这个阶段分流问题。好在底层 _restore 已能处理“restoring 且 snapshot 已移走”的情况,别让上层绕开它啦。

最小修改: 在公共编排层将 restoring 和 restored 都先交给 restore_previous,完成原来的回滚、校验和清理,不能再次调用 install。用真实临时目录补一条公共入口回归:在 snapshot 移回后中断,下次调用应保留原文件、完成回滚,且不启动安装。这里不需要运行游戏或真实专项。

规范与 CI

当前格式任务的实际日志显示 Ruff 要求格式化 4 个文件:app/core/script_update.py、app/core/script_update_recovery.py、app/services/script_install_backup.py、tests/core/test_script_update_recovery.py。请用仓库锁定版本处理并重跑,红灯还不能跳过喵。

上轮 P3、非阻断 的客户端生成问题仍在:recovery_summary 已进入后端任务契约,生成的 TaskItem_current.ts 尚未同步。按既有生成器更新即可,具体证据不再重复铺开。

验证情况

已重新检查完整 PR 与新增提交的安装、快照、超时、取消、回滚及清理路径。旧 reconcile 的异常记录修复成立;新安装超时当次会保留备份并阻止继续,没有把取消当成普通下载失败。

本次新增的 run_managed_installation 和 ManagedInstallBackup 尚无直接测试覆盖;当前 281 行恢复测试与上次完全相同,验证的是旧公共决策、下载降级和延后通知,不能证明新增目录事务。上述中断回归应随修复补上,别让已有绿灯替它作保啦。

发布前读取的 CI 中,Windows 验证包构建与 Ubuntu pytest 已通过,Windows pytest 仍在运行;格式任务失败后,前端 lint、类型、格式、单测、词条及 E2E 契约检查均被跳过。dot酱未执行项目代码、测试或安装器。具体专项尚未接入,本次结论只针对公共能力,不声称已经验证真实安装恢复。

—— dot酱守着旧版备份敬上 🐾

… timeout retry, repeated download errors and fail-closed guards
youngslin added a commit to youngslin/AUTO-MAS that referenced this pull request Nov 10, 2026
youngslin added a commit to youngslin/AUTO-MAS that referenced this pull request Nov 10, 2026
…d repair health callbacks without dialogs
youngslin added a commit to youngslin/AUTO-MAS that referenced this pull request Nov 10, 2026
…ions and verified full-package repairs without modal
youngslin added a commit to youngslin/AUTO-MAS that referenced this pull request Nov 10, 2026
youngslin added a commit that referenced this pull request Nov 10, 2026
…pts (#1905)

## 方向调整:改为 #1916 公共自动恢复

此 PR 原来基于 #1900 的弹窗方案。现已移除奇想盒专有 WebSocket 弹窗、前端常驻订阅和用户选择,改由 #1916
的统一后端入口执行健康性检查、备份、自动重试及可验证回滚。原生 GUI 配置/修复入口仍可打开,但不会因此绕过自动任务的安装保护。

### 具体实现

- 正常更新:只读下载/准备完成后,通过 `run_managed_script_install` 创建旧版快照并运行官方 pip wheel
安装;安装结果由公共层汇总。
- 已有跨任务备份:优先恢复公共事务;下次先检查真实
pip/包入口和版本,确认上次已成功则清理备份,否则重试,只有进程全部停写且原快照通过完整性校验才允许回滚。
- 老版本留下的 `.mas-update-pending`:无可信更新前快照,只能走公共
`auto_recover_script_install` 的健康核验或强制重装,不能虚构可回滚旧版。
- 任务末尾错误汇总交给 #1916;不再使用脚本自带的弹窗服务。
- 保留 `skip_pending_installation` 的依赖完整性检查作为公共 acknowledge 所用的专项安全操作。
- 原前端 modal / websocket / 语言包以及旧弹窗测试已删除,补了公共恢复路径与残留标记回归测试。

### 必须注意的合并顺序

本分支已通过双父提交显式叠加 #1916 的实现,因此合并顺序必须为 **#1916 先进入 dev,本 PR 后合并**。在公共 PR
合并前,这个 PR 的差异会暂时显示公共文件;不能单独将本 PR 作为独立功能合并,也不能因为公共回归测试存在就认定真实 pip
安装端到端通过。

最新 CI 以 PR 最新提交为准。
youngslin added a commit that referenced this pull request Nov 10, 2026
…1906)

## 方向:仅保留 #1916 公共自动恢复
旧人工询问、弹窗和 SRC 专用 WS 恢复协议已删除。manager 持有安装互斥锁,使用
`auto_recover_script_install` / `run_managed_script_install`;SRC 专项适配器提供
Git HEAD、原生 installer、Python 依赖与进程停写证据。

旧 src-install.json 只有 Git 完成不能自动放行:`pip check` 不足以证明 requirements
已安装,需执行原生
installer;只有安装器成功后写入的完成记录才能证明本次安装完成。公共备份支持跨任务恢复;更新失败且旧版经健康检查才继续运行,异常由公共队列在任务结束时报告。

不保留旧版确认 UI。无可信安装证据、后台进程未停写或取消时 fail-closed。最新代码和 CI 以本 PR 最新 SHA
为准;未宣称真实 Windows 上游安装器 E2E 已完成。
youngslin added a commit that referenced this pull request Nov 10, 2026
…ts (#1915)

## 方向:#1916 公共恢复,无人工弹窗
旧恢复询问、skip journal、专用 WebSocket 及前端常驻弹窗已删除。本 PR 合并旧 #1914 的 native
work/backup/journal 符号链接防护。M7A/SRA 路径锁由 HSR manager 持有;原生
`rollback_pending` 失败后由 `auto_recover_script_install`
统一再次确认和重试原生回滚;未确认删除 journal/释放备份时绝不放行,不提供用户跳过按钮。

专项仅提供 PE 基础校验(M7A)、SRA CLI 版本探针、SRA GUI
进程停写检查。成功恢复的单引擎本轮不重复更新,其他引擎照常处理;异常由队列末尾汇总。此处动作是原生事务回滚,不是保证重新下载安装。

#1914 已关闭,以本 PR 为唯一 HSR 实现。最新 CI 与审查均已通过,但不宣称真实安装恢复 E2E。
@youngslin youngslin changed the title feat(script-update): centralized automatic recovery with persistent rollback snapshots 脚本更新:新增统一自动恢复与持久备份回滚机制 Nov 10, 2026
youngslin added a commit to youngslin/AUTO-MAS that referenced this pull request Nov 10, 2026
youngslin added a commit to youngslin/AUTO-MAS that referenced this pull request Nov 10, 2026
youngslin added a commit to youngslin/AUTO-MAS that referenced this pull request Nov 10, 2026
youngslin added a commit to youngslin/AUTO-MAS that referenced this pull request Nov 10, 2026
youngslin added a commit that referenced this pull request Nov 10, 2026
## 方向:#1916 公共自动恢复,去掉人工弹窗
把 #1911 合法大事务校验与旧版本回执复核收进本 PR;关闭旧弹窗、前端订阅和专用 WS。BAAH 以原生完整包作为修复手段,由
`auto_recover_script_install`、`run_managed_script_install`
和公共下载安全回退决定重试、备份、健康核验、回滚与队列末尾报告。

进程未停写、目录尚存 previous/ready、损坏原生事务、身份回执不可信时禁止错误放行;只允许完成经过
PE、版本与原始文件回执确认的旧事务归档。首次新安装由公共快照保留旧版。没有可靠身份时不猜测架构、不强制下载安装。
本 PR 替代 #1911 与旧 #1900 弹窗,所有最终结论以最新 CI 和审查为准;真实 Windows 官方安装器待 E2E。
youngslin added a commit that referenced this pull request Nov 10, 2026
## 仅保留 #1916 公共自动恢复入口

本 PR 不再提供人工确认弹窗或自定义恢复 WebSocket。MAA 安装失败状态经统一公共入口接收、健康检查、恢复执行以及任务末尾异常汇总。

**MAA 本体官方安装失败:** 经官方已发布版本代码核对,`pending-update-failure.txt` 存在时,启动 MAA
会先清空 `UpdatePackage`。MAS 单独写入包路径再拉起 MAA.exe 并不能完成官方内部的重新登记流程。因此本 PR
不再虚假执行自动本体重试。只要官方失败标记尚未安全消除且无法证明已完成新版本,就阻止脚本任务继续,保留失败标记和原始包,明确提示用户先在 MAA
官方界面完成原生修复。也不擅自清理上游失败标记。

**MAS 资源半更新:** `.automas-resource-update.json` 继续经 #1916
自动重新获取完整资源、核验下载与身份,然后重新合并;不能通过旧资源时钟直接跳过。资源中断及官方本体失败同时存在时优先阻断本体,避免错误地完成部分资源更新。

保留 PE 检查、原生事务/进程锁和标记变化保护。新增使用真实
manager、adapter、公共恢复入口的测试,证明官方本体失败与完整包待处理时不会空转或误删原文件;资源单独失败仍自动重试。真实 MAA
官方 UI 修复的端到端验证尚未执行。

已废弃的 #1912 资源恢复弹窗逻辑没有保留。
youngslin added a commit to youngslin/AUTO-MAS that referenced this pull request Nov 10, 2026
youngslin added a commit that referenced this pull request Nov 10, 2026
## 方向:仅采用 #1916 公共恢复
整合旧 #1910 的可信 program-identity.json、官方完整包下载与校验;以及 #1913 的原生
transaction.json/previous/ready 安全性检查。删除所有恢复弹窗、专用 WS 及“用户确认跳过”。恢复由
`auto_recover_script_install` 接收健康检查、原生回滚和官方完整包修复回调,主流程保持安装锁及原生 MXU
清理机制。

只有确认原生进程停止、完整发行文件和回执一致、且没有尚可回滚的 previous/ready,才允许归档过期事务。不可读架构、缺少 MAS
自有身份时绝不猜测官方安装目标。关闭托管的自定义构建遵守既有 MXU 行为,不强行覆盖。自动恢复结果交公共队列末尾汇总。

本轮补充:安装器复制 `ready` 后、写入 `transaction.json` 前失败或取消时,在没有
journal/previous、确认停写和持有安装锁的条件下可清理未提交暂存。若原安装健康,核验收据后清理;若 EXE 损坏或因 MXU
独立升级导致旧收据失效,仅允许 AutoProxy + 开启托管 + MAS 可信 `program-identity.json`
的修复请求清理暂存,随后必须由 #1916 公共入口执行官方完整包重装与最终健康复核。身份缺失、previous 或 journal
存在时继续保留现场并阻断,不能把清理暂存当作恢复成功。回归测试包含真实安装器的 ready
阶段故障注入、两类受控自动修复,以及缺乏可信身份时拒绝清理。

本 PR 取代 #1910;未运行真实 MXU/Electron E2E,CI 以最新提交为准。
youngslin added a commit that referenced this pull request Nov 10, 2026
…ion coverage (#1923)

## 摘要

- 修复 #1916 在 release 旧调度器中的会话接线:旧基类直接执行 `_run_main_task`,原来放在
`main_task` 的绑定不会生效。改在真实执行入口绑定并覆盖子任务收尾,正常完成和手动停止均只通过既有 TASK_NOTICE 汇总一次。
- 保留 BetterGI 正式版公告、灰度和资源就绪门槛;对有效 MAS
残留目标记录,允许主程序缺失、损坏或版本资源不可读后重新执行经校验的官方完整安装器。拒绝目标降级、记录损坏或变化,以及下载期间原生升级后的覆盖;安装后复核版本和
PE 架构再清除标记。下载准备失败仍沿用既有健康检查后继续任务的 release 行为。
- 修复 HSR 恢复状态未初始化,以及本轮原生回滚或公共恢复成功后再次更新同一引擎的问题;保留旧调度、路径锁和原生回滚,不引入新调度器。
- 逐项补回 #1905、#1906、#1908、#1909、#1913、#1915 缺失的恢复回归,适配 release
的日志与锁接口;专用验证工作流增加本目标分支的 PR 触发及三平台接口类型检查。整个 PR 只有一个更新日志碎片,不修改前端或版本号。

## 验证


提交:`fc68ce88035fc206deeabe59851286d1459dba7b`;基线:`606c7ebd9231888519b0decad085c249b17c554a`。Windows、Python
3.12.13、uv.lock 锁定依赖。

- `uv run --no-sync python -m pytest tests -q --tb=short`:**1614
passed、2 skipped、15 subtests passed**,174.47 秒;保留现有 Pydantic 弃用提示。基线全量为
1554 passed、2 skipped。
- 同一故障场景修复前后对照:BetterGI 损坏/缺失程序、非法或变化的安装记录、目标降级与下载期间原生升级;HSR 公共恢复后的
AttributeError 和重复更新;真实旧任务正常结束/停止时的恢复汇总。修复前均复现,修复后对应检查通过。
- 变更 Python 文件 Ruff 检查、全仓 Ruff 格式、compileall、Windows/Linux/macOS 平台接口
mypy、`uv lock --check`、更新日志规则和 `git diff --check` 均通过。外部 CI
action/container 引用均固定到提交或摘要。
- 本 PR 的远端 Windows/Ubuntu 全量、格式、依赖与构建检查以 Checks 最新结果为准。

| 已合并 PR | 本轮保留或补回的关键恢复覆盖 |
| --- | --- |
| #1905 奇想盒 | 遗留标记走公共入口,健康复核,备份失败/取消清理候选 |
| #1906 SRC | Git 目标不能替代原生依赖安装完成证据,完成记录跨适配器重建 |
| #1908 BAAH | 损坏/缺失程序可信修复、回执变化拒绝、旧事务验证、取消保留目录锁 |
| #1909 MAA | 本体失败不伪造重试,资源半更新恢复,原始包与失败现场保留 |
| #1913 MaaEnd | 原生事务、ready 阶段故障注入、可信身份修复、精确版本恢复与配置保护 |
| #1915 HSR | 损坏程序、未知进程路径、真实 journal 恢复要求、恢复后不重复更新 |

## 排除与验证边界

- 不迁移 #1845 新四级调度/运行树,也不迁移 #1862 依赖新调度和前端的进度展示;保留 release 原有预下载架构。
- 不新增 dev 的 `current.recovery_summary` 历史字段或前端消费,恢复结果仍使用 release
现有任务提示和后端日志。
- BetterGI 未接入通用快照自动回滚;有效残留事务通过官方完整安装器重试,缺少可信记录、资源未就绪或仍有写入者时继续阻断,不仅凭 EXE
版本清除失败记录。
- MAA 官方本体更新失败的无人值守重试继续排除:现有上游启动流程会清空待安装包登记,仍需官方界面完成原生修复;MAS
自有资源半更新可自动重试。
- 未运行真实游戏、账号、模拟器或上游官方安装器 E2E。自动化使用真实文件/事务与 MAS
入口,并在网络、原生进程和安装器边界隔离;不能据此声称实机安装已验收。
- 后续实机验收可在已配置脚本和账号的作者环境运行 `cd frontend; yarn e2e:real:all --only
BetterGIConfig,HSRConfig,MaaConfig,MaaEndConfig,BAAHConfig,SrcConfig,WhimboxConfig`,产出各场景报告和
`real-e2e-summary.json`。

目标仅为 `release-v5.8.0-backport-verify`;不直接修改或合并该分支及 `release/v5.8.0`。
@github-actions github-actions Bot mentioned this pull request Nov 13, 2026
3 tasks
ClozyA added a commit that referenced this pull request Nov 13, 2026
## Release v5.9.0-beta.1

由「准备发版」工作流生成。这是唯一允许修改 `CHANGELOG.md` 与版本号的 PR,合并后请手动运行「构建并发布应用程序」。

合并前请在本 PR 里完成:

- [ ] 「本次亮点」够不够:合并前给碎片加 `highlight: true` 就会自动进这一类,现在也可以直接在
`CHANGELOG.md` 新版本段里把条目挪过去
- [ ] 有 3
个提交改了用户可见代码但没带碎片(清单见[运行摘要](https://github.com/AUTO-MAS-Project/AUTO-MAS/actions/runs/43347223103)),若用户可见就在新版本段里补一条
- [ ] 改完运行 `python scripts/changelog.py sync` 并提交

### 体积

- 首行 JSON 2371 / 18000 字符,带 1 个版本段
- 本版 40 条,最长的几条:
- 78 字(变更)【设置】自启与静默启动可独立设置,静默时直接进入托盘,关闭可选退出或托盘,最小化保留任务栏。 (#1928) by
@he0119 by @1w1w11w1
- 76 字(修复)【MAA】MAA 更新失败时统一检查安装健康;资源半更新自动重装,官方本体失败保留标记并提示使用官方修复入口 (#1909)
by @youngslin
- 75 字(变更)【模拟器】ModAVD 全部改由 modavd 命令行控制,移除自带的直控和更新器,不再支持无命令行的旧根目录
(#1918) by @qiyinxi
- 64 字(修复)【主页】调整任务台版本主线的 UI,并让版本更新倒计时更清楚 (#1926) by
@TyrannosaurusGodofWar
- 64 字(破坏性变更)【调度】重构任务调度与范围选择,完善日志恢复、独立触发、队列附加动作及电源收尾。 (#1845) by
@DLmaster361

自 `v5.8.0` 以来的改动:

### ⚠️ 破坏性变更

- 【调度】重构任务调度与范围选择,完善日志恢复、独立触发、队列附加动作及电源收尾。 (#1845) by @DLmaster361

### ✨ 新增

- 【M9A】新增 MAS 登录 B 服:处理隐私协议并选择已保存账号后交给 M9A 运行 (#1882) by @Douya36
- 【ok-ww】支持脚本逐账号或批量切号、显示失败原因并补跑未完成账号 (#1890) by @AthenaHibou
- 【ok-nte】支持按日配置日常计划,并可在详细配置中调整当天任务。 (#1921) by @AthenaHibou
- 【调度】在日志末尾显示预下载方式和进度,支持独立配色与连续渐变(仅公测) by @youngslin
- 【设置】支持调整自定义光标的显示大小。 (#1904) by @Douya36

### 🔧 变更

- 【调度】统一各脚本账号编辑页的页头和基本信息布局 by @Craun718
- 【模拟器】魔改 AVD 改名为 ModAVD,界面、提示和日志统一用新名称 (#1898) by @qiyinxi
- 【模拟器】ModAVD 全部改由 modavd 命令行控制,移除自带的直控和更新器,不再支持无命令行的旧根目录 (#1918) by
@qiyinxi
- 【设置】统一主要页面的标题、间距、卡片层次和日志按钮外观 (#1893) by @1w1w11w1
- 【设置】浅色主题改为中浅灰画布配纯白卡片,补回分隔线与卡片边缘层次 (#1855) by @beichen24a1
- 【设置】自启与静默启动可独立设置,静默时直接进入托盘,关闭可选退出或托盘,最小化保留任务栏。 (#1928) by @he0119 by
@1w1w11w1
- 【Runtime】加快运行环境健康时的启动准备 (#1907) by @jinghero

### 🐛 修复

- 【MAA】MAA 更新失败时统一检查安装健康;资源半更新自动重装,官方本体失败保留标记并提示使用官方修复入口 (#1909) by
@youngslin
- 【MAA】修复保存配置时修改被误判未保存并丢弃的问题 (#1930) by @jinghero
- 【end】MaaEnd 安装异常时统一恢复事务,并安全修复可信身份的损坏本体 (#1913) by @youngslin
- 【HSR】为 M7A 与 SRA 更新中断后的未完成回滚添加用户确认恢复入口 (#1915) by @youngslin
- 【HSR】修复 SRA 使用自建下载站时无法下载安装更新的问题。 (#1945) by @youngslin
- 【bgi】修复正式版安装资源尚未就绪时自动更新失败的问题 (#1901) by @youngslin
- 【ok-ww】修复直接启动游戏时无法覆盖默认资源档位的问题 (#1925) by @AthenaHibou
- 【ok-ww】修复新版脚本启动后不执行每日任务的问题 (#1940) by @AthenaHibou
- 【ok-ww】修复新版启动器不触发游戏更新及停服维护时反复重试的问题 (#1934) by @1w1w11w1
- 【ok-ww】修复鸣潮和异环更新重启后自动切号失败的问题。 (#1933) by @AthenaHibou
- 【ok-nte】修复仅开启任务后关闭时无法关闭游戏及启动器的问题。 (#1920) by @AthenaHibou
- 【BAAH】损坏的托管安装须由用户明确选择官方完整包修复,禁止绕过校验运行 (#1908) by @youngslin
- 【奇想盒】修复后端安装中断后无法自主确认恢复的问题 (#1905) by @youngslin
- 【SRC】修复原生安装中断后无法自主选择安全恢复的问题 (#1906) by @youngslin
- 【主页】调整任务台版本主线的 UI,并让版本更新倒计时更清楚(仅公测) (#1926) by @TyrannosaurusGodofWar
- 【调度】修复停止任务后脚本及更新子进程残留、项目持续占用和结果未保存的问题 (#1892) by @youngslin
- 【调度】统一配置表单、卡片间距与状态颜色,优化队列列宽和配置说明 (#1927) by @AthenaHibou
- 【模拟器】修复启动模拟器时 adb 命令执行不了却只提示超时、看不到原因的问题 (#1894) by @miaojiuqing
- 【模拟器】手动停止任务时不再把 ModAVD 模拟器连同任务一起强制结束 (#1919) by @qiyinxi
- 【工具】修复 MCP 查询全部托管失败及可空参数被错误拒绝的问题 (#1895) by @HarcoChen
- 【设置】修复模拟器管理和调度中心卡片外侧阴影显示不一致 (#1897) by @1w1w11w1
- 【设置】FluxDown 自动识别强制优先选择 MAS 内的文件夹。 (#1948) by @youngslin
- 【更新】统一脚本安装恢复入口及队列结束时的下载异常汇总 (#1916) by @youngslin
- 【Runtime】修复回退旧版后再次升级时无法启动的问题 (#1889) by @jinghero
- 【Runtime】修复后端启动异常退出却被误判为正常结束的问题 (#1929) by @jinghero
- 【Runtime】修复临时启动失败后反复停留在失败页的问题 (#1938) by @jinghero
- 【Runtime】修复初始化时依赖安装已成功却被误报为失败的问题。 by @ClozyA

Co-authored-by: ClozyA <133191303+ClozyA@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

模块: 更新 按更新日志碎片自动设置 类型: 修复 按更新日志碎片自动设置

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants