makecindy / makecindy/cindy

长任务被自动中止,并误报为用户中断和 iOS Simulator 拦截

Open
#2,479 0 comments 0 reactions 0 assignees View on GitHub
bug
Dominant language
TypeScript
Stars
2.7k
Forks
401
Avg merge
21h 48m
Merged PRs (30d)
776

Description

**提交人**: 午夜乐园管理员
**客户端版本**: 0.1.44

---

## 现象

执行长时间、跨文件、包含多次工具调用的 Codex 任务时,当前 turn 会在用户未点击停止的情况下被自动终止,记录为:

```text
aborted by user after 0.1s
turn_aborted
reason: interrupted
```

界面同时可能闪过:

```text
Cindy blocked a shell command that would bypass the embedded iOS Simulator.
Use cindy_ios_simulator for device lifecycle, app install/launch,
interaction, screenshots, and diagnostics.
```

实际命令仅涉及读取项目文件、解析 JSON、查看日志或检查服务状态,没有调用 iOS Simulator、`simctl`、`xcrun`、Simulator.app 或相关自动化。问题会跨任务出现:新建任务以及独立排障任务仍可复现。

## 复现步骤

1. 启动一个持续时间较长、包含多次工具调用的 Codex 任务。
2. 执行复合但只读的诊断,例如查找并读取文件/JSON、并行检查文件与服务状态、用 Python 解析本地 JSON,或一次工具调用包含多个 Shell 子命令。
3. 工具可能尚未真正执行,也可能已经成功返回输出。
4. 约 0.1–0.2 秒后观察到 `aborted by user`、`turn_aborted` 和 `reason: interrupted`。
5. 界面可能同时出现与命令无关的 iOS Simulator 拦截提示。
6. 同时使用桌面端与手机端并发生切换/重连时,丢帧、活动状态停止和任务状态异常更明显。

## 期望行为

- 安全规则拒绝命令时,应返回准确、可恢复的工具错误;需要权限时应提示授权。
- 单条命令被拒绝不应终止整个 turn,也不应把普通文件读取误报为 iOS Simulator 绕过。
- 手机端断线或重连不应改变桌面端任务运行状态。
- 只有用户真正点击停止时才应记录 `aborted by user`。
- 工具失败后 Agent 应能继续当前 turn 并尝试安全替代方案。

## 实际行为

- 用户未停止任务,却被记录为 `aborted by user`。
- 命令拦截或授权失败疑似被映射成整个 turn 的 `interrupted`。
- 普通只读命令被错误映射为 iOS Simulator 专用拦截提示。
- 手机设备链路同时出现断线、ACK 超时、丢帧和 `DEVICE_OFFLINE`,任务状态可能随之异常。

## 复现频率

偶发后会连续发生。在约 24 小时的脱敏检查窗口内:

- 错误的 iOS Simulator 拦截横幅:35 次
- 对应的 `turn_aborted / interrupted`:35 次
- 多个样本时间戳直接对应
- 手机链路另记录到 35 条 `device-link disconnected (code=1006)`、3 次 reliable transport ACK timeout、24 条 pending-frame 丢弃及多次 `DEVICE_OFFLINE`

以上为日志条数,不一定等于唯一故障次数。另有少量模型容量、额度及普通网络重连事件,但与这 35 次中断是不同问题。

## 已尝试

- 新建任务:仍复现。
- 建立独立排障任务读取日志:同样自动中止。
- 等待后续客户端自动更新:问题仍持续。
- 将命令限制为只读文件/JSON/日志/服务状态检查:仍可能被拦截。
- 反复发送“继续”:新 turn 仍可能再次中止。

## 影响

长任务无法稳定连续运行;成功的工具调用也可能导致整个 turn 随即终止。用户必须反复续办,容易造成重复执行、重复消耗模型额度以及流水线状态无法收口。手机端还可能表现为活动图标停止或任务突然静止。

## 已脱敏诊断摘要

用户已同意公开本摘要;未附原始日志。日志显示问题在一次客户端自动更新后集中出现,并在后续更新后持续。一次现场复现中,新任务运行只读诊断后约 0.1 秒即返回 `aborted by user`;数分钟后的独立排障任务读取日志时再次复现。

基于时间对应关系,初步怀疑以下链路之一或组合:

1. Shell/Host Authorization 安全分类误判。
2. 工具拒绝或授权失败被错误转换为“用户中断”并终止整个 turn。
3. 手机 device-link 重连或状态同步不稳定,放大任务取消或 UI 状态丢失。

建议检查:近期 Shell command safety/host authorization 变更、普通命令命中 iOS Simulator 专用错误的路径、工具错误到 `turn_aborted` 的生命周期映射、SDK session 标识为空时的处理,以及 device-link 重连是否触发 turn cancellation 或状态重置。
---
**OS**: darwin arm64 (25.5.0)
**界面语言**: zh-CN

Contributor guide

Open the contributing guide

Research direction

No file or test is named. Start by reviewing recent Shell/Host Authorization changes, then trace tool rejection errors into turn_aborted and inspect SDK session identifiers and device-link reconnect handling. Done means safe read-only commands receive accurate recoverable errors, only an actual stop records user interruption, and device-link state changes do not cancel desktop turns.

Written by the indexing model from the issue text.

Assessment

Tech stack
electron, ios, react-native, shell, typescript
Domain
desktop-dev, devtools, mobile-dev, security
Issue type
Bug
Difficulty
5/5
Estimated time
Over a week
Activity status
Quiet
Clarity
Needs clarification
Newbie friendliness
32/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.