# Codex 工作动态云端完整方案 仅供后续参考

> 已于 2026-09-30 根据用户确认收敛首期范围。本轮请只按 [云端同步首期后端交接](team-codex-cloud-sync-minimal-v1-2026-09-30.md) 开发：现有本地采集＋三个云端接口＋账号团队权限。本文件保留最初方案供以后评估；以下「首期」「P0」和历史策略均为旧提案，不再是当前必做项，不能与精简版叠加执行。

日期：2026-09-30。交接对象：Arkme 后端、桌面插件及后续移动端开发。

状态：**接口设计提案，可用于评审和开发排期；不是已部署接口或云端验收结果。** 本轮只交付文档，不启用上传，不修改当前本地版行为。用户已反馈本机自用基本跑通。

配套：[请求响应与接口契约](team-codex-cloud-api-contract-2026-09-30.md)、[本地版说明](team-codex-local-activity.md)。接口路径可按后端规范调整；身份、授权、去重、撤销及迁移语义不可省略。

## 1. 结论和首期范围

要支持「电脑 A 采集、电脑 B 查看」和「团队内分人查看」，不能只增加一个上传接口。至少需要：稳定身份与设备登记、显式同步授权、项目与任务归属、幂等事件上报、按权限分页读取、增量更新、暂停与撤销、历史迁移。

建议把两个能力分开：

1. **我的云端工作记录**：本人授权后，把指定采集器产生的新记录同步至自己的 Arkme 账号。同账号其他设备可查看，不要求这些设备安装 Codex 或配置 Hooks。
2. **分享给团队**：本人另外选择某个项目/任务和一个明确团队，团队成员才能查看这一范围。加入团队、浏览团队、切换页面本身不构成分享授权。

首期仍只收集用户输入、每轮最终回答及中断状态，不扩展为源码、工具输出、终端日志、附件、历史 transcript、内部推理或后台录屏。Stop 表示「本轮结束」，不能称为「任务已完成」。

### 首期推荐的产品规则

以下为本次交接的推荐默认值，尚未作为云端功能实施。后端评审可调整，但需回传最终决定。

| 事项 | 推荐规则 |
| --- | --- |
| 升级插件 | 仍保持本地模式，用户确认后才开启云端 |
| 本人多设备 | 同一稳定账号可读本人云端记录；新设备只登录即可读，采集需另外接入 |
| 多个 Arkme 账号 | 本机同一 Codex 配置同一时刻仅一个账号采集绑定生效；切号停止，不自动接到新账号 |
| 多个团队 | 一个任务首期至多分享给一个团队；个人可见不受影响；禁止自动广播至全部团队 |
| 新项目 | 未匹配明确团队规则时仅本人可见；尚未授权个人云端则仅本地，不猜测团队 |
| 团队规则 | 一次授权项目后，其后新任务自动归该团队，不逐任务粘贴；修改规则只影响新任务 |
| 已存在任务 | 首次归属后不因页面、账号、项目目录或团队规则变化而转移；转给另一团队首期要求新建 Codex 任务 |
| 团队成员可见性 | 已授权的内容对该团队有效成员可见，包含之后加入的成员；确认页必须明确这一点。若需「仅当时成员可见」，需改成受众快照模型，不能默默混用 |
| 成员退组/被移除 | 立即撤销其团队读取和新分享权限；该成员原分享在团队中暂停可见，本人私有记录保留；重新加入不自动恢复分享 |
| 旧本地数据 | 默认不上传；用户先选范围、预览账号/团队/条数，再单独确认导入 |
| 已上传内容 | 暂停只停止后续；撤销团队分享移除团队可见性；删除记录才删除云端正文，三者分开 |

团队历史是否在员工离开后继续保留是产品/组织政策选择。本提案先采用可撤销分享，**不能把管理员身份解释为可以读取员工私人任务**。如要团队归档，须另行定义确认文案、所有权和保留政策，不能在后端默认放开。

## 2. 当前代码已有能力与不能直接复用的地方

本次依据为当前本地源代码，不把源码存在等同于线上部署。当前分支为 `codex/ts0930-01-插件dev开发`，HEAD 为 `bc33e58336b689b19a1b3f2ad17cc91158dc7251`，本地 Codex 功能存在未提交改动。

| 能力 | 已有证据 | 云端需要补齐 |
| --- | --- | --- |
| 团队目录及成员 | `src/services/team-service.ts`、`src/openapi-capability-gateway.ts` 调用 `/api/v1/teams/list`、`/resolve`、`/members/list` 等 | 复用团队体系；新增可靠 `current_user_ref`、成员资格版本和工作动态权限，不能用昵称或即我号推断本人 |
| 一次接入多个 Codex 任务 | `src/team-codex-machine-script.ts` 中 `enroll/capture`；按 Codex 配置安装用户级 Hooks | 保留一次性安装体验；采集器与账号绑定、团队投递规则分离 |
| 本地事件和分页 | `src/team-codex-machine-journal.ts` 的安装、任务、事件、排除表 | 云端 UUID/引用、持久 outbox、逐条确认、租户权限及服务端变更游标 |
| 本地账号防护 | `src/team-codex-service.ts` 的 `fence`、当前账号检查及在线标记 | 云端凭据隔离、上传租约、远程撤销、切号竞态防护；不能仅依赖本机 15 秒心跳 |
| 本地归组 | Git common directory 的本机路径哈希、cwd、branch、worktree | 本地哈希不能当跨电脑项目 ID；路径默认不上传，由服务端项目引用及显式映射统一 |
| 本地去重 | `(installation, session, turn, kind)`，后到同类事件可能更新正文 | 云端不可无条件覆盖已分享正文；新增持久事件 ID、摘要冲突检查、明确修订规则 |
| 本地数据隔离 | SQLite 的 `user_id + team_ref` 和成员展示快照 | 这是本地查看范围，不是历史云端分享许可；也不是不可变云端账号 ID |
| 本机 Host API | `team.codex.state/invite/events/change`，同源 loopback 防护 | 保留 Host 边界，新增云端适配；不要暴露本机 Host 给互联网 |

另检索到 `ai-coding-monitor` 有独立监控平台、会话批量导入和另一套认证/访问规则；它不等于 Arkme 团队授权，且其历史文件扫描超出本功能范围。可由后端评估复用存储/分页经验，**不可直接复用其账号密码、组织可见性或全量历史导入脚本来替代本契约**。

## 3. 身份与数据边界

```text
本机 Codex 配置 → 本地采集器 collector_local_id
                         │ 一次仅一个生效账号绑定
                         ▼
                  owner_user_ref（不可变）
                         │
             私有云端记录（本人跨端读取）
                         │ 显式分享授权，不是复制消息
                         ▼
        指定 team_ref → 成员 → 项目 → 任务 → 输入/回答
```

### 必须区分的 ID

| 对象 | 身份和约束 |
| --- | --- |
| Arkme 账号 | 服务端认证主体对应的稳定 `user_ref`；即我号、昵称、手机号是展示/查找字段，不是隔离键 |
| 团队 | 现有稳定 `team_ref`；团队名改动不改变归属 |
| 成员资格 | `membership_ref + membership_epoch`；退组后重新加入是新一轮资格，旧授权不可自行复活 |
| 本地采集器 | `collector_local_id`，为一份本机 Codex 配置生成持久随机 UUID，不使用 MAC 地址或账号名 |
| 云端绑定 | `binding_ref` 固定 owner 和 collector；账号 B 必须新建 binding，不改写 A 的 owner |
| 项目 | 云端 `project_ref` 属于 owner；本机 `(collector_local_id, local_project_key)` 映射到它；不同成员同名项目不合并 |
| 源任务 | `source_task_key` 为持久本地标识，映射 Codex session；一个 collector 下永远锁定原 owner；换号不能重新登记同源任务偷渡历史上下文 |
| 任务 | `task_ref`，绑定 owner、binding、project 和首个路由；项目别名可改，所有权不能改 |
| 同步路由 | `route_ref`，目标为 `private` 或一个 `team_ref`，带 `policy_epoch`、授权记录；任务创建后不可替换为别的团队 |
| 事件 | `event_id` 持久 UUID，重试不能重生成；归属固定 task，带 `source_seq/turn_key/kind/content_hash` |

本机存在两套预览/桌面运行时或不同 CODEX_HOME 时，不得因为使用相同系统账号就把它们视作同一采集器。需要统一的本机采集协调器或明确只启用一个实例；克隆目录/备份恢复需重新登记设备绑定，不复制运行中的上传租约。

## 4. 多账号与多团队的规则

### 4.1 切换账号

1. A 账号配置采集后，源任务 X 固定属于 A。Hook 收到事件时即记录账号绑定、路由、版本，不能到上传时再读取「当前登录用户」来改归属。
2. A → B：先同步停止采集/上传、撤销本机活动租约、取消在途请求、清除 UI 及内存缓存，再激活 B 的页面。A 的队列隔离保留，不能装入 B 的 outbox。
3. B 默认只查看 B 的内容，不自动取得 A 的采集器授权。B 如需采集，须完成自己的云端授权。
4. X 在 B 登录时继续输出：不作为 B 上传，也不偷偷用 A 长期凭据继续传；进入本地阻断状态并提示「此任务属于另一账号，请切回原账号或新建任务」。首期不支持跨账号任务转移。
5. 切回 A 不补传切号期间未知归属的内容。A 切走前已采集的待传队列，可在 A 明确恢复后，按原路由与当前权限重验再传，不能自动迁给 B。
6. 同一用户的电脑 B 仅仅打开另一个团队页面，不改变电脑 A 的路由。远程暂停是显式管理动作，不与页面选中态绑定。

本机必须维护跨账号的最小源任务归属登记（不含正文）；否则重新给 B 生成 task ID 仍会把 A 会话的后续上下文发给 B。云端对同 collector 的源任务归属也做唯一约束，错误只返回通用冲突，不泄露另一个账号身份。

重装、恢复备份或丢失本地源任务映射时，不能把所有已有 Codex 会话当作新任务接入。先从本人设备绑定恢复可验证映射；无法确认归属的旧会话保持本地、要求新建任务。系统也无法仅凭 Hook 判断电脑前实际是谁，账号/设备的明确授权与 OS 用户隔离仍是前提。

### 4.2 团队选择与项目映射

- 推荐默认：新任务进入本人私有云端；用户可以把项目 P 设为「后续新任务分享给团队甲」。一次授权即可覆盖之后的新任务，不重复粘贴接入指令。
- 一条项目规则只有一个目标团队，不支持同时多选。相同项目有冲突规则时阻断团队分享，让用户选择，不能取列表第一项、最近浏览团队或默认团队。
- 无目录/未知项目不套用团队规则，先私有或本地。项目路径变化、Git remote 改动、打开另一目录，均不能自动换团队。
- X 已归团队甲；后来 P 的默认团队改为乙：X 仍归甲，其新内容不进入乙。用户应在乙的上下文中新建任务，避免旧聊天内容被模型带到新团队。
- 对已经产生内容的私有任务补做团队分享，视作**历史分享**，必须预览明确事件范围并再次确认，不混在修改默认路由接口中。
- 任务排除优先于项目规则；项目排除优先于默认私有自动同步。排除表示本功能不继续采集/上传，恢复仅覆盖恢复后的新事件。
- 同一仓库在两台电脑映射为同一云端项目，需本人明确选择既有 `project_ref`；后端不能按仓库名、远程 URL 或本机路径哈希跨账号自动合并。

**「新任务」不是「首次在数据库看到的 session」。** 当前三个内容 Hook 的字段不足以单独证明会话是新建还是旧对话恢复。云端版需要本机采集器补充可靠的会话来源/生命周期判断；若本地无法证明任务在本次授权后新建，标记 existing/unknown，不能自动套用团队规则。已有明确原账号归属且已授权私有云端的，先仅本人可见；账号归属也未知的，先仅本地并要求确认。这不是要求每个任务重新粘贴指令，而是不能把未知旧上下文默认为新团队内容。元数据识别方案需插件与后端联调，不能读取 transcript 全文来偷渡实现。

### 4.3 团队读取权限

所有读取、搜索、计数、预览、推送及导出都使用同一权限判定，不能详情拒绝而列表/搜索泄露摘要。

| 操作 | 本人 | 团队有效成员 | 团队管理员/所有者 | 非成员/已退组 |
| --- | --- | --- | --- | --- |
| 读取自己的私有记录 | 允许 | 不因同团队而获得权限 | 不因管理身份而获得权限 | 本人私有权限独立于团队 |
| 读取分享给该团队的有效记录 | 允许 | 允许 | 允许 | 拒绝 |
| 开启/扩大别人的分享 | 不适用 | 拒绝 | 拒绝，管理员不能替员工授权 | 拒绝 |
| 修改本人路由/暂停本人采集 | 允许 | 拒绝 | 不能改他人的目标团队 | 拒绝 |
| 隐藏团队中的违规分享 | 作者可撤销 | 拒绝 | 可关闭团队可见性，不删除作者私有副本 | 拒绝 |
| 删除个人云端正文 | 作者确认后允许 | 拒绝 | 不因管理身份获得删除私有正文权限 | 拒绝 |

退组/移除必须使成员资格版本失效。分享者被移除：停止该团队路由、暂停其已有团队授权；查看者被移除：其所有团队列表、详情、搜索和变化游标立即失效。重入团队不复用旧授权或旧游标。

服务端以数据库授权变更提交作为拒绝新读写的边界；变更前已合法返回的数据、截图和手工导出无法远程收回。受控客户端清除内存和受保护磁盘缓存，首期不支持团队内容离线阅读，不承诺能销毁他人已保存副本。

## 5. 采集和上传架构

```text
Codex Hooks（无云端凭据、无网络上传）
  → 本地校验账号/源任务/排除规则
  → 持久 outbox（采集当时即固定 owner、route、epoch）
  → Arkme Host 上传器（当前账号托管凭据 + 短期上传租约）
  → 云端权限校验 + 幂等写入 + 变更日志
  → 本人其他设备 / 有权限的团队成员增量读取
```

### 授权与凭据

- 复用 Arkme 现有登录和托管 OpenAPI 凭据，但后端新增最小工作动态 scope 或等效能力授权，不把完整登录凭据交给 Hook。
- 复制进 Codex 的指令只有本机桥接引用和明确作用说明；不包含密码、长期 API Key、云端 refresh token 或可读取团队的 bearer token。
- 云端启用需确认固定计划：账号、设备、个人云端范围、团队目标、事件类型、是否历史、策略版本。后端记录确认结果，不能让普通事件上报顺带扩大权限。
- `binding_ref` 不可用作 bearer credential。上传同时验证当前认证主体、绑定 owner、短期租约、epoch、任务归属和团队成员资格。
- 建议租约有效期 120 秒、Host 每 30 秒续约；这是在线状态提示和失效兜底，**不是撤销延迟许可**。每次落库仍检查当前授权版本，远程撤销不等租约过期。
- 本轮不支持 Arkme 退出后仍由长期守护程序偷偷继续上传。如以后需无界面后台同步，单独设计可见的设备授权与撤销，不混入首期。

### 断线和重试

- Hook 写本地后立即返回，不等待 HTTP。失败不能阻塞 Codex 原任务。
- 正常网络故障：保留采集时绑定的队列；恢复后同账号、同 route/epoch 重验再传。不能用新的账号、团队或授权版本给旧事件重新贴标签。
- 暂停、排除、退组或撤销产生新的 epoch。未获 ACK 的旧 epoch 事件被明确拒绝并转本地待处理，不无限重试；用户要重新分享需显式导入计划。
- 初始建议每批最多 100 条，整个请求最大 1 MiB UTF-8，单条正文最大 256 KiB UTF-8。现有 65,536 字符保护与字节限制分别检查，不能以字符数代替字节数。
- 本机 outbox 建议最多 100 MiB/保留 7 天，具体上限由 capabilities 返回。达到限制停止新增云端队列并显示「同步不完整」，不要静默丢弃后仍显示全部同步成功。
- 已确认、待传、永久拒绝、过期和丢失计数要分别显示。服务端 ACK 仅在持久化事务完成后返回。
- 权限故障不当网络故障重试；429/5xx 指数退避加随机抖动，服从 `retry_after_ms`。

## 6. 服务端数据模型与一致性

建议实体：`collector_bindings`、`sync_consents`、`sync_routes`、`projects`、`collector_project_mappings`、`tasks`、`task_sources`、`turns`、`events`、`team_grants`、`import_plans`、`change_log`、`tombstones`。

核心约束：

- `collector_bindings.owner_user_ref` 不可变；所有操作先按认证主体限制查询。
- `task_sources(collector_ref, source_task_key)` 唯一并锁定 owner；同源会话在账号之间不能被重复认领。源 ID 是关联键，不是访问凭据。
- `events(owner_user_ref, event_id)` 唯一；同 ID、同 canonical payload hash 重试返回 duplicate；同 ID、不同 payload 返回冲突，不覆盖旧内容。
- `task_ref + source_turn_key + kind` 首期为一个逻辑槽位。Stop 被续写可能再次触发，当前本地实现会覆盖；云端首期固定首个有效版本，后续差异返回 `EVENT_SLOT_CONFLICT`、本地保留并提示，不悄悄改变已分享正文。需要完整修订流时扩展 revision/父版本后再接入。
- 如果两个采集实例观测同一真实任务，没有可靠源映射则宁可分开，不按文本、标题、时间相近自动合并。后续跨设备续任务需显式 source 映射授权；导入不得假装已解决。
- `source_seq` 为每采集器持久递增整数，仅用于该源内去重/排序提示；服务端独立分配 `event_seq` 和 `change_seq`，分页不能用客户端墙钟。
- `occurred_at`、`received_at` 分开；电脑时间偏差不改变权限/历史授权边界。多设备列表以服务端活动序列保证稳定顺序，展示事件原时间及必要的偏差标识。
- 状态按 turn 归并：同 turn 有 Stop 后，迟到的 UserPromptSubmit 不能让状态回退为 working。下一轮输入才重新 working；离线/长时间无事件只能显示 stale，不能推断成功。
- 团队读权限来自 grant 和当前 membership，而不是在 events 表写一个 team_ref 就永远放行。读取人、作者和团队状态均须校验。
- 写入事件、授权检查、序列分配和 change_log 发布需同事务或事务 outbox；避免 ACK 后查不到、撤销后新写入仍可见。
- 删除留无正文 tombstone，阻断延迟重传、备份重放和旧导入复活。恢复如要支持需新授权流程，不能删除 tombstone 即静默恢复。

昵称头像由当前账号/团队成员投影返回，附 `user_ref` 稳定身份；可另保留发送时展示快照，但不能根据旧昵称串人。离线/资料不可用须有明确 fallback，不拿其他同名成员代替。

## 7. 最小后端交付包

详细字段与示例见配套接口契约。首期需要以下能力，不强制每项各自建微服务。

| 优先级 | 能力 | 用户得到的效果 |
| --- | --- | --- |
| P0 | 登录主体/团队权限上下文 | 明确当前账号、可选团队、本人身份，不误同步 |
| P0 | 设备绑定、云端授权、上传租约、远程暂停/撤销 | 一次接入、多设备管理、可控停止 |
| P0 | 项目登记及路由、任务归属锁定 | 跨任务自动同步，同时隔离账号/团队 |
| P0 | 事件批量写入、幂等、逐条 ACK、限流 | 断网可补传，重试不重复，不误报成功 |
| P0 | 本人/团队成员/项目/任务/事件分页查询 | 本人换电脑能看，同事按人按项目看 |
| P0 | change cursor、撤销通知和 ACL 失效 | 缓存保持已有内容，只更新变化且不泄露失权内容 |
| P0 | 本地历史导入预检、明确授权、分批确认 | 保住现有本地工作记录，不因升级丢失，也不自动上传 |
| P0 | 撤销分享、删除及 tombstone | 错选可止损，重传不复活 |
| P0 | 限额/保留时间/数据覆盖信息 | 不把截断、拒绝、未传当作空或同步完成 |
| P1 | SSE/WebSocket 失效通知 | 轮询可先满足首期，推送只传变化引用不传正文 |
| P1 | 跨设备源任务显式合并、事件修订、导出 | 不能以这些增强未完成为由放宽 P0 身份/权限要求 |

首期轮询增量即可，不必等推送。入口摘要、成员统计和搜索也必须由后端按可见范围聚合，不能先全量返回所有人数据再由前端过滤。

建议交付顺序：先同账号两设备的私有闭环 → 再一个团队两成员的明确分享 → 最后验证多账号、多团队、撤销和历史迁移。个人云端服务与团队分享可以分别灰度，但账号锁定、授权确认和幂等不能后补。

## 8. 当前插件需要配合的工作

这些不是全都交给后端的任务；接口确定后插件需要再次开发。

1. 将「本地 team installation」升级为「本机采集器 → 不可变账号绑定 → 私有/团队路由」，多个本地团队不能直接变成多个全量云端投递器。
2. 新增云端启用确认、项目目标选择、账号冲突提示和同步状态；UI 实现前另出交互图确认，本轮不改现有页面。
3. 在 Host 层持久化稳定 event ID、源序号、原始 owner/route/epoch、ACK 和失败原因；不要上传时临时生成 ID。
4. 账号切换关闭所有请求和监听；缓存键至少包含环境、认证主体、view/team、ACL 版本和查询条件。另一个账号不能看上一账号缓存。
5. 去掉跨端原始 cwd/worktree/homeKey 上传；仅保留本机定位映射，上传用户可见项目别名与必要分支。仓库 URL 默认不上传。
6. 对源任务固定原账号及目标团队；在本机就拦住切号续同任务和多团队冲突，再由后端复验。
7. 后台云端上传与可见页面分离；页面卸载不导致清空已加载记录，任务正文按需分页。
8. 新云端授权与原本地 Hook 信任分开。即使 Hook 已信任，也不表示用户同意云端上传或团队分享。
9. 3100 与桌面端均可能运行时，设计采集器唯一领导租约/本机锁，避免两个运行时同时转发；云端租约 `uploader_instance_id` 则防止同绑定双写。不能通过挤占桌面端端口实现。

## 9. 本地历史迁移

1. 先保留并备份当前 SQLite，升级不得清空真实记录。当前本地表使用数字 user_id、成员快照、team_ref；需在当前登录账号下通过权威映射确认 user_ref，身份不明的记录不导入。
2. 本地预检展示：来源电脑、账号、任务/事件数、时间范围、内容是否截断、未知项目、待选择目标。不要先把正文上传服务端再称为「仅预检」。服务端预检只接收最小清单与散列，清单上传本身也需明确说明。
3. 默认目标「仅本人」。分享给团队必须单独确认；旧本地 team_ref 不代表允许向该团队公开。
4. 首次迁移为原事件生成持久 UUID 和 payload hash，写入独立映射表，不能每次重试产生不同 ID。历史 `sequence` 只在该本地数据库内有意义。
5. 用户确认 manifest 的固定范围后生成 `import_ref`，包括目标、ACL 版本、过期时间和最大序号。确认后的新事件不挤进历史授权范围。
6. 分批上传得到逐条结果；崩溃后按原 ID 和 import_ref 恢复。ACK 前保留本地，导入失败不销毁记录。完成后任务只显示一个合并数据视图，不能本地/云端各一条。
7. 原本未记录/已被覆盖的轮次、中断或丢失内容无法凭空恢复。返回 `coverage=partial` 和原因，不承诺完整历史。
8. 被删除的云端记录不因导入旧备份复活；团队已撤销/退组则停止该导入，不换成别的团队。原账号私有导入可重新单独授权。

## 10. 隐私、可靠性与运维

- 传输使用 HTTPS，正文和上传凭据不写普通日志/埋点；日志只含 request ID、对象引用、结果码和计数。
- 静态存储、备份和设备凭据使用平台既有加密及访问控制；本地 0600 权限不是端到端加密，也不能宣传为零知识存储。
- 常见密钥正则脱敏仅为尽力保护；提示词/最终回答仍可能含客户、文件片段和私密内容。云端授权需解释风险，不以“只是最后回答”为无敏感依据。
- `cwd/homeKey`、Git URL、机器真实 hostname 可能敏感；设备使用用户可改别名，绝对路径本机保留。正文内出现路径也按普通敏感文本处理。
- 不抓取正文链接预览、不执行 Markdown HTML/脚本、不自动下载附件；显示链接需经过现有安全渲染。
- 明确服务端容量配额、事件大小、保留期、正文删除周期及备份到期。capabilities 未给保留期时不能宣称永久保存；配额不足返回明确状态，不能当正常 ACK。
- 审计仅记录谁授权/撤销了哪个范围、何时生效、策略版本和操作者，不复制正文。
- 请求在撤销前已持久化，可能成功；撤销事务提交后必须拒绝旧权限请求。UI 的“已停止”在本机停止、服务端撤销成功后才显示，离线则显示“本机已停止，云端确认待完成”。
- 采集器需提供最后 Hook 时间、最后成功上传、最后错误、待传数；这些是同步健康度，不是员工绩效、在线时长或真实工作完成量。

## 11. 必过联调验收

| 编号 | 场景 | 预期 |
| --- | --- | --- |
| A01 | 电脑 A 新任务，电脑 B 同账号仅登录 | B 可增量看到 owner/project/task 和输入/回答，不必安装 Hooks |
| A02 | 同账号两台电脑各采集不同任务 | 分清设备与任务，同名项目不误合并，明确映射后可同项目展示 |
| A03 | 账号 A 有未 ACK 队列时切到 B | B 无法读/上传 A 数据；迟到响应不写 B 缓存；A 队列不换身份 |
| A04 | A 的 Codex 任务在 B 登录时继续输出 | 阻断，不登记为 B 新任务，不上传至 B 的团队 |
| A05 | 切回 A | 需明确恢复；原队列按原 route 重验，切号期间未知内容不补采 |
| A06 | 同一账号加入甲乙团队，项目只授权甲 | 仅甲可见，乙列表/搜索/统计/推送均不可见 |
| A07 | 浏览乙团队、另一电脑浏览乙 | 不改变电脑 A 的甲团队同步规则 |
| A08 | 项目默认从甲改乙 | 已有任务仍属甲，新任务才属乙；旧队列不能发乙 |
| A09 | 新项目/未知目录/冲突规则 | 不猜团队；无私有云端授权则仅本地 |
| A10 | 管理员请求员工私有 task_ref | 拒绝且不泄露题目、摘要、数量或对象存在性 |
| A11 | 成员改昵称/即我号 | 身份归属稳定，展示可更新，不丢记录、不串人 |
| A12 | 作者/读者退组、被移除、团队解散 | 按规则撤销读写、失效推送游标和缓存；旧租约仍不能写 |
| A13 | 被移除后重新加入 | 旧 epoch 不复活，需新授权；旧游标拒绝 |
| A14 | 断网重连重复上传、ACK 丢失 | 同 ID 同内容只一份，逐条结果可恢复；不可重复计数 |
| A15 | 同 ID 不同正文、不同任务复用 ID | 冲突，不覆盖；外部身份/路由伪造被拒绝 |
| A16 | Stop 先到、输入后到，多任务并发 | 正确按 turn 归并；不会把结束状态回退成进行中 |
| A17 | 暂停/排除/撤销与上传并发 | 撤销提交之后旧 epoch 请求拒绝；恢复不重贴旧队列 |
| A18 | 删除后旧队列/备份/导入重放 | tombstone 阻止正文和团队预览复活 |
| A19 | 旧本地历史未确认 | 升级仍本地；不读取 transcript、不自动上传 |
| A20 | 导入一半崩溃，恢复/再次导入 | 保留本地、续传去重、ACK 完成后覆盖口径明确 |
| A21 | 两个 Arkme 运行时争抢同采集器 | 只有明确持有租约者可上传；不自动跨账号接管 |
| A22 | 假 team_ref/user_ref/cursor/source key | 所有读取与写入服务端校验，不只信任前端 |
| A23 | >10,000 任务/大文本/429/额度用尽 | 正确分页、退避、明确部分覆盖，不一次拉全量或假装完成 |
| A24 | 新成员加入已有团队 | 仅能看按已确认团队政策共享的历史，不能看任何人的私有历史 |
| A25 | 私有任务只分享选定事件范围 | 未来新事件不自动进入该历史 grant；不同团队不得同时得到该任务 |

建议验收环境准备两个账号、两个有交叉成员的团队、两台设备、两个项目和一个 worktree。先测权限和负例，再测列表美观；不在生产真实同事任务上执行删除/退组验收。

## 12. 请后端回传的交付信息

1. 哪些已有能力可扩展、哪些新建；最终接口路径、鉴权 scope、请求响应样例和字段说明。
2. 不可变 user_ref 与现有数字 user_id/即我号的本人映射方式；team_ref、membership epoch 的权威来源。
3. 确认首期团队可见范围、退组历史处理、保留/删除期限、配额及批量限制。
4. 每个接口的权限矩阵、错误码、幂等键、游标失效规则和撤销事务边界。
5. 测试环境与灰度标记、至少两账号两团队的联调用例、请求 ID 与故障定位方式。不要把测试密钥放进文档或聊天。
6. 新功能默认关闭；部署不能让旧版 `localOnly` 数据自动上云。后端上线后再进行插件 UI 确认与接入开发。

## 13. 来源与证据边界

- 本地源码依据：`src/team-codex-{contract,service,machine-journal,machine-script}.ts`、`src/openapi-capability-gateway.ts`、`src/services/team-service.ts`；现有本地测试为 `tests/team-codex-*.test.*`。
- 复用评估参考：工作区 `ai-coding-monitor/docs/codex-sync-onboarding.md`、`server/src/sessions/sessions.controller.ts`，不表示它已有 Arkme 账号和团队合同。
- 使用 OpenAI Docs 核对了 [Codex Hooks 官方文档](https://learn.chatgpt.com/docs/hooks)：本功能依赖输入、最终回答、中断事件及会话/轮次字段；用户级 Hook 需信任。官方未为本业务提供 Arkme 账号、团队、跨端授权或稳定跨电脑项目映射，因此这些必须由 Arkme 负责。
