[Bug] Antigravity (agy 1.1.1) 会话在自动 Context compaction 处静默卡死:turn 永不结束、取消无效,之后所有 prompt 均无响应
环境
codeg-server 0.31.2 (standalone / deb 安装,Linux x86_64,自托管 + Web UI)
智能体:内置 Google Antigravity ,agy_acp_server 1.1.1
该 agent 的 env_json 配置了本地 HTTP 代理(127.0.0.1:<port>),回环地址已在 NO_PROXY
运行环境资源紧张:容器 4 GB RAM (cgroup 内存峰值 4034 MB,swap 已用 240 MB)
上游 OAuth 正常(token 在卡死前后均能自刷新),代理本身健康
现象
长任务里"卡很久"是常态(见下方统计),但会概率性地演变为彻底不返回 。
卡死后点 UI 的「停止」:界面看起来结束了,但再发任何消息都没有反应 ——没有回复、没有报错、spinner 也不再变化。
该会话在 codeg.db 中长期停在 in_progress。
刷新页面、重启 codeg-server 都无效——因为挂住的是 agy 子进程内部 的会话状态。
关键证据(一次完整卡死,日志中的标识已全部脱敏)
A. agy 日志在某一刻彻底停止增长,最后一行不完整
$CODEG_ACP_TMP_ROOT/<codeg-pid>-<rand>/agy_acp_server.par.INFO(符号链接指向带时间戳的 *.log.INFO.<date>.<pid>)停在 218602 字节、mtime 07:52:12,此后 30 秒内 size 与 mtime 均无变化。最后一行连时间戳都没写完 :
(正常行形如 I0923 07:52:11.913642 <pid> local_connection.py:521] RAW WS MSG: {...};本行只有 I0923 07:52,分钟之后即被截断)
30 秒采样:log_size 恒为 218602,进程 utime 仅 +5(几乎不耗 CPU)。
B. 最后一条下发到 codeg 的消息是一次没有终态的自动压缩
RAW WS MSG: {"stepUpdate":{"cascadeId":"<uuid>","trajectoryId":"<uuid>","stepIndex":158,
"state":"STATE_ACTIVE","source":"SOURCE_SYSTEM","target":"TARGET_USER",
"thinking":"","textDelta":"Context compaction","compaction":{}}, "seqNum":"200", ...}
此后再没有该 stepIndex 的 STATE_DONE ,也没有任何新的 stepUpdate(同一步在 07:52:11.909 / .912 / .913 连发 3 次 ACTIVE 后即沉默)。
C. 会话 store 冻结,留下孤立的 ACTIVE 步
~/.gemini/antigravity-acp/conversations/<external_id>.db:
steps 表停在 247 行(max(idx)=246),mtime 与 B 同时刻冻结;
SELECT step_type,status,count(*) GROUP BY 1,2 出现孤立的 step_type=21, status=2(ACTIVE),其余 242 行为 status=3(DONE),另有 1 行为 status=7(早前的路径越界拒绝,与本问题无关)。
D. 不是网络或代理问题
agy 进程存活,但只持有到 localharness_external 的本地回环 socket,该时段没有任何到 cloudcode / Google API 的出站连接 (代理侧日志同步静默);
同一时刻同一代理上其它流量的日志正常,代理连通用 curl --proxy 抽样验证 3 次全部 200/404(可达);
无 crash、无 OOM:dmesg 无 agy/SIGSEGV/SIGILL 记录,cgroup oom_kill 0;
acp_list_connections 仍返回该连接(web mode 下 status 一直是 connecting,本来就不可作为健康判据)。
E. 取消只结束 codeg 侧的 turn,解不开 agy 的会话锁
POST /api/acp_cancel {"connectionId":"<antigravity connection id>"} 返回 null,约 2 分钟后 journal 才出现:
[ACP] turn_complete session=Some("<uuid>") stop_reason=cancelled background_outstanding=0
[ACP] status_changed session=Some("<uuid>") Connected -> Connected
但与此同时:agy 进程没有被杀、日志不恢复、会话 store 不再增长 。说明 agy 内部那次卡住的 compaction 步仍是 ACTIVE、会话锁未释放;反重力对同一 session 的 prompt 是串行的,因此后续 session/prompt 只能排队等一个永不到来的结果——这正是"按停止后再问也不动"的原因。
F. 只能靠换进程恢复
acp_disconnect → acp_connect(相同 workDir)后,codeg 正常 SIGTERM 旧 agy 并拉起新 agy(Initialize responded in 2.68s,旧进程消失),会话可继续使用。
注意:恢复会 replay 含卡死步的 trajectory——建议在此之前备份该 session db 。
为什么"时不时"出现:统计
token_usage_turn 中该 agent 的全部 783 个 turn:
turn 时长
占比
< 1 min
29%
1–5 min
39%
5–10 min
15%
10–30 min
14%
> 30 min
4%
中位数 2.6 min,P90 14.5 min,最长 309 min。input_tokens > 300k 的 turn 中位耗时 11.6 min(单 turn 最高约 5.8M input / 44.7M cache_read)。
也就是说:上下文越长,越频繁触发自动压缩,越容易撞上这个静默卡死点。这不是必然复现——本机观察到的 6 次 compaction 步中,5 次后续正常推进(分别还有 1–413 个新 step),只有 1 次永久卡死 ,属间歇性问题。
期望
prompt 级看门狗 :目前只有 CODEG_ACP_IDLE_TIMEOUT_SECS(默认 300,本机设为 3600)与 CODEG_ACP_SPAWN_HANDSHAKE_TIMEOUT_SECS。agent 已连接、但 prompt 永不返回且没有任何 step 进展 时,codeg 没有任何发现/恢复机制。建议增加"距上次 agent 事件超过 N 分钟即判定卡死"的检测,并允许自动或一键重启该 agent 进程(保留 session 以便恢复)。
取消语义明确化 :当 agent 不确认取消(steering=false)时,应明确行为——要么真正终止/重启该 agent 进程,要么在 UI 上明示"取消只在客户端生效、agent 仍持锁",避免用户以为已停止实际未停。这与 [Bug] ACP cancellation is finalized before agent confirmation, so Pi can keep running and late output is lost #364 、ACP "redirect" fabricates empty ~1ms turn_completes when the agent advertises steering=false, wedging the conversation (cancelled/pending_review) and swallowing the send #590 属于同一片区域,但触发点不同(这里是 agent 端自身卡住、取消无确认)。
可观测性 :agent 侧完全静默(无 error 日志、无 crash、无出站连接)时,codeg 目前没有任何提示。建议在连接/会话上暴露"距上次 agent 事件 N 分钟"之类的信号,让用户能区分"在算"和"已死"。
附注
被截断的 I0923 07:52 表明卡死发生在日志写入过程中,怀疑是 agy 1.1.1 在 compaction 路径上的自身缺陷;如果需要,我可以提供进一步脱敏的日志片段,以及卡死步在 store 中的字段清单(steps 表 schema + 该行各列长度/状态)。
[Bug] Antigravity (agy 1.1.1) 会话在自动 Context compaction 处静默卡死:turn 永不结束、取消无效,之后所有 prompt 均无响应
环境
agy_acp_server1.1.1env_json配置了本地 HTTP 代理(127.0.0.1:<port>),回环地址已在NO_PROXY现象
codeg.db中长期停在in_progress。关键证据(一次完整卡死,日志中的标识已全部脱敏)
A. agy 日志在某一刻彻底停止增长,最后一行不完整
$CODEG_ACP_TMP_ROOT/<codeg-pid>-<rand>/agy_acp_server.par.INFO(符号链接指向带时间戳的*.log.INFO.<date>.<pid>)停在 218602 字节、mtime07:52:12,此后 30 秒内 size 与 mtime 均无变化。最后一行连时间戳都没写完:(正常行形如
I0923 07:52:11.913642 <pid> local_connection.py:521] RAW WS MSG: {...};本行只有I0923 07:52,分钟之后即被截断)30 秒采样:
log_size恒为 218602,进程utime仅 +5(几乎不耗 CPU)。B. 最后一条下发到 codeg 的消息是一次没有终态的自动压缩
此后再没有该
stepIndex的STATE_DONE,也没有任何新的stepUpdate(同一步在 07:52:11.909 / .912 / .913 连发 3 次 ACTIVE 后即沉默)。C. 会话 store 冻结,留下孤立的 ACTIVE 步
~/.gemini/antigravity-acp/conversations/<external_id>.db:steps表停在 247 行(max(idx)=246),mtime 与 B 同时刻冻结;SELECT step_type,status,count(*) GROUP BY 1,2出现孤立的step_type=21, status=2(ACTIVE),其余 242 行为status=3(DONE),另有 1 行为status=7(早前的路径越界拒绝,与本问题无关)。D. 不是网络或代理问题
localharness_external的本地回环 socket,该时段没有任何到 cloudcode / Google API 的出站连接(代理侧日志同步静默);curl --proxy抽样验证 3 次全部 200/404(可达);agy/SIGSEGV/SIGILL 记录,cgroupoom_kill 0;acp_list_connections仍返回该连接(web mode 下 status 一直是connecting,本来就不可作为健康判据)。E. 取消只结束 codeg 侧的 turn,解不开 agy 的会话锁
POST /api/acp_cancel {"connectionId":"<antigravity connection id>"}返回null,约 2 分钟后 journal 才出现:但与此同时:agy 进程没有被杀、日志不恢复、会话 store 不再增长。说明 agy 内部那次卡住的 compaction 步仍是 ACTIVE、会话锁未释放;反重力对同一 session 的 prompt 是串行的,因此后续
session/prompt只能排队等一个永不到来的结果——这正是"按停止后再问也不动"的原因。F. 只能靠换进程恢复
acp_disconnect→acp_connect(相同 workDir)后,codeg 正常 SIGTERM 旧 agy 并拉起新 agy(Initialize responded in 2.68s,旧进程消失),会话可继续使用。注意:恢复会 replay 含卡死步的 trajectory——建议在此之前备份该 session db。
为什么"时不时"出现:统计
token_usage_turn中该 agent 的全部 783 个 turn:中位数 2.6 min,P90 14.5 min,最长 309 min。
input_tokens > 300k的 turn 中位耗时 11.6 min(单 turn 最高约 5.8M input / 44.7M cache_read)。也就是说:上下文越长,越频繁触发自动压缩,越容易撞上这个静默卡死点。这不是必然复现——本机观察到的 6 次 compaction 步中,5 次后续正常推进(分别还有 1–413 个新 step),只有 1 次永久卡死,属间歇性问题。
期望
CODEG_ACP_IDLE_TIMEOUT_SECS(默认 300,本机设为 3600)与CODEG_ACP_SPAWN_HANDSHAKE_TIMEOUT_SECS。agent 已连接、但 prompt 永不返回且没有任何 step 进展时,codeg 没有任何发现/恢复机制。建议增加"距上次 agent 事件超过 N 分钟即判定卡死"的检测,并允许自动或一键重启该 agent 进程(保留 session 以便恢复)。steering=false)时,应明确行为——要么真正终止/重启该 agent 进程,要么在 UI 上明示"取消只在客户端生效、agent 仍持锁",避免用户以为已停止实际未停。这与 [Bug] ACP cancellation is finalized before agent confirmation, so Pi can keep running and late output is lost #364、ACP "redirect" fabricates empty ~1ms turn_completes when the agent advertises steering=false, wedging the conversation (cancelled/pending_review) and swallowing the send #590 属于同一片区域,但触发点不同(这里是 agent 端自身卡住、取消无确认)。附注
I0923 07:52表明卡死发生在日志写入过程中,怀疑是 agy 1.1.1 在 compaction 路径上的自身缺陷;如果需要,我可以提供进一步脱敏的日志片段,以及卡死步在 store 中的字段清单(steps表 schema + 该行各列长度/状态)。