makecindy / makecindy/cindy

Auto 档下 Cindy 审阅器不可用时永久 block 且零用户可见提示(重启无效)

Open
#1,574 1 comment 0 reactions 1 assignee Claimed by @zqchris View on GitHub
bug
Dominant language
TypeScript
Stars
2.7k
Forks
395
Avg merge
21h 48m
Merged PRs (30d)
776

Description

## 现象

Auto 权限档下,如果 Cindy 自己的轻量审阅器(delegate)不可用,灰区动作会**永久被拒**,用户看不到任何弹窗、也看不到任何原因说明,**重启 app 无效**。

已有用户反馈复现该形态:「怎么都掉不起工具,说被拒绝了,但是我一直都没看到过权限批准的弹窗,怎么重启 app 都不行」。

## 根因

`packages/maker-core/src/agents/shared/auto-review-decision.ts:108` `resolveAutoReviewDecision`:

- 本地确定性规则判 `auto-approve` → allow
- 判 `prompt-each-time` → ask(会弹窗)
- **灰区**(`needs-review`)→ 交 delegate;delegate 缺失(:133)、8s 超时、抛错、返回非法(:150-176)**一律 `block`**

`block` 落到 `packages/maker-core/src/agents/claude-code/index.ts:1636`(Codex `codex/index.ts:2969` 分支、Pi `pi/index.ts:805` 同构)变成 `behavior: 'deny'`,reason 只作为工具结果喂给模型,**UI 层零呈现**。

delegate 侧 `apps/desktop/src/main/maker-host/auto-permission-reviewer.ts:120` 的所有失败路径都 `return null`,与"模型判定为危险"在上层不可区分。

### 稳定复现的死路(配置级,重启无效)

`apps/desktop/src/main/utility-model/oneShotCandidates.ts`:

| 位置 | 条件 | 结果 |
|---|---|---|
| :404 | 当前 model 不在该 provider 的 catalog 模型列表 | `no_candidate` |
| :248 | provider 或 model 在设置里被停用 | fail closed |
| :264 | 带 agentKind+model 但 catalog 解析不出 provider | `no_candidate` |
| :365 | provider / agentKind 不匹配 | `no_candidate` |
| :378 | provider 路由变更进行中 | `request_failed` |

这些都不会自愈,命中后该会话(乃至该配置下所有会话)的 Auto 档等于全废。

## 问题本质

当前把两件事压成了同一个 `block`:

1. **模型判定这个动作危险** —— 静默 block 完全合理,给模型一个 reason 让它换安全做法
2. **审阅器压根没跑起来** —— 这不是安全判断,是基础设施故障,用户有权知道并接管

## 建议改法(保持独立)

在 `AutoReviewDecision` 上区分这两类,不改现有 fail-closed 的安全性:

```ts
type AutoReviewDecision = {
verdict: 'allow' | 'block' | 'ask';
reason?: string;
/** true = 审阅器不可用导致的 block,非模型安全判定 */
unavailable?: boolean;
};
```

- `unavailable: true` 时,**会话级一次性**(不是逐条)向用户呈现"自动审核不可用 + 原因 + 一键切到询问档"
- 动作本身仍然 deny,安全边界不变
- 连续 N 次 `unavailable` 后可自动把该会话显性降级到 Ask 并广播状态

这样既满足"不能静默"的评审诉求,又不会退化成逐条弹窗。

## 独立性

改动集中在 `auto-review-decision.ts` 的返回类型 + 三个 harness 的 block 分支 + 一条会话级通知。不依赖其他 auto-review issue(#3 会减少一类触发源,但两者可各自独立合并)。

## 验证

- 停用当前会话 provider,确认 Auto 档下出现一次性提示而非静默拒绝
- 确认模型判定的 `block` 仍然静默、不打扰用户

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.