Repository navigation
v1.7.2
Claude Code Heihei v1.7.2
让会话不再「静默假死」:修掉两个会让会话停在那里、既不报错也没有下文的问题——一个用错误地址把会话「起了却连不上」,一个是在等一个永远等不到的批准;并补上对应的可见性提示与兜底。无破坏性变更。
修复:会话静默假死的两个根因
1. 协议通知用一个无效地址去拉起会话
- 现象:某些会话会被「拉起」成一个僵尸会话——进程真的活着,但服务端零连接日志,投递显示成功(HTTP 201)却永远没有下文,会话卡住不动、transcript 不落盘。
- 根因:服务端启动时发出的「协议更新通知」,在拉起当时未运行的主管会话时,传的是一个端口为 0 的无效地址,命令行照着去拨号,自然永远连不上服务端。而这条通知有一个「已发送」标记文件——真实环境下早已存在,使它提前返回,于是这个缺陷长期被掩盖,只在全新环境(如隔离测试环境)里才暴露。
- 修法(四条一起):
- 通知只发给正在运行的主管会话,不再为了发通知把没运行的会话拉起来(避免凭空创建会话、白烧额度);
- 去掉那个端口 0 的常量,改取真实端口;
- 投递入口拒绝无效地址(缺端口、端口 0、越界等一律报错,让它当场显形而不是变成僵尸);
- 「拉起成功」必须以真的连上为准——未确认连接前不再打印成功日志、不再把会话标记为运行中;同时不阻塞投递主路径(投递仍照常快速返回 201,后台补确认;迟到连上也算数)。
- 怎么验证的:三组实验确证根因——预置标记文件 → 不再复现;只造主管会话(不派活)→ 仍复现(说明「拉起者」就是通知本身);交换投递顺序 → 无差异;无标记时 6/6 复现。修复后经真实流程验证:服务端出现连接日志、transcript 落盘。(未核实:提纲提到的「两轮端到端验证」具体轮次未在提交中逐条核到。)
2. 权限等待没有任何超时
- 现象:非员工会话(主管 / 用户)的工具调用若需要人工批准而无人应答,会永久等待——回合永不结束、会话假死;卡死期间后续消息全部排队。
- 根因:待批准的权限请求存在内存里,没有任何超时或过期机制,也没有任何东西会在无人应答时把它收掉。
- 修法:加两档有界超时——界面上有客户端在线时 15 分钟、无客户端时 90 秒(对齐现有重连退避上限,留约 3 倍余量);到期自动拒绝并让回合继续跑完;客户端中途接入只延长、断开不缩短;对不存在的请求重复应答变成空操作(顺手堵掉「双击」竞态)。
- 怎么验证的:端到端冒烟跑通——90 秒整触发自动拒绝 → 工具被拒(
is_error)→ 回合带着「工具被拒」继续至完成。单测覆盖两档、幂等、会话关闭清定时器等。
可见性与兜底
- 权限超时自动拒绝会显形:消息流里追加一行中性灰系统提示(五种界面语言),明确表达「该请求已被自动拒绝、工具未执行」——不会让你误以为工具跑过了;等待中另有一行静态提示(刻意不显示倒计时,因为中途接入会延长、数字会跳变)。
- 看门狗扩展到「被程序化拉起的主管会话」:这类会话假死时会被告警并做有限重推;绝不自动拉起——不替用户做「要不要起一个会话」的决定。(注:在权限卡死场景里,重推排在卡死回合之后,救不活它——真正救活靠上面的超时拒绝。)
内部改进(用户无感)
- 转录读取缓存:同一个转录文件此前会被整读 3–5 次(派活守卫、会话信息查询、各接口校验各读一遍);改为内容寻址缓存后,三处解析型读取点换线,实测整读 3 → 1(有端到端整读计数与对照组验证)。
- 新逻辑落进
conversation/子模块,不为新特性单开行数豁免。 - 体积门禁口径修复:豁免条目的专属上限现在优先于基线(此前二者自相矛盾)。
- 新增回执消费诊断:补上「自动拒绝 → 派活方回执被消费」这条链此前没有任何正向物证的验证盲区(只加记录,零行为变更)。
已知限制与未验证项(如实,不美化)
- 渲染层视觉未真机走查:权限超时提示的字号、圆点、无动画等细节无组件测试锁定,由设计稿验收兜底,真机呈现需你走查(员工无法启动应用)。
- 720px 短屏降级未做:触发条件已定(真机走查发现该行过高时再做),届时需先补齐五种语言的短版文案。
- 转录缓存的失效风险:若发生「同尺寸重写 + 时间戳精度不足」的极端情况,理论上可能读到旧内容;已与既有摘要缓存用同一口径、触发概率极低故接受。但后果面更大——该缓存承载的是模型上下文(旧内容会污染模型输入)。将来若改「原地等长替换」的清理逻辑,两处缓存需一并复核(锚点已写进代码注释)。
- 「被投递拉起」标记不持久化:重启后该标记丢失,相关问题会静默回到豁免状态(已接受的取舍,如需覆盖属二期)。
- 无客户端 15 分钟档未做端到端覆盖(测试装置里没有桌面客户端)。
- 「320 秒超时」专项排查进行中:据主管口径,已定位为某内部循环的结构性候选成因,但 O(n²) 尚未证实、修法尚未落地——本版未修。(未核实:该项未在提交历史或仓库中找到对应物证,以事实为准。)
债务与豁免(如实披露)
sessionService.ts豁免上限续签为 3846(= 实测 3796 + 50),至 1.7.3,附条件「1.7.3 须含红灯区批次」。请注意:本版对该文件是「成本解耦」而非「减少行数」(净 +1 行)——诚实的口径就是不声称减行。handler.ts豁免上限 维持 3372,至 1.7.3。
升级说明
- 无破坏性变更;通过应用内「检查更新」即可升级(
latest.yml+ blockmap 支持增量下载),也可重新下载安装包覆盖安装。 - 启动后调用
GET /api/whoami可查看当前运行版本号(返回app、version、pid、startedAt)。