状态:正反方审议与仲裁范围内的实现已完成,等待 stacked draft PR 审阅/合并
基线:main@38fcc3a
日期:2026-08-01
决策原则:采用 Codex 已公开验证的产品与工程模式,但保留 DeepCode 的 DeepSeek 定位、品牌和向后兼容性。
交付实现位于 stacked draft PR #180–#210:从计划与安全 runtime 开始,依次落地 canonical
Thread/Turn/Item、app-server 与三类薄客户端、配置/扩展/观测、review apply/revert、legacy 清理、
release gate 和桌面最小权限。真实 release tag、npm publication、Apple 签名/公证和 updater 私钥配置
不在代码改造中代替用户执行;发布前必须按 docs/RELEASING.md 完成外部凭证与 DMG smoke gate。
DeepCode 当前已经不是一个“从零开始”的项目:核心工具、DeepSeek provider、会话、MCP、hooks、sandbox、skills、plugins、CLI、Tauri 桌面端和初步 IDE 接入均已存在,主分支也能完整通过构建与测试。
真正的问题是各界面在各自直接拼装 agent loop,导致协议、会话、权限、恢复、后台任务和 UI 状态逐渐分叉。继续按功能清单补齐只会扩大这种分叉。
因此本计划不以“继续复刻 Claude Code 菜单”为主线,而以 Codex 的三项核心设计为北星:
- 统一运行时语义:先让所有 host 使用不可绕过的 runtime factory,再把 Thread → Turn → Item/Event 固化成协议事实源。
- 可信的长任务执行:可恢复、可中断、可观察;worktree 只有在保留与冲突语义修复后才用于隔离并行写入。
- 客户端薄、运行时厚:CLI、桌面端、VS Code/LSP 不再各自复制 agent orchestration;具体是 in-process、sidecar 还是 daemon,必须由打包 spike 证明后决定。
首要架构决策调整为:先从 CLI 已验证的组装逻辑中提取 RuntimeHost,强制统一安全默认值、取消和配置加载;随后以实验 capability 建立最小协议,并在至少两个真实客户端使用后再冻结稳定面。apps/server 的 transport 与桌面打包方式不预设;不会立刻重写为 Rust,也不会一次性移除现有 API。
本计划基于 2026-08-01 刷新的 Codex 官方手册、官方开源仓库和 DeepCode 当前主分支,而不是基于记忆或旧截图。
主要官方参考:
- Codex Best practices:计划优先、
AGENTS.md、测试/审阅闭环、技能和长期任务。 - Codex Subagents:主线程负责决策,子代理负责有界探索;写操作优先 worktree 隔离。
- Codex App Server:JSON-RPC、Thread/Turn/Item、审批、流式事件、恢复/分叉/中断/转向。
- Codex Worktrees:并行本地任务的隔离模型。
- Codex code review:以 diff 和可定位反馈为核心的审阅闭环。
- Codex
AGENTS.md:仓库级持久指令和就近覆盖规则。 - openai/codex:官方开源实现;其
codex-rs已将 protocol、app-server、core、thread-store、tools、sandbox、hooks、skills 和客户端拆成独立边界。
这里的“对齐”是设计原则与行为模型对齐,不是复制 OpenAI 的商标、文案、私有服务或逐像素克隆 UI。
在 main@38fcc3a 上执行:
pnpm typecheck
pnpm lint
pnpm format:check
pnpm test
pnpm build这些命令全部通过:
- 910 tests passed
- 12 tests skipped(真实 DeepSeek API、Linux bwrap/netns 等条件测试)
- 3 条 lint warning,无 error
- 当前根 TypeScript build 成功
这并不等于全仓覆盖完整:根 tsconfig.json 未引用 LSP/VS Code,pnpm build 不执行 Cargo check/test,VS Code 使用 --passWithNoTests,headless 测试也没有真实 agent E2E。README 的“549 tests”以及多份 handoff/milestone 状态已经明显过期,因此 PR 0 必须同时修正文档和 CI 覆盖。
packages/core已具备较完整的 agent/tool/provider 基础。- MCP、skills、plugins、hooks、sandbox、sessions、snapshots、worktree 均有实现与测试。
- CLI 已有 resume、background tasks、headless、voice 等可用行为。
- Tauri 桌面端已有 session sidebar、composer、inspector、file diff/history 等交互骨架。
- macOS/Linux 双平台 CI 与 release 工具链已存在。
| 优先级 | 差距 | 当前证据 | 后果 |
|---|---|---|---|
| P0 | VS Code/LSP 可绕过中央门禁 | runAgent 仅在 opts.mode 存在时调用 dispatcher;VS Code/LSP 注册完整工具却没有传 mode/permissions/sandbox |
Write/Bash 可在缺少统一审批和沙箱时执行 |
| P0 | 桌面 renderer 直接持有 provider 与 agent loop | apps/desktop/src/lib/mac-agent.ts 在 WebView 中创建 DeepSeekProvider,并明确缺少 hooks/session runtime/autoCompact |
凭证边界偏弱,运行时能力缺失,无法可靠后台执行 |
| P0 | 中断语义不一致 | desktop 有 AbortController;LSP deepcode.abort 只删除 id,没有中止实际 agent |
UI 显示“已停止”但任务仍可能继续写文件 |
| P0 | 桌面 runtime 打包方案未成立 | Tauri app 未打包 Node/server sidecar,安装机也不能假设有 Node 22;core 依赖 Node API | 不能直接宣称“Tauri 后端托管 TypeScript server” |
| P0 | 会话只是 message JSONL | packages/core/src/sessions/storage.ts 只存 StoredMessage,meta 与 events 分散 |
无法可靠表示未完成 turn、审批、tool item、fork、steer、parent/child agent |
| P0 | 权限与工具执行不是运行时统一能力 | 多个 host 自己决定传哪些 mode/permissions/hooks/sandbox 参数 | 相同设置在不同界面产生不同行为 |
| P1 | 没有统一 Thread/Turn/Item 协议 | packages/core/src/ipc/protocol.ts 仍是窄 IPC map;CLI、desktop、LSP、VS Code 分别调用 runAgent |
行为、恢复、审批和事件格式持续分叉 |
| P1 | 桌面 fixture 未进入自动验收 | 普通 Vite 入口依赖 Tauri 是预期行为;preview-app.html 可工作但没有视觉/交互 gate |
UI 改造缺少稳定、可自动化的验收入口 |
| P1 | CLI/desktop 大文件承担过多职责 | commands.ts 1344 行、Repl.tsx 1017 行、repl.ts 963 行、Tauri commands.rs 882 行 |
修改成本高,难以建立可测试边界 |
| P1 | VS Code 与 LSP 仍是独立 MVP | VS Code 直接调用 core;LSP 仅支持 executeCommand 且 README 仍标注 TODO | 不能共享 thread history、审批、任务和配置 |
| P1 | 配置叙事仍以 Claude 兼容为中心 | README、BEHAVIOR_PARITY、settings JSON 都围绕 Claude parity | 新能力缺少稳定的 DeepCode 自身产品模型 |
| P1 | 文档真实性不足 | README、HANDOFF、MORNING_REPORT、core README 相互矛盾 | 用户和后续 agent 会基于错误状态做决策 |
| P2 | 可观察性不足 | 没有统一 trace id、结构化运行日志、协议录制/回放 | 难以诊断跨客户端和长任务问题 |
| P1 | worktree 退出语义不安全 | removeWorktree 强删 branch,但用户文案声称 branch 会保留 |
并行写入可能丢失未合并工作 |
- Project:一个工作目录及其持久配置。
- Thread:一个可恢复、可分叉、可归档的连续目标。
- Turn:用户的一次请求以及 agent 为此执行的完整工作;现有
runAgent内部所谓 turn 改称 Model Step,不能直接投影成用户级 Turn。 - Item:turn 中可独立展示、持久化和审阅的单位,例如消息、命令、工具调用、文件变更、审批、计划更新。
- Task/Agent:thread 下的有界子工作;读任务可共享工作区,写任务在 worktree 安全语义完成后才默认隔离。
协议内部以这组术语为目标。原有 session 在兼容期映射为 thread,但首批 PR 不做全仓 UI 改名;等两个客户端消费新模型后再统一用户术语。
桌面端不追求复制某一版 Codex 截图,而采用其稳定交互原则:
- 左栏:Projects / Threads,支持搜索、pin、archive、fork 和状态筛选。
- 中栏:Turn timeline。消息、plan、tool、command、file change、approval 都是结构化 item。
- 顶部:当前 project、branch/worktree、运行状态、model/effort、权限 profile。
- Composer:文本/图片/文件上下文、Plan/Default 模式、发送/interrupt;steer 先定义为“下一安全边界注入”或“取消后重启”,验证 provider 约束后再启用。
- 右栏:先收敛现有 Changes / Files / Inspector;Terminal / Agents / Context 后置到有真实数据源时。
- Diff review:先交付文件级 diff 与反馈回传;逐行反馈、单项 revert 和 review all 后置。
- 长任务状态:Planning / Running / Waiting approval / Waiting input / Blocked / Completed / Failed / Interrupted。
- CLI 保留终端优先体验,但内部成为 app-server 的一个客户端。
- VS Code 直接消费统一协议,不再自行创建 provider/agent loop。
- LSP 只保留真正的编辑器传输兼容;DeepCode 自有丰富事件走 app-server protocol,而不是伪装成 LSP command。
- headless/CI 继续提供稳定 JSON/JSONL 输出,并由协议事件投影生成。
flowchart LR
CLI["CLI / headless"] --> Host["RuntimeHost"]
VSCode["VS Code / LSP"] --> Host
Desktop["Tauri desktop"] --> Boundary["Packaging boundary (ADR)"]
Boundary --> Host
Host --> P["experimental protocol"]
P --> Server["optional app-server transport"]
Host --> Runtime["packages/core runtime"]
Runtime --> Threads["thread store"]
Runtime --> Tools["tool + permission pipeline"]
Runtime --> Providers["provider adapters"]
Tools --> Sandbox["sandbox / worktree"]
职责:
- 版本化 request/response/notification schema。
Thread、Turn、Item、Agent、Approval、Usage、Error类型。- JSON Schema 与 TypeScript 类型生成入口。
- 协议兼容测试与录制/回放 fixtures。
- 不依赖 Node、Tauri、React 或具体 provider。
首批实验方法只覆盖一个垂直切片:
initialize
thread/start
thread/read
thread/resume
turn/start
turn/interrupt
turn/completed notification
item/started notification
item/completed notification
approval/requested notification + approval/respond
user-input/requested notification + user-input/respond
delta 默认只流式传输、不落盘。fork/archive/search、agent graph 等在垂直切片稳定后再加入。实验字段必须显式 capability 协商;至少由两个客户端消费并经过兼容测试后才升为 stable。
职责:
RuntimeHost先统一 provider、tools、config、trust、permissions、hooks、MCP、sandbox 与取消的组装,且安全门禁不可选。apps/server在桌面打包 ADR 后创建;JSONL stdio 只承诺单客户端 ownership 和完成后的跨客户端恢复。- 若要多个客户端附着同一个 active turn,必须采用单 daemon + Unix socket/命名管道,并明确锁、订阅、背压与重连;不能把 stdio 当作共享 daemon。
- 初始化握手、client capabilities 与协议版本协商先保持 experimental。
- credentials、config、hooks、MCP、sandbox 等只在可信后端加载。
- graceful shutdown 与未完成 turn 恢复标记。
- renderer/webview 永远不直接读取 API key;VS Code extension host 属于可信进程,但也应通过统一 runtime 获取 credentials,而不是复制逻辑。
保留现有可用模块,先建立不可绕过的 RuntimeHost,再把“一个 runAgent(opts) 函数”逐步重构为可恢复状态机:
AgentRuntime:处理一个用户级 turn 的生命周期;内部 provider round-trip 为 model step。ThreadRuntime:维护 history、active turn、pending approvals、task graph。ItemEmitter:把 provider/tool/hook 事件规范化成协议 item。RuntimeServices:provider、tools、permissions、sessions、hooks、MCP、worktrees 的依赖容器。
当前 turn_complete 事件发生在工具执行前,语义其实是 model step complete;必须先更名/适配,不能直接公开为用户级 turn/completed。现有 runAgent 在迁移期作为兼容 facade 调用新 runtime。
采用 append-only rollout JSONL + 可重建索引:
- 每条记录有
schemaVersion、sequence、timestamp、threadId、turnId?、itemId?。 - message、tool、approval、file change、status、fork relation 都进入同一事件日志。
- metadata/index 允许 list/search/pin/archive,不作为完整事实源。
- 写入先临时文件/原子 rename 或单 writer queue,避免并发损坏。
- core 与 desktop 目前存在两种 legacy session 格式,且历史版本未完整写入所有 tool 事件。迁移采用格式探测、双读单写与 normalization;不修改旧文件,也不声称能恢复从未持久化的数据。
统一顺序:
model tool call
→ schema validation
→ mode/profile policy
→ repo/user allow-deny rules
→ hook preflight
→ approval request(如需)
→ sandbox/worktree execution
→ hook postflight
→ item persistence
→ client notification
原则:
- 默认 workspace-write + 网络受控;扩大边界必须可解释。
- 权限 profile 与批准策略分开,不能用一个
mode同时表达两者。 - 写工具以 workspace/worktree 为边界;破坏性动作做目标解析和窄审批。
- 所有 host 使用同一 pipeline,禁止 renderer 或 IDE 绕过。
AGENTS.md成为首选跨 agent 仓库说明;继续读取DEEPCODE.md作为 DeepCode 专属兼容层。- 继续使用现有多层
settings.jsonloader,暂不引入 TOML;先补逐 key provenance 与 deprecated/ignored diagnostics。 - 配置加载结果提供 provenance,UI 能解释某个值来自 user、project、local override 还是 CLI。
- 运行时公开
config/read与config/diagnostics,各客户端不自行合并配置。
每个 PR 都必须可独立构建、可回滚,并保持现有 CLI 主路径可用。默认创建 draft PR,验证充分后再转 ready。
- 新增本计划与审议记录。
- 新增精简
AGENTS.md,写明仓库结构、检查命令、完成标准和安全约束。 - 修正 README/核心文档中的测试数、技术栈、过期状态与“完整复刻”绝对表述。
- 增加 docs freshness 检查,至少验证关键数字来自测试报告或不再硬编码。
- 根 typecheck/build 纳入 LSP、VS Code;CI 增加 Cargo check/test,并让当前 coverage 缺口显式可见。
验收:文档互不矛盾;新 agent 可只读 AGENTS.md 完成 setup、test、review;CI 覆盖全部 workspace 与 Rust backend。
- 从 CLI 组装提取
RuntimeHost,强制默认 mode、permissions、trust 与 sandbox;host 不能通过漏传mode绕过 dispatcher。 - CLI、headless、LSP、VS Code 先共享 factory;修复 LSP 假 abort。
- provider、pending approval、前台命令、Rust Bash 与 process group 真实取消;定义后台任务不随 turn 隐式存活的 ownership。
- 修复 worktree 退出强删 branch 与用户文案矛盾。
验收:启动延迟写文件的命令并取消,等待后目标文件仍不存在;所有 host 的 Write/Bash 都有一致门禁;worktree 退出不丢未合并工作。
- 探测 core
.meta.json + message JSONL与 desktopsession_meta + typed record JSONL。 - 双读旧格式、单写 normalization 后的新格式;旧文件只读且不改字节。
- 增加截断尾行、中部损坏 diagnostics、并发 writer ownership 测试。
验收:两种旧格式可读;重启后顺序连续;中部损坏不静默;不虚构旧版本未保存的 tool history。
- 明确 User Turn 与 Model Step;修复当前
turn_complete语义。 - 新建无 Node/Tauri/React/provider 依赖的实验 protocol package。
- 只实现 start/read/resume/interrupt 与 completed item 持久化;delta 不落盘。
- 日志、fixture 和 rollout 同期做敏感信息脱敏。
验收:lifecycle invariants、record/replay、重启恢复、terminal state 幂等和协议 golden tests。
- 已由
docs/adr/0001-desktop-runtime-sidecar.md决定采用 Tauri 监督的 target-specific Node 22 sidecar、单文件 app-server resource 与单客户端 stdio;不承诺 active turn 跨端附着。 - 可复现 probe 必须在无系统 Node 的 PATH 中证明协议握手,并报告 runtime 体积与冷启动。
- 签名、notarization、取消、升级和恢复仍是迁移 renderer 前的 release gate,不能用本地 ad-hoc 签名冒充发布验证。
验收:形成 ADR、可复现 spike、本机构建体积/冷启动证据、发布签名 gate 和失败回滚路径。
- 按 ADR 创建 app-server/transport,实现实验 initialize、start/read/resume/interrupt。
- CLI 通过同一 handler/client 使用 RuntimeHost,保留外观与 headless JSON/JSONL 兼容。
- 明确单 owner、断线、背压、重连和 active turn 限制。
验收:CLI 原有行为不回退;新增 transport、断线、背压、中断和恢复 e2e。
- 按 ADR 把 runtime 移出 renderer,移除 WebView 中的 provider/API key。
- 已建立可构建的 CJS app-server、target runtime、Rust supervisor 与 renderer protocol client;桌面
chat 默认且唯一使用 sidecar,旧
mac-agent/mac-toolsrenderer runtime 已删除。 - app-server 已补齐按 active thread/turn 绑定的 approval、AskUserQuestion、tool 与 usage 事件;interrupt 会解除所有待响应请求,避免 sidecar 因 UI 离线而悬挂。
- protocol snapshot 与 canonical session-v1 共享 id;新 thread 会进入现有 session 索引,旧 session 在首次 resume 时惰性投影为 compatibility turn,避免桌面迁移形成第二套不可见历史。
- renderer 只能查询 credential presence/base URL,不能读取 API key/auth token;原生 mutation/bash commands 已从 Tauri invoke surface 移除,tool 执行统一经过 RuntimeHost。
- React 只消费协议事件;接入真实 interrupt、恢复与 structured items。
preview-app.html已使用官方 Tauri event mock 变成协议 fixture harness;Playwright CI 覆盖三栏 几何、session resume、快速 turn、approval、tool/usage 完成事件以及 Files 的 Source/Diff/History。
验收:签名 app、凭证边界、Tauri IPC、重启恢复、浏览器 fixture 与视觉测试。
- VS Code 已改用 shared
ProtocolClient+ 独立 app-server bundle,删除重复 provider/runtime/credential 组装;扩展 build 现在生成真实extension.cjs与 child bundle。 - LSP 已改为 shared
ProtocolClient+ 独立 app-server 子进程;不再读取凭证或组装DeepSeekProvider/RuntimeHost,并公开 read/resume/interrupt/approval/user-input 命令与原生事件。 - 两个编辑器入口均支持 canonical thread、structured tool items、approval、AskUserQuestion 与
interrupt;VS Code diff context 继续由 agent 在 workspace 中读取,后续再接
vscode.git优化。 - LSP 只承担编辑器兼容;VS Code 与 LSP 均已有真正协议测试,不再使用
passWithNoTests。
验收:完成后的 thread 可在 CLI、desktop、VS Code 间恢复;事件和权限语义一致。
- JSON config 已增加逐叶 JSON Pointer provenance 与不含值的 diagnostics;CLI/desktop/editor app-server 现在共享 core trust store,未信任项目不能通过 permissions/sandbox/env 等字段扩大权限。
- CLI doctor、Desktop About、VS Code command 与 LSP command 均消费同一个 diagnostics DTO, 客户端不再自行解释配置来源或 trust gate。
- app-server 已在 host 内统一
AGENTS.md、DEEPCODE.md、rules、memory、user/project skills、 output style、hooks 与 model/effort/mode defaults。 - MCP 与 plugin subprocess 已接入同一 turn-scoped lease:eager/deferred tools、resource refs、 best-effort diagnostics、plugin capability policy gates 与 deterministic cleanup 共享 host 边界; plugin trust hash 覆盖全部安装文件,skills-only plugin 不再被强制启动进程。
- project/local command hook 已收敛到规范化定义哈希审核:未审阅或已变化的定义默认跳过,
deepcode hooks list|trust <hash...|--all>|revoke提供显式管理,diagnostics 暴露来源与审核状态; 目录 trust 只是第一道门,user/explicit override 仍是可信层。 - app-server 已为 turn 生成稳定
traceId并贯穿 durable/transient 事件;有界 NDJSON 只允许 关联 ID、事件、状态码与耗时,不序列化协议 payload。diagnostics/export与 CLI 共用脱敏器, 路径哈希化、配置值/issue message 省略,导出前再次白名单清洗;删除logs//diagnostics/即可回滚,不影响 canonical thread。 workspace/diff已把 Git 工作区变化收敛成 app-server 拥有的有界 file/hunk/line DTO,并以 canonicalthreadId绑定 cwd;Git 不经 shell,未跟踪 symlink/binary 不读取内容。VS Code review、Desktop protocol agent 与 LSP command 共享该能力,不再各自解析 diff。- 只读
SubmitReviewFindingtool 已把模型反馈持久化为含 path/line/priority/replacement 的review_findingitem;review/apply只接受 canonical thread 中已有 finding id,由 app-server 解析原始 payload、生成单项或批量 prompt,并把 finding/action/turn 关联持久化为review_action。Apply 不暴露直写接口,因此继续经过 Edit/Write permission、approval、hook、 sandbox 与 snapshot,客户端不能篡改 path/replacement 或伪造 finding。 - 每个 app-server turn 的文件快照已带 canonical turn id;
review/revert只解析已完成的 Apply action,并把 revert turn 的工具上限锁定为RestoreReviewAction。该工具在任何写入前校验 所有 current file 仍逐字节等于 Apply post-image、snapshot blob 完整且路径未逃逸;有冲突、 Bash checkpoint 或 legacy 不完整快照时整体拒绝。恢复仍经过 permission/approval/hooks,且 自身产生 pre/post 快照;新建文件可按existed=false安全删除。 - 在 worktree 语义安全后启用隔离写任务;sub-agent 深度维持安全上限,按真实需求扩展 agent graph。
- VS Code review all 与 latest-action revert 已由同一 canonical action path 提供,Desktop/LSP 暴露对应协议能力;客户端内联评论/上下文 action 在有真实使用证据前继续后置,避免复制第二套 finding/action 状态。
- 已删除无生产引用的 core renderer IPC、desktop native mutation/tool facade 与
chat路由别名; Tauri 仅保留 credential presence、文件/快照只读投影和 sidecar supervision。legacy session importer 继续只读,旧文件不迁移、不覆盖;用户文档已改为 app-server 架构。 - Tauri capability 已收紧为 open dialog、默认 URL、updater 与 restart 的精确 allow 集;未使用的 FS plugin、generic process exit、file reveal 和 renderer → provider CSP 路径已移除,release gate 防止回归。
pnpm release:check已对真实 VS Code/app-server/VSIX 产物执行包体预算、v1 capability、 create/read、配置诊断、workspace diff、重启 read/resume 与薄客户端边界扫描;Ubuntu/macOS CI 与 tag validate 共用该门禁,tag 还必须通过 desktop Playwright journey。迁移、隔离 home 回滚演练、 fail-closed 协议升级和签名 DMG smoke test 已记录在docs/design/release-gates-v1.md。
验收:端到端 golden journey、性能基线、安全 review、文档与 release gate。
- 一个已完成或已中断的 thread 可以从 CLI 创建,在 desktop 恢复,再在 VS Code 继续;active turn 跨端附着取决于 daemon ADR。
- active turn 可以 interrupt,且中断后不再发生文件写入;steer 只有在安全边界语义经测试后才启用。
- 重启 server 后未完成 turn 有明确状态,不会伪装成完成。
- approval、ask-user、tool、file change 在所有客户端具有同一 id 和最终状态。
- renderer/webview/VS Code webview 中不存在 provider credential。
- 所有写入与命令经过同一 permission pipeline。
- 日志、rollout、protocol fixture 默认脱敏凭证与敏感 header。
- 不可信 repo 不能通过配置/hooks/plugin 自动扩大权限。
- 主分支不允许新增
passWithNoTests的产品代码包。 - protocol/core/server 的公共行为必须有 contract 或 e2e test。
- CI 持续执行 typecheck、lint、format、test、build;关键安全测试按平台运行。
- 大文件目标:新增业务模块不超过 500 行;现有超大文件随触达拆分,不做无收益搬家。
- release gate 以实测产物锁定 extension 64 KiB、app-server 768 KiB、VSIX 256 KiB 上限。
- 打包 app-server 冷启动 initialize 预算 5 秒,metadata request 2 秒,workspace diff 10 秒;报告随 CI failure artifact 上传。提高预算必须附 before/after 数据和新增用户价值。
- thread list、长列表 UI 与 provider 首 token 仍需真实分布数据后再锁 SLO,不用本地单样本伪造目标。
| 风险 | 缓解 |
|---|---|
| 改造面过大导致长期分支 | 按安全 host → legacy 兼容 → 实验协议 → 打包 ADR → client 的顺序,小 PR |
| 追逐 Codex 每周变化 | 只对齐稳定原则;协议做版本/capability;记录参考日期 |
| UI 重做先于运行时导致返工 | 先确定 item/lifecycle,再重做 timeline 和 inspector |
| 旧用户配置/会话损坏 | 格式探测、旧文件只读、双读单写、明确回滚窗口 |
| 子代理并行写冲突 | 先修复 worktree 保留/恢复语义,再启用隔离写;合并前统一 review/test |
| 桌面无法托管 Node runtime | PR 4 在签名 app 和无系统 Node 环境做 sidecar/daemon spike,ADR 后才定 transport |
| 为“对齐”牺牲 DeepSeek 特性 | provider capability 由运行时发现;保留 DeepSeek cache、pricing、reasoner 特性 |
| PR 过多难审 | 每个 PR 有单一架构边界、明确依赖和可执行验收命令 |
后续遇到未写明的选择,按以下顺序裁决:
- 安全与数据可恢复性。
- 跨客户端一致性。
- 可测试、可观察、可回滚。
- 用户完成任务的速度与清晰度。
- 向后兼容。
- 实现便利。
若 Codex 的公开行为与 DeepSeek/provider 约束冲突,保留统一产品心智,但允许底层实现不同;在 diagnostics 和文档中明确差异,不伪装完全兼容。
本计划已完成一次正式正反方审议:
- 正方负责证明该架构能降低分叉、提升安全与长期交付速度。
- 反方负责寻找过度设计、迁移风险、错误优先级和可更小切入点。
- 仲裁只采纳有代码证据、测试证据或官方设计依据的观点。
- 审议结论写回本文件,并据此调整 PR 顺序和 scope。
审议完成后自动进入 PR 0 与 PR 1,不再等待逐项产品决策;只有凭证、付费、不可逆发布、破坏性数据迁移或权限扩大需要额外确认。
正方支持“统一 runtime、Thread/Turn/Item、可信后端持有凭证、append-only 恢复模型”的主方向,证据是四个 host 虽共享 runAgent,但实际传入的 session、permissions、hooks、sandbox、autoCompact 和 task manager 完全不同。正方要求保留真实 interrupt、旧数据兼容和协议不变量,并建议先做最小 protocol/thread-store,不把 UI 或 transport 混入。
反方认可收敛方向,但反对原 PR 顺序,关键证据如下:
- Tauri app 没有 Node sidecar,无法直接托管现有 TypeScript core/server。
- stdio 是一对一 transport,不能同时声称多客户端单 runtime owner。
runAgent的 dispatcher 因mode可选而可被 VS Code/LSP 绕过,安全修复不能排到后期。- 现有
turn_complete实际是 model step 事件,不能直接公开成用户级 turn lifecycle。 - core 与 desktop 有两种 legacy session 格式,一次性 importer 会固化数据缺失。
- worktree 退出会强删 branch,尚不能作为默认隔离承诺。
- 当前根 build/CI 未覆盖 LSP、VS Code 与 Cargo,910 tests 不能代表全仓完整基线。
| 议题 | 决定 |
|---|---|
| 总方向 | 保留统一 runtime 和 Thread/Turn/Item 北星 |
| 第一实现优先级 | 接受反方:CI 真实基线后立即修安全门禁、取消和 worktree 数据丢失 |
| 协议 | 接受双方共同建议:最小 experimental slice,两个客户端验证后再 stable |
| 桌面后端 | 接受反方:先做签名 app/无 Node 环境 packaging ADR,不预设 Tauri 承载 TS runtime |
| transport | stdio 只承诺单客户端;active turn 多端共享必须 daemon/socket ADR |
| 会话迁移 | 接受反方:双读单写、旧文件只读,不做一次性破坏迁移 |
| 配置 | 接受反方:沿用 JSON loader 并补 provenance/diagnostics,TOML 后置 |
| UI | 采用 Codex 的结构化工作流原则;术语换皮、Terminal/Agents 面板、逐行 review 后置 |
| 子代理 | 深度 1 视为当前安全限制,不把“加深层级”本身当目标 |
此仲裁已反映到 PR 路线。后续若没有新的代码证据推翻这些事实,按本版本自动推进。