# 开发主线: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 候选保留原现场。沿用前述实际验证结果,提交前检查精确暂存范围和差异空白;不推送、打标签、发布或重启后台。