feat: prepare 2.2.0 with UI and execution fixes

Add dark theme, richer Markdown and readable plugin results.
Improve Android input evidence, response integrity and diagnostics.
Unify lifecycle, guidance receipts and evidence sources across clients.
Keep direct action dispatch without an added AI quota approval layer.
Align version metadata at 2.2.0 and bundle Helper 1.2.2.

Validation: 3063 backend tests before the version bump; 44 after.
Frontend: 317 tests and production build passed.
This commit is contained in:
chenmingxuan committed 2026-10-26 00:44:13 +08:00
1 parent 83bcfd54d5
commit fac4ccb760
146 files changed
+5689 -2033

No files matched your search

+7 -1
View File
@@ -58,7 +58,7 @@ MCP 同步仅检查 `$CODEX_HOME/config.toml`;未设置或为空时使用当
报告按任务或批次归档到 `artifacts/mcp_exports/`,包含本地路径及服务下载链接;删除批次时会清理对应导出副本。运行中导出是快照;执行完成不等于验证通过,报告会保留未验证、失败、跳过与中断状态。
新安装模型默认使用 `gpt-6-luna`,预设 `gpt-6-luna`、`gpt-6.1-sol`、`gpt-6-astra`、`mimo-v2.6-pro`;首页、兜底模型与精选任务使用统一选择控件,也支持自定义模型名称。已保存的模型配置保留。思考强度最高支持 `max`,默认 `high`,选“由模型默认”不发送该参数;接口不支持时明确报错。单次请求 300 秒,首次失败后最多再试 5 次,普通错误每次等待 10 秒,429 每次等待 60 秒,SDK 不叠加重试。首选模型连续 3 次没有有效工具调用时,当前步骤改用 `gpt-6-luna`(high),最多再试 3 次;下一步重新使用首选模型。兜底模型及次数可通过 `.env.example` 中的 `OPENAI_TOOL_FALLBACK_*` 和 `ARTEMIS_TOOL_FALLBACK_MAX_NO_PROGRESS_ATTEMPTS` 配置。请求耗尽后沿用任务暂停/恢复机制,鉴权或非法参数立即失败。视频分析与录屏是独立开关,默认均关闭。每项批量用例可覆盖模式、模型、设备、录屏和超时等配置,不影响其他任务。暂停先返回 `pausing`,确认状态为 `task_paused` 才表示设备已释放;Pro 等待模型回复或只读诊断时可及时中断,恢复后重新观察设备。AI 可用 `mobile_manage_task(action="inject_instruction")` 提交指导并恢复;运行中的模型思考会中断并重新观察设备,已经开始的设备动作会安全结束。用 `guidance_history` 核对指导是否被领取、在任务流程中核对实际执行情况,或用 `resume` 单独恢复。
新安装模型默认使用 `gpt-6-luna`,预设 `gpt-6-luna`、`gpt-6.1-sol`、`gpt-6-astra`、`mimo-v2.6-pro`;首页、兜底模型与精选任务使用统一选择控件,也支持自定义模型名称。已保存的模型配置保留。思考强度最高支持 `max`,默认 `high`,选“由模型默认”不发送该参数;接口不支持时明确报错。单次请求 300 秒,首次失败后最多再试 5 次,普通错误每次等待 10 秒,429 每次等待 60 秒,SDK 不叠加重试。首选模型连续 3 次没有有效工具调用时,当前步骤改用 `gpt-6-luna`(high),最多再试 3 次;下一步重新使用首选模型。兜底模型及次数可通过 `.env.example` 中的 `OPENAI_TOOL_FALLBACK_*` 和 `ARTEMIS_TOOL_FALLBACK_MAX_NO_PROGRESS_ATTEMPTS` 配置。请求耗尽后沿用任务暂停/恢复机制,鉴权或非法参数立即失败。视频分析与录屏是独立开关,默认均关闭。每项批量用例可覆盖模式、模型、设备、录屏和超时等配置,不影响其他任务。暂停先返回 `pausing`,确认状态为 `task_paused` 才表示设备已释放;Pro 等待模型回复或只读诊断时可及时中断,恢复后重新观察设备。AI 可用 `mobile_manage_task(action="inject_instruction")` 提交指导并恢复;指导由执行器在安全检查点领取,可能中断当前模型等待并重新观察设备;接收回执不保证任务结束前已消费,已经开始的设备动作会安全结束。用 `guidance_history` 核对指导是否被领取、在任务流程中核对实际执行情况,或用 `resume` 单独恢复。
429 等待、兜底模型及次数也可在网页“模型配置 → 稳定性与兜底模型”或通过已授权的 `mobile_config(section="model")` 配置。批次 ZIP 还收录每项任务已保存的步骤截图和录屏。
@@ -80,6 +80,12 @@ Flash 最终 AI 判定与分析默认关闭。读取 `mobile_config(section="cap
任务已经产生最终结果,但 SDK 线程或资源清理仍卡住时,默认最多再等待 30 秒后回收工作进程,避免继续占用队列。全局可用 `ARTEMIS_WORKER_CLEANUP_TIMEOUT_SECONDS` 或功能配置的 `worker_cleanup_timeout_seconds` 调整,任务 JSON 同名字段可覆盖。原有结果与截图保留,未完成保存的录屏尽力恢复。
MCP 工具和单任务 HTTP 提交均拒绝未知顶层字段,在执行前返回错误。`mobile_run_task` 使用 `task_desc`,HTTP `/api/run` 使用 `goal`;两者不能混用来静默替换任务。结构化 JSON 工具结果同步保留 `structuredContent` 和原文本内容。`view_summary` 的文本保持 Markdown,结构化结果提供 `summary` 与 `steps={items,total,offset,limit,next_offset}`;按 `next_offset` 翻页,值为 null 才表示没有下一页,`items` 保留存储中的 `step_id/step_number`。
跨端阶段工具 `update_task_progress` 首次使用完整 `stages`;之后可提供 `stage_updates=[{id,status,evidence?}]` 和 `reason`。补丁只更新已存在的阶段,保留其顺序、范围、资源与未提及阶段;完整阶段和补丁只能选择一种。完成或阻塞仍需事实依据,校验或保存失败时不更新进度。来源清单与阶段完成都不能替代正式验收。
报告和证据索引的 `evidence_sources` 从已记录的插件来源汇总,区分安卓/电脑界面与接口、终端、文件等辅助来源,并保留实际步骤和调用编号。缺失来源显示未知,不按业务后台名称或网址推断执行平台;界面截图不能单独证明后端持久状态。该清单不改变 `test_result`、AI 原判或人工复验。
## 插件证据与留档参数
2.0.0 插件协议与可运行示例见 [开发规则](plugin-development.md)。单任务和批次全部资料包含各来源截图/录像、插件附件及包内证据索引。
+5 -1
View File
@@ -16,7 +16,7 @@
“执行完成”与测试结论分开记录。预期直接写在任务提示词中即可;Pro 默认用只读终检核对提示词、用户指导、执行结论及实际证据,不增加必填表单。Flash 的“最终 AI 判定与分析”默认关闭,可在首页功能配置开启;关闭时正常完成的任务显示“执行完成 · 未做 AI 判定”,历史、批次与 Word/Excel 保持一致,不自动记为测试通过。终检出错或缺少证据时仍显示“未验证”,设备或执行异常不当作产品缺陷;已确认的断言失败会保留。正在执行的任务也可以下载,但文件只代表下载时的快照。
Flash 开关保存在全局配置中,对网页、批量、精选、MCP/SDK 和探索提炼用例的 Flash 复跑统一生效;在任务开始时固定,排队中的任务使用最新配置,运行中的任务不变。开关只省去末尾独立 AI 复核,执行模型的最终答复、步骤摘要收尾和资源清理仍保留,不影响 Pro 或主动探索。环境变量为 `ARTEMIS_FLASH_FINAL_CHECK_ENABLED=false`,JSON 默认在 `agent.flash.final_check_enabled`;旧配置缺少该字段时也默认关闭。
Flash 开关保存在全局配置中,网页切换后自动保存,失败恢复原值;无需重启服务。对网页、批量、精选、MCP/SDK 和探索提炼用例的 Flash 复跑统一生效;在任务开始时固定,排队中的任务使用最新配置,运行中的任务不变。开关只省去末尾独立 AI 复核,执行模型的最终答复、步骤摘要收尾和资源清理仍保留,不影响 Pro 或主动探索。环境变量为 `ARTEMIS_FLASH_FINAL_CHECK_ENABLED=false`,JSON 默认在 `agent.flash.final_check_enabled`;旧配置缺少该字段时也默认关闭。
终检已输出完整且符合结构的结论时,直接校验并保存,不额外请求模型改写格式;若兼容接口把 `test_result` 编码为 JSON 字符串,会先解码再按同一规则校验。普通说明文字、被截断的输出、缺少检查项或证据的结果不会直接算通过。判定范围以提示词为准:明确要求“发现并如实报告问题、不要求无缺陷”的检查任务通过,不表示被测产品没有缺陷。
@@ -32,6 +32,10 @@ Flash 开关保存在全局配置中,对网页、批量、精选、MCP/SDK 和
展开“模型请求诊断”可查看最近 100 次尝试的模型、思考强度、本地请求编号、尝试编号、服务端请求编号(如有)、开始/响应头/首个有效输出/最后输出/结束时间,以及错误类型、阶段、图片数量与尺寸和服务报告的 token 用量。有效输出片段按客户端接收计数,与服务端 SSE 事件数口径不同;工具参数只记录字符数和工具名,不保存参数正文。输出 token 上限来自该调用的 `max_tokens` 配置,未设置时明确标注由服务决定;它与 300k 上下文限制不同。未报告的用量显示“未知”;旧任务未记录的字段无法补推。页面按本机时区显示,完整 JSON 同时保留 Unix 秒和 UTC 时间,方便与服务端日志对照。
新记录还包含取消原因与中断阶段,区分用户停止、新指导替换、暂停及任务/检查替换;已知外层等待时限、单次模型请求时限、连接读写超时和最终验收总预算分别显示。重试等待中取消会保留上次请求错误,同时明确记录本次取消来源,不再发起重试。没有来源记录的取消显示未知;服务返回 HTTP 499 时需结合本地终止记录及服务端日志核对,不能仅凭状态码归咎于用户、模型或代理。未完整结束的响应及无效工具参数沿用完整性保护,不进入工具或结论解析。
同一次模型调用的自动重试共享本地请求编号,每次尝试有独立编号,通过“上次尝试编号”追踪;重试和终止事件携带对应的尝试编号。“出站请求编号”是实际发送的 `X-Client-Request-Id`,保留调用方已有值;服务端若提供 `x-request-id`/`request-id`、`x-trace-id`、有效的 `traceparent` 或 Responses 响应编号,也会显示并导出,未提供时明确注明。仅采集这些白名单标识,不保存认证头、Cookie、取消消息正文或工具参数正文。
诊断可单独下载,也会收录到单任务“全部资料”和批次 ZIP 各任务目录的 `模型请求诊断.json`。请求状态复用任务 trace 数据库,每次尝试一条记录;同一阶段的流式更新至多每 5 秒保存一次,阶段变化立即记录,不额外调用模型、抓取屏幕或记录认证头。强制退出导致缺少结束事件时保留最后阶段,不推断为成功。
Flash、Pro 和探索的最终验收使用独立总预算,不再复用中间检查点的 180 秒时限。预算按实际 Checker 的单次请求超时 `T`、重试次数 `R`,以及普通/限流重试间隔的较大值 `D` 自动计算:`min(3600, T × (3 + R) + D × R + 60)` 秒。它为取证、结论及必要的结构化整理预留三次正常请求时间,再共用一份重试时间余量和 60 秒工具读取余量;不会按 20 轮循环逐轮放大。每个请求仍最多重试 `R` 次,但全部请求和重试必须在总预算内完成。默认配置的上限为 2760 秒,提前完成就立即结束;用户停止、探索指导及任务本身的执行时限仍生效。
+2
View File
@@ -1,5 +1,7 @@
# 开发交接:2026-10-19
2026-10-24 开发主线已迁入新会话,迁入基线为 2.1.0;2026-10-26 工作区已升至 2.2.0,尚未发布,完整增量见[2.2.0 说明](releases/2.2.0.md)。新增工作与待办优先级见[本轮主线计划](plans/2026-10-25-mainline.md);以下保留原始迁入快照,不将其提交号、分叉计数或测试数量视为当前状态。
本文件保留 2026-10-19 从《Artemis开发主线-1017-2》迁入时的开发快照。历史结论已结合代码、发行说明和当时的本地 Git 引用核对;后续开发以[仓库指南](../AGENTS.md)、[设计约定](../DESIGN.md)和实时 Git 状态为准,以下提交号与分叉计数不随后续提交自动更新。
**迁入时插件仓库有本地改动及分叉,不能用该工作目录代表已发布版本。** 后续发布应明确本次范围,保留尚未归并的开发现场。
+131
View File
@@ -0,0 +1,131 @@
# 开发主线:2026-10-24 会话迁入
更新于 2026-10-26。本轮以 2.1.0 的 `83bcfd5` 为开发基线,结合用户提供的《Artemis开发主线-1023》迁移记录及 `artemis-android-limitations-2026-10-24.md` 测试复盘整理。本文记录工作区实现与后续计划,不代表已经发布新版本。
当前主程序已按用户要求升至 **2.2.0** 并整理为本地开发提交;前后端和锁文件同步,完整增量清单见[2.2.0 说明](../releases/2.2.0.md)。尚未推送、打标签或发布源码包。
当前更正:新增的次数约束与 AI 动作否决机制是实现时自行扩展的,并非用户提出的需求。用户明确要求移除,已撤回该机制;下文相关实现与补丁仅保留为历史记录,以文末撤回说明为准。
主程序与相邻的 `Artemis-Plugins` 是独立仓库。迁入阶段只修改主程序;10 月 25 日追加的 CUA 修复在插件仓库的隔离工作树中开发,原插件检出的分叉及未提交修改保留,不能随主程序夹带发布。
## 本轮交付
| 项目 | 工作区实现 | 验收范围 |
| --- | --- | --- |
| 计划 Markdown | 计划、笔记、报告复用渲染器,支持表格、列对齐、嵌套列表、任务清单、引用、链接、图片、删除线和围栏代码;保留进行中和验收标记 | 表格、转义、代码字面量、流式未闭合围栏、链接协议及 HTML 安全回归 |
| 暗色模式 | 导航使用单个太阳/月亮按钮一键切换亮暗;首次跟随系统,点击后浏览器记忆,首次绘制前应用;首页、工作区、配置、插件和报告共用语义颜色 | 系统变化、按实际外观反转、刷新、跨标签同步、存储不可用;检查实际页面和窄屏布局 |
| Flash 最终 AI 判定 | 切换即保存,保存中禁用,失败恢复原值并提示;不提交其他未保存的草稿 | 保存后无须重启,尚未开始的任务采用新值,已开始任务保持快照;Pro 仍保留最终验收 |
| 模型响应完整性 | 流式、非流式、结构化输出和串接解析器统一检查服务端完成状态;原始工具参数严格解析,拒绝自动修补的截断 JSON | 缺终止事件、`incomplete/failed`、已结束但参数截断、重试保留证据、零重试和取消;使用真实 LangChain/OpenAI 适配器及本地模拟 HTTP/SSE,不调用外部模型 |
| 应用启动恢复 | 移除第二次及后续启动尝试中的隐式强制停止;焦点为空时结合 resumed 活动所在任务,只有 visible 任务时继续等待 | 成功、失败、未知焦点、有/无 resumed 活动、错误任务和瞬时启动错误;保留有界重试与焦点/任务诊断 |
| 取消与请求链路 | 用户停止、指导替换、暂停、任务/检查替换及已知外层时限传递明确来源;区分请求/传输/验收预算;显示可用链路编号并关联重试 | 运行时到模型的嵌套取消、旧标记、未知来源、499、零重试、重试等待与验收预算;不保存自由文本取消消息,旧任务不补推 |
Flash 排查发现:较早的“未做 AI 判定”任务启动快照为关闭,后续任务快照为开启,当前服务保存值也是开启。本轮未复现后台热更新失效,不能据此断言用户当时没有保存;页面原先只改变草稿、需再点底部保存,现已消除这个容易误解的环节。保持原有后台配置、队列刷新与工作进程快照机制。
## 下一步优先级
| 顺序 | 问题与证据状态 | 实现状态与后续验收 |
| --- | --- | --- |
| P1-1 | **模型流完整性,已实现。** 本轮协议模拟确认[旧累积逻辑](../../artemis/services/llm.py)会接受未完整结束的输出,库的 `last` 标记及宽松 JSON 解析不能作为证明 | 新增[完整性检查](../../artemis/llm/response_guard.py),缺终止事件、`response.incomplete/failed` 和原始参数截断均不能交给工具或解析器;无效输出最多重试一次,保留已有证据。协议与取消回归通过;真实模型链路待外部验收 |
| P1-2 | **启动重试隐式停止应用,已实现。** 已移除[启动辅助逻辑](../../artemis/utils/app_launch_utils.py)中重试前的 `terminate_app`;驱动的独立停止能力保留。焦点为空时核对 resumed 活动所在任务 | 启动失败不会隐式强制停止;仅 visible 的候选任务不算就绪,错误或未知任务保留诊断。模拟控制器、ADB 启动及工具回归通过;具体历史事故仍需逐次归因,实机复验待安排 |
| P2-1 | **取消与请求诊断,已实现。** 原先取消标记的原因在工作进程处丢失,指导与外层等待取消也没有来源;确定性回归先复现,再验证分层传递 | 标记增加白名单原因,任务控制及等待包装层透传;区分用户停止、指导替换、暂停/替换、已知外层时限、单次请求、传输及验收预算。可用的请求/响应/链路 ID 和上次尝试 ID 进入现有诊断,重试及终止事件关联到尝试。未知原因与 499 不自动归因;参数长度及完整性保护保留。历史任务不回填 |
| P2-2 | **任务生命周期与进度,已实现。** 原队列 started_at 可能记录提交时点,指导接收也不能保证终态前消费;旧记录缺少完整分项 | 复用控制文件记录状态区间,增加实际工作进程开始/导出完成时点;网页、MCP 与 Word/Excel 共用只读投影,区分排队、资源等待、暂停/示范、执行、最终验收、报告导出。指导区分接收、领取和消费,终态未消费与领取未确认单独显示;不改写旧证据、不补猜缺失时间 |
| P2-3 | **验收范围与证据来源,已实现。** 执行平台与辅助数据来源分别描述;不据业务名称推断平台,不以 UI 单独证明后台状态 | 报告、Word/Excel 与证据索引共享有界来源清单及实际引用;最终复核读取来源并明确未验证边界。只读投影保留原始步骤、AI 原判和人工有效结论;历史个案不重新判定 |
| P3 | **接口审计与改进,已实现。** 确认未知字段会被忽略、旧摘要缺少可靠页尾信息;原阶段完整更新已有防丢失保护 | MCP 与单任务 HTTP 拒绝未知字段;旧 JSON 结果增加 structuredContent,摘要返回总数/下一页/存储编号;阶段 id 补丁保留其他范围并原子校验。工具名称和白名单不变,更新目录、Skill、文档及测试。素材目录隔离与哈希回执已有,准备句柄及跨次任务取代关系属于新增能力,本轮不扩展宿主读取或自动覆盖历史结论 |
本轮 P1、P2 及已确认的 P3 改进代码已完成。应用自身的 Plan、RPC 或语言设置问题需独立归因,不能自动归为 ARTEMIS 缺陷,也不在此次修复中修改业务应用。素材准备句柄、跨次任务取代关系留作后续产品需求;没有把未复现的推测当作已修复事故。
## 迁入阶段交付边界与验证
- 本轮不启动真实设备任务或付费模型调用;通过确定性测试验证配置到工作进程环境的传递,并检查现有历史的网页呈现。
- 不改变用户配置、任务、历史与插件开发现场;不重启现有后台。
- 运行前端完整测试与生产构建,后端默认测试、Ruff 格式和静态检查、质量基线、核心类型检查;最终结果记录在本轮交付说明中。检查通过不代表外部设备或模型链路已完成实测。
首轮前端、Markdown 与 Flash 修复验证:前端 **301 项通过**,生产构建成功;当时后端默认测试 **2969 通过、2 跳过、8 排除**,Ruff 两项、质量基线和核心类型检查全部通过。浏览器检查包含暗色首页、配置表单、工作区历史报告与笔记、浅色切换和刷新,以及 390px 窄屏。
单按钮调整与 P1 续开发验证:前端 **301 项通过**,生产构建成功,运行中的 8000 服务已提供新页面;已检查直接切换、刷新记忆和 390px 窄屏。模型完整性相关 **90 项**、应用启动相关 **61 项**针对性测试通过;最终后端默认测试 **2998 通过、2 跳过、8 排除**,Ruff 两项、质量基线、核心类型检查和 `git diff --check` 通过。队列通过新进程执行 `artemis.main`,新启动的任务工作进程读取当前源码;已有 Python 进程不热替换代码。本轮没有重启后台或打断运行任务,外部设备与模型任务未执行。
P2-1 续开发验证:取消、请求诊断、暂停、验收预算、队列及图流程相关 **229 项通过**;后端默认测试 **3012 通过、2 跳过、8 排除**;前端 **304 项通过**,生产构建成功;Ruff 两项、质量基线、核心类型检查及 `git diff --check` 通过。浏览器在独立标签查看已有任务,新工作进程的出站请求编号与 Responses 响应编号已在暗色诊断面板展示,未发起新的模型或设备测试。
P2-2 至 P3 续开发验证:后端默认测试 **3039 通过、2 跳过、8 排除**。随后补充摘要的 Markdown 文本输出兼容,相关 MCP、共享桥接及任务检查 **57 项通过**;原生 MCP 未知参数拒绝、结构化结果、实际 UUID 步骤、Word/Excel 来源和人工结论保留的集成回归通过。前端 **311 项通过**、生产构建成功;Ruff 两项、质量基线、核心类型检查与 `git diff --check` 通过。浏览器使用隔离的只读模拟数据检查生命周期、终态未消费指导、暗/浅色来源分类与真实格式引用;该预览未连接实际服务,也不代表实机验收。
生效范围:网页产物已由运行中的 8000 服务提供,新任务工作进程读取当前源码;常驻后台仍使用启动时加载的代码。生命周期详细响应、来源报告、严格 HTTP/MCP 入参、用户停止来源及导出时间等后台改动需下次正常重启后生效。新页面兼容旧指导数组,旧后台尚未提供的详细来源不伪造展示;历史记录不回填。本轮没有为使改动生效而重启后台、停止任务或改写配置。
继续开发前阅读[仓库指南](../../AGENTS.md)、[设计约定](../../DESIGN.md)并检查实时 Git 状态;历史发行状态见 [2.1.0 说明](../releases/2.1.0.md),更早迁入快照见[开发交接](../development-handoff.md)。
## 10 月 25 日追加:输入、次数约束与 CUA
本阶段处理输入真实性、像素目标、历史引用及 CUA Shell 观察,并曾自行扩展一次性动作约束。次数约束已按用户要求撤回;CodexM 客户端独立修复不在范围内。
- 输入采集保留真实值、占位提示、可编辑性、提示显示状态及焦点。仅真实输入值可证明填写成功;输入后重新采集,空值或证据不足会中止后续批量动作。Android Helper 同步更新为 1.2.2,APK、版本和签名校验通过;本轮未安装到用户设备或重跑原业务。
- 明确的次数限制由执行层持久化,在派发前预留预算;重新规划、控件编号改变和模型重试不重置。明确未派发的预检拒绝可退还,已派发或结果未知保留占用。仅新的真实用户指导可修改约束。Flash、Pro、设备及插件写操作共享该机制。
- 输入框和按钮定位必须符合实际控件,不能改称空白区域绕过校验。拒绝的点位结合局部图像冻结,屏幕其他区域变化不清除拒绝;历史引用保留当时目标、坐标及截图身份。
- CUA 官方已有 Driver 0.38.0,插件在隔离工作树更新为 0.38.0+artemis.1。补充任务栏、托盘及原生菜单发现,按实际键盘焦点和已验证归属选择动作后截图。固定上游源码仅对已知 Shell/菜单类型的空标题精确窗口解析增加补丁,并重新构建 Driver、UIA 和 SDK DLL,记录完整来源。市场索引未发布此候选。
任务 `d189e8e6-efd4-4cff-9924-0e0e8920cda7` 暴露了新次数约束的误拦:编译器正确引用“不关闭 Plan”“不要清数据”等禁止动作原文,校验器却要求每条引用都包含次数或重试词,导致整组约束失败。已将该词法规则限制为编译触发条件;每条约束仍必须提供非空、真实存在的用户原文,保留严格结构和预算校验。任务内两组共 6 次附件菜单点击均在派发前被拦;没有因此发送业务消息。
已离线重放该任务保存的 6 份实际编译结果,全部通过修复后的引用校验,未调用设备或模型。新增回归确认普通菜单导航放行、发送第二次与禁止操作仍被拦、伪造原文仍在派发前拒绝。默认测试 3073 项通过,2 项跳过、8 项未选中;Ruff 格式及静态检查、质量基线、核心类型检查与 diff 检查通过。新增结果对应本轮实际执行,不替代上文的历史验证。
CUA 在共享桌面锁下完成隔离窗口验证:原生菜单与 Win+B 共 9 次调用,通过菜单截图、实际 HWND 来源和一次触发计数核验;隔离 Brave 本地表单共 38 次调用,中文输入、只提交一次、滚动、焦点保持及只读恢复通过。未调用付费模型,未操作用户真实业务会话。首次桌面失败保留原证据,用户反馈可能手动点走窗口,未将它认定为驱动故障。
主程序源码修复需重启服务后供新任务使用;不自动重跑失败任务。原始业务全流程、其他托盘应用、全部多屏/DPI 组合仍需后续业务验收。本轮不发布或推送仓库。
本机已将 CUA 从 0.36.0+artemis.4 升级并启用为 0.38.0+artemis.1,保留原有两套连接配置、密钥存储和旧版本目录;主程序没有自动升级其他插件。实际安装路径的 MCP 握手与 12 个工具契约校验通过,会话正常关闭。最终安装包的适配器、UIA helper 与 SDK DLL 和桌面测试候选相同;Driver 重新链接仅有 PE 时间戳及 CodeView 构建 GUID 共 24 字节差异,其余字节一致。安装与来源核验结果保存在本地 `artifacts/validation/2026-10-25/cua-local-upgrade.json`。
## 10 月 25 日追加:首次发送被尾句禁止项覆盖
任务 `7b89b1e2-4340-43c6-a4e4-cc8c7bb5911b` 的 Step 10 在派发前误拦。原记录同时存在“输入核对完整后仅发送一次,不自动重发。”的 0/1 预算与“不要另发消息/停止任务/操作其他会话。”的 0/0 预算,动作匹配器同时选中两者,导致首次 Send 被零次项拒绝;持久化派发列表为空。这次并非次数已用完,也没有实际发送或停止任务。
根因是动作匹配只收到提取后的预算和目标,未收到完整原文及真实指导,失去了“允许这一次、禁止另发”的关系。现已补齐完整上下文,编译时要求保留相对范围、操作者和接收方,并拆分不同禁止动作。正向与零次约束冲突时增加范围复核,必须引用已匹配正向预算的完整原文;不删除禁止项、不增加额度,已用次数仍由执行层持久化。明确禁止的报错改为“命中用户禁止约束”,附实际原文,与正向次数耗尽区分。
新增回归覆盖首次发送、重载后再次发送、丢失回执、一次派发多个点击、其他会话、停止、权限禁止、独立绝对禁令,以及不明确、伪造、截短或错误关联的例外。另在临时历史库中加载该任务真实的 7 条预算及 Step 10 匹配结果,以固定语义复核结果验证派发和持久化:仅一次模拟派发、第二次 1/1 拒绝、停止仍被禁止,7 条约束完整保留。证据和离线结果保存在本地 `artifacts/validation/2026-10-25/action-budget-scope-7b89.json` 与 `action-budget-scope-replay-7b89.json`;固定语义结果的回归不代表真实模型准确率验收。
本次次数约束专项测试 **27 项通过**,默认后端测试 **3086 项通过、2 项跳过、8 项排除**;Ruff 格式和静态检查、质量基线、核心类型检查及按仓库换行配置执行的 `git diff --check` 通过。验证直接使用当前 `.venv`,未变更依赖。没有调用真实设备或外部模型,没有重启后台、重跑原任务或改写原任务结论;源码需由重新启动的进程加载后,再以新任务复验真实模型判读。
## 10 月 25 日追加:触发问题与普通聊天代答混淆
任务 `9170bc7c-03b2-4855-8d37-04ce523e900c` 的 Step 14 仍在派发前误拦。记录有 14 条约束、全部已用次数为零、派发列表为空;首次消息与真实 Color 表单的自定义答复各有一次独立额度。实际匹配仅返回“不要普通聊天代答或重复提交。”对应的零次项,遗漏首次消息的正向额度,因此没有进入上一轮只处理“正向与零次同时命中”的复核。报错已使用上一轮新增文案,不能归因于旧后端未加载。
此次问题来自两处缺口:复核入口假设匹配器不会遗漏允许项;动作证据又缺少实际输入对应哪段用户原文的标识,截图只能看到消息末段,操作者描述不能替代该证据。此前固定语义返回的测试证明了计数与派发流程,没有证明模型能区分两次提交,不能视作完整语义验收。
修复后,零次项命中时检查全部正向候选,恢复的额度仍由宿主预留和持久化。Flash 与 Pro 的原生动作提供从真实可编辑值取得的原文位置和内容指纹;编译时把用户明确指定的完整消息、表单答案分别固化为绑定。宿主在初次匹配和复核后的派发路径都核对绑定,防止把答案当作触发消息而借用额度。聚焦空输入、其他输入、多个歧义输入、提示和掩码不能提供有效绑定。旧预算保持原有已用次数,遗漏输入额度缺少绑定时不自动恢复;没有可编辑值接口的电脑插件保持原有目标和截图判读能力,不冒称已核对内容。
经用户授权,使用当前判读配置 `gpt-6-luna / high` 完成四次结构化模型判读,关闭重试与格式纠正重问:本次首次消息放行、重复消息阻止、上次误拦的首次消息放行;“普通聊天代答”的合成反例却被模型误选为首次消息额度。原始语义结果是 **3/4**,不能记作全部通过。因此增加上述宿主内容绑定,而非只增加一层 AI 判断。四次额度已用完,没有追加调用。
复用保存的四份模型选择,在临时历史库中提供新版编译绑定的离线样本,最终宿主路径 **4/4** 符合预期;其中实际错误选择被绑定校验拒绝,没有模拟派发或扣次数。该结果验证宿主硬校验,不代表已实测新版编译器的模型输出或手机全流程。原始结果与宿主复验分别保留于本地 `artifacts/validation/2026-10-25/scope-semantic-model-results.json`、`scope-semantic-host-replay.json`;调用次数核对说明另存 `scope-semantic-model-validation-note.json`。未操作设备、发送业务消息、修改原任务记录、重启服务或自动复跑。
最终次数约束与输入证据专项 **57 项通过**;默认后端测试 **3105 项通过、2 项跳过、8 项排除**,保留 102 条现有 Pillow 弃用警告。Ruff 格式和静态检查、质量基线及核心类型检查通过;核心类型配置只覆盖其既有文件清单,不冒称对全部运行时模块做了类型覆盖。验证使用现有 `.venv`,未改依赖。按仓库换行配置检查 tracked diff 与本轮未跟踪源码、测试和文档的空白;没有提交或推送。新源码仍需重启后端加载,旧任务与原始预算不被自动重写。
## 10 月 25 日追加:次数判读置信度误作动作否决
任务 `2f3f7b75-31a0-400d-b178-f5505e8e0b19` 的 Step 12 在普通 Approve 前被 ARTEMIS 自身拒绝。用户原文明确为 `Approve once (not remember rule).`,预算中审批额度为 0/1,首次消息已独立占用 1/1。实际 `_Match` 正确选中审批额度 `2395a82bab1ee99b759c681a`,却同时返回 `uncertain:true`;执行层仅因该标记抛出“无法确认动作是否属于限次提交”,没有调用点击工具,也没有扣审批次数。截图与步骤记录均显示普通 Approve、指定理由、命令和目录;不是用户未授权或审批额度耗尽。
与此前几次误拦的共同原因,是新增次数约束把辅助语义判读错误提升为硬阻断:引用的二次词法检查、失去完整上下文的相对禁令、遗漏允许项后绕过复核,以及本次置信度否决。已发布的 `v2.1.0` 不包含 `action_constraints.py`,当时原生动作直接调用动作会话;这组误拦来自本轮新增、尚未发布的执行约束机制,不能归咎于用户指令复杂或 CUA 更新。
根据用户明确的测试工具职责,取消初次关联与范围复核中 `uncertain` 的独立否决作用,将该标记记入诊断。已返回的有效约束仍进入次数、禁止项、输入绑定和持久化校验;未知约束编号、无效原文、明确禁止项、内容不符及次数耗尽不会因不确定而绕过。未匹配任何额度的普通动作也不凭空获得一次性限制。此修改没有按钮名称白名单,没有增加模型复问或新的授权流程。
使用该步骤保存的真实匹配结果与原始预算,在临时历史库中模拟派发,保留原任务记录。首个普通审批可派发一次并预留到 1/1,重载后第二次被 1/1 拒绝,其余额度不变;只证明宿主处理结果,不代表重新执行手机审批。证据与离线复验分别保存在本地 `artifacts/validation/2026-10-25/action-budget-approve-2f3f.json`、`action-budget-approve-2f3f-replay.json`。本轮没有调用外部模型、操作设备、处理遗留审批、重跑原任务或重启后端。
本轮专项 **66 项通过**,覆盖置信度不否决首次动作、重载后重复提交、无匹配普通导航、独立禁止项、无效编号、范围复核及输入绑定。默认后端测试 **3114 项通过、2 项跳过、8 项排除**,102 条现有 Pillow 弃用警告;Ruff 格式和静态检查、质量基线、核心类型检查及本轮差异空白检查通过。旧版本比较来自本地 `v2.1.0` 标签;源码修复尚未发布,真实设备全流程仍未复验。
## 10 月 26 日追加:按用户要求撤回次数约束机制
用户明确表示“不需要这个,不要引入额外困难”。此前新增次数约束是实现过程自行扩大范围,并非用户提出的需求;本轮完整撤回,以上相关补丁与验证均为历史记录。
- 删除新增的约束运行时和专属测试,移除自然语言约束编译、次数预留、范围复核、提交内容指纹与 AI 动作否决。
- Flash 原生动作、扩展动作、Pro 动作和插件调用直接进入原有工具会话,清理指导记录、输入匹配证据及拦截回执的接入;没有留下开关或替代审批层。
- 保留真实输入与占位提示的区分、输入后重新观察、目标与截图身份、共享资源锁、插件参数和授权校验、取消暂停及实际工具错误处理。新的用户指导仍会清除过期的像素拒绝记录。
- 用户任务中的次数和禁止要求仍交给执行模型根据原文、指导、观察与历史遵守;模型请求重试不自动重放业务动作。历史任务和旧约束记录保留,不再读取为执行配额。
新增回归覆盖含“仅一次”“不要另发消息”“Approve once”等措辞的首次动作、原生与扩展派发、成功与真实工具失败,并确认没有额外 AI 判读且每次调用只派发一次。Pro 成功用例同样校验直接调用;输入状态回归继续保留。当前专项 **38 项通过**。验证使用模拟工具,不代表真实设备全流程通过;没有调用付费模型、操作设备、改写历史任务或重启后端。运行中的后端需正常重启后加载改动。
本轮默认后端测试 **3063 项通过、2 项跳过、8 项排除**,耗时 287.16 秒,保留 102 条现有 Pillow 弃用警告。撤回机制的专属测试随模块删除,其余默认测试和质量要求继续执行。Ruff 格式检查(806 个文件)、静态检查、质量基线(754 个宽泛异常、0 个静默宽泛异常、18 个类型忽略)及核心类型检查通过。全仓库检索无该机制的有效代码引用;tracked diff 与本轮未跟踪源码、测试和文档的空白检查通过。未提交或推送。
## 10 月 26 日追加:升版 2.2.0 与增量清单
按用户要求同步后端项目、UV 锁、前端项目及 NPM 锁版本到 **2.2.0**,离线更新本机 Artemis 可编辑安装,并核对发行元数据和运行时版本。新增[2.2.0 说明](../releases/2.2.0.md),对比 `v2.1.0` 列出最终保留的变更、撤回机制及独立 CUA 插件候选;README、设计与交接入口同步。
升版后 UV 锁离线检查、七处版本读数、启动/安装资源/状态路径/配置打包相关 **44 项测试**、前端 **317 项测试**与生产构建通过。后端全量和质量门禁沿用紧前一轮记录,未重复执行或冒称为升版后重跑。当前仅工作区升版,未提交、推送、打标签、发布源码包、更新插件市场或重启后台。
## 10 月 26 日追加:本地提交
按用户“先提交”的指令,将本轮主程序 2.2.0 的源码、测试、版本文件、随源码分发的 Helper APK 与清单及文档整理为一次本地提交。根目录 `.angular/` 缓存不纳入,独立插件仓库与 CUA 候选保留原现场。沿用前述实际验证结果,提交前检查精确暂存范围和差异空白;不推送、打标签、发布或重启后台。
+57
View File
@@ -0,0 +1,57 @@
# ARTEMIS-Eapil 2.2.0
日期:2026-10-26。比较基线:`v2.1.0`(`83bcfd5`)至当前工作区,包括本轮新增文件。
主程序、前端及各自锁文件已统一为 **2.2.0**。当前为本地开发提交,尚未推送、创建标签或发布源码包。远程薄客户端 `artemis-client` 与安卓 Helper 沿用各自独立版本。
## 主程序变更清单
| 范围 | 2.1.0 → 2.2.0 的变化 |
| --- | --- |
| Markdown | 计划、笔记和报告复用渲染器,支持表格与对齐、嵌套列表、任务清单、引用、链接、图片、删除线和围栏代码;保留计划进度与验收标记,处理 HTML 转义、链接协议和流式未闭合代码围栏。 |
| 暗色模式 | 导航太阳/月亮按钮一键切换,首次跟随系统,浏览器记忆并在首次绘制前应用;首页、工作区、配置、插件和报告共用亮暗主题。 |
| Flash 最终 AI 判定设置 | 开关切换后立即保存,保存中防止重复操作,失败恢复原值;保存成功后后续未开始任务使用新值,无须重启。默认关闭、运行任务配置快照及 Pro 验收行为保持原约定。 |
| 插件结果阅读 | 窗口状态、控件与工具结果采用摘要、分组及可展开原始数据展示,改善 `get_window_state` 大 payload 的阅读;此次优化网页呈现,保留执行模型收到的工具证据。 |
| 安卓输入真实性 | 区分输入值、占位提示、可编辑性、焦点与掩码;保留空输入框,输入后重新观察,避免把提示文字当成已经填写。未确认输入时停止继续批量提交,保留已派发事实。 |
| 安卓 Helper | 升至独立版本 **1.2.2**,补充节点输入相关属性,同步 APK、清单与校验信息。 |
| 点击定位与历史引用 | 动作保留实际目标、坐标、截图和快照身份,旧步骤不会随控件编号复用而改变;像素定位结合真实控件和局部画面,避免改称空白区域绕过目标检查。 |
| 写操作错误处理 | 不因一次执行错误自动重复物理动作;区分未派发、已派发和结果不明,扩展工具错误及证据回执保存失败不会被错误记作成功或诱发重发。 |
| 应用启动恢复 | 启动重试不再隐式强制停止应用;焦点为空时结合已恢复活动所在任务判断,仅可见的候选任务不足以证明已就绪,保留有界等待与诊断。 |
| 模型响应完整性 | 流式、非流式、结构化结果及串接解析器要求服务端完整结束;缺少终止事件、失败、未完成或截断 JSON 不进入工具与正式结论。恢复只重试无效模型请求,保留工具证据,不重新执行业务动作。 |
| 取消、超时和请求诊断 | 传递用户停止、新指导、暂停、任务/检查替换及已知外层时限;区分单次请求、传输与验收总预算。用请求和尝试编号关联重试,显示可用服务端请求、响应及链路编号;未知来源和 HTTP 499 保留未知。 |
| 任务生命周期 | 网页、MCP 与报告共用阶段和耗时投影,区分排队、资源等待、暂停/示范、执行、最终验收和导出;增加实际工作进程开始、导出完成时点,旧数据缺失项不补成零。 |
| 中途指导回执 | 区分接收、领取与消费;终态尚未消费、领取后未确认消费分别显示,收到指导不再等同于已经执行。 |
| 证据来源与验收范围 | 页面、Word/Excel、报告和证据索引汇总实际执行界面及接口、终端、文件等辅助来源,保留步骤和调用引用;最终复核明确未验证边界,不按网址或业务名称猜测平台。 |
| MCP、HTTP 与阶段更新 | 拒绝未知字段,JSON 工具结果提供 `structuredContent` 与兼容文本;历史摘要带总数、下一页和实际存储步号;任务阶段支持按 id 局部更新,保留其他阶段并原子校验。工具名称和白名单不变。 |
## 本轮撤回的机制
开发中曾自行加入次数约束编译、配额持久化、提交内容指纹和 AI 二次动作否决,造成首次 Send、Approve 被误拦。已按用户明确要求完整删除运行时、调用接入及专属测试,没有留下开关或替代审批层。
2.2.0 由执行模型依据用户原文、指导、观察与历史遵守任务次数和禁止要求。资源锁、既有参数及插件授权校验、暂停取消、输入状态观察和真实错误处理继续保留。旧任务及历史约束记录保留,不再作为执行配额读取。
## 同期 CUA 插件候选
此项位于独立的 `Artemis-Plugins` 仓库和隔离工作树,**不是主程序升版后自动更新的插件**:
- 本地候选 **0.38.0+artemis.1**:同步官方 Driver 0.38.0,补充任务栏、托盘及无标题原生菜单发现。
- 根据实际键盘焦点和经验证的 PID、线程及窗口归属选择动作后观察窗口,返回实际来源。
- 对固定上游源码增加已知 Shell/菜单无标题窗口的兼容补丁,重新构建 Driver、UIA helper 与 SDK DLL,记录来源和 SHA256。
- 移除新版驱动已处理的滚动预缩放,避免坐标重复转换;保留最新截图编号、边界与窗口校验。
- 先前验证记录包含 Go 测试、vet、构建,以及共享桌面锁内的菜单/任务栏 9 次调用和隔离浏览器表单 38 次调用。候选市场索引尚未发布,原失败业务全流程未重跑。
## 验证与交付范围
升版前、撤回次数约束后的当前源码已完成:默认后端 **3063 项通过、2 项跳过、8 项排除**,保留 102 条现有 Pillow 弃用警告;专项 **38 项通过**;Ruff 格式与静态检查、质量基线、核心类型及差异空白检查通过。以上为上一轮实际执行的结果,非本次升版后重跑全量。
本次升版后实际完成:
- 后端项目、UV 锁、前端项目、NPM 锁顶层与根包、本机发行元数据及运行时公开版本共七个读数均为 **2.2.0**。
- `uv lock --check --offline` 通过;离线重建并更新本机 Artemis 可编辑安装,仅调整该包,其他依赖版本保留。
- 启动导入、安装资源、状态路径及配置/源码打包相关测试 **44 项通过**。
- 前端 ChromeHeadless **317 项通过**,生产构建通过。
- 本轮版本文件及文档的差异空白、相对链接检查通过。未重复执行升版前已通过的后端全量和质量门禁,不把上轮结果标作升版后重跑。
本轮未调用付费模型、操作设备、修改历史任务或重启后台;现有原业务、真实多 DPI、多显示器、长任务和压力场景不能据此视为全部通过。
更新安装时由现有安装/升级流程同步包元数据和网页构建;运行中的后台需正常重启后加载新代码。主程序升级不会自动升级或授权插件。