Wework 我的分身
连接企业服务端后,首次主分身引导、新建个人角色或云端项目分身默认选择可用云设备或远程设备(优先设备的默认标记),两者均不可用时默认本机。创建表单允许显式改选本机或其他设备;切换时沿用未保存修改确认。首次打开时优先保留已配置的本地档案;未保存的默认占位角色不视为已有配置。显式选择的云设备按企业地址和账号记住,设备离线不切换旧档案。开始编辑后设备清单变化不自动切换运行位置。保存和对话复用目标 Executor 的现有 Runtime 通道。未连接企业服务端及本地项目保持现有执行方式,不增加插件、提供方设置或云主机创建。
“我的分身”保留未连接企业服务端时创建的本机档案入口,连接后提示查看本机分身,并可在选中本地角色后迁移到云设备。迁移须明确确认:迁移名称、指令、模型设置、标签、角色记忆及共享记忆,追加独立云端角色,不覆盖目标已有分身;不搬迁会话、进行中的工作、本地目录或连接凭据。项目/数据源授权和定时安排需在云端重新配置,云端副本初始暂停;全部复制成功且本地版本未变化后才暂停原分身接收新工作。本地配置、记忆和历史继续保留,失败可重试且不重复导入相同记忆。主分身档案迁移为单独角色,避免覆盖云端主档案。
添加角色与分身设置复用页头、保存栏、接收开关和连接入口,不再额外嵌套一套卡片式设置页。主分身档案使用一个“分身说明”输入区,统一保存职责、个人背景和处理偏好,并与场景角色共享;打开旧档案会合并原两个文本框的内容,保存后不重复保留。连接首页只展示已连接对象及接收范围、处理方式,统一通过“添加连接”选择项目、钉钉群、联系人或日历;范围、排除、标签和处理策略在连接编辑中设置。运行环境直接展示设备、工作目录和模型,设备切换加载该 Executor 的独立档案,未保存修改时禁止切换。目录和模型是新工作的默认值,已有会话保持原环境。创建 Issue 的输入框不提供单独的分身开关,分身接收范围统一在“我的分身”中管理。
“我的分身”作为 Beta 功能直接开放,任务侧栏与协作项目按钮显示 Beta 标识,不再依赖实验性开关;直达页面和项目已启用标记同样不受该开关限制。项目负责人对话保留原实验性开关。主分身默认打开持续聊天,场景角色沿用已有工作与聊天切换;工作列表汇总个人处理记录,按角色可进一步筛选。工作卡片打开原 Runtime 会话,问题与原生确认仍在原工作中处理,不新增“待我判断”页面。设置保留接收新工作、分身说明、连接、执行设备、模型和工作目录;角色保留独立职责配置。连接与处理时机在设置内管理。
项目工具栏打开“项目分身”:优先选中已连接本项目的分身,否则选中第一个可用于本项目的个人分身。已有分身只读展示已有处理要求和自动处理状态。项目启用时,主按钮只显示“停用于此项目”,保存时断开所有分身对本项目的连接;覆盖所有项目的分身将本项目加入排除范围,不关闭分身全局开关,不影响其他项目或已有执行。项目停用时,主按钮只显示“开启并用于此项目”,保存时开启选中的分身并连接当前项目。界面提示开启也会对该分身已连接的其他项目生效,且仅处理开启后新分配的任务;不修改分身职责和处理要求。设置链接明确跳转到“个人分身设置”,说明修改会影响其他使用此分身的项目;个人设置在任务区打开,保留明确保存的执行设备选择。首次连接尚未启用协作来源的分身时,只连接当前项目,不自动扩大到所有项目。
“为此项目新建分身”仍创建个人分身,默认名称为项目名,保存后只连接当前项目,也会出现在“我的分身”的设置列表。处理要求默认展开,更多设置默认收起;二级设置始终编辑当前分身,不再切换。分身本身是独立的特殊智能体,创建和编辑均不再选择个人或项目智能体,也不请求相应目录。分身使用自身的职责、模型、设备和连接配置,不继承其他智能体的提示词、技能、插件或执行策略。
处理要求复用普通 composer、技能、插件和 Goal 模式。设备、模型与代码工作区收在更多设置。保存个人设置不依赖云端目录、项目设备绑定或模型就绪;执行时再校验当前用户、Issue 权限及分身的设备和模型配置。
所有编辑(包括自动接单)均为草稿,保存后才生效。处理要求和执行字段以函数式更新合并到当前分身,composer 的延迟回写不能覆盖开关、设备或工作区的新值。保存失败保留草稿,版本冲突不会覆盖其他编辑。点击右侧抽屉左侧遮罩、关闭按钮或按 Esc 都会请求关闭;有未保存修改时居中弹出确认框,选择“继续编辑”保留草稿和抽屉,选择“放弃修改”后关闭;二级页面返回会撤销该页面草稿。停用只影响新接单,正在运行的普通 Runtime 任务继续。
每个角色可接入所有参与的协作项目(包括以后加入的项目)并排除个别项目,也可选择具体项目;可选标签用于缩小任务范围。项目数量增加不需要重复设置执行配置。配置按账号保存在所选 Executor 的 SQLite 中;不同设备的配置独立,离线设备不能编辑。配置归属于存储它的 Executor;桌面设备身份更新后,读取和调度统一将配置及其分身的执行设备关联到当前 Executor,保留处理要求、项目范围、版本和启用时间。保存仍拒绝其他设备的配置。前端显式传递用户选定的 Executor 作为请求目标,不从配置中的设备字段推导路由、不重复校验本机身份或项目访问,也不改写 Executor 返回的设备归属;归属及权限由 Executor 校验。本地项目只在拥有其数据的设备展示。
存储只有一个个人设置文档,包含版本和分身配置列表;角色包含名称、执行配置、开关及来源范围。旧项目配置在事务内迁移为角色;旧个人或项目智能体绑定统一移除。移除项目绑定前,将原项目限制与已选项目范围取交集并保留排除项,保持原有效授权、身份、版本和启用时间。已有显式模型和来源连接保持原状;未指定模型时使用独立分身的默认规则。旧项目寻址 RPC 仅是个人文档的视图,不再写入另一份项目设置。
项目自动接单以各项目连接保存时的分配时间为界,不沿用分身在其他项目中的启用时间。Executor 统一在个人设置和项目设置保存事务中维护 projectBoundaries,按项目 ID 和存储类型记录边界;项目配置投影将其作为 enabledAfter,供本地轮询、云端分配和持久 intake 校验复用。持续连接的项目保留边界;新增、重连、取消排除或重新启用分身时重置受影响范围,普通设置修改不重置。旧 Issue 在接入后重新分配给本人时仍可触发。既有 CI stand-in 检查点增加用户故事:先有分配任务,再连接已开启的分身,验证旧任务不执行、新分配执行、断开期间任务不补执行、重新分配执行,以及后续轮询不重复执行;沿用真实桌面、存储和 Executor,仅替换模型服务。
邮件 E2E 使用固定哈希的 GreenMail 2.1.15 和 Java 11+(既有 Linux CI 使用 OpenJDK 21),保留 IMAP APPEND 的精确时间断言。旧版 1.6.15 将中午的协议时间解析为凌晨,导致时间相差 12 小时;上游 #1086 已修复此缺陷,不能通过调整业务时间筛选或削弱断言规避。
连接处理时机与后台统筹
协作项目、日历和消息来源共用标题区及配置末尾的“处理方式”组件。“直接处理”开启时由程序化 Router 直接创建具体工作,不调用后台语义评估;关闭时归集事件交给后台分身判断。角色的新连接默认开启,主分身的新连接默认关闭;显式保存的连接策略保持不变。项目默认策略也适用于以后接入的项目;旧全局模式仅迁移到尚无明确时机的连接,随后删除全局字段。显式连接策略优先;原有 automatic 与 askBeforeAct 保留,原手动连接只有用户点击“启用自动处理”才会开启。明确交办仍立即接收。
事件先保存在所选 Executor 的 SQLite 中,不因入库创建工作或调用模型。内置 @wegent/dsh-coordination-runtime 插件解释连接时机并执行程序化 Router:每个来源、角色从首个未处理事件起归集五分钟;用户主动交办立即获得处理资格;项目指派、消息和日历事项按各自保存的处理方式路由,消息正文中的“紧急”不能改变策略。已验证的回复关系回到原工作,等待用户和审批的状态保持不变;需要语义判断时,才调用主分身的独立持久 Codex 会话。没有事件、状态变化或到期跟进时不调用模型。离线恢复归集积压,不补跑每个错过周期。
设置保存与统筹派发按账号串行,配置变化取消未派发动作并作废旧批次;已经接收的评估命令保留同一回执核对,不能换一个命令 ID 自动重发。进入新批次及实际派发前均重新核对来源、启用时间、当前指派、角色范围与权限;临时云端失败保留事件以便恢复,明确撤权事件取消。普通来源失败显示在原来源入口,后台等待用户或审批时链接到原会话,不能代答。明确失败或取消的评估可在用户点击“立即检查”后重新评估未完成事件;执行结果不确定时显示原执行记录入口并停止自动重发。状态沿用 runtime.stand_in.processing.status,不提供全局模式或周期编辑界面。个人 Router 不新增 Backend API。
插件与宿主的事务边界
Executor 通过 runtime.coordination-v1 宣告协调接口。插件经现有 executor-runtime 客户端调用 runtime.coordination.contexts、snapshot、commit、wake 和 status。快照由宿主绑定当前用户、设备、配置、唤醒版本及事件版本;插件只能提交快照内的决策。提交在原 SQLite 事务内一次写入所有动作、状态与回执,拒绝非法或重复消费事件、过期快照、配置变化和另一设备提交。同一快照的相同计划重放返回原回执,不产生第二次派发。
Router 不拥有另一套数据库、模型运行器或权限系统。评估提示词和分流规则属于插件,来源资格、批次白名单、角色权限、当前账号与实际执行仍由 Rust 验证。快照和提交都复验后台会话生命周期,不能覆盖正在运行或等待用户的批次。旧原生后台业务轮询和连接立即派发分支已移除;Automation 定时器和连接 Provider 保留。
自动续聊接收后,完整输入归原生加密队列及稳定命令回执管理。standInAutomatic 标记使出队、强制启动、重启恢复和实际启动前都检查原工作是否等待用户或审批;等待期间保留同一请求,明确的用户回答仍可通过。原生接收只表示可靠投递,不表示模型已经读取或业务工作完成。中断恢复只以当前批次的稳定命令回执或精确消息记录确认接收;旧执行仍在运行不代表新批次已被接收。没有接收证据的批次回到可人工重试的失败状态,不自动重放。
协调会话恢复时,如果 MCP 批次授权变化,Executor 等待当前执行结束,释放旧订阅并确认原生 thread/closed 后,才恢复同一个会话并记录新授权。卸载、恢复与配置记录共用会话生命周期锁,避免并发恢复混用批次。空闲会话保留由宿主管理;原生卸载延迟设为零,避免释放订阅后仍保留第二份旧 MCP 连接。批次校验始终生效,无法确认卸载时停止恢复并显示原执行入口。
已安排
“设置 → 连接 → 添加连接 → 日历”是安排工作的统一入口;工作列表不再有平级的“已安排”页签。日历记录事项内容和触发时间,复用现有 Automation 存储、定时器与执行记录。系统“工作 → 已安排”菜单独立进入 /automations,保留原有任务安排、运行环境、持续目标及续聊配置;日历只从分身连接进入。两者按 taskRequest.standInCalendar 标记隔离列表和编辑,不自动互相转换。日历连接统一在身份的 calendar.policy 保存处理方式;新日历事项以 taskRequest.standInCalendar 标识事项类型,到期后先产生持久化个人 intake;未选择“直接处理”时不会自动创建执行任务。每个日历事项沿用连接的处理方式。日历编辑器不再提供独立处理方式、持续目标、运行于现有任务或独立运行环境设置。日历独立保存,关闭或返回复用原安排编辑器的草稿保护,运行记录可以打开对应的原工作。安排保存 taskRequest.standInOwner,到时重新解析当前分身的设备、模型、工作目录及智能体权限,不在创建时复制凭据或另建调度器。旧安排保留在独立“已安排”页面,日历列表只显示当前分身的日历事项。
主分身聊天也可以列出、记录及取消日历事项,沿用同一日历连接策略,不再指定执行会话。后台判断和实际工作继续保留当前用户、角色及来源约束;不能自动给负责人或身份聊天发消息。停用或删除角色、取消或修改安排会阻止旧准备请求启动。等待用户回答或确认的工作保持原交互,运行中或容量不足的安排进入“需要关注”,不排入可能过期的延迟队列。一次性安排系统领走后的停用与用户撤销通过版本区分。设置内安排的未保存修改也受离开确认保护。
项目负责人对话
入口只在项目页面。对话、自动处理和实际 Issue 工作均属于原协作小组负责人,不另建统筹身份。后台只读判断复用该负责人的模型及设备策略;不加载私人提示词、技能、插件或记忆。队列启动前核对负责人配置指纹,固定模型不可用时拒绝替换默认模型。协作小组提供负责人和成员配置,离开项目上下文不提供独立负责人聊天。多个小组时在项目内选择小组;人类负责人引导回项目 Issue 协作。
当前沿用成员私有执行会话,不将其冒充为项目共享聊天。会话键绑定用户、项目存储位置、项目及小组,设备各自持久化;每次发送及实际执行重查项目访问、当前负责人、智能体设备与模型约束。项目资料作为不可信任务材料注入,不能授予权限。项目负责人对话和分身复用 Runtime 聊天、执行准备、记忆面板与原生确认,具体工作仍在原 Issue 中沟通和追问。
项目负责人记忆使用独立 project_coordinator 范围,固定当前项目及存储位置,按用户隔离,不加载私人偏好、个人记忆或其他项目记忆。项目入口的工作列表返回当前项目看板,设置返回项目协作小组配置。
“发布到项目”只把用户填写的指令或结论写入当前项目所选 Issue 的现有评论记录;不自动复制聊天、私人记忆或未发送草稿。发布前重新读取项目与 Issue,校验当前评论权限、项目归属及归档状态,实际写入继续经过原评论接口的权限检查。发布面板保留原私人聊天及草稿,未发布内容离开前需要确认,发送期间禁止重复提交。发布成功后,内容按原 Issue 的访问权限共享,私人聊天本身仍然独立。
既有 CI stand-in-profile 组覆盖连接处理时机、真实持久入库、MCP 派发、原会话续聊、已安排及项目负责人上下文与记忆隔离;只替换模型服务。截图、日志及临时验证文件不提交到仓库。
连接与安排回归用户故事
验证使用隔离 Electron、真实本地 Executor、SQLite、插件注册与 RPC;只替换模型服务。钉钉外部数据使用协议集成测试及 test doubles,不要求真实账号,也不代表已经验证真实钉钉兼容性。
| 用户故事 | 前置条件与操作 | 必须验证的结果与恢复 | 覆盖 |
|---|---|---|---|
| 按需启用分身 | 关闭实验开关后进入分身 | 开关关闭时仍可访问,入口带 Beta 标识;顶部展示全部角色并能切换 | application-menu、stand-in-identities |
| 连接来源和安装依赖 | 依赖缺失、授权缺失、就绪分别打开来源 | 安装、授权、选择互斥;只使用清单声明的实际工具和账号身份;失败可恢复 | stand-in-plugin-bridge、连接协议测试 |
| 批量或持续接收全部来源 | 默认全部,切换筛选并多选;保存后重新打开 | 全部范围持久化为账号与类型约束下的通配范围,包含后来可访问的来源;批量选择不覆盖其他账号 | stand-in-plugin-bridge、stand_in_identity_contract |
| 统一连接配置 | 打开项目、日历、消息来源,修改后返回 | 共用标题及处理方式组件;只有顶部一个返回;未保存修改保护并保留草稿 | stand-in-profile-settings、stand-in-connections、组件测试 |
| 路由直接处理事项 | 角色连接默认直接处理;分别关闭或开启直接处理 | 开启时跳过后台语义评估,仍复验身份与来源;关闭时先归集;等待用户或审批不可自动代答 | coordination-runtime、coordination-arrangements、原生协议测试 |
| 日历记录事项和时间 | 保存日历连接策略,再创建、编辑、触发事项 | 到期进入持久 intake,使用所属分身当前设置;事项没有独立执行环境或处理方式 | stand-in-profile-settings、stand-in-plugin-bridge、原生定时测试 |
| 保留独立已安排 | 从侧栏或系统菜单进入已安排,再返回连接日历 | 原任务安排选项保留,两者列表、编辑和取消工具隔离;原安排不自动变成日历事项 | application-menu、stand-in-plugin-bridge |
每个隔离用例结束后恢复原档案、删除所建事项及测试插件,并停止隔离应用。失败保留运行器日志和截图用于根因分析;这些验证输出不提交仓库。
连接插件来源
连接能力由 DSH 插件提供,统一宿主、Provider 协议和默认事件处理约定见连接扩展点。
连接依赖通过 source 和可选的 alternateSources 声明允许的完整市场与插件 ID。解析优先复用已安装的来源;多个来源都已安装时按声明顺序选择。禁用或版本不兼容的安装仍须显式处理,不自动启用、升级或替换。工具调用使用实际选中来源的 ID 与版本,并由 Executor 校验该来源已在连接插件中声明。
钉钉同时支持 dingtalk@wegent 与 dingtalk@wework,复用旧市场中的现有安装与账号配置,无需迁移或重新安装。未声明的市场不参与解析。
模型目录与执行引用
分身与普通任务共用模型选择器及分类、排序和参数规则。云模型直接使用原始 UnifiedModel 目录对象,不再先转换为执行模型后转回展示模型,也不改写目录中的 name、标签或 config.ui。本地 Executor 的原生目录只进行一次必要的展示适配,提供方信息复用公共 Codex 目录工具。
展示模型与 RunnerModelIdentity 分别保存:前者用于界面,后者仅包含实际运行时、提供方、模型 ID,以及云资源的名称、类型、命名空间和所属人。保存时只提交执行引用,不复制模型配置或凭据。资源类型 public 表示公共资源,不表示公网;内网、公网和海外标签仍由原始目录信息决定,未标注网络的模型不自动变成公网。
原生宿主的 ModelConfigurationStore 统一拥有 model.yml 自定义接口。启动 Executor 后、启动 Core 之前,以及读取、保存或切换模型配置文件后,宿主串行重建 Executor 内存中的接口目录。分身选择 local-model:<id> 与设备上的提供方引用;公开目录和分身设置不包含地址、API Key 或完整执行配置。执行时按完整设备模型身份解析当前配置,停用或删除接口后拒绝新的执行,不改用 Codex 订阅。普通任务与分身复用同一协议转换函数,具体工作继承保存的模型引用。任务落盘不保存凭据;实际执行每一轮(含重启恢复、队列和续跑)按原任务的稳定模型标识重新解析本机配置。标识缺失或模型停用时明确拒绝执行,不发送无凭据请求。
桌面与移动端使用同一个完整模型身份比较规则,区分同名模型的提供方、命名空间和所属人。选项标识独立于展示名称,既有选项标识保持不变。切换设备或运行时会作废旧目录请求;已保存但不可用的模型仍保留恢复入口。
现有 CI 的 stand-in-profile 检查点组包含原档案用例 stand-in-profile-settings 和新增 stand-in-model-catalog。后者用真实后端中共享同一上游模型 ID 的内网、公网及未标注模型,对照普通任务与分身的标签,并校验保存的执行引用。运行器与 CI 目录检查复用同一个检查点组展开函数,防止注册用例未实际被 CI 调用。
stand-in-model-catalog 同时加载 stand-in-model-interface 扩展,沿用原场景、Backend 和桌面生命周期,检查原生 model.yml 接口可选、设置不泄露凭据,以及主分身和其创建的具体工作均到达同一受认证的模型服务。检查还覆盖应用重启后继续原任务,校验同一会话与受认证模型调用。原有模型服务场景和断言保持不变。
多分身接手
本地协作负责人通过 submit_workflow_plan 将 Issue 交给人工成员时,必须在同一 SQLite 事务中同步 Issue 指派历史和分配回执,复用普通指派的 sync_assignment_receipt。回执使用所属 Issue 的指派事件 ID,而不是协作轮次的成员工作 ID。分身接收与本人已读分别更新各自时间,重开本地存储后仍保留;接收回执不代表工作完成,也不会结清人工交付。同一人工成员接收后续新轮次时也必须创建新的指派事件和未确认回执;重复提交同一轮次保持幂等。此同步针对新指派,不补造历史缺失回执。
分身处理不限制 Issue 的看板状态或完成时间。手动“交给分身”和自动接单均适用于待确认、已完成及其他状态;未分配的 Issue 可通过手动委托先分配给自己。执行仍校验当前用户、所属项目、有效分配和执行权限。
来源、标签、处理策略和启用时间决定角色是否具备接手资格。项目指派先完成原生有效性校验,再按角色连接的“直接处理”策略分流:开启时原生分发,关闭时进入后台 intake。每个已连接且匹配的角色各处理一次,多个角色共享同次有效指派校验。手动指定角色仍走原有委托入口。普通来源事件由协调插件归集、判断归属并复用已有工作。
协调批次的 snapshot.works 只按当前 owner、角色和来源授权生成工作元数据,不预读会话;历史读取容量暂满不能令已有责任从目录消失。read_work 提供该批次工作元数据与原来源消息,不表示已经读取原会话。协调器按需用通用 read_task 读取匹配工作原始要求和成果,并跟随有界分页与正文游标;只允许当前批次列出的工作。暂忙返回可恢复的读取错误,不能解释成没有匹配工作或另建重复任务。续办仍保留原 taskId、读授权、审批和结果返回链。
同一上游事件 ID 可以对应多个不可变版本。读取指定版本时,将 read_work 摘要中的 recordId 传入 messageId,并跟随 payloadOffset / nextOffset 读取原始事件;recordId 优先精确匹配当前工作内的记录。只有一个记录对应某个上游 id 时才可用该 ID;多个版本共享 ID 时返回明确的歧义错误,不能默选旧版本,也不能读取其他工作或已撤销来源的内容。reply 和 send_email 也使用同一精确记录选择规则,执行前仍校验当前工作的所属人、角色和来源授权;外部回复目标与幂等键继续使用所选原始记录的上游 ID。
插件 CLI 动作只使用原生安装目录中唯一且已安装、启用的插件与精确版本。原生执行器从插件清单中唯一匹配的 localAuth.tool.id 取得声明的 connectorSlug;插件名称不能替代连接器身份。目录加载失败、同名多安装、未声明或重复的工具均拒绝执行,不扫描旧缓存选择其他身份,也不额外执行登录或健康预检。
原生 MCP 操作确认未直接提供工具名时,宿主只从当前任务、线程和轮次中尚未完成的原生调用,按服务器及完整 JSON 参数唯一精确关联工具名与调用 ID,再供确认预览使用。没有匹配或多匹配时不推断身份;不解析问题文案、标题或最近一条调用。实时确认与恢复后的会话使用同一关联结果;此关联不修改原生审批、授权或发送策略。
既有 Runtime 执行与绑定按分配、账号、项目及角色身份保留,包括失败和归档记录;命名变化或重复通知不重放已处理工作。升级前已有指派级绑定的工作不重新分派。新指派按连接策略选择原生直接分发或后台归集,两条路径共用分配与角色去重;升级前已入库的归集指派仍受原分配与角色绑定去重。开启直接处理时,承载 Executor 的远程设备无需额外启动桌面 DSH,便可处理明确指派;后台归集仍要求插件宿主在线。
自动通知、本地轮询和手动委托共用任务是否已处理的判断及执行入口。自动事件保留已有执行,不重复唤醒失败或归档的任务;用户主动委托时,失败任务沿用现有重试流程,归档任务先通过普通任务恢复流程取消归档,再在原会话执行新一轮,保留原分配绑定。恢复或执行失败必须返回错误。通知在委托成功后读取该 Runtime 任务,并复用执行列表的状态转换函数展示真实状态;返回已有任务不代表新一轮正在运行,已完成任务不得被乐观标记为“处理中”。
委托后读取的即时状态快照只保留到通知来源版本变化;版本复用现有轮次和状态标识,不比较可能具有不同时间精度的启动与完成时间。补充要求后的等待状态和结果加载也使用同一个版本标识,确保同一秒内完成的新轮次可以正确结束等待。来源更新后丢弃即时快照,避免已完成的任务继续显示为运行中。
删除执行任务后保留原分配的去重关系,自动通知和轮询不会重新创建同一轮任务。删除标记生效后,即使后台清理尚未完成,也不能恢复该会话或报告正在运行。Issue 重新分配产生的新分配记录按新一轮工作处理。
钉钉每 15 秒触发一轮采集,同一账号下相同群或联系人合并为一个来源,每个来源独立分页,再将消息分别交给所有连接该来源且已开启的分身。连接不同来源时串行读取;每次最多 100 条,有下一页时留到后续轮次继续。采集耗时会影响实际延迟。消息按账号、分身和来源分别去重,同一分身不会重复处理,其他分身也不会因已有接收记录而漏收。私聊可连接具体联系人,也支持同一账号的持续全部联系人范围,包含以后新增的联系人。自动消息先形成角色来源事件,采集阶段不创建工作或调用模型;后续由协调 Router 关联已有工作或进行语义判断。手动消息整理保留既有的归组与错误确认流程。
云端项目复用 Wework 已收到的协作分配通知触发分身,不再由 Executor 每五秒扫描项目或轮询 assignments。桌面通知入口复用已加载的通知和在线设备列表,按账号、设备和通知去重,通过现有 Runtime RPC 交给对应设备检查已启用的个人分身。设备先校验当前用户、项目、当前分配和标签,再校验分配有效状态与启用时间;同一次接单只读取一次 assignments。本地项目保留只读本地存储的调度,不请求云端项目或 assignments。过滤历史、他人、未分配以及已关联执行的任务后,复用 runtime.tasks.create、普通任务绑定、会话和结果入口。手动委托可在自动接单关闭时执行,并只启动明确指定的分身;未指定时使用首个已连接本项目的分身,无可用分身时明确报错。任务来源记录实际分身。
云端项目沿用现有项目 API 和个人执行权限;本地项目不要求云端连接。桌面重新加载后复用通知列表补收分配;已有 Runtime 任务直接复用,不重新查询 assignments 或创建任务。自动触发依赖收到分配通知;启动失败保留日志,不随通知列表刷新无限重试。任务尚未创建时,原分配通知仍可点击“交给分身”手动恢复;已有失败任务使用原“重试”入口。显式保存分身设置后,会重新检查该设备的已加载通知。创建失败回滚 Issue 绑定;已有失败执行保留原任务供重试,不重复创建。跨设备竞争仍受现有任务绑定语义约束,没有新增服务端队列或分布式锁。
Rust 自动分配与当前分配索引在同一个 Issue 锁和数据库事务内提交,复用分配事件归并逻辑。改派会撤销所有尚未取消的旧根分配事件,避免同一成员较早的事件重新生效。读取历史 v1 索引时,从真实分配事件一次性重建为 v2;不修改分配事件、通知或 Runtime 身份。这样旧索引不会将仍然有效的分配误判为“已处理或已失效”。数据库回归验证真实 Rust 写入、事务回滚及三种表结构;桌面 stand-in-assignment-notifications 检查点还原旧索引后,分别验证通知中的手动委托和重载后的自动接管,以及已有执行的去重。
协作通知中的处理反馈
协作通知通过项目、Issue 和本次分配标识关联分身任务。除当前 Runtime 执行列表外,桌面通过只读 runtime.stand_in.assignment_tasks RPC,按当前账号和通知中的精确分配身份批量查询执行器本地记录,包含已归档、尚未删除的执行。因此归档或重载后,已处理通知仍展示真实状态,不重新出现“交给分身”。重新分配生成新的身份,不复用上一轮结果;已删除记录不返回。查询完成前不显示委托按钮;读取失败显示错误,可刷新通知恢复。各在线执行器独立读取,远端失败不丢弃本地已确认结果。该查询不恢复会话、不触发模型执行,也不依赖云端回执写入成功。分身图标默认 28px,项目侧栏使用 16px。主人和分身复用相同轮廓,主人稍小。关闭时,分身收拢为主人右侧的加粗阴影;开启时用约 560ms 向右后方展开成人形,不用紫色或漫画排线,不画眼睛、嘴或其他五官。停用时以反向动画收回主人右侧的粗影子。项目侧栏仅在当前用户为该项目开启至少一个分身时显示图标;未开启或停用全部分身时隐藏图标,其他项目的图标独立更新。减少动态效果模式直接显示最终状态。下半身允许裁切,突出两人的头部与影子身份;深色背景随文字反色。已有分配通知内展示分身图标、处理中、等你回复、处理完毕或失败状态;没有分配通知的本地或手动执行,也能在协作通知中找到。点击任务标题进入对应执行会话,不重新派发任务。
通知按来源、事件和时间、任务正文、轻量操作组织,不再增加“新任务”标题。创建通知时直接保存真实分配人姓名或负责人智能体名称,列表直接读取通知,不跨表反查。没有姓名的通知省略分配人信息,直接展示任务标题和时间,不显示占位文案。分身接手后在同一条通知更新身份和状态。
处理区域可以直接补充要求、回复真实的 Runtime 问题,或重试失败的分身任务。普通补充输入在点击“回复”后展开;需要你回答的问题直接显示。快捷回复继续原会话;Runtime 拒绝发送时保留草稿并显示错误。问题选项沿用会话中的原始问题和请求标识,不根据结果文本猜测可执行操作。
完成、失败和需要回复时重新显示未读,并更新列表排序。桌面提醒遵循协作通知的设置,正在查看该执行时不重复弹出。状态和通知关联由桌面前端完成,归档执行身份由上述只读 Executor RPC 提供,不新增 Backend API。
分身状态的已读标记和桌面提醒去重记录按账号保存在当前设备,不跨设备同步;原有分配通知仍使用已有的已读接口。两类辅助记录各保留 90 天、最多 1000 条,在读取和写入时清理,过期清理不删除真实通知、任务或执行历史。
完成状态优先使用 Runtime 执行轮次 ID 标识事件,没有轮次 ID 的任务保留原有的状态与时间戳标识。有轮次 ID 时,同一轮的状态与任务摘要先后到达不会重复提醒或把已读结果重新标为未读;旧的时间戳标记在匹配当前状态时更新为轮次标记。恢复任务列表时,首次读到且早于当前账号监听开始的结束状态只建立提醒基线,保留通知及其未读状态,不补弹历史桌面提醒;监听开始后完成的任务仍正常提醒,即使任务完成得很快、首次读到时已经结束。
聚焦测试覆盖设备设置持久化与版本、多配置及标签规则、历史分配过滤、已有关联过滤、设备切换,以及侧栏状态合并和保存更新。桌面 stand-in-assignment-notifications 在真实云端指派上验证两个匹配分身分别建立任务、共享一次指派校验,并在通知刷新后保持各自去重;stand-in 同时验证本地多分身接手、改名、记忆范围名称及抽屉外部点击确认。上述场景及 stand-in-workspace、stand-in-cloud、stand-in-connections 和 stand-in-notifications 均注册至现有 CI,仅替换模型响应;其余存储、任务执行、云端 API 和设备连接使用真实实现。
验证计划
使用隔离 Electron、独立项目与 Executor 数据。云端检查点使用真实后端及设备连接,只替换模型响应。证据截图保留在仓库外,具体运行结果记录在 PR 中。
| 场景 | 操作 | 预期 |
|---|---|---|
| 个人首页 | 从任务侧栏进入 | 展示分身状态和按项目分组的执行记录,设置在二级 |
| 项目入口 | 从项目工具栏进入 | 默认选中已连接或首个可用分身,已有配置只读 |
| 侧栏图标 | 新建两个项目,开启关联两者的分身,再停用于其中一个项目 | 未开启时无图标;开启后两者显示;停用后只移除对应项目图标 |
| 项目新建 | 选择为项目新建分身并保存 | 个人拥有,默认只连接当前项目 |
| 全局设置跳转 | 点击修改分身设置,保存或取消 | 进入个人设置并返回原项目,提示跨项目影响 |
| 草稿与取消 | 修改开关和要求,访问插件页后返回,取消或 Esc | 草稿保留,保存前不生效,明确放弃后关闭 |
| 失败恢复 | 保存旧版本或断开 Executor | 错误可见,草稿保留,重新加载可恢复 |
| 批量连接 | 接入所有项目,排除一个项目 | 统一配置覆盖新项目,排除项目不执行 |
| 多分身 | 添加分身并重新打开 | 独立配置保留,二级更多设置不切换分身 |
| 多分身接手 | 分配同时匹配多个分身的任务 | 每个符合条件的分身分别执行,不调用选角模型 |
| 独立去重 | 重复收到同一次指派或同一消息 | 每个分身最多处理一次,不互相覆盖处理记录 |
| 抽屉关闭 | 编辑后点击遮罩、关闭或按 Esc | 居中确认;继续编辑保留内容;放弃后关闭 |
| 去重与权限 | 检查历史、他人、未分配及已有关联 | 不产生新执行,不改变负责人 |
| 旧数据迁移 | 读取多个旧项目配置 | 范围、启用时间、权限边界保持,旧行删除 |
持久聊天与长期记忆
主分身聊天入口持续存在,每项具体工作仍使用独立 Runtime 任务。本地 Codex 复用现有线程恢复和自动压缩,不按固定时间新建会话。分身输入框保留模型选择,隐藏上下文压缩、权限与计划等执行控制。
主分身每轮刷新统筹要求:先发现任务工具并检查已有工作,再创建或继续独立任务,完整传递需求、来源、交付物和授权边界,读取实际结果后汇报。已加载线程直接续跑时也适用,具体执行任务和场景角色不会收到这项主分身限制。配置提案直接在身份会话中处理;propose_profile 声明完整配置的必填字段、项目对象格式和独立的自动处理、操作确认、处理时机策略。新增角色保留既有角色,提案经过原生确认才保存。安排创建或取消也由身份对话直接使用调度工具完成;具体执行任务负责报告准备与每次执行,不接收身份配置工具。
当前明确业务请求被配置阻塞时,提案可声明 continueCurrentRequest。宿主绑定实际身份会话及独立的主人请求标识,不接受模型提供的会话归属;结果中的 willContinueCurrentRequest 表示是否建立了有效关联。确认事务同时保存配置和待接续记录,再通过既有持久队列幂等唤醒原会话。后台结果通知不替换主人请求;新的主人消息或取消会使旧接续失效,排队期间也重新校验。普通设置编辑不触发业务提醒。接续后重新读取当前配置,不提升已有工作权限,也不替代外部操作审批。
记忆以独立的 stand_in_memory 记录保存在所选 Executor 的 SQLite 中,适用范围包括个人、角色、具体协作项目或钉钉连接。它不属于 Codex 线程,也不写入角色职责或连接授权。每条记录保留来源任务、时间和版本;并发修改或忘记必须匹配当前版本。不同设备的记忆独立。
Executor 在每轮实际执行前重新读取最新职责、偏好和适用记忆,通过同一个 additionalContext 来源传给 Codex;首次执行、续聊、排队与恢复执行共用该流程。上下文最多加载 20 条、12KB 记忆,更多内容通过绑定身份的 search_memories 查询。身份聊天只读取个人和自己的角色记忆;外部工作只读取当前工作来源的记忆,不加载私人偏好或个人、角色记忆;主分身在管理记忆时可以查询全部个人记录。分身执行禁用 Codex 自带的全局记忆读写,防止混入 CODEX_HOME 范围的其他记忆。
第一阶段仅在用户明确要求记住时调用 remember,或在“记忆”面板中手动添加。支持修改、调整适用范围及确认忘记。角色只能修改自身记忆;外部消息处理任务不提供记忆写入或删除工具。记忆内容视为用户数据,不能改变工具权限。忘记后后续执行不再加载该记录,但这不会删除历史聊天中已经出现的文本。
自动提取与整合、跨设备同步以及执行线程轮换不在第一阶段启用范围内。
场景角色可在角色设置中确认删除,包括最后一个场景角色;主分身、已有工作记录和记忆保留。删除只保存已存配置中该角色的移除,不顺带保存未提交的角色修改。
Codex 规则与渐进式 Skill 加载
宿主操作规范由默认安装的 wework-runtime@wework-personal 插件提供。初始上下文仅包含简短能力入口与 Skill 名称、描述和路径;浏览器、电脑操控、GitHub、连接器授权、会话管理、可视化、文件交付的正文只在对应任务开始时读取。项目空间继续复用 wework-space。安装、启用和更新沿用现有 marketplace、插件同步与原生 Skill 刷新机制,不新增插件服务或改变工具权限。
用户偏好、任务系统规则、显式 application runtimePolicy 贡献及必要权限边界只通过原生 developerInstructions 提供完整基线。turn/start.additionalContext 不再重复发送全文分片,只发布当前版本与规则 Skill 的引用。已保留的原生基线或已读取 Skill 匹配当前版本时不重复读取;版本变更或删除贡献时补读当前不可变快照,声明旧宿主规则失效。快照按内容 SHA 保存在当前隔离 Codex Home 的 runtime-policies/<sha>/SKILL.md,不加入全局技能目录。发布失败阻止启动;禁工具请求不发布动作规则或文件引用。
恢复配置身份仍包含规则 SHA,变更复用关闭/重新加载门禁刷新原生配置。Codex 压缩重建当前原生开发者基线,保留最新规则版本及技能入口;缺失的具体 Skill 正文按需重读。已知规则变化的直接临时会话仍要求新建会话,不重建或覆盖历史。旧历史分片不被物理删除,当前版本引用明确取代旧宿主规则。runtimePolicy 只适用于显式 application 条目,不授予权限;untrusted 来源不能提升为策略。普通 application 数据与 CLI 上下文保持独立。
共享桌面检查点 runtime-policy 仅模拟模型服务,Electron、插件安装、Executor、Codex、文件读取及压缩均使用真实路径:
| 用户故事 | 验收 |
|---|---|
| 开始普通新会话 | 默认插件可发现;用户规则只出现一次;浏览器、可视化正文未加载。 |
| 首次执行浏览器任务 | 模型通过真实工具读取已发现的浏览器 Skill。 |
| 修改规则后继续 | 当前版本引用到达模型;真实工具读取新规则;快照不含已删除内容。 |
| 压缩后继续 | 真实压缩摘要存在;最新原生规则恢复一次;旧规则不复活,浏览器正文不预加载。 |
| 卸载原生线程后恢复 | 同一会话保留当前规则和压缩摘要。 |
合并与拆分工作
将工作卡片拖到另一张卡片上,松开后合并其中的消息;展开工作后,可把消息拖到“拆成新工作”区域。拖放目标会预览具体动作。键盘和触控用户可使用“合并”“拆分”和“移到另一项工作”按钮;目标直接在工作列表中点选,不使用下拉框、配置弹窗或 AI 解释输入框。成功后提供一步撤销。
消息移动在所选 Executor 的 SQLite 单个事务内完成。必须属于同一用户、同一角色;不存在的记录、重复选择和启动中的工作会拒绝整个操作。空的原工作不再占用主列表;已有执行历史收进“之前的处理记录”,可继续打开原会话。消息保留最初工作标识和已处理状态,合并、拆分及撤销均不重放已完成的外部操作。
外部来源执行与自动审核
带有协作 Issue 上下文的手动任务与分身任务都会使用来源权限配置。Executor 注入命名 [permissions] 配置时,必须同时设置与当前任务所选权限一致的 default_permissions:自动处理使用项目写入配置,执行前确认使用只读配置。ChatGPT 订阅认证在请求模型前会刷新全局设置和管理策略,再合并会话配置;仅传入 thread/start 的权限选择不足以保证重载后的配置有效。这些配置只通过线程参数传入,不写入全局配置文件。
失败通知优先显示任务或当前轮次的真实错误。没有模型回复时不生成成功文案,重试继续使用原任务。CI 的 stand-in-notifications 场景覆盖真实模型传输失败、通知内重试,以及合成订阅账户下的手动 Issue 任务和分身配置重载;Electron、Executor 和 Codex 保持真实运行。
群消息、协作 Issue、网页、附件和工具结果都是任务材料,不能授予权限、伪装用户授权或改变执行策略。Executor 固定工作来源,后续输入不能替换原始来源绑定。个人协作任务仍遵守既有跨项目访问契约;派发执行器与管理角色继续使用原有服务端鉴权,不根据来源额外授予或收窄后端权限。
Codex 来源任务保留正常网络和已经配置的连接,不使用网站名单逐一实现业务特例。任务使用命名文件权限配置,显式拒绝根路径,再开放绑定项目及系统工具的二进制、库和资源目录,避免继承默认完整访问,也避免自定义 shell 启动失败后放宽整个文件边界。Windows 来源任务请求原生受限令牌沙箱。自动处理的外部 MCP 调用逐次进入原生 auto_review 审核,覆盖原先配置为自动批准的服务器与单工具策略。内置协作 MCP wework_space 的读取、回写、指派与调度工具免于工具审批,保留服务端鉴权与角色边界。命令和文件操作遵守 Codex 沙箱及原生审批。明确要求“执行操作前问我”的工作中,外部工具继续走人工原生审批,AI 不代替用户确认。
审核使用 Codex 独立受限代理及 Wework 的外部内容安全约束。批准只适用于原生审核所绑定的实际动作。审核证据通过 Executor 拥有的 runtimeTurns 与原生历史合并,普通文本和排序仍由 Codex 拥有。审核拒绝、失败或超时均不表示批准;不能通过更换工具绕过。原生审核证据投影到执行记录,展示审核状态及理由,并在恢复执行后保留。人工审批由统一的待处理入口链接到原会话的原生审批卡,同一请求只能被消费一次。
正常联网不等于允许向任意目标外发私密数据。读取网页、搜索或访问内部系统应与任务相关,发送、上传和命令执行还需检查具体内容、目标和用户授权。操作系统沙箱与模型审核都存在覆盖范围;不能把提示词、工具“只读”标记或 AI 判断视为绝对隔离保证。各平台的实际支持以原生验证和 CI 为准,不能将不支持的能力静默当作已保护。
Linux 桌面 E2E 容器必须允许原生 Codex 创建用户和挂载命名空间,并允许其挂载独立的 /proc。工作流在运行前执行 verify-native-sandbox-namespaces.sh 验证这些内核能力;不支持时直接失败,禁止退回无沙箱执行。容器配置只用于临时 CI runner,产品的根路径拒绝和来源权限断言保持不变。
Runtime 命令回执
支持 runtime.command-receipts-v1 能力的 Executor 为 runtime.tasks.create 和 runtime.tasks.send 提供显式 commandId。同一任务内重复提交同一命令及相同输入,返回原接收回执;同一 ID 改变输入或执行身份返回 command_conflict。普通查询和命令重放都校验所属用户;连接云端时还校验当前登录账号。未携带 commandId 的旧调用不获得这一幂等保证。
使用 runtime.tasks.commands.get 查询 { taskId, commandId, userId }。accepted 表示 Runtime 已持久接收,不表示模型已经读取,更不表示业务工作完成。状态区分 queued、dispatching、started、settled、awaiting_user、failed、cancelled 和 recovery_required。awaiting_user 记录该命令因等待用户回答或审批而停止;后续回答是新命令,不会把原回执改写成成功。
待执行请求、命令身份和队列变更一起写入现有加密 Runtime 队列文件,不用 transcript 是否可见来猜测消息是否已接收。业务事件、评估快照及业务动作继续使用现有分身存储;它们与 Runtime 投递回执承担不同职责。确认终态后删除命令记录中的启动凭据和完整请求,只保留回执所需身份与原生关联。
重启后按具体 thread 和 turn 核对原生 timeline 的真实完成边界。thread/turns/list 可能合成 interrupted,单独这一状态不足以证明已取消。无法确认执行事实时返回 recovery_required,保留待核对请求,要求在原工作检查状态,不自动重发。Goal 的自主恢复不重新提交原用户命令;真实执行结果和 generation 决定命令收尾,迟到回调不得结算后续命令。
如果真实原生命令结果仍未知且已无活跃 runner,设备 owner 可通过正式审查流程放弃这次未知执行:先用 runtime.tasks.commands.get 获取当前 commandFingerprint、精确 native 三元组及请求时间,再调用 runtime.tasks.commands.resolve,传入 { taskId, commandId, userId, expectedFingerprint, expectedNative, decision: "abandon", requestId }。userId 只是查询选择器,不授予权限;请求走与停止任务相同的受控设备写通道,并重新核验登录账号、原命令与当前任务的 owner 和设备。缺失设备归属、执行仍活跃、审查后指纹或原生执行变化时均拒绝。 原生明确的 notLoaded 只可证明当前没有加载的 runner,不能证明历史 turn 已完成;仅此 owner 决定流程可在本地 active、queued、preparing、Goal 和已知 transition 均不存在时采用这一事实。无法核验的原生状态仍拒绝放弃,停止任务和历史完成判定仍沿用原有规则。
底层命令继续保留 recovery_required,owner 的放弃决定单独持久化;公共回执将这一组合投影为 abandoned。旧读取器忽略新增可选决定字段后,仍按未知结果拒绝重放。abandoned 回执保留 nativeOutcome: "unknown"、原 command/thread/turn 和 owner 决定;它不表示原生执行完成、取消或任何对外操作成功。同一 requestId 可幂等读取原决定;原 commandId 永远不能重放。决定先与加密命令队列原子持久。协调器随后只消费该正式回执,将对应旧 assessment 记为 owner 放弃,并在同一事务清理该批次的恢复门禁;已有业务 actions 和 receipts 不回滚,尚未处理事件留给新批次。界面确认后检查处理状态,若这一步中断,重启后仍可消费持久回执继续,不需要再次放弃或重发旧命令。
新协调调用方必须先检查能力标记,不能在缺少该能力时降级为不带命令 ID 的发送。接收回执不替代来源、角色、项目权限或原生操作确认,也不能用于替用户回答问题或批准操作。
已安排的持久恢复
分身所属安排继续使用现有 Automation 存储保存日程和运行记录。到期记录冻结所属用户、角色、安排版本和目标任务。内置协调插件通过 arrangements:<user> 上下文发现这些记录,并直接路由 schedule_due 事件,不必等待繁忙的主分身语义会话。调用方除协调和回执能力外,还须检查 runtime.coordination-arrangements-v1。
现有 SQLite 事务保存派发意图及不可变路由回执;Executor 加密命令日志保存 arrangement-run:<run-id> 的实际接收回执。恢复时先查询这一命令,再决定是否准备输入。因此,到期记录、派发意图或命令接收落盘后退出,都能继续核对,避免重复执行。清理历史不会删除 Pending 或 Running 记录。分身所属周期安排恢复后补处理一次错过的运行,再按正常周期继续。
安排被修改、暂停或取消后,不能启动新命令。已排队的命令启动前仍检查当前身份、安排版本和原工作中的原生问题及审批。即使安排随后被编辑或删除,已接收命令的原回执仍是执行事实。等待用户或执行结果不确定时,在原工作中处理,不自动重发。旧版所属安排缺少持久回执的未结束记录需要人工核对;非分身安排保留现有执行路径。
日历待处理触发使用与历史记录相同的每安排 100 条容量上限。达到上限时保留已有待处理/运行记录及下一次到期时间,待容量释放后继续收集。某条日历入队失败时,只将该次触发标记为需要关注,其他日历继续处理。
首次功能选择与周期复盘
首次引导使用两步弹窗:连接常用应用、确认开始使用。直接复用 StandInConnectionSettings 的提供方目录、授权和范围编辑,不创建另一套连接状态或保存接口。未连接也能继续并开启主分身;空连接不产生外部动态。最终确认通过现有个人设置保存接口提交草稿,成功后再记录引导完成;保存失败保留草稿,完成标记失败重试不重复提交已保存设置。关闭时复用连接编辑器和设置页的草稿保护。
顶部问号保留每日简报、会议准备、项目跟进、钉钉提及自动回复和每周复盘五类示例。选择示例切回主分身,将业务需求追加到可编辑草稿,保留已有草稿, 不自动发送、创建任务或新增定时安排。主分身用单人图标,角色用双人图标;当前 选择有独立底色与勾选标记。会话使用白色浅色背景,处理异常使用带操作的横向提示条。
来源检查规则由宿主注入系统提示词,并在已有身份会话续聊时更新,不混入用户草稿。
AI 先读取配置与提供方目录,再通过 connect_source 实际发现可用资源;项目通过
list_projects 查询。连接工具返回提供方真实状态、精确授权身份或安全配置要求,
不收集密码、不自动扩大资料范围,也不将提供方可用误当成已读取邮件或日程。
订阅变更仍走 propose_profile 和用户确认,登录走原生授权。缺少资料时先完成
连接与范围确认;无法访问时说明阻塞,不编造简报或先创建无法读取输入的任务。
历史身份会话可能保留此前桌面设备标识。续聊只在持久化任务 ID、账号及角色绑定 一致时刷新为当前宿主设备,保留原账号与角色;普通任务、外部消息与后台批次 不走该路径。任务工具继续校验设备、归属和主分身身份。
首次使用引导通过 runtime.stand_in.onboarding.get/complete 读取和提交当前账号在
所选 Executor 上的功能选择。读取不调用模型、云端目录或执行准备。完成接口只保存完成标记;两步引导先保存个人设置,开启主分身及已选连接,不默认创建任何复盘事项;关闭引导不保存连接草稿。
五个示例均为普通按钮,不展示勾选框或内嵌时间设置。每周复盘在对话中确认范围
与时间后,通过原生确认的日历操作创建,不重新开启显式停用的主分身。
weekly_review 模板与引导共用 Executor 定义,默认每周一北京时间 09:00。
删除事项不删除完成标记,重复提交和并发初始化不重建;用户可从主分身日历主动
使用模板。普通安排和角色日历不获得复盘权限。
复盘执行复用通用只读 list_tasks、read_task,不再使用复盘专属的批量读取工具。
宿主按原有运行绑定校验账号、本设备、原任务、当前事项版本及运行状态,将范围固定为
运行时间前七天;显式请求越界时间时拒绝。任务页、消息页及正文分块的每次读取均重验
权限,使用 nextCursor、beforeCursor、afterCursor、messageContentCursor 补齐
所需证据。正文完整不等于已读完整段历史,只有来源确实不完整时才标记
sourceContentMayBeIncomplete。前次报告也通过普通会话读取,不能当成独立证据。
此身份不能续接其他任务、创建委托、配置、写记忆或外发。原生权限与确认保持不变;
历史材料不授予权限。成果直接回到原主会话,只用业务语言说明影响结论的证据缺口。
个人分身与普通角色通过通用 list_tasks、read_task 读取本账号有权限的会话,
包括身份管理会话及普通任务。列表和原生 transcript 都支持分页,并可选择任意时间范围;
任务列表标明 kind 与 canContinue,可读身份会话不表示可以向其调度工作。主分身
直接委派的工作默认仅继承这两个只读工具;创建时显式选择 readSources 才增加所选
具体连接的只读目录与读取能力,不获得配置、任务调度、定时、记忆写或外部操作权限。
每次读取都重新验证实际会话归属、设备、角色存在和委派来源。暂停接收新工作不撤销
已有会话的读取权限。来源任务仅能读取同角色、同连接 scope 且仍有有效连接的关联
会话;移除连接立即拒绝后续读取。跨账号、未知归属、删除、临时及协调器私有会话
不进入可读列表,项目协调器不开放个人历史。历史文本不授予任何执行权限。
用户故事与验收覆盖
| 用户故事 | 验收行为 | 自动化覆盖 |
|---|---|---|
| 首次进入时连接常用应用 | 可不连接直接继续,最终确认才保存设置并开启主分身,不创建定时事项 | 引导组件测试、既有 stand-in-profile-settings 桌面检查点 |
| 保护连接草稿 | 返回保留所选范围;关闭不保存;放弃修改前确认 | 组件草稿测试、桌面引导检查 |
| 恢复并发编辑冲突 | 真实版本冲突不完成引导;重新加载并确认,保留另一处修改 | 同一桌面检查点及组件失败重试测试 |
| 稍后连接应用 | 无连接也能开启,再从既有设置添加连接并开始关注 | 同一桌面检查点 |
| 根据工作习惯调整时间 | 在日历模板中保存修改后的周一时间,日历显示对应事项 | 日历模板编辑测试 |
| 随时停止复盘 | 暂停或删除后重复提交、重启均不自动恢复 | 桌面日历操作、Automation 重载及并发测试 |
| 重新开启并查看实际结果 | 从日历模板重新添加,运行后打开原工作中的报告 | 同一桌面检查点,真实 Executor、原生 MCP 及 transcript,仅模拟模型 |
| 相信报告的证据范围 | 跨页读取超过 100 项任务和超过 50 条消息,固定七天窗口,拒绝其他账号、角色及伪造运行 | Executor 原生协议分页和权限测试、桌面真实历史读取 |
| 在不同窗口和主题下操作 | 宽窄窗口无横向溢出,深浅主题清晰,键盘可选择,保存时不可重复提交 | 桌面画面及几何断言、组件待保存和失败恢复测试 |
新增桌面覆盖组合到原分身档案检查点,保留原场景的全部断言,共用构建、启动和 模型协议 fixture;不添加独立 CI 作业。画面与运行日志留在测试产物中,不提交仓库。