Repository navigation
Replies: 1 comment
|
感谢整理这么详细的现场信息。我核对了 npm 发布的
我用 OpenAI Codex 提取并检查了 rc.5 的实际方法,上述测试对会话、调度等依赖用了桩;没有复现完整 Desktop 环境,也还不能确定现场的 |
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
Bug report:
turn/end的reason为 undefined 时,多处监听器裸读.kind导致整轮失败目标版本:
@deepseek-ai/*0.2.1-rc.5(DeepSeek Harness Desktop,macOS)仓库:https://github.com/deepseek-ai/deepseek-harness
报告日期:2026-10-31
证据来源:本机
~/.dsh/sessions/下 340 个会话日志(统计时共 1813 条turn/end),以及
/Applications/DeepSeek Harness.app/Contents/Resources/app.asar中经 sha256 校验的源码。摘要
会话的某一轮结束后,界面只显示一行失败:
code为UNKNOWN。这不是模型或网络问题:它是turn/end事件上.kind的裸解引用(前面任何一段可能是 undefined),在进程内抛出的 TypeError 被 agent loop 捕获,
再以
{kind: "error", error: {message, code: "UNKNOWN"}}记进日志。本机历史上发生 10 次,涉及 5 个会话。一旦某个会话触发,后续轮次会持续失败:
session-f7217f05从 turn 11 连续崩到 turn 14,四轮全挂。会话不会自我恢复。复现到的部分
1. 代码扫描:6 个独立位置存在同样的裸读
判据:
.kind之前的一段路径可能是 undefined。dsh-goal-round-driverlib/index.js:274if (event.data.reason.kind === "max-tokens") {dsh-goal-round-driverlib/index.js:278if (event.data.reason.kind !== "aborted") return;dsh-session-telemetrylib/index.js:224case "turn/end": return event.data.reason.kind === "error" ? "error" : "info";dsh-subagentlib/index.js:226switch (end?.data.reason.kind) {←?.只护了最外层dsh-subagentlib/index.js:2668lastTurnCompleted: event.data.reason.kind === "completed"dsh-agentlib/index.js:63与lib/types/consumed-work.js:24function accountsForClaim(reason) { switch (reason.kind) {第 6 项在两份产物里各出现一次,是同一个缺陷。
复现命令(本机使用;
gates/test_turn_reason_guard.py是本地脚手架,不入本报告所属仓库):2. 机制:
turn/end的reason允许为空dsh-agent-loop/lib/index.js的 turn 收尾:step()存在一条return concluded ? { kind: "completed" } : null;——concluded为假时返回null,随后被赋给turnEnds。reason因此可以为null,而所有读reason.kind的地方都没有考虑这种情况。
已用最小复现确认:把
accountsForClaim/foldConsumedWork原样抽出,喂入turn/start → 认领(removedCount:1) → turn/end 缺 reason的事件序列,得到与线上完全相同的TypeError: Cannot read properties of undefined (reading 'kind')。3. 真实失败分布
session-1905fd5d-8797-4e39-b…session-567a0e1b-14e1-422d-8…session-1e2d2d0f-9ca3-4d58-a…session-63df0969-1efa-404a-a…session-f7217f05-141c-4b17-b…10 次失败的消息字面完全一致:
Cannot read properties of undefined (reading 'kind')。尚未定位的部分(如实说明)
具体是哪一处抛出,未能确定。
已经排除的候选,都附判据:
dsh-goal-round-driver:session/event监听只在turn/end分支读reason.kind;而崩溃轮的输入来源是
user与tool-jobs,不是 goal 轮次,第 274 行在该路径上未被调用。dsh-session-telemetry:captureEvent包在contain()内,其实现是try { step() } catch (e) { this.ctx.logger.warn(...) },异常被吞掉,不会让整轮失败。dsh-session-format-v0-to-v1:normalizeLegacyTurnEnd先经releasedV0Record()校验,不匹配时抛malformedLegacy,不是 TypeError。一个尚未解释的矛盾:现场 10 次全部是 "undefined",而按
turnEnds = null的路径应报"null"。两者不一致,说明
reason是在到达监听器之前就被置空的,而不是本文件里let turnEnds = null这条赋值造成的。这一点是推断,未实跑。建议的修复方向
任选其一,二者不冲突:
event.data.reason?.kind、end?.data?.reason?.kind、reason?.kind。这是最小改动,单独即可消除崩溃。reason:agent loop 的finally里,若turnEnds == null则回落为{ kind: "error", error: { message: "turn ended without a recorded reason", code: "UNKNOWN" } },并在
turn/end的类型定义里把reason标成不可空。这样任何新增的监听器都不会再踩到。建议 1 和 2 一起做:脚本侧兜底,类型侧收口。
附加观察(同批会话,未合并进本问题)
同一批日志里还有两类
UNKNOWN失败,与本 report 的.kind问题无关,单列备查:next is not a function× 3(session-2d2c8398 等),发生在workspace/changes之后cannot get property "workingDirectory" without inject× 2出现位置提示是插件钩子链问题,需要单独排查。
All reactions