Skip to content

Auto-review 权限模式系统性 review:Codex 侧名不副实(实为 Full access)、默认档过激进、模式显示不稳定等问题与改进需求 #129

Description

@zqchris

背景

用户反馈 Auto-review 模式"不定期自己切回 default、非常不稳定",排查后对整个 Auto-review / 权限模式功能做了一次系统性 review,并与 Claude Code 原生 auto mode、Codex 原生 Auto 档做了对比。结论:除了显示层的同步 bug,Codex 侧的 Auto-review 存在语义层面的根本问题。本 issue 汇总全部发现与改进需求,供跟进。

核心事实

同一个 "Auto-review" 标签,两个 agent 下语义相反:

Claude 侧 auto Codex 侧 auto
实际行为 透传 'auto' 给 cc 二进制,由模型分类器逐动作审查(真有 review) approval_policy: never + sandbox: danger-full-access,零审查、零沙箱、网络全放开
与 Full access(bypassPermissions)的区别 有实质区别 无任何功能区别,仅图标/配色/文案不同
  • 映射代码:packages/maker-core/src/agents/codex/index.ts:266-286(mapPermissionToCodex),注释自认 "auto 直接对齐 bypass 的底层权限形态"。
  • 历史(git 历史已随迁仓压平,仅存注释 :271-282):Codex auto 原为 on-request + workspace-write + 客户端自动代答提权;因 Codex app-server 内部安全裁决模型抖动时会卡死 Feishu/WebFetch/Bash 且不可恢复,为了可用性把整条审查通道拆掉,直接给到 never + danger-full-access,名字没改
  • 对比:Codex 官方 Auto 档 = workspace-write + on-request(保沙箱,workspace-write 下网络默认关闭);Claude Code 官方 auto mode(2026-03 上线)= 独立分类器模型逐动作审查 + 大量默认拦截规则 + 连拒 3 次/累计 20 次自动回退人工审批。Cindy 的 Codex "Auto-review" 比两家原生的自动档都激进,等同官方带 danger- 前缀、需显式 flag 的档位。

问题清单

P0

  1. 默认档 = 无审查全权限。桌面(apps/desktop/src/renderer/state/newMakerDraft.ts:120,130hooks/useCCSessions.ts:165)、手机(apps/mobile/app/sessions/new.tsx:1657)、IM bot(apps/desktop/src/main/im/defaultSessionSettings.ts:81)、远程主机会话(RemoteHostDetail.tsx:314)的新会话默认全是 auto——对 Codex 即 danger-full-access。切入 auto/bypass 无任何确认或警告(对比:cc 进 bypass 首次有责任确认弹窗)。hook 后台工作区默认更是 bypassPermissions(hookWorkspacePrefsLogic.ts:89)。
  2. "Auto-review" 标签对 Codex 用户构成安全误导。橙色 Sparkles + "自动审批"文案让用户以为比红色 "Full access" 安全一档,实际权限范围一模一样。i18n 描述里虽写了"权限范围与完全访问相同",但标签本身承诺的"审查"并不存在。

P1

  1. 模式显示不稳定 bug(用户可感知的"自己跳回 default"):permissionMode-only 的 sessions:update 不广播 sessions:patched(apps/desktop/src/main/localDb/ipc/sessions.ts,广播仅覆盖 projectTarget/cleared/pinned),侧栏列表缓存永远停在旧值;CCAgentSessionView.tsx 每次 sessionId effect 把 serverSession 置 null 再异步重取(失败静默吞),窗口期 UI 回退到过期缓存;ChatInput.tsx?? 'acceptEdits' 兜底对 Codex 是非法值,被 PermissionSelector.normalizeMode 折叠成第一项 ask后果不只是烦人:显示 Default、runtime 实际还是 auto,显示与实际权限脱钩
  2. 跨 agent 语义割裂:同一标签下 Claude 有审查、Codex 没有,用户换 agent 心智模型失效。
  3. stale in-code 描述:codex/index.ts:587 仍写"工作区内可读写"(workspace-write 时代旧文案),与实际映射及 i18n 矛盾,i18n key 缺失时会把错误描述暴露给用户。
  4. 收紧模式的脆弱兜底:auto/bypass 为 never 档,turn 内本地拦不住,切回 ask 只能中断当前 turn + 10s ack 超时(codex/index.ts:4062-4069,TIGHTEN_INTERRUPT_ACK_TIMEOUT_MS);Codex 侧也没有 Claude canUseTool 那样的本地 fail-closed 分支。
  5. ask 模式审批能力弱:无 app 级持久 allowlist、无 per-project 规则;Codex 的审批卡片连 "Always allow for session" 都没有(SDK 不回 session-scoped suggestions),逐次确认的摩擦把用户推向 auto/bypass。
  6. PermissionMode 类型是裸 string(userPreferences.types.ts:7),无编译期约束。

做得好、应保留的部分

  • 高风险 MCP 内置操作(删除/合并类)的 forcePrompt 强制逐次确认,auto/bypass 也不放行,且拒绝切模式时的批量放行(codex/index.ts:2466-2483, 2522-2527)。
  • Claude 侧 settings.json 权限规则纯透传(settingSources: ['user','project','local']),保留 cc 原生 protected paths、rm -rf 熔断等机制。
  • 切模式时挂起审批卡的 dismiss 语义清晰(切宽松放行/切严格拒绝)。

改进需求(按优先级)

  1. 恢复 Codex auto 的实质区分。最小改法:auto 改为 workspace-write + never——保沙箱、去审批,工作区内全自动、出界操作被沙箱直接挡掉,auto(有沙箱兜底)与 bypass(无沙箱)形成真实差异,回到 Codex 官方 Auto 档的安全水位。更完整的改法:回到 on-request + workspace-write + 客户端自动代答,对当年"安全模型抖动卡死"的问题改用裁决超时兜底(N 秒无响应按预设策略放行/弹窗),而不是拆掉整条通道。
  2. 改名或补审查,二选一。短期不做审查就别叫 Auto-review(改"自动执行/Full auto"并考虑与 bypass 合并);长期方向:在 maker-core 的 awaitApprovalDecision 处补 Cindy 自建裁决层(复用已有模型通道做 pre-approval 分类),对齐 Claude auto 语义,让 Auto-review 全线名副其实。
  3. 默认档与进入门槛收敛:新会话默认降到 ask(或至少 Codex 侧降档);首次切入 auto/bypass 加一次性确认弹窗(记住选择不重复弹)。
  4. 修显示同步 bug:sessions:update 对设置类字段补 sessions:patched 广播(或选择时乐观 patchLocal);ChatInput'acceptEdits' 兜底改为 per-agent 默认值。
  5. 小项:删 codex/index.ts:587 stale 描述;PermissionMode 收紧为字面量联合;验证 Claude auto 在账号不满足 cc auto mode 门槛(plan/model/管控开关)时的实际表现并做 UI 降级;中期补 per-project 持久 allowlist 降低 ask 摩擦。

注意事项

  • 需求 1/2/3 动 maker-core 权限映射与默认行为,按 AGENTS.md 规则 10 属需实测评估的高风险路径;标签/文案改动涉及四语言 i18n 同步(规则 18);"Auto-review 为默认档"可能是产品有意取舍,动手前建议先与 Lizi 对齐方向
  • 权限模式在 device-link / mobile 均有通道(maker:set-permission-mode),上述任何语义调整需同步核对远程/手机形态(规则 26)。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions