Conversation
…t#498) - log monitor: pass callable log path so daily-rolling logs switch across midnight - ScriptConfig: remove runtime slot after config session (final_task & on_crash) - account_switch: only rebuild repo when previous checkout also failed - open BetterGI with elevated only when MAS itself is not elevated - step report: pick success run when retries happened (no duplicated 1/N) - notify: add one day when step duration crosses midnight - frontend/backend: unify enabled default for custom groups
AUTO-MAS-Project#510 已把 LogMonitor 入参统一为 resolver、将 _build_log_path 改名为 _resolve_log_file_path 并删除 script_log_path,还补了切换后刷新时间戳基准 日期的修复;这两处 hunk 与其冲突且缺该修复,先合入时会引用不存在的方法。 Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
- 标记改为在切号结束、BGI 确已启动并退出后,脚本仍缺失时才写入,并放到
MAS 自有的 data/{script_id}/ 目录,不再进 BGI 的 User/JsScript
- 是否 rmtree 仓库改在杀掉旧 BGI 进程之后单独判断,首次启用与用户误删
都不会在第一轮删除整个 Repos/bettergi-scripts-list
- 调度台文案与 docstring 同步为新流程
- 分步报告无成功轮时回退取最后一个能解析出步骤的轮次,避免整块省略
- notify._step_duration 按 ruff format 排版
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
1w1w11w1
force-pushed
the
fix/bettergi-498-issues
branch
from
September 3, 2026 13:25
c288722 to
0d0b724
Compare
TCddddd
pushed a commit
that referenced
this pull request
Sep 10, 2026
Closes AUTO-MAS-Project#620 ## 问题 `get_device_info` 用 `if_merge_std=True` 跑 `MuMuManager info -v`,MuMu 自己的**埋点**和 **C++ 日志**因此和设备 JSON 混在同一份 stdout 里。`mumu.py` 里 5 处 `json.loads` 都要求整段是纯 JSON,多一行日志就整条失败——**而那份设备 JSON 本身是完整可用的**(`6K` 的事件里 `is_android_started: true` 都在,只是尾部多了一行日志)。 近一日:`1M` 1,943 条(自 08-20 累计 2,113)、`6G` 1 条、`6K` 1 条。`1M` 是模拟器族里事件量最大的一条。 需要说清楚**这条和「模拟器自身故障」不是一回事**:`WinError 5` / `WinError 2` 那批确实是用户侧环境问题,不该我们修;这批是我方解析口径过严。 ## 改动 新增 `MumuManager._decode_polluted_json(text, prefer=None)`:扫出输出里**所有**顶层 JSON 值,由 `prefer` 判据挑出期望的那一份,都不命中时退回第一个,一个都解不出来才抛 `JSONDecodeError`。 **不能简单取第一个** —— 埋点 `add record:{"_track_id":...}` 本身也是合法 JSON,而且常常排在设备 JSON **之前**,取第一个会把埋点当成设备信息。所以 5 个调用点各带自己的判据: | 调用点 | prefer | | --- | --- | | `getStatus` / `getInfo` / `list_devices` | `_has_device_entries`(有 `index` + `name`) | | `_get_adb_address` | 能解析出 host/port | | `_get_app_state` | dict 且 `state` 是 str | ## 本地验证 ``` .venv/Scripts/python.exe -m pytest tests -q 691 passed, 3 skipped, 151 subtests passed in 9.29s (dev 基线是 682,+9 为本 PR 新增) .venv/Scripts/python.exe -m ruff check app/utils/emulator/mumu.py # All checks passed ``` 新增 `tests/tools/test_mumu_json_parse.py` 9 条(纯解析逻辑,按 `tests/AGENTS.md` 属于该提交的纯逻辑测试)。样本用的是 Sentry 事件里的真实污染形态: - 尾部 `[*** LOG ERROR #1 ***] ... {bad_weak_ptr}` - 头部 `add record:{"_track_id":...,"event":"$SignUp",...}` **这些样本在改动前确实是炸的**,且报错与 Sentry 上一字不差: ``` 尾部 C++ 日志: json.loads -> Extra data: line 5 column 1 (char 150) ← 对应 6G 头部埋点: json.loads -> Expecting value: line 1 column 1 (char 0) ← 对应 1M 两者都有: json.loads -> Expecting value: line 1 column 1 (char 0) ``` 其中一条专门断言「埋点排在前面也不能被当成设备信息返回」。 **没有做真机手测**:本地这台 MuMu 不会往 stdout 写埋点,复现不了污染。解析是纯函数、由上面 9 条覆盖;但真机上 `getInfo` 拿到的输出格式如果和我构造的样本有出入,欢迎指出。 ## 请审阅 @qiyinxi `app/utils/emulator` 是你维护的。确认后**请你自行合并**,我不代合。 ## Sourcery 总结 允许 MuMu 命令解析从混入遥测数据和原生日志的标准输出中恢复有效的模拟器数据。 错误修复: - 使 MuMu 设备、ADB 和应用状态解析能够适应命令输出中混入的遥测数据和原生日志,同时仍选择目标 JSON 负载。 增强功能: - 添加共享的污染输出 JSON 解码功能,并支持针对负载的选择条件和回退行为。 测试: - 添加针对前置遥测数据、尾随日志、负载选择、回退行为以及无效或空输出的专项测试。 <details> <summary>Original summary in English</summary> ## Sourcery 总结 提高 MuMu 命令输出的解析容错性,确保混入日志时仍能读取模拟器信息。 Bug 修复: - 使 MuMu 模拟器、ADB 和应用状态解析能够从混入遥测数据或原生日志的命令输出中恢复有效的 JSON 信息。 增强功能: - 新增可识别并选择目标 JSON 负载的通用污染输出解析能力,避免将遥测数据误判为设备信息。 测试: - 新增针对前置遥测、尾随日志、负载选择、回退行为及无效输出的解析测试。 <details> <summary>Original summary in English</summary> ## Summary by Sourcery 提高 MuMu 命令输出解析的容错性,确保混入日志时仍能恢复有效的模拟器信息。 Bug Fixes: - 修复 MuMu 命令输出混入遥测数据或原生日志时无法读取设备、ADB 和应用状态信息的问题。 Enhancements: - 新增可从污染输出中识别并选择目标 JSON 负载的通用解析能力,避免将遥测数据误判为设备信息。 Tests: - 新增覆盖前置遥测、尾随日志、负载选择、回退行为及无效输出的 MuMu JSON 解析测试。 <details> <summary>Original summary in English</summary> ## Summary by Sourcery 提高 MuMu 命令输出解析的容错性,确保混入日志时仍能恢复有效的模拟器信息。 Bug Fixes: - 修复 MuMu 命令输出混入遥测数据或原生日志时无法读取设备、ADB 和应用状态信息的问题。 Enhancements: - 新增可从污染输出中识别并选择目标 JSON 负载的通用解析能力,避免将遥测数据误判为设备信息。 Tests: - 新增覆盖前置遥测、尾随日志、负载选择、回退行为及无效输出的 MuMu JSON 解析测试。 </details> </details> </details> Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com> Co-authored-by: ClozyA <aoxuan233@gmail.com>
TCddddd
pushed a commit
that referenced
this pull request
Sep 14, 2026
## 摘要
- 修复库存保持刷到的材料没有被计入掉落统计的问题(同类的「养成计划」一并覆盖)
- 任务名比对改为容忍 MAA 多链任务的序号后缀;单链任务与旧日志行为完全不变
- 本地用日志解析用例验证多链序号 / 旧裸任务名 / 识别链三种情形,锁住这类静默漏计
## 根因:MAA 上游给多链任务名加了后缀
MAA 在 `MaaAssistantArknights/MaaAssistantArknights@25dacdd68` 引入了任务名后缀:
| 项 | 值 |
|---|---|
| 提交 | `25dacdd68` |
| 时间 | 2026-09-06 20:08:13 +0800 |
| 标题 | `feat: 库存保持与更新用户数据的任务链日志按序号或识别类型区分` |
| 首个包含它的发行版 | v6.17.3(2026-09-09) |
```csharp
// src/MaaWpfGui/Main/AsstProxy.cs:1589
private static string GetMultiChainTaskNameSuffix(BaseTask? task, string taskChain, int taskId)
{
if (task is UserDataUpdateTask)
{
return taskChain is "OperBox" or "Depot" ? $" ({LocalizationHelper.GetString(taskChain)})" : string.Empty;
}
if (task is not DepotMaintainTask depot)
{
return string.Empty;
}
var planIndex = depot.PlanList.FindIndex(p => p.TaskId == taskId);
if (planIndex >= 0)
{
return $" #{planIndex + 1}";
}
return taskChain == "Depot" ? $" ({LocalizationHelper.GetString("DepotRecognition")})" : string.Empty;
}
```
该函数在起始行与完成行两处追加后缀(`AsstProxy.cs:1343`、`:1385`)。由于 `PlanList` 里每条计划的
`TaskId` 在序列化时会写回,库存保持的每条计划链完成行必然是 `完成任务: 库存保持 #N`,仓库识别链是 `完成任务: 库存保持
(仓库识别)`,**不存在裸任务名**。纯 `FightTask`(理智作战/活动关优先/剩余理智)返回空串,不受影响。
MAS 侧此处用精确相等比对,`库存保持 #1` 匹配不上 `库存保持`,整段任务区间被丢弃,掉落随之漏计。
## 影响面
- 受影响:库存保持、养成计划(二者都是 `DepotMaintainTask`)
- 不受影响:理智作战 / 活动关优先 / 剩余理智(无后缀);`AutoProxy` 的理智完成判定走子串匹配,同样不受影响
- 本机未造成实际数据丢失:库存保持最近的真实刷取发生在 MAA 换版之前(09-03/04),换版后(09-11
起)几轮全部因理智不足被跳过、没有掉落
## 验证
- 本地回归用例覆盖多链序号行计入 / 与旧裸任务名结果等价 / 识别链不产出掉落,负向验证确认修复前 2 例必失败;按
`tests/AGENTS.md`,bug 边界测试不随 PR 提交
- 真机日志回归:09-03 真实刷取窗口解析结果不变;09-11 全跳过窗口仍为空
- `ruff check`(本次改动文件)通过;`pytest tests/core` 53 项通过;收集门槛 `pytest tests
--collect-only -q` 通过(1037 项)
- `tests/task` 中 6 个 maafw 用例在干净 dev 基线上同样失败,与本次改动无关
## 备注
- 更新日志碎片:`changelog.d/fix-maa-drop-stats-multichain-suffix.fix.md`
## Summary by Sourcery
修复 MAA 多链任务日志解析,使库存保持和养成计划的掉落统计能够正确识别带序号后缀的任务名。
Bug Fixes:
- 修复 MAA 多链任务带序号后缀时库存保持和养成计划掉落未计入统计的问题。
Enhancements:
- 兼容带序号后缀与旧版裸任务名的日志,并避免将仓库识别链误计为战斗掉落。
Tests:
- 新增 MAA 多链任务掉落统计、旧日志兼容及识别链排除测试。
<details>
<summary>Original summary in English</summary>
## Summary by Sourcery
修复 MAA 多链任务日志解析,使库存保持和养成计划的掉落统计能够正确识别带序号后缀的任务名。
Bug Fixes:
- 修复 MAA 多链任务带序号后缀时库存保持和养成计划掉落未计入统计的问题。
Enhancements:
- 兼容带序号后缀与旧版裸任务名的日志,并避免将仓库识别链误计为战斗掉落。
Tests:
- 新增 MAA 多链任务掉落统计、旧日志兼容及识别链排除测试。
</details>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
对应 AUTO-MAS-Project#523 的评审意见,直接提到你的分支上,合并后 AUTO-MAS-Project#523 会自动带上这些改动。三个提交各自独立,可以只取一部分。
data/{script_id}/目录;是否rmtree仓库改在杀掉旧 BGI 进程之后单独判断。首次启用、用户误删、BGI 启动失败三种情况都不会在第一轮删掉Repos/bettergi-scripts-list;只有上一轮 BGI 跑完仍没把脚本补回来,下一轮才强制重建。调度台文案与 docstring 同步。script_log_path已删)且缺 fix(log): BetterGI 跨日后监控当日日志 AUTO-MAS-Project/AUTO-MAS#510 补的时间戳基准日期刷新,交由 fix(log): BetterGI 跨日后监控当日日志 AUTO-MAS-Project/AUTO-MAS#510 处理。notify._step_duration按 ruff format 排版;main.py的is_admin()复用IS_ELEVATED;changelog 精简为一句。验证(独立 venv,Python 3.12,Windows):模拟脚本跑通首轮不删库 → 记录标记 → 次轮重建 → 脚本就绪后清标记 → 误删不删库五个阶段,BGI 目录树内无 MAS 残留文件;
pytest tests --collect-only -q退出码 0;全量tests360 passed / 1 failed,失败项在 dev 上同样失败;改动文件ruff check通过。另外 AUTO-MAS-Project#523 正文的
Closes #498建议改成「关联 AUTO-MAS-Project#498」,清单里还有未处理项。