nativeAutoReviewUnavailable 会话内单向不可逆,分类器恢复后无法切回原生审阅
- Dominant language
- TypeScript
- Stars
- 2.7k
- Forks
- 401
- Avg merge
- 21h 48m
- Merged PRs (30d)
- 776
Description
## 现象
一次瞬时的原生分类器故障,会把整个会话**永久**钉在 Cindy fallback 上,即使官方分类器几秒后就恢复。会话内没有任何恢复路径,只能新开会话。
## 代码位置
`packages/maker-core/src/agents/claude-code/index.ts:4514`:
```ts
async useCindyAutoReviewFallback() {
if (nativeAutoReviewUnavailable) return;
nativeAutoReviewUnavailable = true; // 只置 true,全文件无处置回 false
autoReviewDecisionCache.clear();
...
}
```
`nativeAutoReviewUnavailable` 在 :1749 初始化为 false,:4516 置 true,此后会话生命周期内**再无重置点**。`usesNativeClaudeAutoReview()`(:1753)从此恒假,SDK 权限档也被永久映射到 `default`(:4524)。
Codex 侧同构:`packages/maker-core/src/agents/codex/index.ts:2906`。
## 为什么值得改
方向上是安全的(fallback 比原生更保守),但代价不对称:
1. 观察器那边已经做了完整的"恢复即清零"记账(`claude-auto-permission-fallback.ts:179`,2xx 成功响应会删掉故障记录),说明系统**知道**分类器什么时候恢复了——但这个恢复信号没有回传给 session handle
2. 一旦切到 Cindy fallback,该会话就完全依赖 host 轻量审阅器。如果这个会话的 model 又踩到路由解析失败(见 catalog 归一那条 issue),就从"偶发抖动"升级成"这个会话此后全废"
3. 用户无感知、无操作入口,只能凭直觉重开会话
## 建议改法(保持独立)
给 handle 补一个对称的恢复入口,由已有的观察器驱动:
1. `claude-auto-permission-fallback.ts` 的成功路径(:179 清零处)在确认「该会话分类器已恢复」时,额外通知 coordinator
2. coordinator 调 session 的 `restoreNativeAutoReview()`(新增,与 `useCindyAutoReviewFallback` 对称)
3. handle 侧置回 `nativeAutoReviewUnavailable = false`、清审阅缓存、把 SDK 权限档切回 `auto`
保守起见可以加一个"恢复需连续 K 次成功"的门槛,避免在抖动期来回横跳。
## 独立性
只碰 `claude-auto-permission-fallback.ts` + 两个 harness 的 handle 方法,不依赖其他 auto-review issue。
## 验证
- 注入连续 429 触发切换,再恢复 2xx,确认会话切回原生分类器且不再走 host 审阅器
- 确认抖动期(成功/失败交替)不会频繁来回切换
Contributor guide
Assessment
This issue has not been assessed yet.